/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.drools.core.reteoo;
import org.drools.core.WorkingMemory;
import org.drools.core.common.RuleBasePartitionId;
import org.drools.core.rule.EvalCondition;
import org.drools.core.spi.Tuple;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
public class ConditionalBranchEvaluator implements Externalizable {
private EvalCondition condition;
private ConditionalBranchEvaluator elseBranchEvaluator;
private ConditionalExecution conditionalExecution;
public ConditionalBranchEvaluator() { }
public ConditionalBranchEvaluator( EvalCondition condition,
RuleBasePartitionId partitionId,
LeftTupleSink tupleSink,
boolean breaking,
ConditionalBranchEvaluator elseBranchEvaluator ) {
this.condition = condition;
this.elseBranchEvaluator = elseBranchEvaluator;
this.conditionalExecution = new ConditionalExecution( partitionId, tupleSink, breaking );
}
public static class ConditionalExecution implements Externalizable {
private LeftTupleSinkPropagator sink;
private boolean breaking;
public ConditionalExecution() { }
private ConditionalExecution( RuleBasePartitionId partitionId,
LeftTupleSink tupleSink,
boolean breaking ) {
this.sink = new SingleLeftTupleSinkAdapter( partitionId, tupleSink );
this.breaking = breaking;
}
public LeftTupleSinkPropagator getSink() {
return sink;
}
public boolean isBreaking() {
return breaking;
}
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(sink);
out.writeBoolean(breaking);
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
sink = (LeftTupleSinkPropagator) in.readObject();
breaking = in.readBoolean();
}
@Override
public String toString() {
return ( breaking ? "break[" : "do[" ) + sink.getSinks()[0] +"]";
}
}
public ConditionalExecution evaluate( Tuple tuple,
WorkingMemory workingMemory,
Object context ) {
if ( condition.isAllowed( tuple, workingMemory, context ) ) {
return conditionalExecution;
}
return elseBranchEvaluator == null ? null : elseBranchEvaluator.evaluate( tuple, workingMemory, context );
}
public Object createContext() {
return condition.createContext();
}
@Override
public int hashCode() {
return condition.hashCode() + ( elseBranchEvaluator == null ? 0 : elseBranchEvaluator.hashCode() );
}
@Override
public boolean equals(Object obj) {
if ( !(obj instanceof ConditionalBranchEvaluator) ) {
return false;
}
ConditionalBranchEvaluator other = (ConditionalBranchEvaluator) obj;
if ( !condition.equals(other.condition) ) {
return false;
}
return elseBranchEvaluator == null ? other.elseBranchEvaluator == null : elseBranchEvaluator.equals(other.elseBranchEvaluator);
}
@Override
public String toString() {
return "if ( " + condition + " ) " + conditionalExecution + (elseBranchEvaluator != null ? " else " + elseBranchEvaluator.toString() : "");
}
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(condition);
out.writeObject(conditionalExecution);
out.writeObject(elseBranchEvaluator);
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
condition = (EvalCondition) in.readObject();
conditionalExecution = (ConditionalExecution) in.readObject();
elseBranchEvaluator = (ConditionalBranchEvaluator) in.readObject();
}
}