/* * Copyright 2011 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.EventFactHandle; /** * A class to hold a list of the right tuples that belong to a * window (sliding, tumbling, etc) * */ public class WindowTupleList { protected EventFactHandle handle; private WindowTupleList listPrevious; private WindowTupleList listNext; public WindowTuple firstWindowTuple; public WindowTuple lastWindowTuple; private WindowNode node; public WindowTupleList() { } public WindowTupleList( EventFactHandle handle, WindowNode node) { this.handle = handle; this.node = node; //this.handle.addLastWindowTuple( this ); } public WindowNode getWindowNode() { return this.node; } public void unlinkFromHandle() { //this.handle.removeWindowTuple( this ); this.handle = null; this.listPrevious = null; this.listNext = null; } public EventFactHandle getHandle() { return this.handle; } public WindowTupleList getListPrevious() { return listPrevious; } public void setListPrevious(WindowTupleList listPrevious) { this.listPrevious = listPrevious; } public WindowTupleList getListNext() { return listNext; } public void setListNext(WindowTupleList listNext) { this.listNext = listNext; } public void addFirstWindowTuple( WindowTuple windowTuple ) { WindowTuple previousFirst = firstWindowTuple; firstWindowTuple = windowTuple; if ( previousFirst == null ) { windowTuple.setWindowPrevious( null ); windowTuple.setWindowNext( null ); lastWindowTuple = windowTuple; } else { windowTuple.setWindowPrevious( null ); windowTuple.setWindowNext( previousFirst ); previousFirst.setWindowPrevious( windowTuple ); } } public void addLastWindowTuple( WindowTuple windowTuple ) { WindowTuple previousLast = lastWindowTuple; lastWindowTuple = windowTuple; if( previousLast == null ){ windowTuple.setWindowPrevious( null ); windowTuple.setWindowNext( null ); firstWindowTuple = windowTuple; } else { windowTuple.setWindowPrevious( previousLast ); windowTuple.setWindowNext( null ); previousLast.setWindowNext( windowTuple ); } } public void removeWindowTuple( WindowTuple windowTuple ) { WindowTuple previous = windowTuple.getWindowPrevious(); WindowTuple next = windowTuple.getWindowNext(); if ( previous != null && next != null ) { // remove from middle previous.setWindowNext( next ); next.setWindowPrevious( previous ); } else if ( next != null ) { // remove from first next.setWindowPrevious( null ); firstWindowTuple = next; } else if ( previous != null ) { // remove from end previous.setWindowNext( null ); lastWindowTuple = previous; } else { // single remaining item, no previous or next firstWindowTuple = null; lastWindowTuple = null; } windowTuple.setWindowPrevious( null ); windowTuple.setWindowNext( null ); } public WindowTuple getFirstWindowTuple() { return firstWindowTuple; } public WindowTuple getLastWindowTuple() { return lastWindowTuple; } public int hashCode() { return this.handle.hashCode(); } public String toString() { return this.handle.toString() + "\n"; } public boolean equals(WindowTupleList other) { // we know the object is never null and always of the type ReteTuple if ( other == this ) { return true; } // A ReteTuple is only the same if it has the same hashCode, factId and parent if ( (other == null) || (hashCode() != other.hashCode()) ) { return false; } return this.handle == other.handle; } public boolean equals(Object object) { return equals( (WindowTupleList) object ); } }