package de.ugoe.cs.autoquest.tasktrees.manager; import java.util.Collection; import java.util.List; import java.util.logging.Level; import de.ugoe.cs.autoquest.eventcore.Event; import de.ugoe.cs.autoquest.eventcore.gui.KeyboardFocusChange; import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTask; import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence; import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTree; import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeBuilder; import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeNode; import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeNodeFactory; import de.ugoe.cs.util.console.Console; /** * TODO comment * * @version $Revision: $ $Date: $ * @author 2011, last modified by $Author: $ */ public class TaskTreeManager { /** */ private static final int MAX_EVENTS_TILL_RULE_APPLICATION = 100; /** */ private ITaskTreeBuilder taskTreeBuilder = ComponentManager.getDefaultTaskTreeBuilder(); /** */ private ITaskTreeNodeFactory taskTreeNodeFactory = ComponentManager.getDefaultTaskTreeNodeFactory(); /** */ private int eventsTillRuleApplication = MAX_EVENTS_TILL_RULE_APPLICATION; /** */ private ISequence rootSequence; /** * TODO: comment * */ public TaskTreeManager() { rootSequence = taskTreeNodeFactory.createNewSequence(); } /** *

* TODO: comment *

* * @param sequences * @return */ public synchronized ITaskTree createTaskTree(Collection> sequences) { for (List sequence : sequences) { for (Event event : sequence) { handleNewEvent(event); } } return getTaskTree(); } /** * */ public void handleNewEvent(Event event) { handleEventTask(taskTreeNodeFactory.createNewEventTask(event.getType(), event.getTarget())); } /** * */ public synchronized ITaskTree getTaskTree() { Console.traceln(Level.INFO, "applying temporal relationship generation rules"); ISequence currentRootSequence = rootSequence.clone(); ComponentManager.getTemporalRelationshipRuleManager().applyRules (currentRootSequence, taskTreeBuilder, taskTreeNodeFactory, true); return taskTreeNodeFactory.createTaskTree(currentRootSequence); } /** * adds the task to the current or the new sequence. The decision depends on the type of task. * If the task finishes the current sequence, the sequence is marked as finished If the task * does not start a new sequence, it is added to the current sequence, before it is marked s * finished. Otherwise it is added to a new sequence. */ private synchronized void handleEventTask(IEventTask eventTask) { if (!(eventTask.getEventType() instanceof KeyboardFocusChange)) { Console.traceln(Level.INFO, "handling interaction event task \"" + eventTask + "\""); addTaskToSequence(eventTask); } } /** * */ private void addTaskToSequence(ITaskTreeNode task) { taskTreeBuilder.addChild(rootSequence, task); if (--eventsTillRuleApplication == 0) { eventsTillRuleApplication = MAX_EVENTS_TILL_RULE_APPLICATION; Console.traceln(Level.INFO, "applying temporal relationship generation rules"); ComponentManager.getTemporalRelationshipRuleManager().applyRules(rootSequence, taskTreeBuilder, taskTreeNodeFactory, false); } } }