/** * 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.container.spring.beans; import java.util.Map; import javax.persistence.EntityManagerFactory; import org.drools.KnowledgeBaseFactory; import org.drools.SessionConfiguration; import org.drools.command.Command; import org.drools.marshalling.ObjectMarshallingStrategy; import org.drools.marshalling.impl.ClassObjectMarshallingStrategyAcceptor; import org.drools.marshalling.impl.SerializablePlaceholderResolverStrategy; import org.drools.persistence.jpa.JPAKnowledgeService; import org.drools.runtime.CommandExecutor; import org.drools.runtime.Environment; import org.drools.runtime.EnvironmentName; import org.drools.runtime.StatefulKnowledgeSession; import org.drools.runtime.process.WorkItemHandler; import org.springframework.transaction.PlatformTransactionManager; public class StatefulKnowledgeSessionBeanFactory extends AbstractKnowledgeSessionBeanFactory { private StatefulKnowledgeSession ksession; private JpaConfiguration jpaConfiguration; public Class<StatefulKnowledgeSession> getObjectType() { return StatefulKnowledgeSession.class; } public JpaConfiguration getJpaConfiguration() { return jpaConfiguration; } public void setJpaConfiguration(JpaConfiguration jpaConfiguration) { this.jpaConfiguration = jpaConfiguration; } @Override protected CommandExecutor getCommandExecutor() { return ksession; } @Override protected void internalAfterPropertiesSet() { if ( getConf() != null && getWorkItems() != null && !getWorkItems().isEmpty() ) { Map<String, WorkItemHandler> map = ((SessionConfiguration) getConf()).getWorkItemHandlers(); map.putAll( getWorkItems() ); } if ( jpaConfiguration != null ) { Environment env = KnowledgeBaseFactory.newEnvironment(); env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, jpaConfiguration.getEntityManagerFactory() ); env.set( EnvironmentName.TRANSACTION_MANAGER, jpaConfiguration.getPlatformTransactionManager() ); env.set( EnvironmentName.OBJECT_MARSHALLING_STRATEGIES, new ObjectMarshallingStrategy[]{new SerializablePlaceholderResolverStrategy( ClassObjectMarshallingStrategyAcceptor.DEFAULT )} ); if ( jpaConfiguration.getId() >= 0 ) { ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( jpaConfiguration.getId(), getKbase(), getConf(), env ); } else { ksession = JPAKnowledgeService.newStatefulKnowledgeSession( getKbase(), getConf(), env ); } } else { ksession = getKbase().newStatefulKnowledgeSession( getConf(), null ); } if ( getBatch() != null && !getBatch().isEmpty() ) { for ( Command< ? > cmd : getBatch() ) { ksession.execute( cmd ); } } if ( getNode() != null ) { getNode().set( getName(), this.ksession ); } } public static class JpaConfiguration { private EntityManagerFactory emf; private PlatformTransactionManager tm; private int id = -1; public EntityManagerFactory getEntityManagerFactory() { return this.emf; } public void setEntityManagerFactory(EntityManagerFactory emf) { this.emf = emf; } public PlatformTransactionManager getPlatformTransactionManager() { return this.tm; } public void setPlatformTransactionManager(PlatformTransactionManager tm) { this.tm = tm; } public int getId() { return id; } public void setId(int id) { this.id = id; } } }