package org.drools.persistence.session; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import org.drools.KnowledgeBase; import org.drools.marshalling.Marshaller; import org.drools.marshalling.MarshallerFactory; import org.drools.marshalling.ObjectMarshallingStrategy; import org.drools.runtime.Environment; import org.drools.runtime.EnvironmentName; import org.drools.runtime.KnowledgeSessionConfiguration; import org.drools.runtime.StatefulKnowledgeSession; public class JPASessionMarshallingHelper { private KnowledgeBase kbase; private KnowledgeSessionConfiguration conf; private StatefulKnowledgeSession ksession; private Marshaller marshaller; private Environment env; /** * Exist Info, so load session from here * @param info * @param ruleBase * @param conf * @param marshallingConfiguration */ public JPASessionMarshallingHelper(KnowledgeBase kbase, KnowledgeSessionConfiguration conf, Environment env) { this.kbase = kbase; this.conf = conf; this.env = env; ObjectMarshallingStrategy[] strategies = (ObjectMarshallingStrategy[]) env.get( EnvironmentName.OBJECT_MARSHALLING_STRATEGIES ); if (strategies != null ) { // use strategies if provided in the environment this.marshaller = MarshallerFactory.newMarshaller( kbase, strategies ); } else { this.marshaller = MarshallerFactory.newMarshaller( kbase ) ; } } /** * new session, don't write now as info will request it on update callback * @param info * @param session * @param conf * @param marshallingConfiguration */ public JPASessionMarshallingHelper(StatefulKnowledgeSession ksession, KnowledgeSessionConfiguration conf) { this.ksession = ksession; this.kbase = ksession.getKnowledgeBase(); this.conf = conf; this.env = ksession.getEnvironment(); ObjectMarshallingStrategy[] strategies = (ObjectMarshallingStrategy[]) this.env.get( EnvironmentName.OBJECT_MARSHALLING_STRATEGIES ); if (strategies != null ) { // use strategies if provided in the environment this.marshaller = MarshallerFactory.newMarshaller( kbase, strategies ); } else { this.marshaller = MarshallerFactory.newMarshaller( kbase ) ; } } public byte[] getSnapshot() { ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { marshaller.marshall( baos, ksession ); } catch ( IOException e ) { throw new RuntimeException( "Unable to get session snapshot", e ); } return baos.toByteArray(); } public StatefulKnowledgeSession loadSnapshot(byte[] bytes, StatefulKnowledgeSession ksession) { this.ksession = ksession; ByteArrayInputStream bais = new ByteArrayInputStream( bytes ); try { if ( this.ksession != null ) { this.marshaller.unmarshall( bais, this.ksession ); } else { this.ksession = this.marshaller.unmarshall( bais, this.conf, this.env ); } } catch ( Exception e ) { throw new RuntimeException( "Unable to load session snapshot", e ); } return this.ksession; } public StatefulKnowledgeSession getObject() { return ksession; } public KnowledgeBase getKbase() { return kbase; } public KnowledgeSessionConfiguration getConf() { return conf; } }