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];
       }
   
   }
  

Reply via email to