From: <jbo...@li...> - 2006-05-25 02:39:07
|
Author: mar...@jb... Date: 2006-05-24 22:38:51 -0400 (Wed, 24 May 2006) New Revision: 4416 Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FieldImpl.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaNode.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooToJungVisitor.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/BoundVariableConstraint.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/visualize/ReteooJungViewer.java Log: JBRULES-271 Incorrect Handling of 'or' I have found a number of issues. -Added reteoo builder test, using equals test against previously know correct rete dump - using xstream -updating toString methods for more data -Added more equals and hashCode impl -Added more getHtml info to the Jung Visitor impl Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java 2006-05-25 00:54:30 UTC (rev 4415) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassFieldExtractor.java 2006-05-25 02:38:51 UTC (rev 4416) @@ -67,6 +67,10 @@ public int getIndex() { return this.extractor.getIndex(); } + + public String getFieldName() { + return this.fieldName; + } public Object getValue(Object object) { return this.extractor.getValue( object ); @@ -76,18 +80,25 @@ return this.extractor.getObjectType(); } - public boolean equals(Object other) { - if ( this == other ) { + public String toString() { + return "[ClassFieldExtractor class=" + this.clazz + " field=" + this.fieldName + "]"; + } + + public int hashCode() { + return this.getObjectType().hashCode() * 17 + this.getIndex(); + } + + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( !(other instanceof ClassFieldExtractor) ) { + + if ( object == null || object.getClass() != ClassFieldExtractor.class ) { return false; } - ClassFieldExtractor extr = (ClassFieldExtractor) other; - return this.extractor.getObjectType().equals( extr.getObjectType() ) && this.extractor.getIndex() == extr.getIndex(); + + ClassFieldExtractor other = (ClassFieldExtractor) object; + + return this.extractor.getObjectType().equals( other.getObjectType() ) && this.extractor.getIndex() == other.getIndex(); } - - public int hashCode() { - return this.getObjectType().hashCode() * 17 + this.getIndex(); - } } \ No newline at end of file Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FieldImpl.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FieldImpl.java 2006-05-25 00:54:30 UTC (rev 4415) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/FieldImpl.java 2006-05-25 02:38:51 UTC (rev 4416) @@ -31,17 +31,21 @@ public Object getValue() { return this.value; } + + public String toString() { + return this.value.toString(); + } - public boolean equals(Object other) { - if ( this == other ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( !(other instanceof FieldImpl) ) { + if ( object == null || !(object instanceof FieldValue) ) { return false; } - FieldImpl field = (FieldImpl) other; + FieldImpl other = (FieldImpl) object; - return (((this.value == null) && (field.value == null)) || ((this.value != null) && (this.value.equals( field.value )))); + return (((this.value == null) && (other.value == null)) || ((this.value != null) && (this.value.equals( other.value )))); } public int hashCode() { Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java 2006-05-25 00:54:30 UTC (rev 4415) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java 2006-05-25 02:38:51 UTC (rev 4416) @@ -44,7 +44,24 @@ } public String toString() { - return this.getClass().getName() + "[ otherColumn == " + this.otherColumn + " ]"; + return "[InstanceEqualsConstraint otherColumn=" + this.otherColumn + " ]"; } + + public int hashCode() { + return this.otherColumn; + } + + public boolean equals(Object object) { + if ( this == object ) { + return true; + } + if ( object == null || getClass() != object.getClass() ) { + return false; + } + + InstanceEqualsConstraint other = ( InstanceEqualsConstraint ) object; + return this.otherColumn == other.otherColumn ; + } + } \ No newline at end of file Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java 2006-05-25 00:54:30 UTC (rev 4415) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java 2006-05-25 02:38:51 UTC (rev 4416) @@ -23,6 +23,7 @@ import org.drools.FactException; import org.drools.RuleBaseConfiguration; import org.drools.common.PropagationContextImpl; +import org.drools.rule.LiteralConstraint; import org.drools.spi.FieldConstraint; import org.drools.spi.PropagationContext; @@ -188,6 +189,19 @@ this.attachingNewNode = false; } + + public void remove(BaseNode node, + WorkingMemoryImpl[] workingMemories) { + this.objectSinks.remove( (ObjectSink) node ); + removeShare(); + if ( this.sharedCount < 0 ) { + for ( int i = 0, length = workingMemories.length; i < length; i++ ) { + workingMemories[i].clearNodeMemory( this ); + } + this.objectSource.remove( this, + workingMemories ); + } + } /** * Creates a HashSet for the AlphaNode's memory. @@ -196,6 +210,14 @@ return new HashSet(); } + public String toString() { + return "[AlphaNode constraint=" + this.constraint + "]"; + } + + public int hashCode() { + return this.objectSource.hashCode() * 17 + ((this.constraint != null) ? this.constraint.hashCode() : 0); + } + /* * (non-Javadoc) * @@ -214,22 +236,4 @@ return this.objectSource.equals( other.objectSource ) && this.constraint.equals( other.constraint ); } - - public int hashCode() { - return this.objectSource.hashCode() * 17 + ((this.constraint != null) ? this.constraint.hashCode() : 0); - } - - public void remove(BaseNode node, - WorkingMemoryImpl[] workingMemories) { - this.objectSinks.remove( (ObjectSink) node ); - removeShare(); - if ( this.sharedCount < 0 ) { - for ( int i = 0, length = workingMemories.length; i < length; i++ ) { - workingMemories[i].clearNodeMemory( this ); - } - this.objectSource.remove( this, - workingMemories ); - } - } - } Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaNode.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaNode.java 2006-05-25 00:54:30 UTC (rev 4415) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BetaNode.java 2006-05-25 02:38:51 UTC (rev 4416) @@ -19,6 +19,7 @@ import org.drools.RuleBaseConfiguration; import org.drools.common.BetaNodeBinder; import org.drools.common.PropagationContextImpl; +import org.drools.spi.FieldConstraint; import org.drools.spi.PropagationContext; /** @@ -89,6 +90,10 @@ this.joinNodeBinder = joinNodeBinder; } + + public FieldConstraint[] getConstraints(){ + return this.joinNodeBinder.getConstraints(); + } /* (non-Javadoc) * @see org.drools.reteoo.BaseNode#attach() Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java 2006-05-25 00:54:30 UTC (rev 4415) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java 2006-05-25 02:38:51 UTC (rev 4416) @@ -26,6 +26,7 @@ import org.drools.common.BetaNodeBinder; import org.drools.common.PropagationContextImpl; import org.drools.rule.EvalCondition; +import org.drools.spi.FieldConstraint; import org.drools.spi.PropagationContext; import org.drools.util.LinkedList; import org.drools.util.LinkedListNode; @@ -85,6 +86,10 @@ this.binder = binder; setHasMemory( true ); } + + public FieldConstraint[] getConstraints() { + return this.binder.getConstraints(); + } /* (non-Javadoc) * @see org.drools.reteoo.BaseNode#attach() Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java 2006-05-25 00:54:30 UTC (rev 4415) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/Rete.java 2006-05-25 02:38:51 UTC (rev 4416) @@ -277,5 +277,22 @@ public Object createMemory( RuleBaseConfiguration config ) { return new HashMap(); } + + public int hashCode() { + return this.objectTypeNodes.hashCode(); + } + + public boolean equals(Object object) { + if ( object == this ) { + return true; + } + if ( object == null || object.getClass() != Rete.class ) { + return false; + } + + Rete other = (Rete) object; + return this.objectTypeNodes.equals( other.objectTypeNodes ); + } + } Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooToJungVisitor.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooToJungVisitor.java 2006-05-25 00:54:30 UTC (rev 4415) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooToJungVisitor.java 2006-05-25 02:38:51 UTC (rev 4416) @@ -23,7 +23,9 @@ import java.util.List; import java.util.Map; +import org.drools.base.ClassFieldExtractor; import org.drools.rule.LiteralConstraint; +import org.drools.spi.FieldConstraint; import org.drools.spi.FieldValue; import org.drools.util.ReflectiveVisitor; import org.drools.visualize.ReteooJungViewer.DroolsVertex; @@ -218,12 +220,12 @@ public String getHtml() { LiteralConstraint constraint = (LiteralConstraint) node.getConstraint(); - FieldValue field = constraint.getField(); - return "AlphaNode<br>field name : " + "<br>evaluator : " + constraint.getEvaluator() + "<br>value : " + field.getValue(); + ClassFieldExtractor extractor = ( ClassFieldExtractor ) constraint.getFieldExtractor(); + return "AlphaNode<br>field : " + extractor.getFieldName() + "<br>evaluator : " + constraint.getEvaluator() + "<br>value : " + constraint.getField(); } public String toString() { - return "AlphaNode"; + return this.node.toString(); } public Paint getFillPaint() { @@ -240,11 +242,11 @@ } public String getHtml() { - return "LeftInputAdapterNode : " + this.node.getId(); + return "LeftInputAdapterNode<br>" + dumpConstraints( this.node.getConstraints() ); } public String toString() { - return "leftInputAdapter"; + return this.node.toString(); } public Paint getFillPaint() { @@ -261,11 +263,11 @@ } public String getHtml() { - return "RightInputAdapterNodeVertex : " + this.node.getId(); + return "RightInputAdapterNode"; } public String toString() { - return "RightInputAdapterNodeVertex"; + return "RightInputAdapterNode"; } public Paint getFillPaint() { @@ -282,7 +284,7 @@ } public String getHtml() { - return "JoinNode : " + this.node.getId(); + return "JoinNode<br> " + dumpConstraints( this.node.getConstraints() ); } public String toString() { @@ -373,4 +375,12 @@ return Color.BLACK; } } + + public static String dumpConstraints(FieldConstraint[] constraints) { + StringBuffer buffer = new StringBuffer(); + for ( int i = 0, length = constraints.length; i < length; i++ ) { + buffer.append( constraints[i].toString() + "<br>" ); + } + return buffer.toString(); + } } Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/BoundVariableConstraint.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/BoundVariableConstraint.java 2006-05-25 00:54:30 UTC (rev 4415) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/BoundVariableConstraint.java 2006-05-25 02:38:51 UTC (rev 4416) @@ -17,7 +17,10 @@ +import java.util.Arrays; + import org.drools.WorkingMemory; +import org.drools.common.InstanceEqualsConstraint; import org.drools.common.InternalFactHandle; import org.drools.spi.Evaluator; import org.drools.spi.FieldConstraint; @@ -74,6 +77,41 @@ // } return evaluator.evaluate( this.fieldExtractor.getValue( handle.getObject() ), declaration.getValue( tuple.get( this.column ).getObject() ) ); + } + + public String toString() { + return "[BoundVariableConstraint fieldExtractor=" + this.fieldExtractor + " declaration=" + this.declaration + "]"; + } + /* (non-Javadoc) + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int PRIME = 31; + int result = 1; + result = PRIME * result + this.column; + result = PRIME * result + ((this.declaration == null) ? 0 : this.declaration.hashCode()); + result = PRIME * result + ((this.evaluator == null) ? 0 : this.evaluator.hashCode()); + result = PRIME * result + ((this.fieldExtractor == null) ? 0 : this.fieldExtractor.hashCode()); + result = PRIME * result + Arrays.hashCode( this.requiredDeclarations ); + return result; + } + + public boolean equals(Object object) { + if ( this == object ) { + return true; + } + + if ( object == null || getClass() != object.getClass() ) { + return false; + } + + BoundVariableConstraint other = ( BoundVariableConstraint ) object; + + return (this.column == other.column) && this.fieldExtractor.equals( other.fieldExtractor ) && this.declaration.equals( other.declaration ) && this.evaluator.equals( other.evaluator ) && Arrays.equals( this.requiredDeclarations, + other.requiredDeclarations ); } + + } \ No newline at end of file Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java 2006-05-25 00:54:30 UTC (rev 4415) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java 2006-05-25 02:38:51 UTC (rev 4416) @@ -35,7 +35,7 @@ private final Evaluator evaluator; - private static final Declaration[] requiredDeclarations = new Declaration[]{}; + private static final Declaration[] requiredDeclarations = new Declaration[0]; public LiteralConstraint(FieldValue field, FieldExtractor extractor, @@ -73,24 +73,25 @@ this.field.getValue() ); } - public boolean equals(Object other) { - if ( this == other ) { + public String toString() { + return "[LiteralConstraint fieldExtractor=" + this.extractor + " evaluator=" + this.evaluator + " value=" + this.field.getValue() + "]"; + } + + public int hashCode() { + return (this.field.hashCode() * 17) ^ (this.extractor.hashCode() * 11) ^ (this.evaluator.hashCode()); + + } + + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( !(other instanceof LiteralConstraint) ) { + if ( object == null || object.getClass() != LiteralConstraint.class ) { return false; } - LiteralConstraint lit = (LiteralConstraint) other; + LiteralConstraint other = (LiteralConstraint) object; - return this.field.equals( lit.field ) && this.extractor.equals( lit.extractor ) && this.evaluator.equals( lit.evaluator ); + return this.field.equals( other.field ) && this.extractor.equals( other.extractor ) && this.evaluator.equals( other.evaluator ); } - public int hashCode() { - return (this.field.hashCode() * 17) ^ (this.extractor.hashCode() * 11) ^ (this.evaluator.hashCode()); - - } - - public String toString() { - return "LiteralConstraint { Field(" + this.extractor.getIndex() + ") " + this.evaluator.toString() + " [" + this.field.getValue() + "] }"; - } }; \ No newline at end of file Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java 2006-05-25 00:54:30 UTC (rev 4415) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java 2006-05-25 02:38:51 UTC (rev 4416) @@ -96,17 +96,15 @@ return this.expression.hashCode(); } - public boolean equals(Object object) { - if (object == null ) { - return false; - } else if ( object == this ){ + public boolean equals(Object object) { + if ( object == this ) { return true; } - if ( ! (object instanceof PredicateConstraint) ) { + if (object == null || object.getClass() != PredicateConstraint.class ) { return false; } - + PredicateConstraint other = ( PredicateConstraint ) object; return this.expression.equals( other.expression ); Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java 2006-05-25 00:54:30 UTC (rev 4415) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java 2006-05-25 02:38:51 UTC (rev 4416) @@ -96,16 +96,14 @@ } public boolean equals(Object object) { - if (object == null ) { - return false; - } else if ( object == this ){ + if ( object == this ) { return true; } - if ( ! (object instanceof ReturnValueConstraint) ) { + if (object == null || object.getClass() != PredicateConstraint.class ) { return false; } - + ReturnValueConstraint other = ( ReturnValueConstraint ) object; return this.expression.equals( other.expression ); Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/visualize/ReteooJungViewer.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/visualize/ReteooJungViewer.java 2006-05-25 00:54:30 UTC (rev 4415) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/visualize/ReteooJungViewer.java 2006-05-25 02:38:51 UTC (rev 4416) @@ -76,7 +76,7 @@ */ VisualizationViewer vv; - private boolean running; + private boolean running = true; public ReteooJungViewer(RuleBase ruleBase) { // Setup a standard left/right splitPane @@ -211,8 +211,7 @@ public void showGUI() { pack(); - setVisible( true ); - this.running = true; + setVisible( true ); addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { @@ -222,7 +221,7 @@ } ); } - public boolean isRunning() { + public synchronized boolean isRunning() { return this.running; } |