Changeset 1217 for trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules
- Timestamp:
- 06/06/13 17:08:25 (11 years ago)
- Location:
- trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules
- Files:
-
- 2 added
- 1 deleted
- 16 edited
- 2 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/UsabilityMetric.java
r1150 r1217 17 17 import com.google.common.base.Optional; 18 18 19 import de.ugoe.cs.autoquest.usability.result.Usability Defect;19 import de.ugoe.cs.autoquest.usability.result.UsabilityProblemDescription; 20 20 21 21 /** 22 22 * <p> 23 * TODO comment 23 * Interface for usability metrics. A metric is a way of measuring or evaluating a particular 24 * phenomenon or thing, in this case usability. 24 25 * </p> 25 26 * … … 27 28 */ 28 29 public interface UsabilityMetric { 29 30 public Optional<UsabilityDefect> calculate(); 30 31 /** 32 * 33 * <p> 34 * Calculates the metric. 35 * </p> 36 * 37 * @return Detailed description of the usability problem, if calculated metric exceeds defined 38 * threshold. 39 */ 40 public Optional<UsabilityProblemDescription> calculate(); 31 41 32 42 } -
trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/UsabilityMetricsRuleset.java
r1152 r1217 26 26 /** 27 27 * <p> 28 * TODO comment 28 * A ruleset containing usability metrics, which might be indicators for potential usability 29 * problems. 29 30 * </p> 30 31 * … … 34 35 35 36 private List<UsabilityRule> metrics; 36 37 37 38 /** 38 39 * <p> 39 * TODO: comment40 * Constructor. Creates new {@code UsabilityMetricsRuleset} for a given task model. 40 41 * </p> 41 * 42 * 42 43 */ 43 44 private UsabilityMetricsRuleset(ITaskModel taskModel) { … … 48 49 } 49 50 50 /* (non-Javadoc) 51 /* 52 * (non-Javadoc) 53 * 51 54 * @see de.ugoe.cs.autoquest.usability.UsabilityRuleset#evaluationRules() 52 55 */ -
trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/UsabilityResult.java
r1138 r1217 18 18 import com.google.common.collect.Multimap; 19 19 20 import de.ugoe.cs.autoquest.usability.result.UsabilityDefect; 21 import de.ugoe.cs.autoquest.usability.result.UsabilityDefectSeverityLevel; 22 20 import de.ugoe.cs.autoquest.usability.result.UsabilityProblemDescription; 21 import de.ugoe.cs.autoquest.usability.result.UsabilityProblemSeverityLevel; 23 22 24 23 /** 25 24 * <p> 26 * T ODO comment25 * The result of the usability evaluation, which contains all detected problems. 27 26 * </p> 28 27 * … … 30 29 */ 31 30 public class UsabilityResult { 32 33 private Multimap<UsabilityDefectSeverityLevel, UsabilityDefect> detectedDefects; 34 31 32 /** 33 * <p> 34 * All detected problems and their appropriate severity level. 35 * </p> 36 */ 37 private Multimap<UsabilityProblemSeverityLevel, UsabilityProblemDescription> detectedProblems; 38 39 /** 40 * 41 * <p> 42 * Constructor. Creates a new result. 43 * </p> 44 * 45 */ 35 46 public UsabilityResult() { 36 this.detected Defects = ArrayListMultimap.create();47 this.detectedProblems = ArrayListMultimap.create(); 37 48 } 38 49 39 50 /** 40 51 * <p> 41 * TODO: comment52 * Adds a usability problem to the result. 42 53 * </p> 43 * 44 * @param usabilityDefect 54 * 55 * @param usabilityProblem 56 * the problem, which should be added. 45 57 */ 46 public void add Defect(UsabilityDefect usabilityDefect) {47 this.detected Defects.put(usabilityDefect.getSeverityLevel(), usabilityDefect);58 public void addProblem(UsabilityProblemDescription usabilityProblem) { 59 this.detectedProblems.put(usabilityProblem.getSeverityLevel(), usabilityProblem); 48 60 } 49 50 public boolean hasDefects() { 51 return !this.detectedDefects.isEmpty(); 61 62 /** 63 * 64 * <p> 65 * Checks, if problems were found during the usability evaluation. 66 * </p> 67 * 68 * @return true, iff problems were found 69 */ 70 public boolean hasDetectedProblems() { 71 return !this.detectedProblems.isEmpty(); 52 72 } 53 73 -
trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/UsabilityRule.java
r1152 r1217 19 19 import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskModel; 20 20 import de.ugoe.cs.autoquest.usability.EvaluationMethodCaller; 21 import de.ugoe.cs.autoquest.usability.result.Usability Defect;21 import de.ugoe.cs.autoquest.usability.result.UsabilityProblemDescription; 22 22 23 23 /** 24 24 * <p> 25 * TODO comment 25 * A {@code UsabilityRule} is a abstract class, representing a usability guideline, metric 26 * interaction pattern etc., which should be checked during a automatic usability evaluation. 26 27 * </p> 27 28 * … … 29 30 */ 30 31 public abstract class UsabilityRule { 31 32 protected final ITaskModel taskModel; 33 34 protected String name; 35 36 protected UsabilityDefect defect; 37 32 38 33 /** 39 34 * <p> 40 * TODO: comment35 * {@link ITaskModel}, which is evaluated 41 36 * </p> 42 * 37 */ 38 protected final ITaskModel taskModel; 39 40 /** 41 * <p> 42 * Name of the usability rule 43 * </p> 44 */ 45 protected String name; 46 47 /** 48 * <p> 49 * Corresponding defect description. 50 * </p> 51 */ 52 protected UsabilityProblemDescription defect; 53 54 /** 55 * <p> 56 * Constructor. Creates a new {@code UsabilityRule} for a given task model 57 * </p> 58 * 43 59 */ 44 60 public UsabilityRule(ITaskModel taskModel) { 45 61 this.taskModel = taskModel; 46 62 } 47 48 public abstract Optional<UsabilityDefect> callEvaluationMethod(EvaluationMethodCaller evaluationMethodCaller); 63 64 /** 65 * 66 * <p> 67 * Calls the evaluation method of this {@code UsabilityRule}. 68 * </p> 69 * 70 * @param evaluationMethodCaller 71 * helper class, which calls the evaluation method based on the type of the 72 * {@code UsabilityRule} 73 * @return {@link UsabilityProblemDescription}, iff violation against usability rule was detected 74 */ 75 public abstract Optional<UsabilityProblemDescription> callEvaluationMethod(EvaluationMethodCaller evaluationMethodCaller); 49 76 50 77 } -
trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/UsabilityRuleset.java
r1138 r1217 19 19 /** 20 20 * <p> 21 * TODO comment21 * A {@code UsabilityRuleset} is a container for {@link UsabilityRule}s. 22 22 * </p> 23 23 * … … 28 28 /** 29 29 * <p> 30 * TODO: comment30 * Gets all {@link UsabilityRule}s contained in the {@code UsabilityRuleset}. 31 31 * </p> 32 * 33 * @return 32 * 33 * @return all contained {@link UsabilityRule}s 34 34 */ 35 35 public List<UsabilityRule> evaluationRules(); -
trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/UsabilityUsageProblem.java
r1216 r1217 17 17 import com.google.common.base.Optional; 18 18 19 import de.ugoe.cs.autoquest.usability.result.Usability Defect;19 import de.ugoe.cs.autoquest.usability.result.UsabilityProblemDescription; 20 20 21 21 /** 22 22 * <p> 23 * TODO comment 23 * Common interface for usability problems. Simple speaking, a usability problem is a specific 24 * problem that negatively affects the usage of a application. 24 25 * </p> 25 26 * 26 27 * @author Alexander Deicke 27 28 */ 28 public interface UsabilityUsageDefect { 29 30 public Optional<UsabilityDefect> check(); 29 public interface UsabilityUsageProblem { 30 31 /** 32 * 33 * <p> 34 * Checks, if usability problem is present. 35 * </p> 36 * 37 * @return Detailed description of the usability problem, if it was detected. 38 */ 39 public Optional<UsabilityProblemDescription> check(); 31 40 32 41 } -
trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/metrics/NoLetterOrDigitRatioMetric.java
r1152 r1217 15 15 package de.ugoe.cs.autoquest.usability.rules.metrics; 16 16 17 import static de.ugoe.cs.autoquest.usability.task tree.filters.EventTypeFilter.TEXT_INPUT;17 import static de.ugoe.cs.autoquest.usability.taskmodel.filter.types.EventTypeFilter.TEXT_INPUT; 18 18 import static de.ugoe.cs.autoquest.usability.util.TextInputUtil.aggregateEnteredTextFromTextInputs; 19 import static de.ugoe.cs.autoquest.usability.util.TextInputUtil.characterIs LetterOrDigitPredicate;19 import static de.ugoe.cs.autoquest.usability.util.TextInputUtil.characterIsNoLetterOrDigitPredicate; 20 20 21 21 import java.util.List; … … 28 28 import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskModel; 29 29 import de.ugoe.cs.autoquest.usability.EvaluationMethodCaller; 30 import de.ugoe.cs.autoquest.usability.result. DefectDescriptionResolver;31 import de.ugoe.cs.autoquest.usability.result.Usability Defect;30 import de.ugoe.cs.autoquest.usability.result.UsabilityProblemDescriptionResolver; 31 import de.ugoe.cs.autoquest.usability.result.UsabilityProblemDescription; 32 32 import de.ugoe.cs.autoquest.usability.rules.UsabilityMetric; 33 33 import de.ugoe.cs.autoquest.usability.rules.UsabilityRule; 34 import de.ugoe.cs.autoquest.usability.task tree.FilterResult;35 import de.ugoe.cs.autoquest.usability.task tree.IterativeDFSFilterStrategy;36 import de.ugoe.cs.autoquest.usability.task tree.filters.TaskModelFilter;34 import de.ugoe.cs.autoquest.usability.taskmodel.filter.FilterResult; 35 import de.ugoe.cs.autoquest.usability.taskmodel.filter.IterativeDFSFilterStrategy; 36 import de.ugoe.cs.autoquest.usability.taskmodel.filter.types.TaskModelFilter; 37 37 38 38 /** 39 39 * <p> 40 * TODO comment 40 * Metric, which calculates the ratio ratio between non letter or digit characters and all entered 41 * characters. 41 42 * </p> 42 43 * … … 47 48 /** 48 49 * <p> 49 * TODO: comment50 * Constructor. Creates a new {@code NoLetterOrDigitRatioMetric} for a given task model. 50 51 * </p> 51 * 52 * @param task Tree52 * 53 * @param taskModel 53 54 */ 54 55 public NoLetterOrDigitRatioMetric(ITaskModel taskModel) { 55 56 super(taskModel); 56 57 this.name = "NoLetterOrDigitRatio"; 57 this.defect = new DefectDescriptionResolver().descriptionFor(this.getClass().getSimpleName()); 58 this.defect = 59 new UsabilityProblemDescriptionResolver().descriptionFor(this.getClass() 60 .getSimpleName()); 58 61 } 59 62 60 /* (non-Javadoc) 63 /* 64 * (non-Javadoc) 65 * 61 66 * @see de.ugoe.cs.autoquest.usability.rules.UsabilityRule#check() 62 67 */ 63 68 @Override 64 public Optional<Usability Defect> calculate() {69 public Optional<UsabilityProblemDescription> calculate() { 65 70 FilterResult textInputEvents = extractNodesFromTaskTree(); 66 71 float evaluationMetric = calculateEvaluationMetric(textInputEvents.tasksMatchedFilter()); 67 72 return this.defect.isPresent(evaluationMetric); 68 73 } 69 74 75 /** 76 * 77 * <p> 78 * Filters all text input events from task model. 79 * </p> 80 * 81 * @return {@code FilterResult} 82 */ 70 83 private FilterResult extractNodesFromTaskTree() { 71 84 return new TaskModelFilter(new IterativeDFSFilterStrategy()).filterByEventType(TEXT_INPUT) 72 85 .from(this.taskModel); 73 86 } 74 87 88 /** 89 * 90 * <p> 91 * Calculates the metric. 92 * </p> 93 * 94 * @param textInputEvents 95 * all text input events 96 * @return ratio between non letter or digit characters and all entered characters 97 */ 75 98 private float calculateEvaluationMetric(List<ITask> textInputEvents) { 76 Multiset<String> enteredTextFragments = 77 aggregateEnteredTextFromTextInputs(textInputEvents); 99 Multiset<String> enteredTextFragments = aggregateEnteredTextFromTextInputs(textInputEvents); 78 100 int allCharactersCount = 0; 79 101 int noLetterOrDigitCount = 0; … … 82 104 allCharactersCount += CharMatcher.ANY.countIn(textFragment) * occurencesOfTextFragment; 83 105 noLetterOrDigitCount += 84 CharMatcher.forPredicate(characterIs LetterOrDigitPredicate()).countIn(textFragment) *85 occurencesOfTextFragment;106 CharMatcher.forPredicate(characterIsNoLetterOrDigitPredicate()) 107 .countIn(textFragment) * occurencesOfTextFragment; 86 108 } 87 109 return allCharactersCount != 0 ? (float) noLetterOrDigitCount / (float) allCharactersCount … … 89 111 } 90 112 91 /* (non-Javadoc) 92 * @see de.ugoe.cs.autoquest.usability.rules.UsabilityRule#callEvaluationMetho(de.ugoe.cs.autoquest.usability.EvaluationMethodCaller) 113 /* 114 * (non-Javadoc) 115 * 116 * @see 117 * de.ugoe.cs.autoquest.usability.rules.UsabilityRule#callEvaluationMetho(de.ugoe.cs.autoquest 118 * .usability.EvaluationMethodCaller) 93 119 */ 94 120 @Override 95 public Optional<Usability Defect> callEvaluationMethod(EvaluationMethodCaller evaluationMethodCaller)121 public Optional<UsabilityProblemDescription> callEvaluationMethod(EvaluationMethodCaller evaluationMethodCaller) 96 122 { 97 123 return evaluationMethodCaller.check(this); -
trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/metrics/TextInputEntryRepetitionsMetric.java
r1199 r1217 15 15 package de.ugoe.cs.autoquest.usability.rules.metrics; 16 16 17 import static de.ugoe.cs.autoquest.usability.task tree.filters.EventTypeFilter.TEXT_INPUT;17 import static de.ugoe.cs.autoquest.usability.taskmodel.filter.types.EventTypeFilter.TEXT_INPUT; 18 18 import static de.ugoe.cs.autoquest.usability.util.TextInputUtil.aggregateEnteredTextFromTextInputs; 19 19 … … 28 28 import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskModel; 29 29 import de.ugoe.cs.autoquest.usability.EvaluationMethodCaller; 30 import de.ugoe.cs.autoquest.usability.result. DefectDescriptionResolver;31 import de.ugoe.cs.autoquest.usability.result.Usability Defect;30 import de.ugoe.cs.autoquest.usability.result.UsabilityProblemDescriptionResolver; 31 import de.ugoe.cs.autoquest.usability.result.UsabilityProblemDescription; 32 32 import de.ugoe.cs.autoquest.usability.rules.UsabilityMetric; 33 33 import de.ugoe.cs.autoquest.usability.rules.UsabilityRule; 34 import de.ugoe.cs.autoquest.usability.task tree.FilterResult;35 import de.ugoe.cs.autoquest.usability.task tree.IterativeDFSFilterStrategy;36 import de.ugoe.cs.autoquest.usability.task tree.filters.TaskModelFilter;34 import de.ugoe.cs.autoquest.usability.taskmodel.filter.FilterResult; 35 import de.ugoe.cs.autoquest.usability.taskmodel.filter.IterativeDFSFilterStrategy; 36 import de.ugoe.cs.autoquest.usability.taskmodel.filter.types.TaskModelFilter; 37 37 38 38 /** 39 39 * <p> 40 * TODO comment 40 * Metric, which measures either the repetition of entered words or the maximum repetition of a 41 * single word. 41 42 * </p> 42 43 * … … 47 48 /** 48 49 * <p> 49 * TODO: comment50 * Constructor. Creates a new {@link TextInputEntryRepetitionsMetric} for a given task model. 50 51 * </p> 51 * 52 * @param task Tree52 * 53 * @param taskModel 53 54 */ 54 55 public TextInputEntryRepetitionsMetric(ITaskModel taskModel) { 55 56 super(taskModel); 56 57 this.name = "TextInputEntryRepetitions"; 57 this.defect = new DefectDescriptionResolver().descriptionFor(this.getClass().getSimpleName()); 58 this.defect = 59 new UsabilityProblemDescriptionResolver().descriptionFor(this.getClass() 60 .getSimpleName()); 58 61 } 59 62 60 /* (non-Javadoc) 63 /* 64 * (non-Javadoc) 65 * 61 66 * @see de.ugoe.cs.autoquest.usability.rules.UsabilityRule#check() 62 67 */ 63 68 @Override 64 public Optional<Usability Defect> calculate() {69 public Optional<UsabilityProblemDescription> calculate() { 65 70 FilterResult textInputEvents = extractNodesFromTaskTree(); 66 71 float evaluationMetric = calculateEvaluationMetric(textInputEvents.tasksMatchedFilter()); 67 72 return this.defect.isPresent(evaluationMetric); 68 73 } 69 74 75 /** 76 * 77 * <p> 78 * Filters all text input events from task model. 79 * </p> 80 * 81 * @return {@code FilterResult} 82 */ 70 83 private FilterResult extractNodesFromTaskTree() { 71 84 return new TaskModelFilter(new IterativeDFSFilterStrategy()).filterByEventType(TEXT_INPUT) 72 85 .from(this.taskModel); 73 86 } 74 87 88 /** 89 * 90 * <p> 91 * Calculates the metric. 92 * </p> 93 * 94 * @param textInputEvents 95 * all text input events 96 * @return either number of repeated words or the number of repetitions of the most entered word 97 */ 75 98 private float calculateEvaluationMetric(List<ITask> textInputEvents) { 76 Multiset<String> enteredTextFragments = 77 aggregateEnteredTextFromTextInputs(textInputEvents); 99 Multiset<String> enteredTextFragments = aggregateEnteredTextFromTextInputs(textInputEvents); 78 100 Multiset<String> orderedTextFragmentsWithMultipleOccurences = 79 101 onlyTextFragmentsWithMultipleOccurences(enteredTextFragments); … … 86 108 orderedTextFragmentsWithMultipleOccurences 87 109 .count(wordWithHighestRepetitionInTextFragments); 88 return Math.max(numberOfRepeatedWords, maxRepetitions -1);110 return Math.max(numberOfRepeatedWords, maxRepetitions - 1); 89 111 } 90 112 113 /** 114 * 115 * <p> 116 * Return only words, which at least entered twice. 117 * </p> 118 * 119 * @param allTextInputs 120 * all text input events 121 * @return all word, which used min. twice 122 */ 91 123 private Multiset<String> onlyTextFragmentsWithMultipleOccurences(final Multiset<String> allTextInputs) 92 124 { … … 104 136 } 105 137 106 /* (non-Javadoc) 107 * @see de.ugoe.cs.autoquest.usability.rules.UsabilityRule#callEvaluationMetho(de.ugoe.cs.autoquest.usability.EvaluationMethodCaller) 138 /* 139 * (non-Javadoc) 140 * 141 * @see 142 * de.ugoe.cs.autoquest.usability.rules.UsabilityRule#callEvaluationMetho(de.ugoe.cs.autoquest 143 * .usability.EvaluationMethodCaller) 108 144 */ 109 145 @Override 110 public Optional<Usability Defect> callEvaluationMethod(EvaluationMethodCaller evaluationMethodCaller)146 public Optional<UsabilityProblemDescription> callEvaluationMethod(EvaluationMethodCaller evaluationMethodCaller) 111 147 { 112 148 return evaluationMethodCaller.check(this); 113 149 } 114 150 115 151 } -
trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/metrics/TextInputRatioMetric.java
r1152 r1217 15 15 package de.ugoe.cs.autoquest.usability.rules.metrics; 16 16 17 import static de.ugoe.cs.autoquest.usability.task tree.filters.EventTypeFilter.TEXT_INPUT;17 import static de.ugoe.cs.autoquest.usability.taskmodel.filter.types.EventTypeFilter.TEXT_INPUT; 18 18 19 19 import java.util.List; … … 27 27 import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskModel; 28 28 import de.ugoe.cs.autoquest.usability.EvaluationMethodCaller; 29 import de.ugoe.cs.autoquest.usability.result. DefectDescriptionResolver;30 import de.ugoe.cs.autoquest.usability.result.Usability Defect;29 import de.ugoe.cs.autoquest.usability.result.UsabilityProblemDescriptionResolver; 30 import de.ugoe.cs.autoquest.usability.result.UsabilityProblemDescription; 31 31 import de.ugoe.cs.autoquest.usability.rules.UsabilityMetric; 32 32 import de.ugoe.cs.autoquest.usability.rules.UsabilityRule; 33 import de.ugoe.cs.autoquest.usability.task tree.FilterResult;34 import de.ugoe.cs.autoquest.usability.task tree.IterativeDFSFilterStrategy;35 import de.ugoe.cs.autoquest.usability.task tree.filters.TaskModelFilter;33 import de.ugoe.cs.autoquest.usability.taskmodel.filter.FilterResult; 34 import de.ugoe.cs.autoquest.usability.taskmodel.filter.IterativeDFSFilterStrategy; 35 import de.ugoe.cs.autoquest.usability.taskmodel.filter.types.TaskModelFilter; 36 36 37 37 /** 38 38 * <p> 39 * TODO comment39 * Metric, which measures the ratio between the text input and the non text input events. 40 40 * </p> 41 41 * … … 46 46 /** 47 47 * <p> 48 * TODO: comment48 * Constructor. Creates a new {@code TextInputRatioMetric} for a given task model. 49 49 * </p> 50 * 50 * 51 51 * @param taskTree 52 52 */ … … 54 54 super(taskModel); 55 55 this.name = "TextInputRatio"; 56 this.defect = new DefectDescriptionResolver().descriptionFor(this.getClass().getSimpleName()); 56 this.defect = 57 new UsabilityProblemDescriptionResolver().descriptionFor(this.getClass() 58 .getSimpleName()); 57 59 } 58 60 59 /* (non-Javadoc) 61 /* 62 * (non-Javadoc) 63 * 60 64 * @see de.ugoe.cs.autoquest.usability.rules.UsabilityRule#check() 61 65 */ 62 66 @Override 63 public Optional<Usability Defect> calculate() {67 public Optional<UsabilityProblemDescription> calculate() { 64 68 FilterResult textInputEvents = extractNodesFromTaskTree(); 65 float evaluationMetric = calculateEvaluationMetric(textInputEvents.tasksMatchedFilter(), textInputEvents.tasksNotMatchedFilter()); 69 float evaluationMetric = 70 calculateEvaluationMetric(textInputEvents.tasksMatchedFilter(), 71 textInputEvents.tasksNotMatchedFilter()); 66 72 return this.defect.isPresent(evaluationMetric); 67 73 } 68 74 75 /** 76 * 77 * <p> 78 * Filters all text input events from task model. 79 * </p> 80 * 81 * @return {@code FilterResult} 82 */ 69 83 private FilterResult extractNodesFromTaskTree() { 70 84 return new TaskModelFilter(new IterativeDFSFilterStrategy()).filterByEventType(TEXT_INPUT) 71 85 .from(this.taskModel); 72 86 } 73 74 private float calculateEvaluationMetric(List<ITask> textInputEvents, List<ITask> nonTextInputEvents) { 87 88 /** 89 * 90 * <p> 91 * Calculates the metric. 92 * </p> 93 * 94 * @param textInputEvents 95 * all text input events 96 * @param nonTextInputEvents 97 * all non text input events 98 * @return ratio between text input and non text input events 99 */ 100 private float calculateEvaluationMetric(List<ITask> textInputEvents, 101 List<ITask> nonTextInputEvents) 102 { 75 103 float numberOfTextInputEvents = textInputEvents.size(); 76 104 float numberOfNonTextInputEvents = nrOfEventTasksNotMatchedFilter(nonTextInputEvents); … … 78 106 } 79 107 108 /** 109 * 110 * <p> 111 * Filters all {@link IEventTask}s from non text input event. 112 * </p> 113 * 114 * @param nonTextInputEvents 115 * all non text input events 116 * @return number of {@link IEventTask}s 117 */ 80 118 private int nrOfEventTasksNotMatchedFilter(List<ITask> nonTextInputEvents) { 81 return Iterables.size(Iterables.filter(nonTextInputEvents, 82 new Predicate<ITask>() { 119 return Iterables.size(Iterables.filter(nonTextInputEvents, new Predicate<ITask>() { 83 120 84 85 86 87 88 121 @Override 122 public boolean apply(ITask task) { 123 return task instanceof IEventTask; 124 } 125 })); 89 126 } 90 127 91 /* (non-Javadoc) 92 * @see de.ugoe.cs.autoquest.usability.rules.UsabilityRule#callEvaluationMetho(de.ugoe.cs.autoquest.usability.EvaluationMethodCaller) 128 /* 129 * (non-Javadoc) 130 * 131 * @see 132 * de.ugoe.cs.autoquest.usability.rules.UsabilityRule#callEvaluationMetho(de.ugoe.cs.autoquest 133 * .usability.EvaluationMethodCaller) 93 134 */ 94 135 @Override 95 public Optional<Usability Defect> callEvaluationMethod(EvaluationMethodCaller evaluationMethodCaller)136 public Optional<UsabilityProblemDescription> callEvaluationMethod(EvaluationMethodCaller evaluationMethodCaller) 96 137 { 97 138 return evaluationMethodCaller.check(this); -
trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/patterns/InteractionPattern.java
r1204 r1217 15 15 package de.ugoe.cs.autoquest.usability.rules.patterns; 16 16 17 import java.util.Arrays;18 17 import java.util.List; 19 18 … … 24 23 import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask; 25 24 import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskModel; 26 import de.ugoe.cs.autoquest.usability.task tree.IterativeDFSFilterStrategy;27 import de.ugoe.cs.autoquest.usability.task tree.filters.TaskModelFilter;28 import de.ugoe.cs.autoquest.usability.task tree.filters.TaskTypeFilter;25 import de.ugoe.cs.autoquest.usability.taskmodel.filter.IterativeDFSFilterStrategy; 26 import de.ugoe.cs.autoquest.usability.taskmodel.filter.types.TaskModelFilter; 27 import de.ugoe.cs.autoquest.usability.taskmodel.filter.types.TaskTypeFilter; 29 28 30 29 /** 31 30 * <p> 32 * TODO comment31 * A interaction pattern is a simple approach to describe the structure of usage behaviour. 33 32 * </p> 34 33 * … … 36 35 */ 37 36 public class InteractionPattern { 38 37 38 /** 39 * <p> 40 * {@link TaskModelFilter}, which is used to filter a task model after different {@link ITask}s 41 * </p> 42 */ 39 43 private TaskModelFilter taskTreeFilter = new TaskModelFilter(new IterativeDFSFilterStrategy()); 40 41 private TaskTypeFilter concernedTask; 42 44 45 /** 46 * <p> 47 * Type of root task. Determines the order in which sub task appear. 48 * </p> 49 */ 50 private TaskTypeFilter rootTask; 51 52 /** 53 * <p> 54 * Helper objects, which decide whether or not a defined pattern condition holds. 55 * </p> 56 */ 43 57 private List<InteractionPatternVisitor> patternVisitors; 44 58 59 /** 60 * <p> 61 * Flag, which indicates if the interaction pattern was found within a given task model. 62 * </p> 63 */ 45 64 private boolean present = false; 46 47 /** 48 * <p> 49 * TODO: comment 50 * </p> 51 * 52 * @param concernedNode 53 * @param eventType 54 */ 55 public InteractionPattern(TaskTypeFilter concernedNode, 56 InteractionPatternVisitor... patternVisitor) 65 66 /** 67 * <p> 68 * Constructor. Creates a new interaction pattern for a given root task and a collection of 69 * {@link InteractionPatternVisitor}s. 70 * </p> 71 * 72 * @param rootTask 73 * Type of root task, which determines the order in which sub task appear. 74 * @param patternVisitors 75 * {@link InteractionPatternVisitor}s, which decide whether or not a defined pattern 76 * condition holds 77 */ 78 public InteractionPattern(TaskTypeFilter rootTask, 79 List<InteractionPatternVisitor> patternVisitors) 57 80 { 58 this.patternVisitors = Arrays.asList(patternVisitor); 59 this.concernedTask = concernedNode; 60 } 61 81 this.patternVisitors = patternVisitors; 82 this.rootTask = rootTask; 83 } 84 85 /** 86 * 87 * <p> 88 * Checks if a interaction pattern is contained in a given task model. 89 * </p> 90 * 91 * @param taskModel 92 * {@link ITaskModel}, which might contain the interaction pattern 93 * @return true, iff interaction pattern is contained 94 */ 62 95 public boolean containedIn(ITaskModel taskModel) { 63 96 List<ITask> allConcernedTasks = filterAllConcernedTasksFrom(taskModel); 64 for(ITask concernedTask : allConcernedTasks) { 65 checkTask(concernedTask); 66 if(this.present) break; 97 for (ITask concernedTask : allConcernedTasks) { 98 checkTask(concernedTask); 99 if (this.present) 100 break; 67 101 } 68 102 return this.present; 69 103 } 70 104 71 private void checkTask(ITask concernedTask) { 72 applyAllVisitors(concernedTask); 73 if(allVisitorsArePresent()) { 105 /** 106 * 107 * <p> 108 * Checks a single {@link ITask} for the interaction pattern. 109 * </p> 110 * 111 * @param task 112 * task, which might contain the interaction pattern 113 */ 114 private void checkTask(ITask task) { 115 applyAllVisitors(task); 116 if (allVisitorsArePresent()) { 74 117 this.present = true; 75 } else { 118 } 119 else { 76 120 resetAllVisitors(); 77 121 } 78 122 } 79 123 124 /** 125 * 126 * <p> 127 * Checks if a interaction pattern is contained in a given task. 128 * </p> 129 * 130 * @param task 131 * task, which might contain the interaction pattern 132 * @return true, iff interaction pattern is contained 133 */ 80 134 public boolean containedIn(ITask task) { 81 135 checkTask(task); 82 return this.present; 83 } 84 85 private void applyAllVisitors(ITask concernedTask) { 136 return this.present; 137 } 138 139 /** 140 * 141 * <p> 142 * Method applys all {@link InteractionPatternVisitor}s, to check single interaction pattern 143 * conditions. 144 * </p> 145 * 146 * @param task 147 * task, which might contain the interaction pattern 148 */ 149 private void applyAllVisitors(ITask task) { 86 150 Optional<InteractionPatternVisitor> previousVisitor = Optional.absent(); 87 for(InteractionPatternVisitor visitor : patternVisitors) { 88 if (appliedOnSelectionNode(previousVisitor)) { 89 for (ITask selection : previousVisitor.get().getRetainedSelectionNodes()) { 90 selection.accept(visitor); 91 } 92 } else { 93 previousVisitor = Optional.of(visitor); 94 concernedTask.accept(visitor); 95 } 96 } 97 } 98 99 private boolean appliedOnSelectionNode(Optional<InteractionPatternVisitor> previousVisitor) { 100 return previousVisitor.isPresent() && previousVisitor.get().hasExcludedSelectionNodes(); 101 } 102 103 /** 104 * <p> 105 * TODO: comment 106 * </p> 107 * 108 * @param taskTree 109 * @return 151 for (InteractionPatternVisitor visitor : patternVisitors) { 152 if (appliedOnSelectionNode(previousVisitor)) { 153 for (ITask selection : previousVisitor.get().getRetainedSelectionNodes()) { 154 selection.accept(visitor); 155 } 156 } 157 else { 158 previousVisitor = Optional.of(visitor); 159 task.accept(visitor); 160 } 161 } 162 } 163 164 /** 165 * 166 * <p> 167 * Checks, if a {@link InteractionPatternVisitor} was applied on a {@link ISelection} task. 168 * </p> 169 * 170 * @param interactionPatternVisitor 171 * {@link InteractionPatternVisitor} 172 * @return true, iff {@link InteractionPatternVisitor} was applied on {@link ISelection} task 173 */ 174 private boolean appliedOnSelectionNode(Optional<InteractionPatternVisitor> interactionPatternVisitor) 175 { 176 return interactionPatternVisitor.isPresent() && 177 interactionPatternVisitor.get().hasExcludedSelectionNodes(); 178 } 179 180 /** 181 * <p> 182 * Filters given task model after root task of interaction pattern. 183 * </p> 184 * 185 * @param taskModel 186 * {@link ITaskModel} 187 * @return all tasks of task model, which matches root task of interaction pattern 110 188 */ 111 189 private List<ITask> filterAllConcernedTasksFrom(ITaskModel taskModel) { 112 return this.taskTreeFilter.filterByNodeType(this.concernedTask).from(taskModel).tasksMatchedFilter(); 113 } 114 115 /** 116 * <p> 117 * TODO: comment 118 * </p> 119 * 120 * @return 190 return this.taskTreeFilter.filterByNodeType(this.rootTask).from(taskModel) 191 .tasksMatchedFilter(); 192 } 193 194 /** 195 * <p> 196 * Checks, if all interaction pattern condition are evaluated to true. 197 * </p> 198 * 199 * @return true, iff all interaction pattern condition are true 121 200 */ 122 201 private boolean allVisitorsArePresent() { 123 Iterable<InteractionPatternVisitor> allPresent = Iterables.filter(this.patternVisitors, new Predicate<InteractionPatternVisitor>() { 124 125 public boolean apply(InteractionPatternVisitor visitor) { 126 return visitor.isPresent(); 127 } 128 129 }); 202 Iterable<InteractionPatternVisitor> allPresent = 203 Iterables.filter(this.patternVisitors, new Predicate<InteractionPatternVisitor>() { 204 205 public boolean apply(InteractionPatternVisitor visitor) { 206 return visitor.isPresent(); 207 } 208 209 }); 130 210 return Iterables.size(allPresent) == this.patternVisitors.size(); 131 211 } 132 133 /** 134 * <p> 135 * TODO: comment136 * </p> 137 * 212 213 /** 214 * <p> 215 * Resets all interaction pattern condition. 216 * </p> 217 * 138 218 */ 139 219 private void resetAllVisitors() { 140 for (InteractionPatternVisitor visitor : this.patternVisitors) {220 for (InteractionPatternVisitor visitor : this.patternVisitors) { 141 221 visitor.reset(); 142 222 } 143 223 144 224 } 145 225 -
trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/patterns/InteractionPatternVisitor.java
r1204 r1217 25 25 import de.ugoe.cs.autoquest.eventcore.StringEventType; 26 26 import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTask; 27 import de.ugoe.cs.autoquest.tasktrees.treeifc.IIteration; 28 import de.ugoe.cs.autoquest.tasktrees.treeifc.IOptional; 27 29 import de.ugoe.cs.autoquest.tasktrees.treeifc.ISelection; 30 import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence; 28 31 import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask; 29 32 import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskVisitor; 30 import de.ugoe.cs.autoquest.usability.task tree.filters.EventTypeFilter;31 import de.ugoe.cs.autoquest.usability.task tree.filters.TaskTypeFilter;33 import de.ugoe.cs.autoquest.usability.taskmodel.filter.types.EventTypeFilter; 34 import de.ugoe.cs.autoquest.usability.taskmodel.filter.types.TaskTypeFilter; 32 35 33 36 /** … … 39 42 */ 40 43 public abstract class InteractionPatternVisitor implements ITaskVisitor { 41 42 43 44 45 protected TaskTypeFilter taskType; 46 44 47 protected EventTypeFilter eventType; 45 48 46 49 protected InteractionPattern containedPattern; 47 50 48 51 protected boolean present = false; 49 52 50 53 protected List<ITask> retainedSelectionTasks = Lists.newArrayList(); 51 52 /* (non-Javadoc) 53 * @see de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTask) 54 55 /* 56 * (non-Javadoc) 57 * 58 * @see 59 * de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc 60 * .IEventTask) 54 61 */ 55 62 public void visit(IEventTask event) { 56 if (!this.present && isEventVisitor()) {63 if (!this.present && isEventVisitor()) { 57 64 IEventType eventType = event.getEventType(); 58 if (eventType instanceof StringEventType) {65 if (eventType instanceof StringEventType) { 59 66 this.present = eventType.toString().equals(nameOfEventType()); 60 } else { 67 } 68 else { 61 69 this.present = eventType.getClass().equals(this.eventType.clazz()); 62 70 } 63 71 } 64 72 } 65 73 66 74 public boolean isEventVisitor() { 67 75 return this.eventType != null && this.containedPattern == null; 68 76 } 69 77 70 78 protected String nameOfEventType() { 71 79 String ret = StringUtils.EMPTY; 72 80 Iterable<String> splitted = Splitter.on("_").split(this.eventType.name()); 73 for (String str : splitted) {81 for (String str : splitted) { 74 82 str = str.toLowerCase(); 75 83 ret += Character.toString(str.charAt(0)).toUpperCase() + str.substring(1); … … 77 85 return ret; 78 86 } 79 80 /* (non-Javadoc) 81 * @see de.ugoe.cs.autoquest.tasktrees.treeifc.TaskVisitor#accept(de.ugoe.cs.autoquest.tasktrees.treeifc.ITask) 87 88 /* 89 * (non-Javadoc) 90 * 91 * @see 92 * de.ugoe.cs.autoquest.tasktrees.treeifc.TaskVisitor#accept(de.ugoe.cs.autoquest.tasktrees. 93 * treeifc.ITask) 82 94 */ 83 95 @Override 84 96 public void visit(ITask task) { 85 task.accept(this); 86 97 if (task instanceof ISequence) { 98 this.visit((ISequence) task); 99 } 100 else if (task instanceof IIteration) { 101 this.visit((IIteration) task); 102 } 103 else if (task instanceof ISelection) { 104 this.visit((ISelection) task); 105 } 106 else { 107 this.visit((IOptional) task); 108 } 87 109 } 88 89 /* (non-Javadoc) 90 * @see de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc.ISelection) 110 111 /* 112 * (non-Javadoc) 113 * 114 * @see 115 * de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc 116 * .ISelection) 91 117 */ 92 118 public void visit(ISelection selection) { 93 if (isEventVisitor()) {119 if (isEventVisitor()) { 94 120 retainNodesWherePatternIsPresent(selection); 95 121 this.present = patternIsPresent(); 96 } else { 97 this.present = containedPattern.containedIn(selection); 122 } 123 else { 124 this.present = containedPattern.containedIn(selection); 98 125 } 99 126 } 100 127 101 128 @SuppressWarnings("unchecked") 102 103 for (ITask task : selection.getChildren()) {129 protected void retainNodesWherePatternIsPresent(ISelection selection) { 130 for (ITask task : selection.getChildren()) { 104 131 this.present = false; 105 132 task.accept(this); 106 if (this.present && this.taskType.filterPredicate().apply(selection)) {133 if (this.present && this.taskType.filterPredicate().apply(selection)) { 107 134 this.retainedSelectionTasks.add(selection); 108 135 } 109 if (this.present) {110 136 if (this.present) { 137 break; 111 138 } 112 139 } 113 140 } 114 141 115 142 private boolean patternIsPresent() { 116 143 return !this.retainedSelectionTasks.isEmpty(); 117 144 } 118 145 119 146 /** 120 147 * <p> 121 148 * TODO: comment 122 149 * </p> 123 * 150 * 124 151 * @return 125 152 */ … … 132 159 * TODO: comment 133 160 * </p> 134 * 161 * 135 162 */ 136 163 public void reset() { … … 143 170 * TODO: comment 144 171 * </p> 145 * 172 * 146 173 * @return 147 174 */ … … 154 181 * TODO: comment 155 182 * </p> 156 * 183 * 157 184 * @return 158 185 */ … … 160 187 return this.retainedSelectionTasks; 161 188 } 162 189 163 190 } -
trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/patterns/LongFormUsageProblem.java
r1216 r1217 15 15 package de.ugoe.cs.autoquest.usability.rules.patterns; 16 16 17 import static de.ugoe.cs.autoquest.usability.task tree.filters.EventTypeFilter.MOUSE_CLICK;18 import static de.ugoe.cs.autoquest.usability.task tree.filters.EventTypeFilter.SCROLL;19 import static de.ugoe.cs.autoquest.usability.task tree.filters.EventTypeFilter.TEXT_INPUT;20 import static de.ugoe.cs.autoquest.usability.task tree.filters.TaskTypeFilter.ITERATION;21 import static de.ugoe.cs.autoquest.usability.task tree.filters.TaskTypeFilter.SEQUENCE;17 import static de.ugoe.cs.autoquest.usability.taskmodel.filter.types.EventTypeFilter.MOUSE_CLICK; 18 import static de.ugoe.cs.autoquest.usability.taskmodel.filter.types.EventTypeFilter.SCROLL; 19 import static de.ugoe.cs.autoquest.usability.taskmodel.filter.types.EventTypeFilter.TEXT_INPUT; 20 import static de.ugoe.cs.autoquest.usability.taskmodel.filter.types.TaskTypeFilter.ITERATION; 21 import static de.ugoe.cs.autoquest.usability.taskmodel.filter.types.TaskTypeFilter.SEQUENCE; 22 22 23 23 import com.google.common.base.Optional; … … 25 25 import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskModel; 26 26 import de.ugoe.cs.autoquest.usability.EvaluationMethodCaller; 27 import de.ugoe.cs.autoquest.usability.result. DefectDescriptionResolver;28 import de.ugoe.cs.autoquest.usability.result.Usability Defect;27 import de.ugoe.cs.autoquest.usability.result.UsabilityProblemDescriptionResolver; 28 import de.ugoe.cs.autoquest.usability.result.UsabilityProblemDescription; 29 29 import de.ugoe.cs.autoquest.usability.rules.UsabilityRule; 30 import de.ugoe.cs.autoquest.usability.rules.UsabilityUsage Defect;30 import de.ugoe.cs.autoquest.usability.rules.UsabilityUsageProblem; 31 31 32 32 /** … … 37 37 * @author Alexander Deicke 38 38 */ 39 public class LongFormUsage Defect extends UsabilityRule implements UsabilityUsageDefect{39 public class LongFormUsageProblem extends UsabilityRule implements UsabilityUsageProblem { 40 40 41 41 private InteractionPattern longFormUsagePattern; 42 42 43 43 /** 44 44 * <p> 45 45 * TODO: comment 46 46 * </p> 47 * 47 * 48 48 * @param taskTree 49 49 */ 50 public LongFormUsage Defect(ITaskModel taskModel) {50 public LongFormUsageProblem(ITaskModel taskModel) { 51 51 super(taskModel); 52 52 this.name = "LongFormUsagePattern"; 53 this.defect = new DefectDescriptionResolver().descriptionFor(this.getClass().getSimpleName()); 53 this.defect = 54 new UsabilityProblemDescriptionResolver().descriptionFor(this.getClass() 55 .getSimpleName()); 54 56 initUsagePattern(); 55 57 } … … 59 61 * TODO: comment 60 62 * </p> 61 * 63 * 62 64 */ 63 65 private void initUsagePattern() { 64 InteractionPatternBuilder builder = new InteractionPatternBuilder(); 65 InteractionPattern fillFormPattern = builder.concernedNode(ITERATION).startsWith(TEXT_INPUT).endsWith(SCROLL).build(); 66 this.longFormUsagePattern = builder.concernedNode(SEQUENCE).startsWith(MOUSE_CLICK).contains(fillFormPattern).endsWith(MOUSE_CLICK).build(); 66 InteractionPattern fillFormPattern = 67 InteractionPatternBuilder.newPattern().rootTask(ITERATION).startsWithEvent(TEXT_INPUT) 68 .endsWithEvent(SCROLL).patternFinished().build(); 69 this.longFormUsagePattern = 70 InteractionPatternBuilder.newPattern().rootTask(SEQUENCE).startsWithEvent(MOUSE_CLICK) 71 .containsPattern(fillFormPattern).endsWithEvent(MOUSE_CLICK).patternFinished() 72 .build(); 67 73 } 68 74 69 /* (non-Javadoc) 75 /* 76 * (non-Javadoc) 77 * 70 78 * @see de.ugoe.cs.autoquest.usability.rules.UsabilityRule#check() 71 79 */ 72 80 @Override 73 public Optional<Usability Defect> check() {74 Optional<Usability Defect> present = Optional.absent();75 if (this.longFormUsagePattern.containedIn(taskModel)) {81 public Optional<UsabilityProblemDescription> check() { 82 Optional<UsabilityProblemDescription> present = Optional.absent(); 83 if (this.longFormUsagePattern.containedIn(taskModel)) { 76 84 present = Optional.of(this.defect); 77 85 } … … 79 87 } 80 88 81 /* (non-Javadoc) 82 * @see de.ugoe.cs.autoquest.usability.rules.UsabilityRule#callEvaluationMetho(de.ugoe.cs.autoquest.usability.EvaluationMethodCaller) 89 /* 90 * (non-Javadoc) 91 * 92 * @see 93 * de.ugoe.cs.autoquest.usability.rules.UsabilityRule#callEvaluationMetho(de.ugoe.cs.autoquest 94 * .usability.EvaluationMethodCaller) 83 95 */ 84 96 @Override 85 public Optional<Usability Defect> callEvaluationMethod(EvaluationMethodCaller evaluationMethodCaller)97 public Optional<UsabilityProblemDescription> callEvaluationMethod(EvaluationMethodCaller evaluationMethodCaller) 86 98 { 87 99 return evaluationMethodCaller.check(this); -
trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/patterns/visitors/ContainsEventVisitor.java
r1213 r1217 22 22 import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask; 23 23 import de.ugoe.cs.autoquest.usability.rules.patterns.InteractionPatternVisitor; 24 import de.ugoe.cs.autoquest.usability.task tree.filters.EventTypeFilter;25 import de.ugoe.cs.autoquest.usability.task tree.filters.TaskTypeFilter;24 import de.ugoe.cs.autoquest.usability.taskmodel.filter.types.EventTypeFilter; 25 import de.ugoe.cs.autoquest.usability.taskmodel.filter.types.TaskTypeFilter; 26 26 27 27 /** … … 38 38 * TODO: comment 39 39 * </p> 40 * 40 * 41 41 * @param containsType 42 42 */ … … 46 46 } 47 47 48 /* (non-Javadoc) 49 * @see de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc.IIteration) 48 /* 49 * (non-Javadoc) 50 * 51 * @see 52 * de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc 53 * .IIteration) 50 54 */ 51 55 public void visit(IIteration iteration) { … … 53 57 } 54 58 55 /* (non-Javadoc) 56 * @see de.ugoe.cs.autoquest.tasktrees.treeifc.TaskVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc.IOptional) 59 /* 60 * (non-Javadoc) 61 * 62 * @see 63 * de.ugoe.cs.autoquest.tasktrees.treeifc.TaskVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc 64 * .IOptional) 57 65 */ 58 66 public void visit(IOptional optional) { … … 60 68 } 61 69 62 /* (non-Javadoc) 63 * @see de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence) 70 /* 71 * (non-Javadoc) 72 * 73 * @see 74 * de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc 75 * .ISequence) 64 76 */ 65 77 public void visit(ISequence sequence) { 66 78 checkAllChildrenAndReturnIfPatternIsPresent(sequence.getChildren()); 67 79 } 68 80 69 81 private void checkAllChildrenAndReturnIfPatternIsPresent(List<ITask> children) { 70 82 for (ITask task : children) { -
trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/patterns/visitors/ContainsInteractionPatternVisitor.java
r1213 r1217 22 22 import de.ugoe.cs.autoquest.usability.rules.patterns.InteractionPattern; 23 23 import de.ugoe.cs.autoquest.usability.rules.patterns.InteractionPatternVisitor; 24 import de.ugoe.cs.autoquest.usability.task tree.filters.TaskTypeFilter;24 import de.ugoe.cs.autoquest.usability.taskmodel.filter.types.TaskTypeFilter; 25 25 26 26 /** … … 37 37 * TODO: comment 38 38 * </p> 39 * 39 * 40 40 * @param containsPattern 41 41 */ 42 public ContainsInteractionPatternVisitor(InteractionPattern containsPattern, TaskTypeFilter taskType) { 42 public ContainsInteractionPatternVisitor(InteractionPattern containsPattern, 43 TaskTypeFilter taskType) 44 { 43 45 this.containedPattern = containsPattern; 44 46 this.taskType = taskType; 45 47 } 46 48 47 /* (non-Javadoc) 48 * @see de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc.IIteration) 49 /* 50 * (non-Javadoc) 51 * 52 * @see 53 * de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc 54 * .IIteration) 49 55 */ 50 56 public void visit(IIteration iteration) { … … 52 58 } 53 59 54 /* (non-Javadoc) 55 * @see de.ugoe.cs.autoquest.tasktrees.treeifc.TaskVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc.IOptional) 60 /* 61 * (non-Javadoc) 62 * 63 * @see 64 * de.ugoe.cs.autoquest.tasktrees.treeifc.TaskVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc 65 * .IOptional) 56 66 */ 57 67 public void visit(IOptional optional) { … … 59 69 } 60 70 61 /* (non-Javadoc) 62 * @see de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence) 71 /* 72 * (non-Javadoc) 73 * 74 * @see 75 * de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc 76 * .ISequence) 63 77 */ 64 78 public void visit(ISequence sequence) { 65 79 checkAllChildrenAndReturnIfPatternIsPresent(sequence); 66 80 } 67 81 68 82 private void checkAllChildrenAndReturnIfPatternIsPresent(ISequence sequence) { 69 83 for (ITask child : sequence.getChildren()) { 70 if (checkTaskAndReturnIfPatternIsPresent(child)) {84 if (checkTaskAndReturnIfPatternIsPresent(child)) { 71 85 this.present = true; 72 86 break; … … 74 88 } 75 89 } 76 90 77 91 private boolean checkTaskAndReturnIfPatternIsPresent(ITask task) { 78 if(isEvent(task)) return false; 92 if (isEvent(task)) 93 return false; 79 94 return this.containedPattern.containedIn(task); 80 95 } 81 96 82 97 private boolean isEvent(ITask task) { 83 98 return task instanceof IEventTask; -
trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/patterns/visitors/EndsWithEventVisitor.java
r1213 r1217 19 19 import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence; 20 20 import de.ugoe.cs.autoquest.usability.rules.patterns.InteractionPatternVisitor; 21 import de.ugoe.cs.autoquest.usability.task tree.filters.EventTypeFilter;22 import de.ugoe.cs.autoquest.usability.task tree.filters.TaskTypeFilter;21 import de.ugoe.cs.autoquest.usability.taskmodel.filter.types.EventTypeFilter; 22 import de.ugoe.cs.autoquest.usability.taskmodel.filter.types.TaskTypeFilter; 23 23 import de.ugoe.cs.autoquest.usability.util.PatternsVisitorUtil; 24 24 … … 36 36 * TODO: comment 37 37 * </p> 38 * 38 * 39 39 * @param eventType 40 40 */ … … 44 44 } 45 45 46 /* (non-Javadoc) 47 * @see de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc.IIteration) 46 /* 47 * (non-Javadoc) 48 * 49 * @see 50 * de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc 51 * .IIteration) 48 52 */ 49 53 public void visit(IIteration iteration) { … … 51 55 } 52 56 53 /* (non-Javadoc) 54 * @see de.ugoe.cs.autoquest.tasktrees.treeifc.TaskVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc.IOptional) 57 /* 58 * (non-Javadoc) 59 * 60 * @see 61 * de.ugoe.cs.autoquest.tasktrees.treeifc.TaskVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc 62 * .IOptional) 55 63 */ 56 64 public void visit(IOptional optional) { … … 58 66 } 59 67 60 /* (non-Javadoc) 61 * @see de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence) 68 /* 69 * (non-Javadoc) 70 * 71 * @see 72 * de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc 73 * .ISequence) 62 74 */ 63 75 public void visit(ISequence sequence) { 64 PatternsVisitorUtil.last NodeOf(sequence.getChildren()).accept(this);76 PatternsVisitorUtil.lastSubTaskOf(sequence.getChildren()).accept(this); 65 77 } 66 78 67 79 } -
trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/patterns/visitors/EndsWithInteractionPatternVisitor.java
r1213 r1217 22 22 import de.ugoe.cs.autoquest.usability.rules.patterns.InteractionPattern; 23 23 import de.ugoe.cs.autoquest.usability.rules.patterns.InteractionPatternVisitor; 24 import de.ugoe.cs.autoquest.usability.task tree.filters.TaskTypeFilter;24 import de.ugoe.cs.autoquest.usability.taskmodel.filter.types.TaskTypeFilter; 25 25 import de.ugoe.cs.autoquest.usability.util.PatternsVisitorUtil; 26 26 … … 38 38 * TODO: comment 39 39 * </p> 40 * 40 * 41 41 * @param endsWithPattern 42 42 */ 43 public EndsWithInteractionPatternVisitor(InteractionPattern endsWithPattern, TaskTypeFilter taskType) { 43 public EndsWithInteractionPatternVisitor(InteractionPattern endsWithPattern, 44 TaskTypeFilter taskType) 45 { 44 46 this.containedPattern = endsWithPattern; 45 47 this.taskType = taskType; 46 48 } 47 49 48 /* (non-Javadoc) 49 * @see de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc.IIteration) 50 /* 51 * (non-Javadoc) 52 * 53 * @see 54 * de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc 55 * .IIteration) 50 56 */ 51 57 public void visit(IIteration iteration) { 52 this.present = containedPattern.containedIn(iteration); 58 this.present = containedPattern.containedIn(iteration); 53 59 } 54 60 55 /* (non-Javadoc) 56 * @see de.ugoe.cs.autoquest.tasktrees.treeifc.TaskVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc.IOptional) 61 /* 62 * (non-Javadoc) 63 * 64 * @see 65 * de.ugoe.cs.autoquest.tasktrees.treeifc.TaskVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc 66 * .IOptional) 57 67 */ 58 68 public void visit(IOptional optional) { 59 this.present = containedPattern.containedIn(optional); 69 this.present = containedPattern.containedIn(optional); 60 70 } 61 71 62 /* (non-Javadoc) 63 * @see de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence) 72 /* 73 * (non-Javadoc) 74 * 75 * @see 76 * de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc 77 * .ISequence) 64 78 */ 65 79 public void visit(ISequence sequence) { 66 ITask lastTask = PatternsVisitorUtil.last NodeOf(sequence.getChildren());67 if (isEvent(lastTask)) {80 ITask lastTask = PatternsVisitorUtil.lastSubTaskOf(sequence.getChildren()); 81 if (isEvent(lastTask)) { 68 82 this.present = containedPattern.containedIn(sequence); 69 } else { 83 } 84 else { 70 85 this.present = containedPattern.containedIn(lastTask); 71 } 86 } 72 87 } 73 88 -
trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/patterns/visitors/StartsWithEventVisitor.java
r1213 r1217 19 19 import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence; 20 20 import de.ugoe.cs.autoquest.usability.rules.patterns.InteractionPatternVisitor; 21 import de.ugoe.cs.autoquest.usability.task tree.filters.EventTypeFilter;22 import de.ugoe.cs.autoquest.usability.task tree.filters.TaskTypeFilter;21 import de.ugoe.cs.autoquest.usability.taskmodel.filter.types.EventTypeFilter; 22 import de.ugoe.cs.autoquest.usability.taskmodel.filter.types.TaskTypeFilter; 23 23 import de.ugoe.cs.autoquest.usability.util.PatternsVisitorUtil; 24 24 … … 36 36 * TODO: comment 37 37 * </p> 38 * 38 * 39 39 * @param eventType 40 40 */ … … 44 44 } 45 45 46 /* (non-Javadoc) 47 * @see de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc.IIteration) 46 /* 47 * (non-Javadoc) 48 * 49 * @see 50 * de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc 51 * .IIteration) 48 52 */ 49 53 public void visit(IIteration iteration) { 50 54 iteration.getMarkedTask().accept(this); 51 55 } 52 53 /* (non-Javadoc) 54 * @see de.ugoe.cs.autoquest.tasktrees.treeifc.TaskVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc.IOptional) 56 57 /* 58 * (non-Javadoc) 59 * 60 * @see 61 * de.ugoe.cs.autoquest.tasktrees.treeifc.TaskVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc 62 * .IOptional) 55 63 */ 56 64 public void visit(IOptional optional) { … … 58 66 } 59 67 60 /* (non-Javadoc) 61 * @see de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence) 68 /* 69 * (non-Javadoc) 70 * 71 * @see 72 * de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc 73 * .ISequence) 62 74 */ 63 75 public void visit(ISequence sequence) { 64 PatternsVisitorUtil.first NodeOf(sequence.getChildren()).accept(this);76 PatternsVisitorUtil.firstSubtaskOf(sequence.getChildren()).accept(this); 65 77 } 66 78 67 79 } -
trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/patterns/visitors/StartsWithInteractionPatternVisitor.java
r1213 r1217 22 22 import de.ugoe.cs.autoquest.usability.rules.patterns.InteractionPattern; 23 23 import de.ugoe.cs.autoquest.usability.rules.patterns.InteractionPatternVisitor; 24 import de.ugoe.cs.autoquest.usability.task tree.filters.TaskTypeFilter;24 import de.ugoe.cs.autoquest.usability.taskmodel.filter.types.TaskTypeFilter; 25 25 import de.ugoe.cs.autoquest.usability.util.PatternsVisitorUtil; 26 26 … … 38 38 * TODO: comment 39 39 * </p> 40 * 40 * 41 41 * @param startsWithPattern 42 42 */ 43 public StartsWithInteractionPatternVisitor(InteractionPattern startsWithPattern, TaskTypeFilter taskType) { 43 public StartsWithInteractionPatternVisitor(InteractionPattern startsWithPattern, 44 TaskTypeFilter taskType) 45 { 44 46 this.containedPattern = startsWithPattern; 45 47 this.taskType = taskType; 46 48 } 47 49 48 /* (non-Javadoc) 49 * @see de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc.IIteration) 50 /* 51 * (non-Javadoc) 52 * 53 * @see 54 * de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc 55 * .IIteration) 50 56 */ 51 57 public void visit(IIteration iteration) { 52 this.present = containedPattern.containedIn(iteration); 58 this.present = containedPattern.containedIn(iteration); 53 59 } 54 60 55 /* (non-Javadoc) 56 * @see de.ugoe.cs.autoquest.tasktrees.treeifc.TaskVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc.IOptional) 61 /* 62 * (non-Javadoc) 63 * 64 * @see 65 * de.ugoe.cs.autoquest.tasktrees.treeifc.TaskVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc 66 * .IOptional) 57 67 */ 58 68 public void visit(IOptional optional) { 59 this.present = containedPattern.containedIn(optional); 69 this.present = containedPattern.containedIn(optional); 60 70 } 61 71 62 /* (non-Javadoc) 63 * @see de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence) 72 /* 73 * (non-Javadoc) 74 * 75 * @see 76 * de.ugoe.cs.autoquest.tasktrees.treeifc.NodeVisitor#visit(de.ugoe.cs.autoquest.tasktrees.treeifc 77 * .ISequence) 64 78 */ 65 79 public void visit(ISequence sequence) { 66 ITask firstTask = PatternsVisitorUtil.first NodeOf(sequence.getChildren());67 if (isEvent(firstTask)) {80 ITask firstTask = PatternsVisitorUtil.firstSubtaskOf(sequence.getChildren()); 81 if (isEvent(firstTask)) { 68 82 this.present = containedPattern.containedIn(sequence); 69 } else { 83 } 84 else { 70 85 this.present = containedPattern.containedIn(firstTask); 71 } 86 } 72 87 } 73 88
Note: See TracChangeset
for help on using the changeset viewer.