source: trunk/autoquest-core-usability-evaluation/src/main/java/de/ugoe/cs/autoquest/usability/rules/patterns/UsagePattern.java @ 1150

Last change on this file since 1150 was 1150, checked in by adeicke, 11 years ago

Added usage patterns and mechanism for detecting them.

  • Property svn:mime-type set to text/plain
File size: 4.3 KB
Line 
1//   Copyright 2012 Georg-August-Universität Göttingen, Germany
2//
3//   Licensed under the Apache License, Version 2.0 (the "License");
4//   you may not use this file except in compliance with the License.
5//   You may obtain a copy of the License at
6//
7//       http://www.apache.org/licenses/LICENSE-2.0
8//
9//   Unless required by applicable law or agreed to in writing, software
10//   distributed under the License is distributed on an "AS IS" BASIS,
11//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12//   See the License for the specific language governing permissions and
13//   limitations under the License.
14
15package de.ugoe.cs.autoquest.usability.rules.patterns;
16
17import java.util.Arrays;
18import java.util.List;
19
20import com.google.common.base.Optional;
21import com.google.common.base.Predicate;
22import com.google.common.collect.Iterables;
23
24import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTree;
25import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeNode;
26import de.ugoe.cs.autoquest.usability.tasktree.IterativeDFSFilterStrategy;
27import de.ugoe.cs.autoquest.usability.tasktree.filters.TaskTreeFilter;
28import de.ugoe.cs.autoquest.usability.tasktree.filters.TaskTreeNodeTypeFilter;
29
30/**
31 * <p>
32 * TODO comment
33 * </p>
34 *
35 * @author Alexander Deicke
36 */
37public class UsagePattern {
38   
39    private TaskTreeFilter taskTreeFilter = new TaskTreeFilter(new IterativeDFSFilterStrategy());
40   
41    private TaskTreeNodeTypeFilter concernedNode;
42
43    private List<UsagePatternVisitor> patternVisitors;
44   
45    private boolean present = false;
46   
47    /**
48     * <p>
49     * TODO: comment
50     * </p>
51     *
52     * @param concernedNode
53     * @param eventType
54     */
55    public UsagePattern(TaskTreeNodeTypeFilter concernedNode,
56                        UsagePatternVisitor... patternVisitor)
57    {
58        this.patternVisitors = Arrays.asList(patternVisitor);
59        this.concernedNode = concernedNode;
60    }
61
62    public boolean containedIn(ITaskTree taskTree) {
63        List<ITaskTreeNode> allConcernedNodes = filterAllConcernedNodeFrom(taskTree);
64        for(ITaskTreeNode concernedNode : allConcernedNodes) {
65            applyAllVisitors(concernedNode);
66            if(allVisitorsArePresent()) {
67                this.present = true;
68                break;
69            } else {
70                resetAllVisitors();
71            }
72           
73        }
74        return this.present;
75    }
76
77    private void applyAllVisitors(ITaskTreeNode concernedNode) {
78        Optional<UsagePatternVisitor> previousVisitor = Optional.absent();
79        for(UsagePatternVisitor visitor : patternVisitors) {
80            if(appliedOnSelectionNode(previousVisitor)) {
81                for(ITaskTreeNode selectionNode : previousVisitor.get().getRetainedSelectionNodes()) {
82                    selectionNode.accept(visitor);
83                }
84            } else {
85                previousVisitor = Optional.of(visitor);
86                concernedNode.accept(visitor);
87            }
88        }
89    }
90
91    private boolean appliedOnSelectionNode(Optional<UsagePatternVisitor> previousVisitor) {
92        return previousVisitor.isPresent() && previousVisitor.get().hasExcludedSelectionNodes();
93    }
94
95    /**
96     * <p>
97     * TODO: comment
98     * </p>
99     *
100     * @param taskTree
101     * @return
102     */
103    private List<ITaskTreeNode> filterAllConcernedNodeFrom(ITaskTree taskTree) {
104        return this.taskTreeFilter.filterByNodeType(this.concernedNode).from(taskTree).nodesMatchedFilter();
105    }
106   
107    /**
108     * <p>
109     * TODO: comment
110     * </p>
111     *
112     * @return
113     */
114    private boolean allVisitorsArePresent() {
115        Iterable<UsagePatternVisitor> allPresent = Iterables.filter(this.patternVisitors, new Predicate<UsagePatternVisitor>() {
116           
117            public boolean apply(UsagePatternVisitor visitor) {
118                return visitor.isPresent();
119            }
120           
121        });
122        return Iterables.size(allPresent) == this.patternVisitors.size();
123    }
124   
125    /**
126     * <p>
127     * TODO: comment
128     * </p>
129     *
130     */
131    private void resetAllVisitors() {
132        for(UsagePatternVisitor visitor : this.patternVisitors) {
133            visitor.reset();
134        }
135       
136    }
137
138}
Note: See TracBrowser for help on using the repository browser.