/** * 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.reteoo; import java.io.ByteArrayOutputStream; import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.util.Collection; import java.util.Collections; import java.util.List; import org.drools.FactHandle; import org.drools.SessionConfiguration; import org.drools.StatefulSession; import org.drools.common.InternalAgenda; import org.drools.common.InternalFactHandle; import org.drools.common.InternalRuleBase; import org.drools.concurrent.AssertObject; import org.drools.concurrent.AssertObjects; import org.drools.concurrent.ExecutorService; import org.drools.concurrent.FireAllRules; import org.drools.concurrent.Future; import org.drools.concurrent.RetractObject; import org.drools.concurrent.UpdateObject; import org.drools.impl.EnvironmentFactory; import org.drools.marshalling.Marshaller; import org.drools.marshalling.MarshallerFactory; import org.drools.runtime.Environment; import org.drools.runtime.StatefulKnowledgeSession; import org.drools.spi.AgendaFilter; import org.drools.spi.FactHandleFactory; import org.drools.spi.RuleBaseUpdateListener; import org.drools.spi.RuleBaseUpdateListenerFactory; public class ReteooStatefulSession extends ReteooWorkingMemory implements StatefulSession, Externalizable { private static final long serialVersionUID = 510l; private transient ExecutorService executor; private transient List ruleBaseListeners; public ReteooStatefulSession() { super(); } public ReteooStatefulSession(final int id, final InternalRuleBase ruleBase, final ExecutorService executorService) { this( id, ruleBase, executorService, new SessionConfiguration(), EnvironmentFactory.newEnvironment() ); } public ReteooStatefulSession(final int id, final InternalRuleBase ruleBase, final ExecutorService executorService, final SessionConfiguration config, final Environment environment) { super( id, ruleBase, config, environment ); this.executor = executorService; } public ReteooStatefulSession(final int id, final InternalRuleBase ruleBase, final ExecutorService executorService, final FactHandleFactory handleFactory, final InternalFactHandle initialFactHandle, final long propagationContext, final SessionConfiguration config, final InternalAgenda agenda, final Environment environment) { super( id, ruleBase, handleFactory, initialFactHandle, propagationContext, config, agenda, environment ); this.executor = executorService; } public byte[] bytes; public void writeExternal(ObjectOutput out) throws IOException { // all we do is create marshall to a byte[] and write to the stream StatefulKnowledgeSession ksession = (StatefulKnowledgeSession) getKnowledgeRuntime(); Marshaller marshaller = MarshallerFactory.newMarshaller( ksession.getKnowledgeBase() ); ByteArrayOutputStream stream = new ByteArrayOutputStream(); marshaller.marshall( stream, (StatefulKnowledgeSession) getKnowledgeRuntime() ); stream.close(); byte[] bytes = stream.toByteArray(); out.writeInt( bytes.length ); out.write( bytes ); } public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { bytes = new byte[ in.readInt() ]; in.readFully( bytes ); } public Future asyncInsert(final Object object) { final AssertObject assertObject = new AssertObject( object ); this.executor.submit( assertObject ); return assertObject; } public Future asyncRetract(final FactHandle factHandle) { return this.executor.submit( new RetractObject( factHandle ) ); } public Future asyncUpdate(final FactHandle factHandle, final Object object) { return this.executor.submit( new UpdateObject( (org.drools.FactHandle)factHandle, object ) ); } public Future asyncInsert(final Object[] array) { final AssertObjects assertObjects = new AssertObjects( array ); this.executor.submit( assertObjects ); return assertObjects; } public Future asyncInsert(final Collection collection) { final AssertObjects assertObjects = new AssertObjects( collection ); this.executor.submit( assertObjects ); return assertObjects; } public Future asyncInsert(final Iterable<?> iterable) { final AssertObjects assertObjects = new AssertObjects( iterable ); this.executor.submit( assertObjects ); return assertObjects; } public Future asyncFireAllRules(final AgendaFilter agendaFilter) { final FireAllRules fireAllRules = new FireAllRules( agendaFilter ); this.executor.submit( fireAllRules ); return fireAllRules; } public Future asyncFireAllRules() { final FireAllRules fireAllRules = new FireAllRules( null ); this.executor.submit( fireAllRules ); return fireAllRules; } public void dispose() { this.ruleBase.disposeStatefulSession( this ); super.dispose(); this.executor.shutDown(); } @Override protected void finalize() throws Throwable { dispose(); } public List getRuleBaseUpdateListeners() { if ( this.ruleBaseListeners == null || this.ruleBaseListeners == Collections.EMPTY_LIST ) { String listenerName = this.ruleBase.getConfiguration().getRuleBaseUpdateHandler(); if ( listenerName != null && listenerName.length() > 0 ) { RuleBaseUpdateListener listener = RuleBaseUpdateListenerFactory.createListener( listenerName, this ); this.ruleBaseListeners = Collections.singletonList( listener ); } else { this.ruleBaseListeners = Collections.EMPTY_LIST; } } return this.ruleBaseListeners; } // public StatefulSession getEntryPoint(String id) { // EntryPoint ep = new EntryPoint( id ); // return new EntryPointInterfaceImpl( ep, // this ); // } public ExecutorService getExecutorService() { return executor; } public void setExecutorService(ExecutorService executor) { this.executor = executor; } }