/* * Copyright 2013 Red Hat, Inc. and/or its affiliates. * * 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.kie.spring.tests.persistence; import org.h2.tools.DeleteDbFiles; import org.h2.tools.Server; import org.junit.*; import org.kie.api.KieBase; import org.kie.api.persistence.jpa.KieStoreServices; import org.kie.api.runtime.Environment; import org.kie.api.runtime.KieSession; import org.kie.api.runtime.process.WorkItem; import org.kie.api.runtime.process.WorkflowProcessInstance; import org.kie.internal.persistence.jpa.JPAKnowledgeService; import org.kie.spring.beans.persistence.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionTemplate; import javax.naming.NamingException; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.transaction.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import static org.junit.Assert.*; public class VariablePersistenceStrategyEnvTest { private static final Logger log = LoggerFactory.getLogger(VariablePersistenceStrategyEnvTest.class); private static Server h2Server; private ApplicationContext ctx; @BeforeClass public static void startH2Database() throws Exception { DeleteDbFiles.execute("", "DroolsFlow", true); h2Server = Server.createTcpServer(new String[0]); h2Server.start(); } @AfterClass public static void stopH2Database() throws Exception { log.debug("stoping database"); h2Server.stop(); DeleteDbFiles.execute("", "DroolsFlow", true); } @Before public void createSpringContext() { try { log.debug("creating spring context"); ctx = new ClassPathXmlApplicationContext("org/kie/spring/persistence/persistence_var_beans_env.xml"); } catch (Exception e) { log.error("can't create spring context", e); throw new RuntimeException(e); } } @After public void destroySpringContext() { log.debug("destroy spring context"); } @Test public void testTransactionsRollback() throws Exception { final List<?> list = new ArrayList<Object>(); PlatformTransactionManager txManager = (PlatformTransactionManager) ctx.getBean("txManager"); // final Environment env = KnowledgeBaseFactory.newEnvironment(); // env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, // ctx.getBean( "myEmf" ) ); // env.set( EnvironmentName.TRANSACTION_MANAGER, // txManager ); // env.set( EnvironmentName.GLOBALS, // new MapGlobalResolver() ); // // env.set( EnvironmentName.OBJECT_MARSHALLING_STRATEGIES, // new ObjectMarshallingStrategy[]{new JPAPlaceholderResolverStrategy( env ), // new SerializablePlaceholderResolverStrategy( ClassObjectMarshallingStrategyAcceptor.DEFAULT )} ); final Environment env = (Environment) ctx.getBean("env"); final KieStoreServices kstore = (KieStoreServices) ctx.getBean("kstore1"); final KieBase kbRollback = (KieBase) ctx.getBean("drl_persistence_rb"); TransactionTemplate txTemplate = new TransactionTemplate(txManager); final KieSession ksession = (KieSession) txTemplate.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { KieSession kNewSession = kstore.newKieSession(kbRollback, null, env); kNewSession.setGlobal("list", list); kNewSession.insert(1); kNewSession.insert(2); return kNewSession; } }); final long sessionId = ksession.getIdentifier(); txTemplate = new TransactionTemplate(txManager); txTemplate.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { ksession.insert(3); status.setRollbackOnly(); return null; } }); txTemplate = new TransactionTemplate(txManager); txTemplate.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { ksession.fireAllRules(); return null; } }); assertEquals(2, list.size()); txTemplate = new TransactionTemplate(txManager); txTemplate.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { ksession.insert(3); ksession.insert(4); return null; } }); txTemplate = new TransactionTemplate(txManager); txTemplate.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { ksession.insert(5); ksession.insert(6); status.setRollbackOnly(); return null; } }); txTemplate = new TransactionTemplate(txManager); txTemplate.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { ksession.fireAllRules(); return null; } }); assertEquals(4, list.size()); ksession.dispose(); // now load the ksession final KieSession ksession2 = JPAKnowledgeService.loadStatefulKnowledgeSession(sessionId, kbRollback, null, env); txTemplate = new TransactionTemplate(txManager); txTemplate.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { ksession2.setGlobal("list", list); ksession2.insert(7); ksession2.insert(8); return null; } }); txTemplate.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { ksession2.fireAllRules(); return null; } }); assertEquals(6, list.size()); } @Test public void testPersistenceVariables() throws NamingException, NotSupportedException, SystemException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException { MyEntity myEntity = new MyEntity("This is a test Entity with annotation in fields"); MyEntityMethods myEntityMethods = new MyEntityMethods("This is a test Entity with annotations in methods"); MyEntityOnlyFields myEntityOnlyFields = new MyEntityOnlyFields("This is a test Entity with annotations in fields and without accesors methods"); MyVariableSerializable myVariableSerializable = new MyVariableSerializable("This is a test SerializableObject"); EntityManager em = ((EntityManagerFactory) ctx.getBean("myEmf")).createEntityManager(); em.getTransaction().begin(); em.persist(myEntity); em.persist(myEntityMethods); em.persist(myEntityOnlyFields); em.getTransaction().commit(); em.close(); log.debug("---> get bean jpaSingleSessionCommandService"); KieSession service = (KieSession) ctx.getBean("jpaSingleSessionCommandService2"); long sessionId = service.getIdentifier(); log.debug("---> created SingleSessionCommandService id: " + sessionId); log.debug("### Starting process ###"); Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("x", "SomeString"); parameters.put("y", myEntity); parameters.put("m", myEntityMethods); parameters.put("f", myEntityOnlyFields); parameters.put("z", myVariableSerializable); WorkflowProcessInstance processInstance = (WorkflowProcessInstance) service.startProcess("com.sample.ruleflow", parameters); log.debug("Started process instance {}", processInstance.getId()); TestWorkItemHandler handler = TestWorkItemHandler.getInstance(); WorkItem workItem = handler.getWorkItem(); assertNotNull(workItem); service.dispose(); //EntityManagerFactory emf = (EntityManagerFactory) ctx.getBean( "myEmf" ); // List< ? > result = emf.createEntityManager().createQuery( "select i from VariableInstanceInfo i" ).getResultList(); // assertEquals( 5, // result.size() ); log.debug("### Retrieving process instance ###"); /* Environment env = KnowledgeBaseFactory.newEnvironment(); env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf ); env.set( EnvironmentName.TRANSACTION_MANAGER, ctx.getBean( "txManager" ) ); env.set( EnvironmentName.OBJECT_MARSHALLING_STRATEGIES, new ObjectMarshallingStrategy[]{ // new JPAPlaceholderResolverStrategy(env), new SerializablePlaceholderResolverStrategy( ClassObjectMarshallingStrategyAcceptor.DEFAULT ) } ); */ final Environment env = (Environment) ctx.getBean("env2"); KieStoreServices kstore = (KieStoreServices) ctx.getBean("kstore1"); KieBase kbase1 = (KieBase) ctx.getBean("drl_persistence"); service = kstore.loadKieSession(sessionId, kbase1, null, env); processInstance = (WorkflowProcessInstance) service.getProcessInstance(processInstance.getId()); assertNotNull(processInstance); assertNotNull(processInstance); assertEquals("SomeString", processInstance.getVariable("x")); assertEquals("This is a test Entity with annotation in fields", ((MyEntity) processInstance.getVariable("y")).getTest()); assertEquals("This is a test Entity with annotations in methods", ((MyEntityMethods) processInstance.getVariable("m")).getTest()); assertEquals("This is a test Entity with annotations in fields and without accesors methods", ((MyEntityOnlyFields) processInstance.getVariable("f")).test); assertEquals("This is a test SerializableObject", ((MyVariableSerializable) processInstance.getVariable("z")).getText()); assertNull(processInstance.getVariable("a")); assertNull(processInstance.getVariable("b")); assertNull(processInstance.getVariable("c")); service.dispose(); } }