// Copyright 2012 Georg-August-Universität Göttingen, Germany // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package de.ugoe.cs.autoquest.tasktrees.temporalrelation; import java.util.ArrayList; import java.util.List; import de.ugoe.cs.autoquest.eventcore.guimodel.IGUIElement; import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTask; import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence; import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeBuilder; import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeNode; import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeNodeFactory; /** * This rule structures the task tree based on GUI elements of the GUI model. The rule can * be provided with a filter for considered GUI elements. It generates sub sequences for any * GUI element in the hierarchy matching the filter so that each sequence represents all * interactions in a certain GUI element. * * @version $Revision: $ $Date: 18.03.2012$ * @author 2012, last modified by $Author: patrick$ */ class DefaultGuiElementSequenceDetectionRule implements TemporalRelationshipRule { /** *
* the task tree node factory to be used for creating substructures for the temporal * relationships identified during rule *
*/ private ITaskTreeNodeFactory taskTreeNodeFactory; /** ** the task tree builder to be used for creating substructures for the temporal relationships * identified during rule application *
*/ private ITaskTreeBuilder taskTreeBuilder; /** ** the GUI element filter to be applied or null if none is specified. *
*/ private List* instantiates the rule with a task tree node factory and builder to be used during rule * application but without a GUI element filter *
* * @param taskTreeNodeFactory the task tree node factory to be used for creating substructures * for the temporal relationships identified during rule * application * @param taskTreeBuilder the task tree builder to be used for creating substructures for * the temporal relationships identified during rule application */ DefaultGuiElementSequenceDetectionRule(ITaskTreeNodeFactory taskTreeNodeFactory, ITaskTreeBuilder taskTreeBuilder) { this(null, taskTreeNodeFactory, taskTreeBuilder); } /** ** instantiates the rule with a GUI element filter. Only those types given in the filter will * be considered during the rule application. For all other types, no subsequences will be * created. *
* * @param guiElementFilter the GUI element filter to be applied * @param taskTreeNodeFactory the task tree node factory to be used for creating substructures * for the temporal relationships identified during rule * application * @param taskTreeBuilder the task tree builder to be used for creating substructures for * the temporal relationships identified during rule application */ DefaultGuiElementSequenceDetectionRule(List* generates subsequences for all groups of children of the provided parent, that operate * in different GUI elements at the provided hierarchy level. It will not generate a sub * sequence for the last elements, if the rule application shall not finalize. *
* * @param parent the parent node of which the children shall be grouped * @param hierarchies the GUI hierarchies for the children of the parent * @param hierarchyLevel the current hierarchy level to be considered * @param maxHierarchyDepth the maximum hierarchy depth that may apply in this application * @param finalize true, if the application shall be finalized, false else * @param result the result of the rule application to add newly created parent * nodes to * * @return RULE_APPLICATION_FINISHED, if at least one subsequence was generated, * RULE_APPLICATION_FEASIBLE, if the application shall not be finalized but some * children could be condensed if further data was available, and RULE_NOT_APPLIED, * if no subsequence was created and none is can be created, because no further * data is expected */ private RuleApplicationStatus generateSubSequences(ITaskTreeNode parent, List* condenses a specified group of children on the provided parent to a subsequences and * calls {@link #generateSubSequences(ITaskTreeNode, List, int, boolean, ITaskTreeBuilder, ITaskTreeNodeFactory, RuleApplicationResult)} * for the newly created subsequence. The method does not condense subgroups consisting of * only one child which is already a sequence. *
* * @param parent the parent task of which children shall be condensed * @param hierarchies the GUI element hierarchies of the children of the parent * @param hierarchyLevel the currently considered GUI element hierarchy level * @param startIndex the index of the first child belonging to the subgroup * @param endIndex the index of the last child belonging to the subgroup * @param result the result of the rule application to add newly created parent nodes to * * @return RULE_APPLICATION_FINISHED, if at the subsequence was generated and RULE_NOT_APPLIED, * if no subsequence was created, because only one child belonged to the group which * was already a sequence */ private RuleApplicationStatus condenseSequence(ITaskTreeNode parent, List* return a common denominator for the provided list of GUI elements, i.e. a GUI element, that * is part of the parent GUI hiearchy of all GUI elements in the list. If there is no common * denominator, the method returns null. *
*/ private IGUIElement getCommonDenominator(List* returns the GUI element on which all interactions of the provided task takes place. If * the task is a simple event task its target is returned. If the task is a parent task * of several children, the common denominator of the GUI elements of all its children is * returned. The method returns null, if there is no common GUI element for all events * represented by the provided task. *
*/ private IGUIElement getGuiElement(ITaskTreeNode node) { if (node != null) { List* recursive method calling itself to determine all terminal GUI elements of the provided * task. The terminal GUI elements are stored in the provided list. *
*/ private void getTerminalGuiElements(ITaskTreeNode node, List* returns a list of GUI elements that represents the whole GUI element hierarchy of the * provided GUI element. The method considers the GUI element filter applied by this rule. *
*/ private List* returns for a given GUI element the next GUI element in the upper GUI element hierarchy * that matches the GUI element filter of the rule. If the provided GUI element already * matches the filter, it is returned directly. *
*/ private IGUIElement searchHierarchyForGuiElementWithConsideredType(IGUIElement guiElement) { IGUIElement returnValue = guiElement; while ((returnValue != null) && !guiElementMatchesConsideredTypes(returnValue)) { returnValue = returnValue.getParent(); } return returnValue; } /** ** checks if the provided GUI element matches the GUI element filter applied by the rule. *
*/ private boolean guiElementMatchesConsideredTypes(IGUIElement guiElement) { if (guiElementFilter == null) { return true; } else { for (Class extends IGUIElement> clazz : guiElementFilter) { if (clazz.isInstance(guiElement)) { return true; } } return false; } } }