cmailleux 2005/11/22 11:02:32 CET
Modified files:
core/src/java/org/jahia/engines/workflow ManageWorkflow.java
Log:
Use a transaction to ensure the existence of the virtual group for the
workflow
Revision Changes Path
1.9 +74 -46
jahia/core/src/java/org/jahia/engines/workflow/ManageWorkflow.java
http://jahia.mine.nu:8080/cgi-bin/cvsweb.cgi/jahia/core/src/java/org/jahia/engines/workflow/ManageWorkflow.java.diff?r1=1.8&r2=1.9&f=h
Index: ManageWorkflow.java
===================================================================
RCS file:
/home/cvs/repository/jahia/core/src/java/org/jahia/engines/workflow/ManageWorkflow.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- ManageWorkflow.java 11 Oct 2005 14:19:26 -0000 1.8
+++ ManageWorkflow.java 22 Nov 2005 10:02:32 -0000 1.9
@@ -12,6 +12,11 @@
import org.jahia.services.usermanager.JahiaUser;
import org.jahia.services.workflow.ExternalWorkflow;
import org.jahia.services.workflow.WorkflowService;
+import org.jahia.hibernate.manager.SpringContextSingleton;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.TransactionStatus;
+import org.springframework.transaction.support.TransactionTemplate;
+import
org.springframework.transaction.support.TransactionCallbackWithoutResult;
import java.security.Principal;
import java.util.*;
@@ -27,6 +32,7 @@
private static ManageWorkflow instance = null;
private static final String JSP_FILE =
"/jsp/jahia/engines/workflow/changeworkflow.jsp";
public static final String WORKFLOW_ROLES = "workflowRoles";
+ private TransactionTemplate transactionTemplate;
/**
* @return a single instance of the object
@@ -215,7 +221,7 @@
private boolean save(final ProcessingContext jParams, final HashMap
engineMap, final ContentObject object)
throws JahiaException {
- WorkflowService service;
+ final WorkflowService service;
try {
service = ServicesRegistry.getInstance().getWorkflowService();
} catch (Exception e) {
@@ -226,64 +232,86 @@
if (engineMap.get("workflowMode") == null) {
return true;
}
- boolean result = false;
+ final boolean[] result = new boolean[]{false};
int mode = ((Integer) engineMap.get("workflowMode")).intValue();
engineMap.put("workflowMode", new Integer(mode));
if (mode == WorkflowService.EXTERNAL) {
- final String workflowName = (String)
engineMap.get("workflowName");
- final String process = (String) engineMap.get("process");
- if (workflowName != null) {
- engineMap.put("workflowName", workflowName);
- final ExternalWorkflow workflow =
service.getExternalWorkflow(workflowName);
- workflow.startSession(jParams.getLocale());
- final Collection names = workflow.getAvailableProcesses();
- if (process != null && names.contains(process)) {
- service.setWorkflowMode(object,
WorkflowService.EXTERNAL, workflowName, process, jParams);
-
- final Vector roles = (Vector) engineMap.get("roles");
- // Handle roles changes
- if (roles != null) {
- for (int roleNb = 0; roleNb < roles.size();
roleNb++) {
- final String role = (String) roles.get(roleNb);
- final JahiaGroup grp =
service.getRoleGroup(object, role, true);
- final HashSet membersSet =
getFormMembers(jParams, roleNb);
- final Enumeration members = grp.members();
- while (members.hasMoreElements()) {
- final Principal p = (Principal)
members.nextElement();
- if (p instanceof JahiaUser) {
- if (!membersSet.contains(p)) {
- logger.debug("removed member=" +
p.getName());
- grp.removeMember(p);
- } else {
- membersSet.remove(p);
- }
- } else if (p instanceof JahiaGroup) {
- if (!membersSet.contains(p)) {
- logger.debug("removed member=" +
p.getName());
- grp.removeMember(p);
- } else {
- membersSet.remove(p);
+ if (transactionTemplate == null) {
+ SpringContextSingleton instance =
SpringContextSingleton.getInstance();
+ if (instance.isInitialized()) {
+ PlatformTransactionManager manager =
(PlatformTransactionManager)
instance.getContext().getBean("transactionManager");
+ transactionTemplate = new TransactionTemplate(manager);
+ }
+ }
+ try {
+ transactionTemplate.execute(new
TransactionCallbackWithoutResult() {
+ protected void
doInTransactionWithoutResult(TransactionStatus status) {
+ try {
+ final String workflowName = (String)
engineMap.get("workflowName");
+ final String process = (String)
engineMap.get("process");
+ if (workflowName != null) {
+ engineMap.put("workflowName", workflowName);
+ final ExternalWorkflow workflow =
service.getExternalWorkflow(workflowName);
+ workflow.startSession(jParams.getLocale());
+ final Collection names =
workflow.getAvailableProcesses();
+ if (process != null &&
names.contains(process)) {
+ service.setWorkflowMode(object,
WorkflowService.EXTERNAL, workflowName, process, jParams);
+
+ final Vector roles = (Vector)
engineMap.get("roles");
+ // Handle roles changes
+ if (roles != null) {
+ for (int roleNb = 0; roleNb <
roles.size(); roleNb++) {
+ final String role = (String)
roles.get(roleNb);
+ final JahiaGroup grp =
service.getRoleGroup(object, role, true);
+ final HashSet membersSet =
getFormMembers(jParams, roleNb);
+ final Enumeration members =
grp.members();
+ while
(members.hasMoreElements()) {
+ final Principal p =
(Principal) members.nextElement();
+ if (p instanceof JahiaUser) {
+ if
(!membersSet.contains(p)) {
+
logger.debug("removed member=" + p.getName());
+ grp.removeMember(p);
+ } else {
+ membersSet.remove(p);
+ }
+ } else if (p instanceof
JahiaGroup) {
+ if
(!membersSet.contains(p)) {
+
logger.debug("removed member=" + p.getName());
+ grp.removeMember(p);
+ } else {
+ membersSet.remove(p);
+ }
+ }
+ }
+
+ final Iterator it =
membersSet.iterator();
+ while (it.hasNext()) {
+ final Principal p =
(Principal) it.next();
+ grp.addMember(p);
+ }
+ }
}
+ result[0] = true;
}
+ workflow.endSession();
}
-
- final Iterator it = membersSet.iterator();
- while (it.hasNext()) {
- final Principal p = (Principal) it.next();
- grp.addMember(p);
- }
+ } catch (Throwable e) {
+ throw new RuntimeException(e);
}
}
- result = true;
- }
- workflow.endSession();
+ });
+ } catch (Throwable e) {
+ logger.error("Error during add operation of a new element we
must flush all caches to ensure integrity between database and viewing");
+
ServicesRegistry.getInstance().getCacheService().flushAllCaches();
+ throw new JahiaException(e.getMessage(), e.getMessage(),
+ JahiaException.DATABASE_ERROR,
JahiaException.CRITICAL_SEVERITY, e);
}
} else {
service.setWorkflowMode(object, mode, null, null, jParams);
- result = true;
+ result[0] = true;
}
- return result;
+ return result[0];
}
}