// Copyright 2012 Georg-August-Universität Göttingen, Germany // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package de.ugoe.cs.autoquest.usability.result; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.util.EnumMap; import java.util.Map; import java.util.Map.Entry; import jodd.props.Props; import com.google.common.base.Optional; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import de.ugoe.cs.util.console.Console; /** *

* Helper class, which creates a {@link UsabilityProblemDescription} for a usability rule. *

* * @author Alexander Deicke */ public class UsabilityProblemDescriptionResolver { /** *

* .properties file, which contains all details concerning a usability defect. *

*/ private final String defectDescriptionFile = "defects.props"; /** *

* Creates a defect description for a {@link UsabilityRule}. *

* * @param name * of usability rule * @return defect description for usability rule */ public UsabilityProblemDescription descriptionFor(String usabilityRuleName) { Props allProperties = initProperties(); Map usabilityRuleProperties = allUsabilityRuleProperties(allProperties, usabilityRuleName); return createUsabilityDefect(usabilityRuleProperties); } /** *

* Initializes the properties, which are used to create the defect description. *

* * @return properties needed to create defect description */ private Props initProperties() { Optional defectDescriptionFile = getDefectDescriptionFile(); Props props = new Props(); props.setEscapeNewLineValue("\n"); props.setValueTrimLeft(true); if (defectDescriptionFile.isPresent()) { loadProperties(defectDescriptionFile, props); } return props; } /** *

* Loads the .properties file from the system. *

* * @return iff present, {@link File} object of the .properties file */ private Optional getDefectDescriptionFile() { try { return Optional.fromNullable(new File(ClassLoader .getSystemResource(defectDescriptionFile).toURI())); } catch (URISyntaxException e) { Console.printerr("Error while loading defect description file."); Console.logException(e); return Optional.absent(); } } /** * *

* Loads the values from the .properties. *

* * @param defectDescriptionFile * .properties file * @param props * object, which stores the loaded values */ private void loadProperties(Optional defectDescriptionFile, Props props) { try { props.load(defectDescriptionFile.get()); } catch (IOException e) { Console.logException(e); } } /** *

* Returns all existing properties for a given usability rule. *

* * @param allProperties * all properties available * @param usabilityRuleName * name of usability rule * @return all properties of certain usability rule */ private Map allUsabilityRuleProperties(Props allProperties, String usabilityRuleName) { Map usabilityRuleProperties = Maps.newHashMap(); allProperties.extractSubProps(usabilityRuleProperties, usabilityRuleName + ".*"); return usabilityRuleProperties; } /** *

* Creates the usability defect. *

* * @param usabilityRuleProperties * all properties needed for creation. * @return defect description for a usability rule */ private UsabilityProblemDescription createUsabilityDefect(Map usabilityRuleProperties) { String description = Iterables.getOnlyElement(Maps .filterKeys(usabilityRuleProperties, descriptionProperty()).values()); EnumMap severity = getSeverityMap(usabilityRuleProperties); return new UsabilityProblemDescription(description, severity); } /** *

* Gets the description property. *

* * @return description property */ private Predicate descriptionProperty() { return new Predicate() { public boolean apply(String key) { return key.endsWith("description"); } }; } /** *

* Creates severity level map for defect description, by matching all entried from .properties * file to corresponding {@link UsabilityProblemSeverityLevel}. *

* * @param usabilityRuleProperties * all properties of certain usability rule * @return assignment of {@link UsabilityProblemSeverityLevel} and corresponding threshold */ private EnumMap getSeverityMap(Map usabilityRuleProperties) { EnumMap severityMap = Maps.newEnumMap(UsabilityProblemSeverityLevel.class); Map allSeverityProperties = Maps.filterEntries(usabilityRuleProperties, allSeverityProperties()); for (Entry severityProperty : allSeverityProperties.entrySet()) { UsabilityProblemSeverityLevel severityLevel = getSeverityLevel(severityProperty.getKey()); Double rule = Double.valueOf(severityProperty.getValue()); severityMap.put(severityLevel, rule); } return severityMap; } /** *

* Matches severity level from .properties file against {@link UsabilityProblemSeverityLevel}. *

* * @param severityProperty * severity level from .properties file * @return matching {@link UsabilityProblemSeverityLevel} */ private UsabilityProblemSeverityLevel getSeverityLevel(String severityProperty) { int startSeverityLevel = severityProperty.lastIndexOf(".") + 1; String severityLevelIdentifier = severityProperty.substring(startSeverityLevel).toUpperCase(); return UsabilityProblemSeverityLevel.valueOf(severityLevelIdentifier); } /** *

* Gets the severity level properties. *

* * @return severity level */ private Predicate> allSeverityProperties() { return new Predicate>() { public boolean apply(Map.Entry entry) { return entry.getKey().contains("severity"); } }; } }