package org.drools.chance.reteoo.nodes;
import org.drools.base.ClassObjectType;
import org.drools.base.ValueType;
import org.drools.chance.rule.constraint.core.evaluators.IsAEvaluatorDefinition;
import org.drools.chance.degree.Degree;
import org.drools.chance.degree.simple.SimpleDegree;
import org.drools.chance.evaluation.SimpleEvaluationImpl;
import org.drools.chance.reteoo.ChanceFactHandle;
import org.drools.common.InternalFactHandle;
import org.drools.common.InternalWorkingMemory;
import org.drools.factmodel.traits.Trait;
import org.drools.reteoo.EntryPointNode;
import org.drools.reteoo.ObjectTypeNode;
import org.drools.reteoo.builder.BuildContext;
import org.drools.spi.ObjectType;
import org.drools.spi.PropagationContext;
public class ChanceObjectTypeNode extends ObjectTypeNode {
private boolean imperfect = false;
private IsAEvaluatorDefinition.ImperfectIsAEvaluator isA;
public ChanceObjectTypeNode() {
}
public ChanceObjectTypeNode(int id, EntryPointNode source, ObjectType objectType, BuildContext context) {
super( id, source, objectType, context );
}
public boolean isImperfect() {
return imperfect;
}
public void setImperfect(boolean imperfect) {
this.imperfect = imperfect;
if ( imperfect == true && isA == null ) {
isA = new IsAEvaluatorDefinition.ImperfectIsAEvaluator( ValueType.OBJECT_TYPE, false );
}
}
@Override
public void assertObject( InternalFactHandle factHandle, PropagationContext context, InternalWorkingMemory workingMemory ) {
Class<?> klass = ((ClassObjectType) this.getObjectType()).getClassType();
((ChanceFactHandle) factHandle).addEvaluation( this.getId(),
new SimpleEvaluationImpl( this.getId(),
"this isA " + klass.getName(),
match( workingMemory, factHandle.getObject() ),
klass.getSimpleName() ) );
super.assertObject(factHandle, context, workingMemory);
}
protected Degree match( InternalWorkingMemory wm, Object object ) {
if ( imperfect ) {
return isA.match( wm, object, ((ClassObjectType) getObjectType()).getClassType().getName() );
} else {
return SimpleDegree.TRUE;
}
}
public static boolean isImperfect( ObjectType objectType ) {
if ( objectType instanceof ClassObjectType ) {
Class klass =((ClassObjectType) objectType).getClassType();
return klass.getAnnotation( Trait.class ) != null;
} else {
return false;
}
}
}