From d9cd9b1046351f80b7ed9bbd4dfbca6b048158e5 Mon Sep 17 00:00:00 2001
From: Maciej Swiderski
Date: Wed, 11 Dec 2013 12:08:37 +0100
Subject: [PATCH] unification of persistence and transaction handling for jbpm
and human task
---
.../DroolsSpringTransactionManager.java | 9 ++
.../HumanTaskSpringTransactionManager.java | 9 ++
kie-aries-blueprint/pom.xml | 10 ++
.../api/command/RemoteRuntimeEngine.java | 4 +-
.../command/RemoteTaskCommandExecutor.java | 10 +-
kie-remote/kie-services-remote/pom.xml | 1 -
.../remote/cdi/TransactionalExecutor.java | 83 ------------
.../remote/jms/RequestMessageBean.java | 11 +-
.../services/remote/rest/ResourceBase.java | 23 ++--
.../remote/rest/RestProcessRequestBean.java | 13 +-
.../util/ExecuteAndSerializeCommand.java | 35 +++++
kie-spring/pom.xml | 6 +
.../AbstractKieSpringJpaManager.java | 125 ++++++++++++++++++
.../HumanTaskSpringTransactionManager.java | 10 ++
.../persistence/KieSpringJpaManager.java | 91 ++-----------
.../persistence/KieSpringTaskJpaManager.java | 67 ++++++++++
.../KieSpringTransactionManager.java | 24 ++++
17 files changed, 341 insertions(+), 190 deletions(-)
delete mode 100644 kie-remote/kie-services-remote/src/main/java/org/kie/services/remote/cdi/TransactionalExecutor.java
create mode 100644 kie-remote/kie-services-remote/src/main/java/org/kie/services/remote/util/ExecuteAndSerializeCommand.java
create mode 100644 kie-spring/src/main/java/org/kie/spring/persistence/AbstractKieSpringJpaManager.java
create mode 100644 kie-spring/src/main/java/org/kie/spring/persistence/KieSpringTaskJpaManager.java
diff --git a/drools-spring-legacy5/src/main/java/org/drools/container/spring/beans/persistence/DroolsSpringTransactionManager.java b/drools-spring-legacy5/src/main/java/org/drools/container/spring/beans/persistence/DroolsSpringTransactionManager.java
index 995dbfcd5e..7e1cdeda1e 100644
--- a/drools-spring-legacy5/src/main/java/org/drools/container/spring/beans/persistence/DroolsSpringTransactionManager.java
+++ b/drools-spring-legacy5/src/main/java/org/drools/container/spring/beans/persistence/DroolsSpringTransactionManager.java
@@ -138,4 +138,13 @@ public int getStatus() {
public void registerTransactionSynchronization(TransactionSynchronization ts) {
TransactionSynchronizationManager.registerSynchronization( new SpringTransactionSynchronizationAdapter( ts ) );
}
+
+ @Override
+ public void putResource(Object key, Object resource) {
+ }
+
+ @Override
+ public Object getResource(Object key) {
+ return null;
+ }
}
diff --git a/drools-spring-legacy5/src/main/java/org/drools/container/spring/beans/persistence/HumanTaskSpringTransactionManager.java b/drools-spring-legacy5/src/main/java/org/drools/container/spring/beans/persistence/HumanTaskSpringTransactionManager.java
index de066b9206..cc9192a11e 100644
--- a/drools-spring-legacy5/src/main/java/org/drools/container/spring/beans/persistence/HumanTaskSpringTransactionManager.java
+++ b/drools-spring-legacy5/src/main/java/org/drools/container/spring/beans/persistence/HumanTaskSpringTransactionManager.java
@@ -130,4 +130,13 @@ public int getStatus() {
public void registerTransactionSynchronization(TransactionSynchronization ts) {
TransactionSynchronizationManager.registerSynchronization( new SpringTransactionSynchronizationAdapter( ts ) );
}
+
+ @Override
+ public void putResource(Object key, Object resource) {
+ }
+
+ @Override
+ public Object getResource(Object key) {
+ return null;
+ }
}
diff --git a/kie-aries-blueprint/pom.xml b/kie-aries-blueprint/pom.xml
index e37bbfb98d..4b0ef3afdd 100644
--- a/kie-aries-blueprint/pom.xml
+++ b/kie-aries-blueprint/pom.xml
@@ -75,6 +75,16 @@
jbpm-persistence-jpa
true
+
+ org.jbpm
+ jbpm-runtime-manager
+ true
+
+
+ javax.enterprise
+ cdi-api
+ true
+
org.hibernate.javax.persistence
diff --git a/kie-remote/kie-services-client/src/main/java/org/kie/services/client/api/command/RemoteRuntimeEngine.java b/kie-remote/kie-services-client/src/main/java/org/kie/services/client/api/command/RemoteRuntimeEngine.java
index d498214e37..297aeab4aa 100644
--- a/kie-remote/kie-services-client/src/main/java/org/kie/services/client/api/command/RemoteRuntimeEngine.java
+++ b/kie-remote/kie-services-client/src/main/java/org/kie/services/client/api/command/RemoteRuntimeEngine.java
@@ -2,8 +2,10 @@
import org.drools.core.command.CommandService;
import org.drools.core.command.impl.CommandBasedStatefulKnowledgeSession;
+import org.drools.core.impl.EnvironmentFactory;
import org.jbpm.process.audit.AuditLogService;
import org.jbpm.process.audit.CommandBasedAuditLogService;
+import org.jbpm.services.task.events.TaskEventSupport;
import org.jbpm.services.task.impl.command.CommandBasedTaskService;
import org.kie.api.runtime.CommandExecutor;
import org.kie.api.runtime.KieSession;
@@ -28,7 +30,7 @@ public KieSession getKieSession() {
public TaskService getTaskService() {
CommandExecutor executor = new RemoteTaskCommandExecutor(config);
- return new CommandBasedTaskService(executor);
+ return new CommandBasedTaskService((CommandService)executor, new TaskEventSupport());
}
public AuditLogService getAuditLogService() {
diff --git a/kie-remote/kie-services-client/src/main/java/org/kie/services/client/api/command/RemoteTaskCommandExecutor.java b/kie-remote/kie-services-client/src/main/java/org/kie/services/client/api/command/RemoteTaskCommandExecutor.java
index 60aefb37f7..c6a940f5d8 100644
--- a/kie-remote/kie-services-client/src/main/java/org/kie/services/client/api/command/RemoteTaskCommandExecutor.java
+++ b/kie-remote/kie-services-client/src/main/java/org/kie/services/client/api/command/RemoteTaskCommandExecutor.java
@@ -1,12 +1,18 @@
package org.kie.services.client.api.command;
+import org.drools.core.command.CommandService;
import org.kie.api.runtime.CommandExecutor;
+import org.kie.internal.command.Context;
-class RemoteTaskCommandExecutor extends AbstractRemoteCommandObject implements CommandExecutor {
+class RemoteTaskCommandExecutor extends AbstractRemoteCommandObject implements CommandService {
RemoteTaskCommandExecutor(RemoteConfiguration configuration) {
super(configuration);
isTaskService = true;
}
-
+
+ @Override
+ public Context getContext() {
+ return null;
+ }
}
diff --git a/kie-remote/kie-services-remote/pom.xml b/kie-remote/kie-services-remote/pom.xml
index 568ea4d95c..e407f6099e 100644
--- a/kie-remote/kie-services-remote/pom.xml
+++ b/kie-remote/kie-services-remote/pom.xml
@@ -102,7 +102,6 @@
org.slf4j
slf4j-api
-
junit
diff --git a/kie-remote/kie-services-remote/src/main/java/org/kie/services/remote/cdi/TransactionalExecutor.java b/kie-remote/kie-services-remote/src/main/java/org/kie/services/remote/cdi/TransactionalExecutor.java
deleted file mode 100644
index 00e0ba714c..0000000000
--- a/kie-remote/kie-services-remote/src/main/java/org/kie/services/remote/cdi/TransactionalExecutor.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.kie.services.remote.cdi;
-
-import javax.inject.Inject;
-import javax.interceptor.Interceptors;
-
-import org.jboss.seam.transaction.TransactionInterceptor;
-import org.jboss.seam.transaction.Transactional;
-import org.jbpm.services.task.commands.TaskCommand;
-import org.jbpm.services.task.impl.model.ContentImpl;
-import org.jbpm.services.task.impl.model.TaskImpl;
-import org.jbpm.services.task.impl.model.xml.JaxbContent;
-import org.jbpm.services.task.impl.model.xml.JaxbTask;
-import org.kie.api.command.Command;
-import org.kie.api.runtime.KieSession;
-import org.kie.api.task.TaskService;
-import org.kie.api.task.model.Content;
-import org.kie.api.task.model.Task;
-import org.kie.internal.task.api.InternalTaskService;
-
-@Transactional
-@Interceptors({TransactionInterceptor.class})
-public class TransactionalExecutor {
-
- @Inject
- private javax.persistence.EntityManager em;
-
- /**
- * Executes a {@link KieSession} operation within a transaction.
- *
- * @param kieSession The {@link KieSession} that the operation is being executed on.
- * @param cmd The {@link Command} to be executed.
- * @return The result of the {@link Command}, possibly null.
- */
- public Object execute(KieSession kieSession, Command> cmd) {
- return kieSession.execute(cmd);
- }
-
- /**
- * Executes a {@link TaskService} operation within a transaction.
- *
- * This method should only be used for {@link TaskCommand} classes that return objects that are not
- * (persistence) entity instances. If the {@link TaskCommand} returns a persistence entity, such as the {@link TaskImpl}
- * or {@link ContentImpl}, then use the {@link TransactionalExecutor#executeAndSerialize(InternalTaskService, TaskCommand)}
- * method.
- *
- * @param taskService The {@link TaskService} to execute the operation on.
- * @param cmd The {@link TaskCommand} to be executed.
- * @return The result of the {@link TaskCommand}, possibly null.
- */
- public Object execute(InternalTaskService taskService, TaskCommand> cmd) {
- em.joinTransaction();
- return ((InternalTaskService) taskService).execute(cmd);
- }
-
- /**
- * Executes a {@link TaskService} operation within a transaction. This method also tries to make sure the object returned
- * by the {@link TaskCommand} executed is also serialized within the transaction.
- *
- * This is done in order to avoid problems with proxy collection objects inserted into the entity instances (such as
- * {@link TaskImpl}): if these collection objects are accessed outside of a transaction, errors will occur.
- *
- * In essence, we're tightly coupling to the {@link TaskService} here, because of problems with the {@link TaskService}.
- * If those problems are ever fixed, this method should no longer be necessary.
- *
- * @param taskService The {@link TaskService} on which the operation is being executed.
- * @param cmd The {@link TaskCommand} to be executed.
- * @return The serialized result of the {@link TaskCommand}
- */
- public Object executeAndSerialize(InternalTaskService taskService, TaskCommand> cmd) {
- em.joinTransaction();
- Object cmdResult = ((InternalTaskService) taskService).execute(cmd);
- if( cmdResult == null ) {
- return null;
- }
- if( cmdResult instanceof Task ) {
- cmdResult = new JaxbTask((Task) cmdResult);
- } else if( cmdResult instanceof Content ) {
- cmdResult = new JaxbContent((Content) cmdResult);
- }
- return cmdResult;
- }
-
-}
diff --git a/kie-remote/kie-services-remote/src/main/java/org/kie/services/remote/jms/RequestMessageBean.java b/kie-remote/kie-services-remote/src/main/java/org/kie/services/remote/jms/RequestMessageBean.java
index ea837b4065..e99a75a6aa 100644
--- a/kie-remote/kie-services-remote/src/main/java/org/kie/services/remote/jms/RequestMessageBean.java
+++ b/kie-remote/kie-services-remote/src/main/java/org/kie/services/remote/jms/RequestMessageBean.java
@@ -41,10 +41,10 @@
import org.kie.services.client.serialization.jaxb.impl.JaxbCommandsRequest;
import org.kie.services.client.serialization.jaxb.impl.JaxbCommandsResponse;
import org.kie.services.remote.cdi.DeploymentInfoBean;
-import org.kie.services.remote.cdi.TransactionalExecutor;
import org.kie.services.remote.exception.DomainNotFoundBadRequestException;
import org.kie.services.remote.exception.KieRemoteServicesInternalError;
import org.kie.services.remote.exception.KieRemoteServicesRuntimeException;
+import org.kie.services.remote.util.ExecuteAndSerializeCommand;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -86,9 +86,6 @@ public class RequestMessageBean implements MessageListener {
@Inject
private TaskService taskService;
-
- @Inject
- private TransactionalExecutor executor;
// Constants / properties
@@ -360,7 +357,7 @@ private JaxbCommandsResponse processJaxbCommandsRequest(JaxbCommandsRequest requ
// that will cause message reception to be *NOT* acknowledged!
if( cmd instanceof TaskCommand>
&& ! AcceptedCommands.TASK_COMMANDS_THAT_INFLUENCE_KIESESSION.contains(cmd.getClass()) ) {
- cmdResult = executor.executeAndSerialize((InternalTaskService) taskService, (TaskCommand>) cmd);
+ cmdResult = ((InternalTaskService) taskService).execute(new ExecuteAndSerializeCommand((TaskCommand < ? >) cmd));
} else {
String deploymentId = request.getDeploymentId();
if( deploymentId == null ) {
@@ -379,9 +376,9 @@ private JaxbCommandsResponse processJaxbCommandsRequest(JaxbCommandsRequest requ
// Synchronize around SSCS to avoid race-conditions with kie session cache clearing in afterCompletion
synchronized(sscs) {
if( cmd instanceof TaskCommand> ) {
- cmdResult = executor.execute((InternalTaskService) taskService, (TaskCommand>) cmd);
+ cmdResult = ((InternalTaskService) taskService).execute((TaskCommand>) cmd);
} else {
- cmdResult = executor.execute(kieSession, cmd);
+ cmdResult = kieSession.execute(cmd);
}
}
}
diff --git a/kie-remote/kie-services-remote/src/main/java/org/kie/services/remote/rest/ResourceBase.java b/kie-remote/kie-services-remote/src/main/java/org/kie/services/remote/rest/ResourceBase.java
index f8057376b4..c5aff2cd91 100644
--- a/kie-remote/kie-services-remote/src/main/java/org/kie/services/remote/rest/ResourceBase.java
+++ b/kie-remote/kie-services-remote/src/main/java/org/kie/services/remote/rest/ResourceBase.java
@@ -22,13 +22,16 @@
import org.jboss.resteasy.spi.NotAcceptableException;
import org.jboss.resteasy.util.HttpHeaderNames;
import org.jbpm.services.task.commands.TaskCommand;
-import org.jbpm.services.task.impl.model.GroupImpl;
-import org.jbpm.services.task.impl.model.TaskImpl;
-import org.jbpm.services.task.impl.model.UserImpl;
import org.jbpm.services.task.query.TaskSummaryImpl;
import org.kie.api.command.Command;
+import org.kie.api.task.model.Group;
import org.kie.api.task.model.OrganizationalEntity;
import org.kie.api.task.model.Status;
+import org.kie.api.task.model.Task;
+import org.kie.api.task.model.User;
+import org.kie.internal.task.api.TaskModelProvider;
+import org.kie.internal.task.api.model.InternalOrganizationalEntity;
+import org.kie.internal.task.api.model.InternalTask;
import org.kie.services.client.api.command.AcceptedCommands;
import org.kie.services.client.serialization.jaxb.impl.JaxbCommandsRequest;
import org.kie.services.client.serialization.jaxb.impl.JaxbCommandsResponse;
@@ -299,17 +302,21 @@ protected static List getOrganizationalEntityListFromParam
throw new BadRequestException("At least 1 query parameter (either 'user' or 'group') is required for the '" + operation + "' operation.");
}
- for( String user : users ) {
- orgEntList.add(new UserImpl(user));
+ for( String user : users ) {
+ User newuser = TaskModelProvider.getFactory().newUser();
+ ((InternalOrganizationalEntity) newuser).setId(user);
+ orgEntList.add(newuser);
}
- for( String group : groups ) {
- orgEntList.add(new GroupImpl(group));
+ for( String group : groups ) {
+ Group newuser = TaskModelProvider.getFactory().newGroup();
+ ((InternalOrganizationalEntity) newuser).setId(group);
+ orgEntList.add(newuser);
}
return orgEntList;
}
- protected static TaskSummaryImpl convertTaskToTaskSummary(TaskImpl task) {
+ protected static TaskSummaryImpl convertTaskToTaskSummary(InternalTask task) {
TaskSummaryImpl taskSummary = new TaskSummaryImpl(
task.getId().longValue(),
task.getTaskData().getProcessInstanceId(),
diff --git a/kie-remote/kie-services-remote/src/main/java/org/kie/services/remote/rest/RestProcessRequestBean.java b/kie-remote/kie-services-remote/src/main/java/org/kie/services/remote/rest/RestProcessRequestBean.java
index b02bb18b4c..9fc986eebc 100644
--- a/kie-remote/kie-services-remote/src/main/java/org/kie/services/remote/rest/RestProcessRequestBean.java
+++ b/kie-remote/kie-services-remote/src/main/java/org/kie/services/remote/rest/RestProcessRequestBean.java
@@ -17,7 +17,7 @@
import org.kie.api.task.TaskService;
import org.kie.internal.task.api.InternalTaskService;
import org.kie.services.remote.cdi.DeploymentInfoBean;
-import org.kie.services.remote.cdi.TransactionalExecutor;
+import org.kie.services.remote.util.ExecuteAndSerializeCommand;
/**
* This class is used by both the {@link RuntimeResource} and {@link TaskResource} to do the core operations on
@@ -41,9 +41,6 @@ public class RestProcessRequestBean {
@Inject
private TaskService taskService;
- @Inject
- private TransactionalExecutor executor;
-
/**
* Executes a command on the {@link KieSession} from the proper {@link RuntimeManager}. This method
* ends up synchronizing around the retrieved {@link KieSession} in order to avoid race-conditions.
@@ -61,7 +58,7 @@ public Object doKieSessionOperation(Command> cmd, String deploymentId, Long pr
SingleSessionCommandService sscs
= (SingleSessionCommandService) ((CommandBasedStatefulKnowledgeSession) kieSession).getCommandService();
synchronized (sscs) {
- result = executor.execute(kieSession, cmd);
+ result = kieSession.execute(cmd);
}
} catch (Exception e) {
if( e instanceof RuntimeException ) {
@@ -95,10 +92,10 @@ public Object doTaskOperationOnDeployment(TaskCommand> cmd, String deploymentI
SingleSessionCommandService sscs
= (SingleSessionCommandService) ((CommandBasedStatefulKnowledgeSession) kieSession).getCommandService();
synchronized (sscs) {
- result = executor.execute((InternalTaskService) taskService, cmd);
+ result = ((InternalTaskService) taskService).execute(cmd);
}
} else {
- result = executor.execute((InternalTaskService) taskService, cmd);
+ result = ((InternalTaskService) taskService).execute(cmd);
}
} catch (PermissionDeniedException pde) {
throw new UnauthorizedException(pde.getMessage(), pde);
@@ -133,7 +130,7 @@ public Object doTaskOperation(TaskCommand> cmd, String errorMsg) {
public Object doTaskOperationAndSerializeResult(TaskCommand> cmd, String errorMsg) {
Object result = null;
try {
- result = executor.executeAndSerialize((InternalTaskService) taskService, cmd);
+ result = ((InternalTaskService) taskService).execute(new ExecuteAndSerializeCommand((TaskCommand>) cmd));
} catch (PermissionDeniedException pde) {
throw new UnauthorizedException(pde.getMessage(), pde);
} catch (RuntimeException re) {
diff --git a/kie-remote/kie-services-remote/src/main/java/org/kie/services/remote/util/ExecuteAndSerializeCommand.java b/kie-remote/kie-services-remote/src/main/java/org/kie/services/remote/util/ExecuteAndSerializeCommand.java
new file mode 100644
index 0000000000..e348fdf756
--- /dev/null
+++ b/kie-remote/kie-services-remote/src/main/java/org/kie/services/remote/util/ExecuteAndSerializeCommand.java
@@ -0,0 +1,35 @@
+package org.kie.services.remote.util;
+
+import org.jbpm.services.task.commands.TaskCommand;
+import org.jbpm.services.task.impl.model.xml.JaxbContent;
+import org.jbpm.services.task.impl.model.xml.JaxbTask;
+import org.kie.api.task.model.Content;
+import org.kie.api.task.model.Task;
+import org.kie.internal.command.Context;
+
+public class ExecuteAndSerializeCommand extends TaskCommand