1 /*****************************************************************************
2 * Copyright Igor Barma, Eric Brun, Alexandre Desoubeaux, Christian Martel,
5 * Ce logiciel est un programme informatique servant à l'évaluation des
8 * Ce logiciel est régi par la licence CeCILL soumise au droit français et
9 * respectant les principes de diffusion des logiciels libres. Vous pouvez
10 * utiliser, modifier et/ou redistribuer ce programme sous les conditions
11 * de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
12 * sur le site "http://www.cecill.info".
14 * En contrepartie de l'accessibilité au code source et des droits de copie,
15 * de modification et de redistribution accordés par cette licence, il n'est
16 * offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
17 * seule une responsabilité restreinte pèse sur l'auteur du programme, le
18 * titulaire des droits patrimoniaux et les concédants successifs.
20 * A cet égard l'attention de l'utilisateur est attirée sur les risques
21 * associés au chargement, à l'utilisation, à la modification et/ou au
22 * développement et à la reproduction du logiciel par l'utilisateur étant
23 * donné sa spécificité de logiciel libre, qui peut le rendre complexe à
24 * manipuler et qui le réserve donc à des développeurs et des professionnels
25 * avertis possédant des connaissances informatiques approfondies. Les
26 * utilisateurs sont donc invités à charger et tester l'adéquation du
27 * logiciel à leurs besoins dans des conditions permettant d'assurer la
28 * sécurité de leurs systèmes et ou de leurs données et, plus généralement,
29 * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
31 * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
32 * pris connaissance de la licence CeCILL, et que vous en avez accepté les
34 *******************************************************************************/
35 package com.pentila.evalcomp.workflow.engine;
38 import java.io.FilenameFilter;
39 import java.io.UnsupportedEncodingException;
40 import java.util.ArrayList;
41 import java.util.Arrays;
42 import java.util.Collection;
43 import java.util.HashMap;
44 import java.util.HashSet;
45 import java.util.List;
48 import java.util.Map.Entry;
50 import org.ow2.bonita.env.Environment;
51 import org.ow2.bonita.facade.APIAccessor;
52 import org.ow2.bonita.facade.IdentityAPI;
53 import org.ow2.bonita.facade.ManagementAPI;
54 import org.ow2.bonita.facade.QueryDefinitionAPI;
55 import org.ow2.bonita.facade.QueryRuntimeAPI;
56 import org.ow2.bonita.facade.RuntimeAPI;
57 import org.ow2.bonita.facade.def.element.BusinessArchive;
58 import org.ow2.bonita.facade.def.majorElement.ActivityDefinition;
59 import org.ow2.bonita.facade.def.majorElement.DataFieldDefinition;
60 import org.ow2.bonita.facade.def.majorElement.ParticipantDefinition;
61 import org.ow2.bonita.facade.def.majorElement.ProcessDefinition;
62 import org.ow2.bonita.facade.def.majorElement.TransitionDefinition;
63 import org.ow2.bonita.facade.exception.ActivityNotFoundException;
64 import org.ow2.bonita.facade.exception.DataFieldNotFoundException;
65 import org.ow2.bonita.facade.exception.InstanceNotFoundException;
66 import org.ow2.bonita.facade.exception.ProcessNotFoundException;
67 import org.ow2.bonita.facade.exception.VariableNotFoundException;
68 import org.ow2.bonita.facade.runtime.ActivityInstance;
69 import org.ow2.bonita.facade.runtime.ActivityState;
70 import org.ow2.bonita.facade.runtime.ProcessInstance;
71 import org.ow2.bonita.facade.runtime.TaskInstance;
72 import org.ow2.bonita.facade.uuid.ActivityInstanceUUID;
73 import org.ow2.bonita.facade.uuid.ProcessDefinitionUUID;
74 import org.ow2.bonita.facade.uuid.ProcessInstanceUUID;
75 import org.ow2.bonita.identity.auth.DomainOwner;
77 import org.ow2.bonita.util.AccessorUtil;
78 import org.ow2.bonita.util.BusinessArchiveFactory;
79 import org.ow2.bonita.util.Command;
81 import com.pentila.evalcomp.domain.Role;
82 import com.pentila.evalcomp.domain.User;
83 import com.pentila.evalcomp.domain.definition.EvaluationDefinition;
84 import com.pentila.evalcomp.domain.definition.Property;
85 import com.pentila.evalcomp.domain.definition.ScenarioDefinition;
86 import com.pentila.evalcomp.domain.service.ExtendProcessDefinition;
87 import com.pentila.evalcomp.domain.transit.Activity;
88 import com.pentila.evalcomp.domain.transit.Process;
89 import com.pentila.evalcomp.domain.transit.TPackageDefinition;
90 import com.pentila.evalcomp.domain.transit.TransitProcessDefinition;
91 import com.pentila.evalcomp.domain.transit.Transition;
92 import com.pentila.evalcomp.manager.Beans;
93 import com.pentila.evalcomp.utilities.InstanceUtil;
94 import com.pentila.evalcomp.utilities.Utils;
95 import com.pentila.evalcomp.workflow.engine.IEngine;
97 public class Engine5 implements IEngine {
99 org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(Engine5.class);
103 private String envFile;
105 /** The workflowsdir. */
106 private String workflowsdir;
108 private Map<ProcessDefinitionUUID, ExtendProcessDefinition> extDefinitions;
110 private final List<String> propertyTypesDefinition = Arrays.asList(new String[] { Property.PROPERTY,
111 Property.DEADLINE });
113 private final List<String> propertyTypesInstance = Arrays.asList(new String[] { Property.PROPERTY,
114 Property.VARIABLE });
117 * Convert. Convert a Bonita ProcessDefintion to a TrasitProcessDefinition
122 * @return the transit process definition
124 private TransitProcessDefinition convert(ProcessDefinition pd) {
125 TransitProcessDefinition tpd = new TransitProcessDefinition();
129 APIAccessor apiac = getAPIAccessor();
131 QueryDefinitionAPI e = apiac.getQueryDefinitionAPI();
133 /*PackageDefinition packDef = e.getPackage(pd
134 .getPackageDefinitionUUID());
136 // Get and Convert Package Definition information
137 TPackageDefinition tpack = new TPackageDefinition();
139 tpack.setAuthor("Pentila");
140 tpack.setCreationDate(pd.getDeployedDate().toString());
141 tpack.setDescription(pd.getDescription());
142 tpack.setVersion(pd.getVersion());
143 tpack.setXpdlVersion("2.0");
144 tpack.setUUID(pd.getUUID().toString());
145 tpack.setDeployedDate(pd.getDeployedDate());
146 tpack.setName(pd.getName());
148 tpd.setPackageDefinition(tpack);
150 // Build Process Definition information
151 tpd.setId(pd.getName());
152 String defuuid = pd.getUUID().toString();
153 tpd.setUUID(defuuid);
154 tpd.setName(pd.getLabel());
155 tpd.setDescription(pd.getDescription());
156 tpd.setAuthor("Pentila");
157 tpd.setVersion(pd.getVersion());
159 tpd.setCreationDate(pd.getDeployedDate().toString());
160 ProcessDefinitionUUID uuid = new ProcessDefinitionUUID(defuuid);
162 ExtendProcessDefinition EPD = extDefinitions.get(pd.getUUID());
165 DataFieldDefinition ob;
166 ob = e.getProcessDataField(uuid, "INIT_ROLE");
167 String value = (String)ob.getInitialValue();
168 tpd.setInitRole(value);
169 } catch (DataFieldNotFoundException e1) {
171 // e1.printStackTrace();
175 DataFieldDefinition ob;
176 ob = e.getProcessDataField(uuid, "INSTANCIATION_MODE");
178 String value = (String)ob.getInitialValue();
180 Integer instanciationMode = new Integer(value);
181 tpd.setInstanciationMode(instanciationMode);
182 } catch (DataFieldNotFoundException e1) {
183 // TODO Auto-generated catch block
184 // e1.printStackTrace();
185 tpd.setInstanciationMode(EvaluationDefinition.MODE_NONE);
189 DataFieldDefinition ob;
190 ob = e.getProcessDataField(uuid, "TYPE");
191 String value = (String)ob.getInitialValue();
193 } catch (DataFieldNotFoundException e1) {
194 String type = ScenarioDefinition.EVALUATION;
197 // e1.printStackTrace();
201 Map<String, Role> mapRoles = new HashMap<String, Role>();
205 if (tpd.getInitRole() != null){
206 Role initRole = new Role();
207 initRole.setName(tpd.getInitRole());
208 mapRoles.put(tpd.getInitRole(), initRole);
213 Set<ParticipantDefinition> sp = e.getProcessParticipants(uuid);
214 for (ParticipantDefinition pad : sp) {
216 if (!mapRoles.containsKey(pad.getName())){
217 Role role = new Role();
218 role.setName(pad.getName());
220 mapRoles.put(pad.getName(), role);
223 if (EPD != null && EPD.getRoles() != null){
224 for(Role r : EPD.getRoles()){
225 if (r.getName().equals(pad.getName())){
226 mapRoles.get(pad.getName()).setSingleMember(r.isSingleMember());
233 if (!mapRoles.isEmpty()){
235 tpd.setRoles(new HashSet<Role>(mapRoles.values()));
237 Set<ActivityDefinition> sad = e.getProcessActivities(pd
240 Set<Activity> sa = new HashSet<Activity>();
241 for (ActivityDefinition ad : sad) {
243 // Take only manual (Humain Activities)
244 if (!ad.isAutomatic()) {
246 Activity a = new Activity();
247 a.setId(ad.getName());
248 a.setName(ad.getName());
249 a.setDescription(ad.getDescription());
253 a.setRoleNamePerformers(ad.getPerformers());
258 tpd.setActivities(sa);
259 Set<Property> spp = getDefProperties(e, pd
260 .getUUID(), propertyTypesDefinition);
262 tpd.getProperties().addAll(spp);
264 } catch (ProcessNotFoundException e) {
265 // TODO Auto-generated catch block
273 * Deploy and return a Map of deployed ProcessDefiniton.
275 * @param managementAPI
280 * @return the map< string, process definition>
285 protected ProcessDefinition deploy(
286 ManagementAPI managementAPI, File barFile) throws Exception {
288 if (barFile != null) {
290 /* final java.io.InputStream in = new FileInputStream(barFile);
293 throw new Exception("Can't find ressource: " + barFile);
297 BusinessArchive ba = BusinessArchiveFactory.getBusinessArchive(barFile);
299 //byte[] bar = Misc.getAllContentFrom(in);
303 return managementAPI.deploy(ba);
305 logger.error("Usage: " + Engine.class + " bpar file");
307 } catch (Exception e) {
309 logger.error("Deploy Workflow Warning");
315 * @see com.pentila.evalcomp.workflow.engine.IEngine#deployWF(org.ow2.bonita.facade.RuntimeAPI, org.ow2.bonita.facade.QueryRuntimeAPI, org.ow2.bonita.facade.ManagementAPI, org.ow2.bonita.facade.QueryDefinitionAPI, java.lang.String)
319 public void deployWF(RuntimeAPI runtimeAPI,
320 QueryRuntimeAPI queryRuntimeAPI, ManagementAPI managementAPI,
321 QueryDefinitionAPI queryDefinitionAPI, String barFile)
324 File dir = new File(Beans.getApplicationPath("/")+ "/WEB-INF/"+workflowsdir);
326 logger.info("PATH of WORKFLOW :" + dir.getAbsolutePath());
328 File[] filesWanted = dir.listFiles(new FilenameFilter() {
329 public boolean accept(File dir, String name) {
330 return name.endsWith(".bar");
334 if (filesWanted != null){
336 for (File f : filesWanted) {
340 logger.info("Engine bar File at : " +f.getAbsolutePath());
342 deploy(managementAPI, f);
344 } catch (Exception e) {
345 logger.warn("Eric Test");
346 logger.warn("Deployer Workflow Warning");
351 // Initilize Extenstion Definition data struct
352 extDefinitions = new HashMap<ProcessDefinitionUUID, ExtendProcessDefinition>();
354 for (ProcessDefinition pd : queryDefinitionAPI.getProcesses()){
356 logger.info("ProcessDefintion name : " + pd.getName());
358 if (!extDefinitions.containsKey(pd.getUUID())){
360 String xmldef = getExtendXML(pd.getUUID(), "forms/resources/extension.xml");
362 extDefinitions.put(pd.getUUID(), XMLUtil.getExtendProcessDefinition(xmldef));
369 * @see com.pentila.evalcomp.workflow.engine.IEngine#execute(org.ow2.bonita.util.Command)
372 public Object execute(Command m) {
373 Object result = null;
375 result = getAPIAccessor().getCommandAPI().execute(m);
376 } catch (Exception e) {
383 * Gets the activity transitions.
388 * @return the activity transition
391 private List<Transition> getActivityTransition(ActivityDefinition ad) {
392 List<Transition> lt = new ArrayList<Transition>();
394 Set<DataFieldDefinition> setFields = ad.getDataFields();
395 for (DataFieldDefinition dataF : setFields) {
396 String id = dataF.getLabel();
397 String[] l = id.split("_");
399 if (l.length > 1 && l[0].equals("TRANSITION")) {
400 Transition t = new Transition();
402 t.setName((String)dataF.getInitialValue());
403 t.setDescription(dataF.getDescription());
411 * Gets the properties from Bonita ProcessDefinition.
420 * @return the def properties
422 * @throws ProcessNotFoundException
423 * the process not found exception
425 private Set<Property> getDefProperties(QueryDefinitionAPI qda,
426 ProcessDefinitionUUID pdUUID, List<String> pstyle)
427 throws ProcessNotFoundException {
429 Set<Property> sp = new HashSet<Property>();
431 for (DataFieldDefinition dfd : qda.getProcessDataFields(pdUUID)) {
432 String id = dfd.getLabel();
433 String description = dfd.getDescription();
434 String v = (String)dfd.getInitialValue();
436 String[] c = id.split("_", 2);
442 if (pstyle.contains(type)) {
443 Property p = new Property();
446 p.setDescription(description);
457 * @see com.pentila.evalcomp.workflow.engine.IEngine#getEnvFile()
460 public String getEnvFile() {
465 * @see com.pentila.evalcomp.workflow.engine.IEngine#getInstance(java.lang.String)
468 public ProcessInstance getInstance(String id)
469 throws InstanceNotFoundException {
470 ProcessInstanceUUID processInstanceUUID = new ProcessInstanceUUID(id);
472 APIAccessor apiac = getAPIAccessor();
474 return apiac.getQueryRuntimeAPI().getProcessInstance(
475 processInstanceUUID);
481 * @see com.pentila.evalcomp.workflow.engine.IEngine#printInstanceDebug(java.lang.String)
484 public void printInstanceDebug(String id)
485 throws InstanceNotFoundException {
486 ProcessInstanceUUID processInstanceUUID = new ProcessInstanceUUID(id);
488 APIAccessor apiac = getAPIAccessor();
490 ProcessInstance pi = apiac.getQueryRuntimeAPI().getProcessInstance(
491 processInstanceUUID);
493 logger.info(pi.toString());
495 Set<ActivityInstance> a = apiac.getQueryRuntimeAPI().getActivityInstances(processInstanceUUID);
497 Set<TaskInstance> b = apiac.getQueryRuntimeAPI().getTasks(processInstanceUUID);
499 for (ActivityInstance z: b){
501 logger.info("Activity ID:" + z.getActivityName());
502 logger.info("State : " + z.getTask().getState());
503 logger.info("Candidates : ");
504 for (String cand : z.getTask().getTaskCandidates()){
516 * @see com.pentila.evalcomp.workflow.engine.IEngine#getProcessDefinitionRoleNames(java.lang.String)
519 public Set<String> getProcessDefinitionRoleNames(String id) {
520 APIAccessor apiac = getAPIAccessor();
521 QueryDefinitionAPI e = apiac.getQueryDefinitionAPI();
523 Set<String> rolenames = new HashSet<String>();
525 ProcessDefinitionUUID u = new ProcessDefinitionUUID(id);
529 Set<ParticipantDefinition> sp = e.getProcessParticipants(u);
530 for (ParticipantDefinition pd : sp) {
531 rolenames.add(pd.getName());
534 } catch (ProcessNotFoundException e1) {
536 e1.printStackTrace();
543 * @see com.pentila.evalcomp.workflow.engine.IEngine#getProcessDefinitions(java.util.Set)
546 public Set<TransitProcessDefinition> getProcessDefinitions(
547 Set<String> filterTypes) {
549 Set<TransitProcessDefinition> stpd = new HashSet<TransitProcessDefinition>();
551 APIAccessor apiac = getAPIAccessor();
552 QueryDefinitionAPI e = apiac.getQueryDefinitionAPI();
554 Set<ProcessDefinition> spd = e.getProcesses();
556 Map<String, TransitProcessDefinition> map = new HashMap<String, TransitProcessDefinition>();
558 for (ProcessDefinition pd : spd) {
559 TransitProcessDefinition tpd = convert(pd);
561 if (filterTypes != null && !filterTypes.contains(tpd.getType())) {
565 // Apply a filter for get the lastest Scenario Def by Version
567 if (map.containsKey(tpd.getId())) {
568 String currentVersion = map.get(tpd.getId()).getVersion();
569 Float cv = new Float(currentVersion);
570 Float newv = new Float(tpd.getVersion());
572 if (java.lang.Math.max(cv, newv) == newv) {
573 map.put(tpd.getId(), tpd);
576 map.put(tpd.getId(), tpd);
581 stpd.addAll(map.values());
587 * @see com.pentila.evalcomp.workflow.engine.IEngine#getProcessDefinitionUUIDs()
590 public List<String> getProcessDefinitionUUIDs() {
592 List<String> ps = new ArrayList<String>();
594 APIAccessor apiac = getAPIAccessor();
595 QueryDefinitionAPI e = apiac.getQueryDefinitionAPI();
597 Set<ProcessDefinition> spd = e.getProcesses();
599 for (ProcessDefinition pd : spd) {
600 String s = pd.getUUID().toString();// pd.getProcessId();
608 * @see com.pentila.evalcomp.workflow.engine.IEngine#getProcessDefinitionVariableByUUID(java.lang.String, java.lang.String)
611 public String getProcessDefinitionVariableByUUID(String defuuid,
612 String variableName) {
616 APIAccessor apiac = getAPIAccessor();
617 QueryDefinitionAPI e = apiac.getQueryDefinitionAPI();
618 ProcessDefinitionUUID uuid = new ProcessDefinitionUUID(defuuid);
623 DataFieldDefinition ob;
624 ob = e.getProcessDataField(uuid, variableName);
625 value = (String)ob.getInitialValue();
626 } catch (DataFieldNotFoundException e1) {
628 e1.printStackTrace();
631 } catch (ProcessNotFoundException e1) {
633 e1.printStackTrace();
641 * @see com.pentila.evalcomp.workflow.engine.IEngine#getProcesses(java.lang.String)
645 public Set<Process> getProcesses(String login) {
647 Map<String, Process> sp = new HashMap<String, Process>();
649 APIAccessor apiac = getAPIAccessor();
650 QueryRuntimeAPI queryRuntimeAPI = apiac.getQueryRuntimeAPI();
652 QueryDefinitionAPI qda = apiac.getQueryDefinitionAPI();
656 final Collection<TaskInstance> activities = queryRuntimeAPI
657 .getTaskList(ActivityState.READY);
659 for (ActivityInstance activity : activities) {
661 ExtendProcessDefinition EPD = extDefinitions.get(activity.getProcessDefinitionUUID());
663 String pi = activity.getProcessInstanceUUID().toString();
665 if (!sp.containsKey(pi)) {
673 String SSIID = (String) queryRuntimeAPI
674 .getProcessInstanceVariable(activity
675 .getProcessInstanceUUID(), "SIID");
679 String TYPE = (String) queryRuntimeAPI
681 .getProcessInstanceVariable(activity
682 .getProcessInstanceUUID(), "TYPE");
685 } catch (Exception e) {
686 pp.setType(ScenarioDefinition.EVALUATION);
688 Long SIID = new Long(SSIID);
692 String activityUUID = activity.getUUID().toString();
694 String activityId = activity.getActivityName();
696 Activity a = new Activity();
698 a.setUUID(activityUUID);
700 a.setTaskCandidates(activity.getTask().getTaskCandidates());
701 }catch (Exception e){
702 //e.printStackTrace();
707 .getExtActivityByActivityId(activityId));
710 // Valiable D'activité
713 Set<Property> setP = new HashSet<Property>();
714 for ( Entry<String, Object> vv : activity.getLastKnownVariableValues().entrySet()){
716 String key = vv.getKey();
717 String value = (String) vv.getValue();
719 logger.debug("Variable : " + key + " with value : " + value);
720 if (key.startsWith(Property.VARIABLE)){
722 Property p = new Property();
732 a.setProperties(setP);
734 // Activity Definition
735 ActivityDefinition ad;
738 ad = qda.getProcessActivity(activity
739 .getProcessDefinitionUUID(), activityId);
741 a.setDescription(ad.getDescription());
743 a.setRoleNamePerformers(ad.getPerformers());
745 List<Transition> lt = getActivityTransition(ad);
747 a.setTransitions(lt);
748 pp.getActivities().add(a);
749 Set<Property> spp = getDefProperties(qda, activity
750 .getProcessDefinitionUUID(), propertyTypesInstance);
752 Map<String, Object> mapVars = queryRuntimeAPI
753 .getProcessInstanceVariables(activity
754 .getProcessInstanceUUID());
756 for (Property p : spp) {
757 if (mapVars.containsKey(p.getName())) {
758 String v = (String) mapVars.get(p.getName());
764 pp.setProperties(spp);
766 } catch (ProcessNotFoundException e) {
767 // TODO Auto-generated catch block
770 } catch (ActivityNotFoundException e) {
771 // TODO Auto-generated catch block
776 } catch (InstanceNotFoundException e) {
777 // TODO Auto-generated catch block
779 } catch (VariableNotFoundException e) {
780 // TODO Auto-generated catch block
784 return new HashSet<Process>(sp.values());
789 * @see com.pentila.evalcomp.workflow.engine.IEngine#getTransitProcessDefinition(java.lang.String)
792 public TransitProcessDefinition getTransitProcessDefinition(String uuid) {
794 TransitProcessDefinition tpd = null;
798 APIAccessor apiac = getAPIAccessor();
799 QueryDefinitionAPI e = apiac.getQueryDefinitionAPI();
800 ProcessDefinitionUUID myuuid = new ProcessDefinitionUUID(uuid);
802 ProcessDefinition pd = e.getProcess(myuuid);
806 } catch (ProcessNotFoundException e) {
807 // TODO Auto-generated catch block
815 * @see com.pentila.evalcomp.workflow.engine.IEngine#getUserScenarioInstanceIds(java.lang.String)
818 public Set<Long> getUserScenarioInstanceIds(String login) {
819 APIAccessor apiac = getAPIAccessor();
821 QueryRuntimeAPI queryRuntimeAPI = apiac.getQueryRuntimeAPI();
823 Set<Long> sid = new HashSet<Long>();
825 final Collection<TaskInstance> activities = queryRuntimeAPI
826 .getTaskList(ActivityState.READY);
828 for (ActivityInstance activity : activities) {
830 String SSIID = (String) queryRuntimeAPI
831 .getProcessInstanceVariable(activity
832 .getProcessInstanceUUID(), "SIID");
834 Long SIID = new Long(SSIID);
838 } catch (InstanceNotFoundException e) {
839 // TODO Auto-generated catch block
841 } catch (VariableNotFoundException e) {
842 // TODO Auto-generated catch block
849 * @see com.pentila.evalcomp.workflow.engine.IEngine#getWorkflowsdir()
852 public String getWorkflowsdir() {
857 * Checks for transition.
864 * @return true, if successful
866 private boolean hasTransition(ActivityInstance activity,
869 return activity.getLastKnownVariableValues().keySet().contains(actionId);
870 }catch (Exception e){
876 * @see com.pentila.evalcomp.workflow.engine.IEngine#initializeWorkers()
879 public void initializeWorkers() throws Exception {
881 logger.info("Bonita environment at : " + Beans.getApplicationPath("/")+ "WEB-INF/"+envFile);
883 //System.setProperty("org.ow2.bonita.environment", Beans.getApplicationPath("/")+ "WEB-INF/"+envFile);
884 System.setProperty("org.ow2.bonita.api-type", "Standard");
887 APIAccessor apiac =getAPIAccessor();
888 DomainOwner.setDomain("default");
889 deployWF(apiac.getRuntimeAPI(), apiac.getQueryRuntimeAPI(), apiac
890 .getManagementAPI(), apiac.getQueryDefinitionAPI(), "");
895 * @see com.pentila.evalcomp.workflow.engine.IEngine#instanciate(java.lang.String, java.lang.String, java.util.Map)
898 public String instanciate(String login, String processDefinitionUUID,
901 ProcessInstanceUUID instanceUUID = null;
903 APIAccessor apiac = getAPIAccessor();
904 RuntimeAPI runtimeAPI = apiac.getRuntimeAPI();
906 ProcessDefinitionUUID PDUUID = new ProcessDefinitionUUID(
907 processDefinitionUUID);
911 instanceUUID = runtimeAPI.instantiateProcess(PDUUID, parameters);
912 } catch (ProcessNotFoundException e) {
914 } catch (VariableNotFoundException e) {
918 return instanceUUID.toString();
922 * @see com.pentila.evalcomp.workflow.engine.IEngine#refreshAssignation(java.lang.String)
925 public void refreshAssignation(String processInstanceId) {
926 APIAccessor apiac = getAPIAccessor();
928 final QueryRuntimeAPI queryRuntimeAPI = apiac.getQueryRuntimeAPI();
929 final RuntimeAPI runtimeAPI = apiac.getRuntimeAPI();
931 final ProcessInstanceUUID processInstanceUUID = new ProcessInstanceUUID(
934 Command<Boolean> assignCommand = new Command<Boolean>(){
936 public Boolean execute(Environment arg0) throws Exception {
937 final Collection<TaskInstance> activities = queryRuntimeAPI
938 .getTasks(processInstanceUUID);
940 for (ActivityInstance activity : activities) {
941 runtimeAPI.assignTask(activity.getTask().getUUID());
950 execute(assignCommand);
955 * @see com.pentila.evalcomp.workflow.engine.IEngine#removeInstance(java.lang.String)
959 public void removeInstance(String id) {
961 APIAccessor apiac = getAPIAccessor();
962 ProcessInstanceUUID processInstanceUUID = new ProcessInstanceUUID(id);
964 RuntimeAPI runtimeAPI = apiac.getRuntimeAPI();
967 if (logger.isDebugEnabled()){
968 logger.debug("Deleting ProcessInstance : " + processInstanceUUID);
970 runtimeAPI.deleteProcessInstance(processInstanceUUID);
972 } catch (InstanceNotFoundException e) {
974 } catch (Exception e) {
980 * @see com.pentila.evalcomp.workflow.engine.IEngine#getExtendXML(org.ow2.bonita.facade.uuid.ProcessDefinitionUUID, java.lang.String)
982 public String getExtendXML(ProcessDefinitionUUID pduuid, String filename) {
984 APIAccessor apiac = getAPIAccessor();
985 QueryDefinitionAPI qda = apiac.getQueryDefinitionAPI();
989 BusinessArchive ba = qda.getBusinessArchive(pduuid);
990 Map<String, byte[]> m = ba.getResources();
992 System.out.println("Size of Map is : " + m.size());
994 for (String name : m.keySet()){
995 System.out.println("Filename is : " + name);
998 byte[] a = ba.getResource(filename);
999 System.out.println("A = " + a);
1001 String ss = new String(a, "UTF-8");
1003 } catch (ProcessNotFoundException e) {
1004 // TODO Auto-generated catch block
1005 e.printStackTrace();
1006 } catch (UnsupportedEncodingException e) {
1007 // TODO Auto-generated catch block
1008 e.printStackTrace();
1009 } catch (Exception e){
1017 * @see com.pentila.evalcomp.workflow.engine.IEngine#runProcessActivity(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
1021 public void runProcessActivity(String login, String processuuid,
1022 String selectedActivityId, String actionId) {
1026 APIAccessor apiac = getAPIAccessor();
1027 QueryRuntimeAPI queryRuntimeAPI = apiac.getQueryRuntimeAPI();
1029 ActivityInstanceUUID selectedUUID = new ActivityInstanceUUID(
1030 selectedActivityId);
1032 ActivityInstance activity;
1034 activity = queryRuntimeAPI.getActivityInstance(selectedUUID);
1036 ActivityInstanceUUID taskUUID = activity.getTask().getUUID();
1037 ActivityInstanceUUID activityUUID = activity.getUUID();
1040 String value = null;
1042 if (hasTransition(activity, actionId)) {
1046 StartFinishCommand5 sfc = new StartFinishCommand5(taskUUID, activityUUID, actionId, value);
1049 } catch (ActivityNotFoundException e) {
1050 // TODO Auto-generated catch block
1051 e.printStackTrace();
1056 * @see com.pentila.evalcomp.workflow.engine.IEngine#setEnvFile(java.lang.String)
1059 public void setEnvFile(String envFile) {
1060 this.envFile = envFile;
1064 * @see com.pentila.evalcomp.workflow.engine.IEngine#setWorkflowsdir(java.lang.String)
1067 public void setWorkflowsdir(String workflowsdir) {
1068 this.workflowsdir = workflowsdir;
1072 * @see com.pentila.evalcomp.workflow.engine.IEngine#setProcessInstanceVariables(java.lang.String, java.util.Map)
1075 public void setProcessInstanceVariables(final String processuuid,
1076 final Map<String, String> variablesValues) {
1077 final APIAccessor apiac = getAPIAccessor();
1078 final RuntimeAPI runtimeAPI = apiac.getRuntimeAPI();
1080 Command<Boolean> setPIVariable = new Command<Boolean>(){
1082 public Boolean execute(Environment arg0) throws Exception {
1084 for (Entry<String, String> e : variablesValues.entrySet()) {
1085 runtimeAPI.setProcessInstanceVariable(new ProcessInstanceUUID(
1086 processuuid), e.getKey(), e.getValue());
1094 execute(setPIVariable);
1099 * @see com.pentila.evalcomp.workflow.engine.IEngine#getProcessByActivityUUID(java.lang.String)
1102 public Process getProcessByActivityUUID(String activityUUID) {
1106 APIAccessor apiac = getAPIAccessor();
1108 QueryRuntimeAPI queryRuntimeAPI = apiac.getQueryRuntimeAPI();
1110 QueryDefinitionAPI qda = apiac.getQueryDefinitionAPI();
1112 ActivityInstance activity = queryRuntimeAPI
1113 .getActivityInstance(new ActivityInstanceUUID(""));
1115 ExtendProcessDefinition EPD = extDefinitions.get(activity
1116 .getProcessDefinitionUUID());
1118 String pi = activity.getProcessInstanceUUID().toString();
1119 Process pp = new Process();
1121 String SSIID = (String) queryRuntimeAPI.getProcessInstanceVariable(
1122 activity.getProcessInstanceUUID(), "SIID");
1125 String TYPE = (String) queryRuntimeAPI
1127 .getProcessInstanceVariable(activity.getProcessInstanceUUID(),
1131 } catch (Exception e) {
1132 pp.setType(ScenarioDefinition.EVALUATION);
1134 Long SIID = new Long(SSIID);
1138 String activityId = activity.getActivityName();
1140 Activity a = new Activity();
1141 a.setId(activityId);
1142 a.setUUID(activityUUID);
1145 a.setExtActivity(EPD.getExtActivityByActivityId(activityId));
1148 ActivityDefinition ad;
1151 ad = qda.getProcessActivity(
1152 activity.getProcessDefinitionUUID(), activityId);
1154 a.setDescription(ad.getDescription());
1156 a.setRoleNamePerformers(ad.getPerformers());
1158 List<Transition> lt = getActivityTransition(ad);
1160 a.setTransitions(lt);
1161 pp.getActivities().add(a);
1163 Set<Property> spp = getDefProperties(qda, activity
1164 .getProcessDefinitionUUID(), propertyTypesInstance);
1166 Map<String, Object> mapVars = queryRuntimeAPI
1167 .getProcessInstanceVariables(activity
1168 .getProcessInstanceUUID());
1170 for (Property p : spp) {
1171 if (mapVars.containsKey(p.getName())) {
1172 String v = (String) mapVars.get(p.getName());
1178 pp.setProperties(spp);
1180 } catch (ProcessNotFoundException e) {
1181 // TODO Auto-generated catch block
1182 e.printStackTrace();
1184 } catch (ActivityNotFoundException e) {
1185 // TODO Auto-generated catch block
1186 e.printStackTrace();
1187 } catch (InstanceNotFoundException e) {
1188 // TODO Auto-generated catch block
1189 e.printStackTrace();
1194 } catch (ActivityNotFoundException e) {
1195 e.printStackTrace();
1196 } catch (InstanceNotFoundException e) {
1197 // TODO Auto-generated catch block
1198 e.printStackTrace();
1199 } catch (VariableNotFoundException e) {
1200 // TODO Auto-generated catch block
1201 e.printStackTrace();
1209 * @see com.pentila.evalcomp.workflow.engine.IEngine#getCandidates(java.lang.String)
1212 public Map<String, Map<String, Object>> getCandidates(String bonitaProcessId) {
1213 APIAccessor apiac = getAPIAccessor();
1215 QueryRuntimeAPI queryRuntimeAPI = apiac.getQueryRuntimeAPI();
1217 ProcessInstanceUUID PIUUID = new ProcessInstanceUUID(bonitaProcessId);
1219 InstanceUtil IU = new InstanceUtil();
1221 IU.applyContext(getProcess("", bonitaProcessId), null, null);
1223 Map<String, Map<String, Object>> activityUsers = new HashMap<String, Map<String, Object>>();
1225 for (ActivityInstance ai : queryRuntimeAPI.getActivityInstances(PIUUID)){
1226 if (ai != null && ai.getTask() != null && ai.getTask().getState()!=null && ai.getTask().getState().equals(ActivityState.READY)){
1227 if (logger.isDebugEnabled()){
1229 logger.debug("getCandidates SIID : "+queryRuntimeAPI.getProcessInstanceVariable(PIUUID, "SIID"));
1230 } catch (VariableNotFoundException e) {
1232 e.printStackTrace();
1235 ExtendProcessDefinition EPD = extDefinitions.get(ai.getProcessDefinitionUUID());
1237 ActivityInstance t = (ActivityInstance)ai;
1239 Map<String, Object> map = new HashMap<String, Object>();
1241 map.put("users", t.getTask().getTaskCandidates());
1242 map.put("extActivity", IU.switchLabel(EPD.getExtActivityByActivityId(ai.getActivityName())));
1243 activityUsers.put(ai.getActivityName(), map);
1247 } catch (InstanceNotFoundException e) {
1248 // TODO Auto-generated catch block
1249 e.printStackTrace();
1251 return activityUsers;
1255 * @see com.pentila.evalcomp.workflow.engine.IEngine#testCoherence(java.lang.String, java.util.Set, java.lang.String)
1258 public boolean testCoherence(String id, Set<String> uids, String actId) {
1260 boolean ret = false;
1262 ProcessInstanceUUID processInstanceUUID = new ProcessInstanceUUID(id);
1263 APIAccessor apiac = getAPIAccessor();
1267 ProcessInstance pi = apiac.getQueryRuntimeAPI().getProcessInstance(
1268 processInstanceUUID);
1270 Set<TaskInstance> b = apiac.getQueryRuntimeAPI().getTasks(processInstanceUUID);
1272 for (ActivityInstance z: b){
1274 if (z.getActivityName().equals(actId)){
1276 for (String uid : uids){
1277 if (!z.getTask().getTaskCandidates().contains(uid) && z.getTask().getState().equals(ActivityState.READY)){
1278 logger.info("Process id : " + id + " is wrong !");
1279 logger.info("ProcessTaskCandidates : " + z.getTask().getTaskCandidates());
1280 logger.info("EMa localroles : " + uids);
1288 } catch (InstanceNotFoundException e) {
1289 // TODO Auto-generated catch block
1290 e.printStackTrace();
1296 * @see com.pentila.evalcomp.workflow.engine.IEngine#displayDB(java.lang.String)
1299 public void displayDB(String stateName){
1301 APIAccessor apiac = getAPIAccessor();
1302 QueryRuntimeAPI queryRuntimeAPI = apiac.getQueryRuntimeAPI();
1304 if (logger.isInfoEnabled()){
1307 Set<ProcessInstance> s = queryRuntimeAPI.getProcessInstances();
1308 for (ProcessInstance pii : s){
1310 logger.info("ProcessInstanceUUID : " + pii.getUUID());
1312 for (TaskInstance a : queryRuntimeAPI.getTasks(pii.getProcessInstanceUUID())){
1318 String users = "#nousers#";
1319 String nstate = "#missing#";
1320 String gouser = "#noGOUser#";
1328 nstate = a.getState().name();
1332 if (stateName != null && !nstate.equals(stateName)){
1336 Set<String> sss = a.getTaskCandidates();
1339 for (String uid : sss){
1340 users += uid + "\n";
1344 gouser = a.getTaskUser();
1345 } catch(IllegalStateException e){
1346 logger.debug(e.getMessage());
1350 logger.info("ActivityID : " + a.getActivityName() +"\n" + "State : " + nstate + "\n" + "Users Candidates = " + users + "GO USER : " + gouser + "\nDate : " + a.getCreatedDate() + "\nStart Date : "+ a.getStartedDate() + "\nEnd Date : "+a.getEndedDate()+"\n\n");
1353 for ( Entry<String, Object> vu : a.getLastKnownVariableValues().entrySet()){
1354 logger.info("Variable Name : " + vu.getKey()+ " value : " + vu.getValue());
1356 if (!vu.getValue().equals("--")){
1362 if (a.getLastKnownVariableValues().size() == 0){
1367 if (nstate.equals("FINISH") && !ok){
1368 logger.info("######################## ALARM !!!!! ");
1369 logger.info("A Activity is finish and not transaction left !!!");
1376 }catch(Exception e){
1377 e.printStackTrace();
1385 * Fix les Process dans l'etat EXECUTING
1389 * @see com.pentila.evalcomp.workflow.engine.IEngine#fixState()
1392 public void fixState(){
1395 APIAccessor apiac = getAPIAccessor();
1396 QueryRuntimeAPI queryRuntimeAPI = apiac.getQueryRuntimeAPI();
1397 final RuntimeAPI runtimeAPI = apiac.getRuntimeAPI();
1398 if (logger.isInfoEnabled()){
1401 Set<ProcessInstance> s = queryRuntimeAPI.getProcessInstances();
1402 for (ProcessInstance pii : s){
1404 for (final TaskInstance a : queryRuntimeAPI.getTasks(pii.getProcessInstanceUUID())){
1409 String users = "#nousers#";
1410 String nstate = "#missing#";
1411 String gouser = "#noGOUser#";
1417 nstate = a.getState().name();
1419 if (!a.getState().equals(ActivityState.EXECUTING)){
1420 logger.debug(a.getUUID() + ": State was : " + a.getState().name());
1424 logger.info("ProcessInstanceUUID : " + pii.getUUID());
1425 Set<String> sss = a.getTaskCandidates();
1428 for (String uid : sss){
1429 Utils.fakeUser(uid);
1430 users += uid + "\n";
1435 gouser = a.getTaskUser();
1436 } catch(IllegalStateException e){
1437 logger.info(e.getMessage());
1441 logger.info("ActivityID : " + a.getActivityName() +"\n" + "State : " + nstate + "\n" + "Users Candidates = " + users + "GO USER : " + gouser + "\n\n");
1444 for ( Entry<String, Object> vu : a.getLastKnownVariableValues().entrySet()){
1445 logger.info("Variable Name : " + vu.getKey()+ " value : " + vu.getValue());
1452 User u = Beans.getEntityManagerBean().getCurrentUser();
1454 logger.info("Fake logged user : " + u.getLastname() + " " + u.getFirstname());
1457 Command<Boolean> finishCommand = new Command<Boolean>(){
1461 public Boolean execute(Environment arg0)
1464 runtimeAPI.finishTask(a.getUUID(), false);
1471 execute(finishCommand);
1484 }catch(Exception e){
1485 e.printStackTrace();
1495 public void setActivitiesInstanceVariables(
1496 final Map<String, Map<String, String>> vva) {
1498 final APIAccessor apiac = getAPIAccessor();
1499 final RuntimeAPI runtimeAPI = apiac.getRuntimeAPI();
1501 Command<Boolean> setPIVariable = new Command<Boolean>(){
1503 public Boolean execute(Environment arg0) throws Exception {
1504 for (Entry<String, Map<String, String>> act : vva.entrySet() ){
1506 String ActivityUUID = act.getKey();
1507 Map<String, String> p = act.getValue();
1508 for (Entry<String, String> f : p.entrySet()){
1510 String var_name = f.getKey();
1511 String var_value = f.getValue();
1513 runtimeAPI.setActivityInstanceVariable(new ActivityInstanceUUID(ActivityUUID), var_name, var_value);
1524 execute(setPIVariable);
1529 public APIAccessor getAPIAccessor(){
1530 DomainOwner.setDomain("default");
1531 return AccessorUtil.getAPIAccessor();
1534 public Process getProcess(String login, String processuuid) {
1537 if (logger.isDebugEnabled()){
1538 logger.debug("Enter in getProcess Method" );
1539 logger.debug("ProcessUUID : " + processuuid);
1541 APIAccessor apiac = AccessorUtil.getAPIAccessor();
1542 QueryRuntimeAPI queryRuntimeAPI = apiac.getQueryRuntimeAPI();
1544 QueryDefinitionAPI qda = apiac.getQueryDefinitionAPI();
1546 ProcessInstanceUUID piu = new ProcessInstanceUUID(processuuid);
1550 final Set<TaskInstance> activities = queryRuntimeAPI
1555 if(!activities.isEmpty()){
1558 if (logger.isDebugEnabled()){
1559 logger.debug("Activity Collection is Empty");
1563 for (ActivityInstance activity : activities) {
1564 if (logger.isDebugEnabled()){
1566 logger.debug("getProcesses for " + login + " : " + activity.toString() + "( " + activity.getState()+") ");
1571 if (!activity.getState().equals(ActivityState.READY)){
1575 ExtendProcessDefinition EPD = extDefinitions.get(activity.getProcessDefinitionUUID()
1578 String SSIID = (String) queryRuntimeAPI
1579 .getProcessInstanceVariable(activity
1580 .getProcessInstanceUUID(), "SIID");
1584 String TYPE = (String) queryRuntimeAPI
1586 .getProcessInstanceVariable(activity
1587 .getProcessInstanceUUID(), "TYPE");
1590 } catch (Exception e) {
1591 pp.setType(ScenarioDefinition.EVALUATION);
1593 Long SIID = new Long(SSIID);
1597 String activityUUID = activity.getUUID().toString();
1599 String activityId = activity.getActivityName();
1601 Activity a = new Activity();
1602 a.setId(activityId);
1603 a.setUUID(activityUUID);
1605 a.setTaskCandidates(activity.getTask().getTaskCandidates());
1606 }catch (Exception e){
1607 //e.printStackTrace();
1612 .getExtActivityByActivityId(activityId));
1615 // Valiable D'activité
1618 Set<Property> setP = new HashSet<Property>();
1619 for ( Entry<String, Object> vv : activity.getLastKnownVariableValues().entrySet()){
1621 String key = vv.getKey();
1622 String value = (String) vv.getValue();
1624 logger.debug("Variable : " + key + " with value : " + value);
1625 if (key.startsWith(Property.VARIABLE)){
1627 Property p = new Property();
1637 a.setProperties(setP);
1639 // Activity Definition
1640 ActivityDefinition ad;
1643 ad = qda.getProcessActivity(activity
1644 .getProcessDefinitionUUID(), activityId);
1646 a.setDescription(ad.getDescription());
1648 a.setRoleNamePerformers(ad.getPerformers());
1650 List<Transition> lt = getActivityTransition(ad);
1652 a.setTransitions(lt);
1653 pp.getActivities().add(a);
1655 Set<Property> spp = getDefProperties(qda, activity
1656 .getProcessDefinitionUUID(), propertyTypesInstance);
1658 Map<String, Object> mapVars = queryRuntimeAPI
1659 .getProcessInstanceVariables(activity
1660 .getProcessInstanceUUID());
1662 for (Property p : spp) {
1663 if (mapVars.containsKey(p.getName())) {
1664 String v = (String) mapVars.get(p.getName());
1670 pp.setProperties(spp);
1672 } catch (ProcessNotFoundException e) {
1674 e.printStackTrace();
1676 } catch (ActivityNotFoundException e) {
1678 e.printStackTrace();
1682 } catch (InstanceNotFoundException e) {
1684 e.printStackTrace();
1685 } catch (VariableNotFoundException e) {
1687 e.printStackTrace();