From: <jbo...@li...> - 2006-05-08 02:51:22
|
Author: mar...@jb... Date: 2006-05-07 22:51:10 -0400 (Sun, 07 May 2006) New Revision: 4118 Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassObjectType.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AgendaGroupImpl.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AgendaItem.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BetaNodeBinder.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ScheduledAgendaItem.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BaseNode.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/InitialFactImpl.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/ObjectTypeNode.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteTuple.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Package.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PackageCompilationData.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/rule/Rule.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/asm/MethodComparator.java labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Hobby.java labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Sex.java Log: JBRULES-251 Node sharing for compiled Expressions -Predicates, ReturnValue and EvalCondition now all work with node sharing Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassObjectType.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassObjectType.java 2006-05-08 02:01:27 UTC (rev 4117) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/ClassObjectType.java 2006-05-08 02:51:10 UTC (rev 4118) @@ -145,7 +145,7 @@ return true; } - if ( object == null || !(object instanceof ClassObjectType) ) { + if ( object == null || object.getClass() != ClassObjectType.class ) { return false; } Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AgendaGroupImpl.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AgendaGroupImpl.java 2006-05-08 02:01:27 UTC (rev 4117) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AgendaGroupImpl.java 2006-05-08 02:51:10 UTC (rev 4118) @@ -116,7 +116,7 @@ return false; } - public int hashcode() { + public int hashCode() { return this.name.hashCode(); } } Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AgendaItem.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AgendaItem.java 2006-05-08 02:01:27 UTC (rev 4117) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AgendaItem.java 2006-05-08 02:51:10 UTC (rev 4118) @@ -181,11 +181,11 @@ } /** - * Return the hashcode of the - * <code>TupleKey<code> as the hashcode of the AgendaItem + * Return the hashCode of the + * <code>TupleKey<code> as the hashCode of the AgendaItem * @return */ - public int hashcode() { + public int hashCode() { return this.tuple.hashCode(); } Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BetaNodeBinder.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BetaNodeBinder.java 2006-05-08 02:01:27 UTC (rev 4117) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/BetaNodeBinder.java 2006-05-08 02:51:10 UTC (rev 4118) @@ -33,9 +33,11 @@ public final static BetaNodeBinder simpleBinder = new BetaNodeBinder(); private final FieldConstraint[] constraints; + + private static final FieldConstraint[] EMPTY_CONSTRAINTS = new FieldConstraint[0]; public BetaNodeBinder() { - this.constraints = null; + this.constraints = BetaNodeBinder.EMPTY_CONSTRAINTS; } public BetaNodeBinder(FieldConstraint constraint) { @@ -102,9 +104,13 @@ BetaNodeBinder other = (BetaNodeBinder) object; + if ( this.constraints == other.constraints ) { + return true; + } + if ( this.constraints.length != other.constraints.length ) { return false; - } + } for ( int i = 0; i < this.constraints.length; i++ ) { if ( !this.constraints[i].equals( other.constraints[i] ) ) { Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ScheduledAgendaItem.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ScheduledAgendaItem.java 2006-05-08 02:01:27 UTC (rev 4117) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ScheduledAgendaItem.java 2006-05-08 02:51:10 UTC (rev 4118) @@ -212,11 +212,11 @@ } /** - * Return the hashcode of the - * <code>TupleKey<code> as the hashcode of the AgendaItem + * Return the hashode of the + * <code>TupleKey<code> as the hashCode of the AgendaItem * @return */ - public int hashcode() { + public int hashCode() { return this.tuple.hashCode(); } } Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BaseNode.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BaseNode.java 2006-05-08 02:01:27 UTC (rev 4117) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/BaseNode.java 2006-05-08 02:51:10 UTC (rev 4118) @@ -135,7 +135,7 @@ } /** - * The hashcode return is simply the unique id of the node. It is expected that base classes will also implement equals(Object object). + * The hashCode return is simply the unique id of the node. It is expected that base classes will also implement equals(Object object). */ public int hashCode() { return this.id; Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java 2006-05-08 02:01:27 UTC (rev 4117) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java 2006-05-08 02:51:10 UTC (rev 4118) @@ -219,7 +219,7 @@ return true; } - if ( object == null || getClass() != object.getClass() ) { + if ( object == null || object.getClass() != EvalConditionNode.class ) { return false; } Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/InitialFactImpl.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/InitialFactImpl.java 2006-05-08 02:01:27 UTC (rev 4117) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/InitialFactImpl.java 2006-05-08 02:51:10 UTC (rev 4118) @@ -30,6 +30,8 @@ implements InitialFact { private static final InitialFact INSTANCE = new InitialFactImpl(); + + private final int hashCode = "InitialFactImpl".hashCode(); public static InitialFact getInstance() { return InitialFactImpl.INSTANCE; @@ -37,4 +39,20 @@ private InitialFactImpl() { } + + public int hashCode() { + return this.hashCode; + } + + public boolean equals(Object object) { + if ( this == object ) { + return true; + } + + if ( object == null || object.getClass() != InitialFactImpl.class ) { + return false; + } + + return true; + } } 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-08 02:01:27 UTC (rev 4117) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/LeftInputAdapterNode.java 2006-05-08 02:51:10 UTC (rev 4118) @@ -22,6 +22,7 @@ import org.drools.common.BetaNodeBinder; import org.drools.common.PropagationContextImpl; +import org.drools.rule.EvalCondition; import org.drools.spi.PropagationContext; import org.drools.util.LinkedList; import org.drools.util.LinkedListNode; @@ -280,4 +281,25 @@ public Object createMemory() { return new HashMap(); } + + public int hashCode() { + return this.objectSource.hashCode(); + } + + public boolean equals(Object object) { + if ( object == this ){ + return true; + } + + if ( object == null || object.getClass() != LeftInputAdapterNode.class ) { + return false; + } + + LeftInputAdapterNode other = ( LeftInputAdapterNode ) object; + if ( this.binder == null ) { + return this.objectSource.equals( other.objectSource ) && other.binder == null; + } else { + return this.objectSource.equals( other.objectSource ) && this.binder.equals( other.binder ); + } + } } Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java 2006-05-08 02:01:27 UTC (rev 4117) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java 2006-05-08 02:51:10 UTC (rev 4118) @@ -246,22 +246,26 @@ return "[ObjectTypeNode objectType=" + this.objectType + "]"; } + /** + * Uses he hashCode() of the underlying ObjectType implementation. + */ + public int hashCode() { + return this.objectType.hashCode(); + } + public boolean equals(Object object) { if ( this == object ) { return true; } - if ( object == null || getClass() != object.getClass() ) { + if ( object == null || object.getClass() != ObjectTypeNode.class ) { return false; } - return this.objectType.equals( this.objectType ); + ObjectTypeNode other = (ObjectTypeNode) object; + + return this.objectType.equals( other.objectType ); } - /** - * Uses he hashcode() of the underlying ObjectType implementation. - */ - public int hashCode() { - return this.objectType.hashCode(); - } + } Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteTuple.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteTuple.java 2006-05-08 02:01:27 UTC (rev 4117) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteTuple.java 2006-05-08 02:51:10 UTC (rev 4118) @@ -40,7 +40,7 @@ * <p> * Each <code>ReteTuple</code> also reference a <code>TupleKey</code> which is special array of FactHandles * representing the <code>Column</code>s in a <code>Rule</code>. The <code>TupleKey</code> also provide the - * hashcode implementation for <code>ReteTuple</code>. + * hashCode implementation for <code>ReteTuple</code>. * * @see Tuple * @see TupleMatch Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java 2006-05-08 02:01:27 UTC (rev 4117) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TerminalNode.java 2006-05-08 02:51:10 UTC (rev 4118) @@ -305,6 +305,23 @@ public Object createMemory() { return new TerminalNodeMemory(); } + + public int hashCode() { + return this.rule.hashCode(); + } + + public boolean equals(Object object) { + if ( object == this ){ + return true; + } + + if ( object == null || object.getClass() != TerminalNode.class ) { + return false; + } + + TerminalNode other = ( TerminalNode ) object; + return this.rule.equals( other.rule ); + } class TerminalNodeMemory { private AgendaGroupImpl agendaGroup; Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java 2006-05-08 02:01:27 UTC (rev 4117) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/EvalCondition.java 2006-05-08 02:51:10 UTC (rev 4118) @@ -75,23 +75,21 @@ return eval; } -// public int hashcode() { -// return this.expression.hashCode(); -// } -// -// public boolean equals(Object object) { -// if (object == null ) { -// return false; -// } else if ( object == this ){ -// return true; -// } -// -// if ( ! (object instanceof EvalExpression) ) { -// return false; -// } -// -// EvalCondition other = ( EvalCondition ) object; -// -// return this.expression.equals( other.expression ); -// } + public int hashCode() { + return this.expression.hashCode(); + } + + public boolean equals(Object object) { + if ( object == this ){ + return true; + } + + if ( object == null || object.getClass() != EvalCondition.class ) { + return false; + } + + EvalCondition other = ( EvalCondition ) object; + + return this.expression.equals( other.expression ); + } }; \ No newline at end of file Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Package.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Package.java 2006-05-08 02:01:27 UTC (rev 4117) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Package.java 2006-05-08 02:51:10 UTC (rev 4118) @@ -289,7 +289,7 @@ if ( object instanceof PredicateConstraint ) { this.packageCompilationData.remove( ((PredicateConstraint) object).getPredicateExpression().getClass().getName() ); } else if ( object instanceof ReturnValueConstraint ) { - this.packageCompilationData.remove( ((ReturnValueConstraint) object).getReturnValueExpression().getClass().getName() ); + this.packageCompilationData.remove( ((ReturnValueConstraint) object).getExpression().getClass().getName() ); } } } Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PackageCompilationData.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PackageCompilationData.java 2006-05-08 02:01:27 UTC (rev 4117) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PackageCompilationData.java 2006-05-08 02:51:10 UTC (rev 4118) @@ -322,9 +322,9 @@ } public InputStream getResourceAsStream(String name) { - byte[] bytes = read( name ); + byte[] bytes = (byte[]) PackageCompilationData.this.store.get( name ); if ( bytes != null ) { - return null; + return new ByteArrayInputStream( bytes ); } else { return super.getResourceAsStream( name ); } 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-08 02:01:27 UTC (rev 4117) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/PredicateConstraint.java 2006-05-08 02:51:10 UTC (rev 4118) @@ -92,4 +92,23 @@ } + public int hashCode() { + return this.expression.hashCode(); + } + + public boolean equals(Object object) { + if (object == null ) { + return false; + } else if ( object == this ){ + return true; + } + + if ( ! (object instanceof PredicateConstraint) ) { + return false; + } + + PredicateConstraint other = ( PredicateConstraint ) object; + + return this.expression.equals( other.expression ); + } }; \ No newline at end of file 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-08 02:01:27 UTC (rev 4117) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/ReturnValueConstraint.java 2006-05-08 02:51:10 UTC (rev 4118) @@ -32,7 +32,7 @@ private final FieldExtractor fieldExtractor; - private ReturnValueExpression returnValueExpression; + private ReturnValueExpression expression; private final Declaration[] requiredDeclarations; @@ -55,7 +55,7 @@ Evaluator evaluator) { this.fieldExtractor = fieldExtractor; - this.returnValueExpression = returnValueExpression; + this.expression = returnValueExpression; if ( declarations != null ) { this.requiredDeclarations = declarations; @@ -71,11 +71,11 @@ } public void setReturnValueExpression(ReturnValueExpression expression) { - this.returnValueExpression = expression; + this.expression = expression; } - public ReturnValueExpression getReturnValueExpression() { - return this.returnValueExpression; + public ReturnValueExpression getExpression() { + return this.expression; } public boolean isAllowed(InternalFactHandle handle, @@ -83,11 +83,31 @@ WorkingMemory workingMemory) { try { return evaluator.evaluate( this.fieldExtractor.getValue( handle.getObject() ), - this.returnValueExpression.evaluate( tuple, + this.expression.evaluate( tuple, this.requiredDeclarations, workingMemory ) ); } catch ( Exception e ) { throw new RuntimeDroolsException( e ); } } + + public int hashCode() { + return this.expression.hashCode(); + } + + public boolean equals(Object object) { + if (object == null ) { + return false; + } else if ( object == this ){ + return true; + } + + if ( ! (object instanceof ReturnValueConstraint) ) { + return false; + } + + ReturnValueConstraint other = ( ReturnValueConstraint ) object; + + return this.expression.equals( other.expression ); + } } \ No newline at end of file Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java 2006-05-08 02:01:27 UTC (rev 4117) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Rule.java 2006-05-08 02:51:10 UTC (rev 4118) @@ -421,13 +421,13 @@ return true; } - if ( object == null || !(object instanceof Rule) ) { + if ( object == null || object.getClass() != Rule.class ) { return false; } Rule other = (Rule) object; - return (this.name.equals( other.name ) && this.agendaGroup.equals( other.agendaGroup ) && this.salience == other.salience && this.noLoop == other.noLoop); + return (this.name.equals( other.name ) && this.agendaGroup.equals( other.agendaGroup ) && this.xorGroup.equals( other.xorGroup )&& this.salience == other.salience && this.noLoop == other.noLoop); } public int hashCode() { Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/asm/MethodComparator.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/asm/MethodComparator.java 2006-05-08 02:01:27 UTC (rev 4117) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/asm/MethodComparator.java 2006-05-08 02:51:10 UTC (rev 4118) @@ -46,10 +46,22 @@ } /** + * This will return a series of bytecode instructions which can be used to compare one method with another. + * debug info like local var declarations and line numbers are ignored, so the focus is on the content. + */ + public static List getMethodBytecode(String methodName, byte[] bytes) { + Tracer visit = new Tracer(methodName); + ClassReader classReader = new ClassReader( bytes ); + classReader.accept( visit, true ); + TraceMethodVisitor trace = visit.getTrace(); + return trace.getText(); + } + + /** * Compares 2 bytecode listings. * Returns true if they are identical. */ - public boolean compareBytecode(List b1, List b2) { + public static boolean compareBytecode(List b1, List b2) { if (b1.size() != b2.size()) return false; for (int i = 0; i < b1.size(); i++) { @@ -63,7 +75,7 @@ return true; } - static class Tracer implements ClassVisitor { + public static class Tracer implements ClassVisitor { private TraceMethodVisitor trace; private String methodName; Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Hobby.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Hobby.java 2006-05-08 02:01:27 UTC (rev 4117) +++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Hobby.java 2006-05-08 02:51:10 UTC (rev 4118) @@ -75,7 +75,7 @@ return (this == object); } - public final int hashcode() { + public final int hashCode() { return this.hobbyIndex; } Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Sex.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Sex.java 2006-05-08 02:01:27 UTC (rev 4117) +++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/examples/manners/Sex.java 2006-05-08 02:51:10 UTC (rev 4118) @@ -53,7 +53,7 @@ return this == object; } - public final int hashcode() { + public final int hashCode() { return this.sex; } |