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 | |
---|
15 | package de.ugoe.cs.autoquest.tasktrees.manager;
|
---|
16 |
|
---|
17 | import java.util.Collection;
|
---|
18 | import java.util.LinkedList;
|
---|
19 | import java.util.List;
|
---|
20 | import java.util.logging.Level;
|
---|
21 |
|
---|
22 | import de.ugoe.cs.autoquest.eventcore.Event;
|
---|
23 | import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask; |
---|
24 | import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskModel;
|
---|
25 | import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskBuilder;
|
---|
26 | import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskFactory;
|
---|
27 | import de.ugoe.cs.autoquest.tasktrees.treeifc.IUserSession; |
---|
28 | import de.ugoe.cs.util.console.Console;
|
---|
29 |
|
---|
30 | /**
|
---|
31 | * <p> |
---|
32 | * The task tree manager is responsible for transforming one or more user sessions into a task |
---|
33 | * model. It can be called by providing a collection of user sessions where the result |
---|
34 | * will be a task model. Furthermore, it can be used by providing single events in their respective |
---|
35 | * order including notifications about where a user session ends. The result is a task model, |
---|
36 | * as well. |
---|
37 | * </p> |
---|
38 | * |
---|
39 | * @version 1.0 |
---|
40 | * @author pharms |
---|
41 | */
|
---|
42 | public class TaskTreeManager {
|
---|
43 |
|
---|
44 | /** |
---|
45 | * <p> |
---|
46 | * the internally used task builder |
---|
47 | * </p> |
---|
48 | */
|
---|
49 | private ITaskBuilder taskBuilder = ComponentManager.getDefaultTaskBuilder();
|
---|
50 |
|
---|
51 | /** |
---|
52 | * <p> |
---|
53 | * the internally used task factory |
---|
54 | * </p> |
---|
55 | */ |
---|
56 | private ITaskFactory taskFactory = ComponentManager.getDefaultTaskFactory();
|
---|
57 |
|
---|
58 | /** |
---|
59 | * <p> |
---|
60 | * if single events are provided, the user sessions collected so far |
---|
61 | * </p> |
---|
62 | */ |
---|
63 | private List<IUserSession> sessions = null;
|
---|
64 |
|
---|
65 | /** |
---|
66 | * <p> |
---|
67 | * if single events are provided, the currently collected user session |
---|
68 | * </p> |
---|
69 | */ |
---|
70 | private IUserSession currentSession = null;
|
---|
71 |
|
---|
72 | /**
|
---|
73 | * <p> |
---|
74 | * initializes the task tree manager |
---|
75 | * </p> |
---|
76 | */
|
---|
77 | public TaskTreeManager() {
|
---|
78 | sessions = new LinkedList<IUserSession>();
|
---|
79 | }
|
---|
80 |
|
---|
81 | /**
|
---|
82 | * <p> |
---|
83 | * creates a task model based on the provided user sessions. Yet, the user sessions are |
---|
84 | * list of events. Such will be transformed in into task instances of event tasks assigned |
---|
85 | * to {@link IUserSession}s. The {@link IUserSession}s will then be restructured using |
---|
86 | * the temporal relationship rule manager to detect tasks and respective instances. The |
---|
87 | * results of this transformation is stored in a task model which is the return value of |
---|
88 | * this method. |
---|
89 | * </p> |
---|
90 | * |
---|
91 | * @param newSessions the user sessions of which the task model shall be created |
---|
92 | * |
---|
93 | * @return the task model created from the user sessions |
---|
94 | * |
---|
95 | * @throws IllegalStateException if the task manager is already used by providing it with |
---|
96 | * single events |
---|
97 | */
|
---|
98 | public synchronized ITaskModel createTaskModel(Collection<List<Event>> newSessions) {
|
---|
99 | if ((currentSession != null) || (sessions.size() > 0)) {
|
---|
100 | throw new IllegalStateException("do not mix calls to this method with calls to the " +
|
---|
101 | "other methods for handling tasks. Use only one " +
|
---|
102 | "variant instead.");
|
---|
103 | }
|
---|
104 |
|
---|
105 | for (List<Event> newSession : newSessions) {
|
---|
106 | if (newSession.size() > 0) {
|
---|
107 | for (Event event : newSession) {
|
---|
108 | handleNewEvent(event);
|
---|
109 | }
|
---|
110 | finishSession();
|
---|
111 | }
|
---|
112 | }
|
---|
113 |
|
---|
114 | return getTaskModel();
|
---|
115 | }
|
---|
116 |
|
---|
117 | /**
|
---|
118 | * <p> |
---|
119 | * handles a single event that occurred in a user session. |
---|
120 | * </p> |
---|
121 | * |
---|
122 | * @param event the event to handle
|
---|
123 | */
|
---|
124 | public void handleNewEvent(Event event) {
|
---|
125 | assertSessionSequence(); |
---|
126 | ITask eventTask = taskFactory.createNewEventTask(event.getType(), event.getTarget());
|
---|
127 | taskBuilder.addExecutedTask(currentSession, taskFactory.createNewTaskInstance(eventTask));
|
---|
128 | }
|
---|
129 |
|
---|
130 | /**
|
---|
131 | * <p> |
---|
132 | * used to denote, that all previously added events using {@link #handleNewEvent(Event)} |
---|
133 | * belong to the same session and that this session is now complete. All further events |
---|
134 | * will be added to a new session which may be ended using this method, as well. |
---|
135 | * </p> |
---|
136 | */
|
---|
137 | public void finishSession() {
|
---|
138 | if ((currentSession != null) && (currentSession.getExecutedTasks().size() > 0)) {
|
---|
139 | sessions.add(currentSession);
|
---|
140 | currentSession = null;
|
---|
141 | }
|
---|
142 | }
|
---|
143 |
|
---|
144 | /**
|
---|
145 | * <p> |
---|
146 | * returns the task model, that belongs to the events in the user sessions collected so far. |
---|
147 | * </p> |
---|
148 | * |
---|
149 | * @return the task model |
---|
150 | */
|
---|
151 | public synchronized ITaskModel getTaskModel() {
|
---|
152 | finishSession();
|
---|
153 |
|
---|
154 | Console.traceln(Level.INFO, "applying temporal relationship generation rules");
|
---|
155 |
|
---|
156 | ComponentManager.getTemporalRelationshipRuleManager().applyRules(sessions);
|
---|
157 |
|
---|
158 | return taskFactory.createTaskModel(sessions);
|
---|
159 | }
|
---|
160 |
|
---|
161 | /**
|
---|
162 | * <p> |
---|
163 | * internally asserts that there is a current session to add new events to |
---|
164 | * </p> |
---|
165 | */
|
---|
166 | private void assertSessionSequence() {
|
---|
167 | if (currentSession == null) {
|
---|
168 | currentSession = taskFactory.createUserSession();
|
---|
169 | }
|
---|
170 | }
|
---|
171 |
|
---|
172 | }
|
---|