Ignore:
Timestamp:
03/18/13 11:46:47 (11 years ago)
Author:
pharms
Message:
  • refactoring of task tree node comparison to be able to optimize the comparisons for the different comparison levels lexically, syntactically, semantically
File:
1 edited

Legend:

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

    r1113 r1125  
    1414 
    1515package de.ugoe.cs.autoquest.tasktrees.nodeequality; 
     16 
     17import java.util.List; 
    1618 
    1719import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence; 
     
    4749    } 
    4850 
    49     /* 
    50      * (non-Javadoc) 
    51      *  
    52      * @see de.ugoe.cs.tasktree.nodeequality.NodeEqualityRule#apply(TaskTreeNode, TaskTreeNode) 
     51    /* (non-Javadoc) 
     52     * @see NodeComparisonRule#isApplicable(ITaskTreeNode, ITaskTreeNode) 
     53     */ 
     54    @Override 
     55    public boolean isApplicable(ITaskTreeNode node1, ITaskTreeNode node2) { 
     56        return (node1 instanceof ISequence) && (node2 instanceof ISequence); 
     57    } 
     58 
     59    /* (non-Javadoc) 
     60     * @see NodeComparisonRule#areLexicallyEqual(ITaskTreeNode, ITaskTreeNode) 
     61     */ 
     62    @Override 
     63    public boolean areLexicallyEqual(ITaskTreeNode node1, ITaskTreeNode node2) { 
     64        NodeEquality equality = getEquality(node1, node2, NodeEquality.LEXICALLY_EQUAL); 
     65        return (equality != null) && (equality.isAtLeast(NodeEquality.LEXICALLY_EQUAL)); 
     66    } 
     67 
     68    /* (non-Javadoc) 
     69     * @see NodeComparisonRule#areSyntacticallyEqual(ITaskTreeNode, ITaskTreeNode) 
     70     */ 
     71    @Override 
     72    public boolean areSyntacticallyEqual(ITaskTreeNode node1, ITaskTreeNode node2) { 
     73        NodeEquality equality = getEquality(node1, node2, NodeEquality.SYNTACTICALLY_EQUAL); 
     74        return (equality != null) && (equality.isAtLeast(NodeEquality.SYNTACTICALLY_EQUAL)); 
     75    } 
     76 
     77    /* (non-Javadoc) 
     78     * @see NodeComparisonRule#areSemanticallyEqual(ITaskTreeNode, ITaskTreeNode) 
     79     */ 
     80    @Override 
     81    public boolean areSemanticallyEqual(ITaskTreeNode node1, ITaskTreeNode node2) { 
     82        NodeEquality equality = getEquality(node1, node2, NodeEquality.SEMANTICALLY_EQUAL); 
     83        return (equality != null) && (equality.isAtLeast(NodeEquality.SEMANTICALLY_EQUAL)); 
     84    } 
     85 
     86    /* (non-Javadoc) 
     87     * @see NodeComparisonRule#compare(ITaskTreeNode, ITaskTreeNode) 
    5388     */ 
    5489    @Override 
    5590    public NodeEquality compare(ITaskTreeNode node1, ITaskTreeNode node2) { 
    56         if ((!(node1 instanceof ISequence)) || (!(node2 instanceof ISequence))) { 
    57             return null; 
    58         } 
     91        return getEquality(node1, node2, null); 
     92    } 
    5993 
    60         if (node1 == node2) { 
    61             return NodeEquality.IDENTICAL; 
    62         } 
     94    /** 
     95     *  
     96     */ 
     97    private NodeEquality getEquality(ITaskTreeNode node1, 
     98                                     ITaskTreeNode node2, 
     99                                     NodeEquality  requiredEqualityLevel) 
     100    { 
     101        List<ITaskTreeNode> children1 = node1.getChildren(); 
     102        List<ITaskTreeNode> children2 = node2.getChildren(); 
    63103 
    64104        // if both sequences do not have children, they are equal although this doesn't make sense 
    65         if ((node1.getChildren().size() == 0) && (node2.getChildren().size() == 0)) { 
     105        if ((children1.size() == 0) && (children2.size() == 0)) { 
    66106            return NodeEquality.LEXICALLY_EQUAL; 
    67107        } 
    68108 
    69         if (node1.getChildren().size() != node2.getChildren().size()) { 
     109        if (children1.size() != children2.size()) { 
    70110            return NodeEquality.UNEQUAL; 
    71111        } 
    72112 
    73113        NodeEquality resultingEquality = NodeEquality.LEXICALLY_EQUAL; 
    74         for (int i = 0; i < node1.getChildren().size(); i++) { 
    75             ITaskTreeNode child1 = node1.getChildren().get(i); 
    76             ITaskTreeNode child2 = node2.getChildren().get(i); 
     114        for (int i = 0; i < children1.size(); i++) { 
     115            ITaskTreeNode child1 = children1.get(i); 
     116            ITaskTreeNode child2 = children2.get(i); 
    77117 
    78             NodeEquality nodeEquality = mRuleManager.applyRules(child1, child2); 
     118            NodeEquality nodeEquality = callRuleManager(child1, child2, requiredEqualityLevel); 
    79119 
    80120            if ((nodeEquality == null) || (nodeEquality == NodeEquality.UNEQUAL)) { 
     
    88128    } 
    89129 
     130    /** 
     131     * <p> 
     132     * TODO: comment 
     133     * </p> 
     134     * 
     135     * @param child1 
     136     * @param child2 
     137     * @param requiredEqualityLevel 
     138     * @return 
     139     */ 
     140    private NodeEquality callRuleManager(ITaskTreeNode child1, 
     141                                         ITaskTreeNode child2, 
     142                                         NodeEquality  requiredEqualityLevel) 
     143    { 
     144        if (requiredEqualityLevel == null) { 
     145            return mRuleManager.compare(child1, child2); 
     146        } 
     147        else if (mRuleManager.areAtLeastEqual(child1, child2, requiredEqualityLevel)) { 
     148            return requiredEqualityLevel; 
     149        } 
     150        else { 
     151            return NodeEquality.UNEQUAL; 
     152        } 
     153    } 
    90154} 
Note: See TracChangeset for help on using the changeset viewer.