source: trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/manager/TaskTreeManager.java @ 1889

Last change on this file since 1889 was 1889, checked in by pharms, 9 years ago
  • added support for separating task tree generation and merging
  • Property svn:executable set to *
File size: 6.5 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.tasktrees.manager;
16
17import java.util.Collection;
18import java.util.LinkedList;
19import java.util.List;
20import java.util.logging.Level;
21
22import de.ugoe.cs.autoquest.eventcore.Event;
23import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTask;
24import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskModel;
25import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskBuilder;
26import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskFactory;
27import de.ugoe.cs.autoquest.tasktrees.treeifc.IUserSession;
28import 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 */
42public 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        String description = event.getType().getName() + " \u21D2 " + event.getTarget();
127        IEventTask eventTask = taskFactory.createNewEventTask(description);
128        taskBuilder.addExecutedTask
129            (currentSession, taskFactory.createNewTaskInstance(eventTask, event));
130    }
131
132    /**
133     * <p>
134     * used to denote, that all previously added events using {@link #handleNewEvent(Event)}
135     * belong to the same session and that this session is now complete. All further events
136     * will be added to a new session which may be ended using this method, as well.
137     * </p>
138     */
139    public void finishSession() {
140        if ((currentSession != null) && (currentSession.size() > 0)) {
141            sessions.add(currentSession);
142            currentSession = null;
143        }
144    }
145
146    /**
147     * <p>
148     * returns the task model, that belongs to the events in the user sessions collected so far.
149     * </p>
150     *
151     * @return the task model
152     */
153    public synchronized ITaskModel getTaskModel() {
154        finishSession();
155       
156        Console.traceln
157            (Level.INFO, "applying temporal relationship generation rules for detecting tasks");
158       
159        ComponentManager.getTemporalRelationshipRuleManager().applyTaskDetectionRule(sessions);
160
161        return taskFactory.createTaskModel(sessions);
162    }
163
164    /**
165     * <p>
166     * merges similar tasks in the given task model and returns a condensed task model
167     * </p>
168     *
169     * @param inputModel the model with the tasks to be merged
170     *
171     * @return as described
172     */
173    public synchronized ITaskModel mergeSimilarTasks(ITaskModel inputModel) {
174        Console.traceln
175            (Level.INFO, "applying temporal relationship generation rules for merging tasks");
176       
177        sessions = inputModel.getUserSessions();
178       
179        ComponentManager.getTemporalRelationshipRuleManager().applyTaskMergingRule(sessions);
180
181        return taskFactory.createTaskModel(sessions);
182    }
183
184    /**
185     * <p>
186     * internally asserts that there is a current session to add new events to
187     * </p>
188     */
189    private void assertSessionSequence() {
190        if (currentSession == null) {
191            currentSession = taskFactory.createUserSession();
192        }
193    }
194
195}
Note: See TracBrowser for help on using the repository browser.