// 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; /** *

* TODO comment *

* * @author Alexander Deicke */ public class DefectDescriptionResolver { private final String defectDescriptionFile = "defects.props"; /** *

* TODO: comment *

* * @param name * @return */ public UsabilityDefect descriptionFor(String usabilityRuleName) { Props allProperties = initProperties(); Map usabilityRuleProperties = allUsabilityRuleProperties(allProperties, usabilityRuleName); return createUsabilityDefect(usabilityRuleProperties); } /** *

* TODO: comment *

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

* TODO: comment *

* * @return */ 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(); } } private void loadProperties(Optional defectDescriptionFile, Props props) { try { props.load(defectDescriptionFile.get()); } catch (IOException e) { Console.logException(e); } } /** *

* TODO: comment *

* * @return */ private Map allUsabilityRuleProperties(Props allProperties, String usabilityRuleName) { Map usabilityRuleProperties = Maps.newHashMap(); allProperties.extractSubProps(usabilityRuleProperties, usabilityRuleName + ".*"); return usabilityRuleProperties; } /** *

* TODO: comment *

* * @param usabilityRuleProperties * @return */ private UsabilityDefect createUsabilityDefect(Map usabilityRuleProperties) { String description = Iterables.getOnlyElement(Maps.filterKeys(usabilityRuleProperties, descriptionProperty()).values()); EnumMap severity = getSeverityMap(usabilityRuleProperties); return new UsabilityDefect(description, severity); } /** *

* TODO: comment *

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

* TODO: comment *

* * @param usabilityRuleProperties * @return */ private EnumMap getSeverityMap(Map usabilityRuleProperties) { EnumMap severityMap = Maps.newEnumMap(UsabilityDefectSeverityLevel.class); Map allSeverityProperties = Maps.filterEntries(usabilityRuleProperties, allSeverityProperties()); for (Entry severityProperty : allSeverityProperties.entrySet()) { UsabilityDefectSeverityLevel severityLevel = getSeverityLevel(severityProperty.getKey()); Double rule = Double.valueOf(severityProperty.getValue()); severityMap.put(severityLevel, rule); } return severityMap; } /** *

* TODO: comment *

* * @param key * @return */ private UsabilityDefectSeverityLevel getSeverityLevel(String severityProperty) { int startSeverityLevel = severityProperty.lastIndexOf(".") + 1; String severitLevelIdentifier = severityProperty.substring(startSeverityLevel).toUpperCase(); return UsabilityDefectSeverityLevel.valueOf(severitLevelIdentifier); } /** *

* TODO: comment *

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