source: trunk/autoquest-plugin-usability2/src/main/java/de/ugoe/cs/autoquest/plugin/usability2/rules/operator/wrapper/FollowedByUtil.java @ 1326

Last change on this file since 1326 was 1326, checked in by khartmann, 10 years ago

Moved alexanders code into a new plugin project.
First commit of my experimental code (needs a lot of cleanup).

File size: 4.9 KB
Line 
1
2package de.ugoe.cs.autoquest.plugin.usability2.rules.operator.wrapper;
3
4import java.util.ArrayList;
5import java.util.LinkedList;
6import java.util.List;
7
8import de.ugoe.cs.autoquest.plugin.usability2.meta.Untested;
9import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTask;
10import de.ugoe.cs.autoquest.tasktrees.treeifc.IIteration;
11import de.ugoe.cs.autoquest.tasktrees.treeifc.IOptional;
12import de.ugoe.cs.autoquest.tasktrees.treeifc.ISelection;
13import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence;
14import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask;
15import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskVisitor;
16
17@Untested
18public class FollowedByUtil {
19
20    private FollowedByUtil() {}
21
22    static class Visitor implements ITaskVisitor {
23        private List<ITaskEntry> next;
24        private TaskWrapper current;
25        private final ITaskEntry root;
26
27        public Visitor(ITask task) {
28            next = new LinkedList<ITaskEntry>();
29            current = new TaskWrapper(task);
30            InstanceUtility.setupInstances(current);
31
32            root = current;
33        }
34
35        public ITaskEntry getRoot() {
36            return root;
37        }
38
39        private TaskWrapper setup(ITask value) {
40            TaskWrapper cur = this.current;
41
42            if (cur.parent != null)
43                cur.parent.addChild(cur);
44
45            this.next = cur.next;
46            return cur;
47        }
48
49        private void finish(ITaskWrapper cur) {}
50
51        @Override
52        public void visit(IEventTask eventTask) {
53            TaskWrapper cur = setup(eventTask);
54            finish(cur);
55        }
56
57        @Override
58        public void visit(IIteration iteration) {
59            TaskWrapper cur = setup(iteration);
60
61            List<ITaskEntry> n = new ArrayList<ITaskEntry>(this.next.size() + 1);
62            TaskProxy p = new TaskProxy();
63            n.add(p);
64            n.addAll(this.next);
65            this.next = n;
66
67            ITaskWrapper c = accept(cur, iteration.getMarkedTask(), this.next);
68            p.setReference(c);
69
70            finish(cur);
71        }
72
73        private ITaskWrapper accept(ITaskWrapper cur, ITask task, List<ITaskEntry> next) {
74            TaskWrapper t = new TaskWrapper(task, cur, next);
75            InstanceUtility.setupInstances(t);
76
77            this.current = t;
78            task.accept(this);
79            return t;
80        }
81
82        @Override
83        public void visit(IOptional optional) {
84            TaskWrapper cur = setup(optional);
85            accept(cur, optional.getMarkedTask(), next);
86            finish(cur);
87        }
88
89        @Override
90        public void visit(ISelection selection) {
91            TaskWrapper cur = setup(selection);
92
93            for (ITask child : selection.getChildren()) {
94                accept(cur, child, cur.getNext());
95            }
96
97            finish(cur);
98        }
99
100        @Override
101        public void visit(ISequence sequence) {
102            /*
103             * Each entry of a sequence is followed by its predecessor. Thus the Wrappers have to be
104             * setup in back-to-front order, but visited in front-to-back order.
105             */
106            TaskWrapper cur = setup(sequence);
107
108            List<ITask> childrenList = sequence.getChildren();
109
110            ITask[] children = childrenList.toArray(new ITask[childrenList.size()]);
111            ITaskEntry[] cArray = new ITaskEntry[children.length];
112
113            if (children.length == 0)
114                return;
115
116            int id = children.length - 1;
117            TaskWrapper nextElement = new TaskWrapper(children[id], cur, next);
118            InstanceUtility.setupSequence(nextElement, id);
119
120            cArray[id] = nextElement;
121
122            id--;
123            for (; id >= 0; id--) {
124                nextElement = new TaskWrapper(children[id], cur, nextElement);
125                InstanceUtility.setupSequence(nextElement, id);
126                cArray[id] = nextElement;
127            }
128
129            for (ITaskEntry child : cArray) {
130                this.current = (TaskWrapper) child;
131                child.getReference().accept(this);
132            }
133
134            finish(cur);
135        }
136
137        @Override
138        public void visit(ITask task) {
139            if (task instanceof IEventTask) {
140                visit((IEventTask) task);
141            }
142            else if (task instanceof IIteration) {
143                visit((IIteration) task);
144            }
145            else if (task instanceof IOptional) {
146                visit((IOptional) task);
147            }
148            else if (task instanceof ISelection) {
149                visit((ISelection) task);
150            }
151            else if (task instanceof ISequence) {
152                visit((ISequence) task);
153            }
154        }
155    }
156
157    /**
158     *
159     * <p>
160     * TODO: comment
161     * </p>
162     *
163     * @param task
164     * @return
165     */
166    public static ITaskEntry generateFollowList(ITask task) {
167        Visitor v = new Visitor(task);
168        v.visit(task);
169        return v.getRoot();
170    }
171}
Note: See TracBrowser for help on using the repository browser.