package org.drools.chance.reteoo.nodes; import org.drools.chance.rule.constraint.ImperfectBetaConstraint; import org.drools.chance.evaluation.DelayedEvaluationImpl; import org.drools.chance.reteoo.ChanceFactHandle; import org.drools.common.InternalFactHandle; import org.drools.common.InternalWorkingMemory; import org.drools.reteoo.ObjectSource; import org.drools.reteoo.builder.BuildContext; import org.drools.rule.ContextEntry; import org.drools.rule.Declaration; import org.drools.spi.AlphaNodeFieldConstraint; import org.drools.spi.BetaNodeFieldConstraint; import org.drools.spi.Constraint; import org.drools.spi.PropagationContext; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; public class DelayedEvaluationNode extends ChanceAlphaNode { public DelayedEvaluationNode( int id, Constraint constraint, ObjectSource objectSource, BuildContext context ) { super( id, new AlphaReferenceToBetaConstraint( (BetaNodeFieldConstraint) constraint ), objectSource, context ); if ( constraint instanceof ImperfectBetaConstraint ) { ((ImperfectBetaConstraint) constraint).setNodeId( id ); } } @Override public void assertObject(InternalFactHandle factHandle, PropagationContext context, InternalWorkingMemory workingMemory) { ((ChanceFactHandle) factHandle).addEvaluation( this.getId(), new DelayedEvaluationImpl( getId() ) ); this.sink.propagateAssertObject( factHandle, context, workingMemory ); } private static class AlphaReferenceToBetaConstraint implements AlphaNodeFieldConstraint { private BetaNodeFieldConstraint beta; public AlphaReferenceToBetaConstraint( BetaNodeFieldConstraint b ) { this.beta = b; } public void writeExternal(ObjectOutput out) throws IOException { out.writeObject( beta ); } public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { beta = (BetaNodeFieldConstraint) in.readObject(); } public Declaration[] getRequiredDeclarations() { return new Declaration[0]; } public void replaceDeclaration(Declaration oldDecl, Declaration newDecl) { } public Constraint clone() { return new AlphaReferenceToBetaConstraint( beta ); } public ConstraintType getType() { return ConstraintType.ALPHA; } public boolean isTemporal() { return false; } public ContextEntry createContextEntry() { return null; } public boolean isAllowed(InternalFactHandle handle, InternalWorkingMemory workingMemory, ContextEntry context) { return true; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; AlphaReferenceToBetaConstraint that = (AlphaReferenceToBetaConstraint) o; if (beta != null ? !beta.equals(that.beta) : that.beta != null) return false; return true; } @Override public int hashCode() { return beta != null ? beta.hashCode() : 0; } } }