source: trunk/autoquest-core-usability/src/main/java/de/ugoe/cs/autoquest/usability/TargetDistanceRule.java @ 1918

Last change on this file since 1918 was 1918, checked in by pharms, 9 years ago
  • extension with further smell detections
  • may not fully work. But Hudson is more happy because compile errors should be gone
File size: 5.6 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;
16
17import java.util.HashMap;
18import java.util.LinkedList;
19import java.util.List;
20import java.util.Map;
21
22import de.ugoe.cs.autoquest.eventcore.IEventTarget;
23import de.ugoe.cs.autoquest.eventcore.gui.Scroll;
24import de.ugoe.cs.autoquest.eventcore.guimodel.IGUIElement;
25import de.ugoe.cs.autoquest.tasktrees.treeifc.DefaultTaskInstanceTraversingVisitor;
26import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTaskInstance;
27import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence;
28import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask;
29import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskInstance;
30import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskModel;
31
32/**
33 * TODO comment
34 *
35 * @version $Revision: $ $Date: 16.07.2012$
36 * @author 2012, last modified by $Author: pharms$
37 */
38public class TargetDistanceRule implements UsabilityEvaluationRule {
39
40    /*
41     * (non-Javadoc)
42     *
43     * @see de.ugoe.cs.usability.UsabilityEvaluationRule#evaluate(TaskTree)
44     */
45    @Override
46    public UsabilityEvaluationResult evaluate(ITaskModel taskModel) {
47        UsabilityEvaluationResult results = new UsabilityEvaluationResult(taskModel);
48
49        checkForTargetDistances(results, taskModel);
50
51        return results;
52    }
53
54    /**
55     *
56     */
57    private void checkForTargetDistances(UsabilityEvaluationResult results, ITaskModel taskModel) {
58        for (ITask task : taskModel.getTasks()) {
59            if (task instanceof ISequence) {
60
61                int cummulativeNoOfHops = 0;
62                int cummulativeDistance = 0;
63
64                for (ITaskInstance instance : task.getInstances()) {
65                    int[] stats = getTargetDistance(instance);
66                    cummulativeNoOfHops += stats[0] - 1;
67                    cummulativeDistance += stats[1];
68                }
69
70                createHighTargetDisanceIfRequired
71                    (cummulativeNoOfHops, cummulativeDistance, task, results, taskModel);
72            }
73        }
74    }
75
76    /**
77     *
78     */
79    private int[] getTargetDistance(ITaskInstance instance) {
80        List<IEventTarget> eventTargets = new LinkedList<IEventTarget>();
81        getEventTargets(instance, eventTargets);
82        int noOfGUIElements = eventTargets.size();
83        int distance = 0;
84       
85        while (eventTargets.size() > 1) {
86            distance += getDistance(eventTargets.get(0), eventTargets.get(1));
87            eventTargets.remove(0);
88        }
89       
90        return new int[] { noOfGUIElements, distance };
91    }
92
93    /**
94     *
95     */
96    private int getDistance(IEventTarget eventTarget1, IEventTarget eventTarget2) {
97        if ((eventTarget1 instanceof IGUIElement) && (eventTarget2 instanceof IGUIElement)) {
98            return (int)
99                (1000 * (((IGUIElement) eventTarget1).getDistanceTo((IGUIElement) eventTarget2)));
100        }
101        else if (eventTarget1.equals(eventTarget2)) {
102            return 0;
103        }
104        else {
105            return 1000;
106        }
107    }
108
109    /**
110     *
111     */
112    private void getEventTargets(ITaskInstance instance, final List<IEventTarget> eventTargets) {
113        instance.accept(new DefaultTaskInstanceTraversingVisitor() {
114            @Override
115            public void visit(IEventTaskInstance eventTaskInstance) {
116                if (!(eventTaskInstance.getEvent().getType() instanceof Scroll)) {
117                    eventTargets.add(eventTaskInstance.getEvent().getTarget());
118                }
119            }
120        });
121    }
122
123    /**
124     *
125     */
126    private void createHighTargetDisanceIfRequired(int                       cummulativeNoOfHops,
127                                                   int                       cummulativeDistance,
128                                                   ITask                     task,
129                                                   UsabilityEvaluationResult results,
130                                                   ITaskModel                taskModel)
131    {
132        if ((cummulativeDistance > 0) && (cummulativeNoOfHops > 0)) {
133            int ratio = cummulativeDistance / cummulativeNoOfHops;
134
135            // for HTML: 800 means not even on the same server
136            // for HTML: 600 means not on the same page
137            // for HTML: 501 means in average not on the same page
138            UsabilitySmellIntensity severity =
139                UsabilitySmellIntensity.getIntensity(ratio, task, taskModel);
140
141            if (severity != null) {
142                double averageNoOfGUIElements =
143                    ((double) cummulativeNoOfHops / task.getInstances().size()) + 1;
144               
145                Map<String, Object> parameters = new HashMap<String, Object>();
146                parameters.put("task", task);
147                parameters.put("noOfGUIElements", averageNoOfGUIElements);
148                parameters.put("distance", ((double) ratio / 1000));
149
150                results.addSmell
151                    (task, severity, UsabilitySmellDescription.HIGH_TARGET_DISTANCE, parameters);
152            }
153        }
154    }
155
156}
Note: See TracBrowser for help on using the repository browser.