/* * 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. * You may obtain a copy of the License at * * 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.common.DefaultFactHandle; import org.drools.core.common.InternalFactHandle; import org.drools.core.spi.PropagationContext; import java.util.concurrent.atomic.AtomicInteger; public class SubnetworkTuple extends BaseLeftTuple implements RightTuple { private LeftTuple blocked; private LeftTuple tempBlocked; private TupleMemory tempRightTupleMemory; private RightTuple tempNextRightTuple; private static final AtomicInteger idGenerator = new AtomicInteger( 0 ); private InternalFactHandle factHandleForEvaluation = new DefaultFactHandle(idGenerator.decrementAndGet(), this); private boolean stagedOnRight; public SubnetworkTuple() { // constructor needed for serialisation } // ------------------------------------------------------------ // Constructors // ------------------------------------------------------------ public SubnetworkTuple(final InternalFactHandle factHandle, final Sink sink, final boolean leftTupleMemoryEnabled) { super(factHandle, sink, leftTupleMemoryEnabled); } public SubnetworkTuple(final InternalFactHandle factHandle, final LeftTuple leftTuple, final Sink sink) { super( factHandle, leftTuple, sink ); } public SubnetworkTuple(final LeftTuple leftTuple, final Sink sink, final PropagationContext pctx, final boolean leftTupleMemoryEnabled) { super(leftTuple, sink, pctx, leftTupleMemoryEnabled); } public SubnetworkTuple(final LeftTuple leftTuple, final RightTuple rightTuple, final Sink sink) { super(leftTuple, rightTuple, sink); } public SubnetworkTuple(final LeftTuple leftTuple, final RightTuple rightTuple, final Sink sink, final boolean leftTupleMemoryEnabled) { this(leftTuple, rightTuple, null, null, sink, leftTupleMemoryEnabled); } public SubnetworkTuple(final LeftTuple leftTuple, final RightTuple rightTuple, final LeftTuple currentLeftChild, final LeftTuple currentRightChild, final Sink sink, final boolean leftTupleMemoryEnabled) { super(leftTuple, rightTuple, currentLeftChild, currentRightChild, sink, leftTupleMemoryEnabled); } public InternalFactHandle getFactHandleForEvaluation() { return factHandleForEvaluation; } public LeftTuple getBlocked() { return this.blocked; } public void setBlocked(LeftTuple leftTuple) { this.blocked = leftTuple; } public void addBlocked(LeftTuple leftTuple) { if ( this.blocked != null && leftTuple != null ) { leftTuple.setBlockedNext( this.blocked ); this.blocked.setBlockedPrevious( leftTuple ); } this.blocked = leftTuple; } public void removeBlocked(LeftTuple leftTuple) { LeftTuple previous = leftTuple.getBlockedPrevious(); LeftTuple next = leftTuple.getBlockedNext(); if ( previous != null && next != null ) { //remove from middle previous.setBlockedNext( next ); next.setBlockedPrevious( previous ); } else if ( next != null ) { //remove from first this.blocked = next; next.setBlockedPrevious( null ); } else if ( previous != null ) { //remove from end previous.setBlockedNext( null ); } else { this.blocked = null; } leftTuple.clearBlocker(); } public LeftTuple getTempBlocked() { return tempBlocked; } public void setTempBlocked(LeftTuple tempBlocked) { this.tempBlocked = tempBlocked; } public RightTuple getTempNextRightTuple() { return tempNextRightTuple; } public void setTempNextRightTuple(RightTuple tempNextRightTuple) { this.tempNextRightTuple = tempNextRightTuple; } public TupleMemory getTempRightTupleMemory() { return tempRightTupleMemory; } public void setTempRightTupleMemory(TupleMemory tempRightTupleMemory) { this.tempRightTupleMemory = tempRightTupleMemory; } public boolean isStagedOnRight() { return stagedOnRight; } public void setStagedOnRight( boolean stagedOnRight ) { this.stagedOnRight = stagedOnRight; } @Override public void clearStaged() { super.clearStaged(); stagedOnRight = false; } }