/** * 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.common; import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.util.Iterator; import java.util.concurrent.locks.Lock; import org.drools.core.util.JavaIteratorAdapter; import org.drools.core.util.ObjectHashMap; import org.drools.core.util.AbstractHashTable.HashTableIterator; import org.drools.runtime.ObjectFilter; import org.drools.runtime.rule.FactHandle; import org.drools.RuleBaseConfiguration; import org.drools.RuleBaseConfiguration.AssertBehaviour; public class SingleThreadedObjectStore implements Externalizable, ObjectStore { /** Object-to-handle mapping. */ private ObjectHashMap assertMap; private ObjectHashMap identityMap; private AssertBehaviour behaviour; private Lock lock; public SingleThreadedObjectStore() { } public SingleThreadedObjectStore(RuleBaseConfiguration conf, Lock lock) { this.behaviour = conf.getAssertBehaviour(); this.lock = lock; this.assertMap = new ObjectHashMap(); if ( AssertBehaviour.IDENTITY.equals(this.behaviour) ) { this.assertMap.setComparator( new IdentityAssertMapComparator() ); this.identityMap = assertMap; } else { this.assertMap.setComparator( new EqualityAssertMapComparator() ); this.identityMap = new ObjectHashMap(); this.identityMap.setComparator( new IdentityAssertMapComparator() ); } } public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { assertMap = (ObjectHashMap)in.readObject(); identityMap = (ObjectHashMap)in.readObject(); behaviour = (AssertBehaviour)in.readObject(); lock = (Lock)in.readObject(); } public void writeExternal(ObjectOutput out) throws IOException { out.writeObject(assertMap); out.writeObject(identityMap); out.writeObject(behaviour); out.writeObject(lock); } /* (non-Javadoc) * @see org.drools.common.ObjectStore#size() */ public int size() { return this.assertMap.size(); } /* (non-Javadoc) * @see org.drools.common.ObjectStore#isEmpty() */ public boolean isEmpty() { return this.assertMap != null; } public void clear() { this.assertMap.clear(); this.identityMap.clear(); } /* (non-Javadoc) * @see org.drools.common.ObjectStore#getObjectForHandle(org.drools.common.InternalFactHandle) */ public Object getObjectForHandle(FactHandle handle) { try { this.lock.lock(); // Make sure the FactHandle is from this WorkingMemory final InternalFactHandle internalHandle = (InternalFactHandle) this.assertMap.get( handle ); if ( internalHandle == null ) { return null; } Object object = internalHandle.getObject(); return object; } finally { this.lock.unlock(); } } /* (non-Javadoc) * @see org.drools.common.ObjectStore#getHandleForObject(java.lang.Object) */ public InternalFactHandle getHandleForObject(Object object){ return (InternalFactHandle) this.assertMap.get( object ); } public InternalFactHandle reconnect(FactHandle factHandle) { return (InternalFactHandle) this.assertMap.get( factHandle ); } /* (non-Javadoc) * @see org.drools.common.ObjectStore#getHandleForObject(java.lang.Object) */ public InternalFactHandle getHandleForObjectIdentity(Object object) { return (InternalFactHandle) this.identityMap.get( object ); } /* (non-Javadoc) * @see org.drools.common.ObjectStore#updateHandle(org.drools.common.InternalFactHandle, java.lang.Object) */ public void updateHandle(InternalFactHandle handle, Object object){ this.assertMap.remove( handle ); Object oldObject = handle.getObject(); handle.setObject( object ); this.assertMap.put( handle, handle, false ); } /* (non-Javadoc) * @see org.drools.common.ObjectStore#addHandle(org.drools.common.InternalFactHandle, java.lang.Object) */ public void addHandle(InternalFactHandle handle, Object object) { this.assertMap.put( handle, handle, false ); if ( AssertBehaviour.EQUALITY.equals(this.behaviour) ) { this.identityMap.put( handle, handle, false ); } } /* (non-Javadoc) * @see org.drools.common.ObjectStore#removeHandle(org.drools.common.InternalFactHandle) */ public void removeHandle(final FactHandle handle) { this.assertMap.remove( handle ); if ( AssertBehaviour.EQUALITY.equals(this.behaviour) ) { this.identityMap.remove( handle ); } } /* (non-Javadoc) * @see org.drools.common.ObjectStore#iterateObjects() */ public Iterator iterateObjects() { HashTableIterator iterator = new HashTableIterator( this.assertMap ); iterator.reset(); return new JavaIteratorAdapter( iterator, JavaIteratorAdapter.OBJECT ); } /* (non-Javadoc) * @see org.drools.common.ObjectStore#iterateObjects(org.drools.ObjectFilter) */ public Iterator iterateObjects(org.drools.runtime.ObjectFilter filter) { HashTableIterator iterator = new HashTableIterator( this.assertMap ); iterator.reset(); return new JavaIteratorAdapter( iterator, JavaIteratorAdapter.OBJECT, filter ); } /* (non-Javadoc) * @see org.drools.common.ObjectStore#iterateFactHandles() */ public Iterator iterateFactHandles() { HashTableIterator iterator = new HashTableIterator( this.assertMap ); iterator.reset(); return new JavaIteratorAdapter( iterator, JavaIteratorAdapter.FACT_HANDLE ); } /* (non-Javadoc) * @see org.drools.common.ObjectStore#iterateFactHandles(org.drools.ObjectFilter) */ public Iterator iterateFactHandles(org.drools.runtime.ObjectFilter filter) { HashTableIterator iterator = new HashTableIterator( this.assertMap ); iterator.reset(); return new JavaIteratorAdapter( iterator, JavaIteratorAdapter.FACT_HANDLE, filter ); } }