/**
* Copyright 2010 JBoss Inc
*
* 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.util;
import org.drools.core.util.AbstractHashTable.Index;
import org.drools.reteoo.LeftTuple;
import org.drools.reteoo.LeftTupleMemory;
import org.drools.reteoo.RightTuple;
public class LeftTupleList
implements
LeftTupleMemory,
Entry {
public static final long serialVersionUID = 510l;
// private Entry previous;
public Entry next;
public LeftTuple first;
public LeftTuple last;
private int hashCode;
private Index index;
private TupleHashTableIterator iterator;
private int size;
public LeftTupleList() {
// this is not an index bucket
this.hashCode = 0;
this.index = null;
}
public LeftTupleList(final Index index,
final int hashCode) {
this.index = index;
this.hashCode = hashCode;
}
public LeftTuple getFirst(RightTuple rightTuple) {
return this.first;
}
public LeftTuple getFirst(LeftTuple leftTuple) {
return this.first;
}
public LeftTuple getLast(RightTuple lastTuple) {
return this.first;
}
public void add(final LeftTuple leftTuple) {
if ( this.last != null ) {
this.last.setNext( leftTuple );
leftTuple.setPrevious( this.last );
this.last = leftTuple;
} else {
this.first = leftTuple;
this.last = leftTuple;;
}
this.size++;
}
public void remove(final LeftTuple leftTuple) {
LeftTuple previous = (LeftTuple) leftTuple.getPrevious();
LeftTuple next = (LeftTuple) leftTuple.getNext();
if ( previous != null && next != null ) {
// remove from middle
previous.setNext( next );
next.setPrevious( previous );
} else if ( next != null ) {
// remove from first
this.first = next;
next.setPrevious( null );
} else if ( previous != null ) {
// remove from end
this.last = previous;
previous.setNext( null );
} else {
// remove everything
this.last = null;
this.first = null;
}
leftTuple.setPrevious( null );
leftTuple.setNext( null );
this.size--;
}
public boolean contains(final LeftTuple leftTuple) {
return get( leftTuple ) != null;
}
public Object get(final LeftTuple leftTtuple) {
LeftTuple current = this.first;
while ( current != null ) {
if ( leftTtuple.equals( current ) ) {
return current;
}
current = (LeftTuple) current.getNext();
}
return null;
}
public int size() {
return this.size;
}
public LeftTuple[] toArray() {
LeftTuple[] tuples = new LeftTuple[this.size];
LeftTuple current = first;
for ( int i = 0; i < this.size; i++ ) {
tuples[i] = current;
current = (LeftTuple) current.getNext();
}
return tuples;
}
public Entry getBucket(final Object object) {
return this.first;
}
public Iterator iterator() {
if ( this.iterator == null ) {
this.iterator = new TupleHashTableIterator();
}
this.iterator.reset( this.first );
return this.iterator;
}
public static class TupleHashTableIterator
implements
Iterator {
private LeftTuple current;
public void reset(LeftTuple first) {
this.current = first;
}
public Object next() {
if ( this.current != null ) {
LeftTuple returnValue = this.current;
this.current = (LeftTuple) current.getNext();
return returnValue;
} else {
return null;
}
}
public void remove() {
// do nothing
}
}
public boolean isIndexed() {
return false;
}
public boolean matches(final Object object,
final int objectHashCode) {
return this.hashCode == objectHashCode && this.index.equal( object,
this.first );
}
public boolean matches(final LeftTuple tuple,
final int tupleHashCode) {
return this.hashCode == tupleHashCode && this.index.equal( this.first,
tuple );
}
public int hashCode() {
return this.hashCode;
}
public boolean equals(final Object object) {
final LeftTupleList other = (LeftTupleList) object;
return this.hashCode == other.hashCode && this.index == other.index;
}
public Entry getNext() {
return this.next;
}
public void setNext(final Entry next) {
this.next = next;
}
public String toString() {
StringBuilder builder = new StringBuilder();
Iterator it = iterator();
for ( LeftTuple leftTuple = (LeftTuple) it.next(); leftTuple != null; leftTuple = (LeftTuple) it.next() ) {
builder.append( leftTuple + "\n" );
}
return builder.toString();
}
}