Changeset 1400


Ignore:
Timestamp:
02/26/14 17:11:14 (10 years ago)
Author:
pharms
Message:
  • added possibility to determine execution variants of a task
Location:
trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeifc/ITask.java

    r1357 r1400  
    7171    /** 
    7272     * <p> 
     73     * returns a collection of collections of all different execution variants of this task. This 
     74     * is a grouping of all instances where each group contains structurally identical instances. 
     75     * </p> 
     76     *  
     77     * @return as described 
     78     */ 
     79    public Collection<Collection<ITaskInstance>> getExecutionVariants(); 
     80 
     81    /** 
     82     * <p> 
    7383     * checks whether this task is equal to another one. Task equality is only given, if two 
    7484     * tasks have the same id. This means, that this method must only return true if the other 
  • trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/treeimpl/Task.java

    r1357 r1400  
    1818import java.util.Collections; 
    1919import java.util.HashSet; 
    20  
     20import java.util.LinkedList; 
     21 
     22import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTaskInstance; 
     23import de.ugoe.cs.autoquest.tasktrees.treeifc.IIterationInstance; 
     24import de.ugoe.cs.autoquest.tasktrees.treeifc.IOptionalInstance; 
     25import de.ugoe.cs.autoquest.tasktrees.treeifc.ISelectionInstance; 
     26import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequenceInstance; 
    2127import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask; 
    2228import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskInstance; 
     29import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskInstanceList; 
    2330import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskVisitor; 
    2431 
     
    3138 * @author Patrick Harms 
    3239 */ 
    33 class Task implements ITask { 
     40abstract class Task implements ITask { 
    3441 
    3542    /** 
     
    7582     */ 
    7683    private Collection<ITaskInstance> instances = new HashSet<ITaskInstance>(); 
     84     
     85    /** 
     86     * <p> 
     87     * the execution variants of this task 
     88     * </p> 
     89     */ 
     90    private Collection<Collection<ITaskInstance>> executionVariants; 
    7791 
    7892    /** 
     
    141155    public Collection<ITaskInstance> getInstances() { 
    142156        return Collections.unmodifiableCollection(instances); 
     157    } 
     158 
     159    /* (non-Javadoc) 
     160     * @see de.ugoe.cs.autoquest.tasktrees.treeifc.ITask#getExecutionVariants() 
     161     */ 
     162    @Override 
     163    public synchronized Collection<Collection<ITaskInstance>> getExecutionVariants() { 
     164        if (executionVariants == null) { 
     165            executionVariants = new LinkedList<Collection<ITaskInstance>>(); 
     166            determineExecutionVariants(executionVariants); 
     167        } 
     168         
     169        return executionVariants; 
    143170    } 
    144171 
     
    215242     * @param instance the instance to be removed from this task 
    216243     */ 
    217     void removeInstance(ITaskInstance instance) { 
     244    synchronized void removeInstance(ITaskInstance instance) { 
    218245        this.instances.remove(instance); 
     246        this.executionVariants = null; 
    219247    } 
    220248 
     
    226254     * @param instance the instance belonging to this task 
    227255     */ 
    228     void addInstance(ITaskInstance instance) { 
     256    synchronized void addInstance(ITaskInstance instance) { 
    229257        this.instances.add(instance); 
     258        this.executionVariants = null; 
    230259    } 
    231260     
     
    238267    } 
    239268 
     269    /** 
     270     * 
     271     */ 
     272    private void determineExecutionVariants(Collection<Collection<ITaskInstance>> executionVariants) 
     273    { 
     274        for (ITaskInstance instance : instances) { 
     275            boolean added = false; 
     276            for (Collection<ITaskInstance> variant : executionVariants) { 
     277                if (!variant.isEmpty() && (isSameExecution(variant.iterator().next(), instance))) { 
     278                    variant.add(instance); 
     279                    added = true; 
     280                } 
     281            } 
     282             
     283            if (!added) { 
     284                Collection<ITaskInstance> variant = new HashSet<ITaskInstance>(); 
     285                variant.add(instance); 
     286                executionVariants.add(variant); 
     287            } 
     288        } 
     289    } 
     290 
     291    /** 
     292     * 
     293     */ 
     294    private boolean isSameExecution(ITaskInstance instance1, ITaskInstance instance2) { 
     295        if (instance1 instanceof IIterationInstance) { 
     296            if (!(instance2 instanceof IIterationInstance)) { 
     297                return false; 
     298            } 
     299             
     300            ITaskInstanceList iteration1 = (ITaskInstanceList) instance1; 
     301            ITaskInstanceList iteration2 = (ITaskInstanceList) instance2; 
     302             
     303            return isSameExecutionList(iteration1, iteration2); 
     304        } 
     305        else if (instance1 instanceof ISequenceInstance) { 
     306            if (!(instance2 instanceof ISequenceInstance)) { 
     307                return false; 
     308            } 
     309             
     310            ITaskInstanceList selection1 = (ITaskInstanceList) instance1; 
     311            ITaskInstanceList selection2 = (ITaskInstanceList) instance2; 
     312             
     313            return isSameExecutionList(selection1, selection2); 
     314        } 
     315        else if (instance1 instanceof ISelectionInstance) { 
     316            if (!(instance2 instanceof ISelectionInstance)) { 
     317                return false; 
     318            } 
     319            else { 
     320                return isSameExecution(((ISelectionInstance) instance1).getChild(), 
     321                                       ((ISelectionInstance) instance2).getChild()); 
     322            } 
     323        } 
     324        else if (instance1 instanceof IOptionalInstance) { 
     325            if (!(instance2 instanceof IOptionalInstance)) { 
     326                return false; 
     327            } 
     328            else { 
     329                return isSameExecution(((IOptionalInstance) instance1).getChild(), 
     330                                       ((IOptionalInstance) instance2).getChild()); 
     331            } 
     332        } 
     333        else if (instance1 instanceof IEventTaskInstance) { 
     334            if (!(instance2 instanceof IEventTaskInstance)) { 
     335                return false; 
     336            } 
     337            else { 
     338                return ((IEventTaskInstance) instance1).getTask().equals 
     339                    (((IEventTaskInstance) instance2).getTask()); 
     340            } 
     341        } 
     342        else if (instance1 == null) { 
     343            return instance2 == null; 
     344        } 
     345        else { 
     346            throw new IllegalArgumentException("unknown type of task instance: " + instance1); 
     347        } 
     348    } 
     349 
     350    /** 
     351     * 
     352     */ 
     353    private boolean isSameExecutionList(ITaskInstanceList list1, ITaskInstanceList list2) { 
     354        if (list1.size() == list2.size()) { 
     355            for (int i = 0; i < list1.size(); i++) { 
     356                if (!isSameExecution(list1.get(i), list2.get(i))) { 
     357                    return false; 
     358                } 
     359            } 
     360             
     361            return true; 
     362        } 
     363        else { 
     364            return false; 
     365        } 
     366    } 
    240367} 
Note: See TracChangeset for help on using the changeset viewer.