http://git-wip-us.apache.org/repos/asf/syncope/blob/7a440618/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/FlowableUserWorkflowAdapter.java
----------------------------------------------------------------------
diff --git 
a/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/FlowableUserWorkflowAdapter.java
 
b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/FlowableUserWorkflowAdapter.java
index 3b82340..82b9057 100644
--- 
a/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/FlowableUserWorkflowAdapter.java
+++ 
b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/FlowableUserWorkflowAdapter.java
@@ -32,7 +32,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import javax.annotation.Resource;
-import javax.ws.rs.NotFoundException;
 import org.activiti.bpmn.converter.BpmnXMLConverter;
 import org.activiti.bpmn.model.BpmnModel;
 import org.activiti.editor.constants.ModelDataJsonConstants;
@@ -46,11 +45,13 @@ import org.activiti.engine.history.HistoricDetail;
 import org.activiti.engine.history.HistoricTaskInstance;
 import org.activiti.engine.impl.persistence.entity.HistoricFormPropertyEntity;
 import org.activiti.engine.query.Query;
+import org.activiti.engine.repository.Deployment;
 import org.activiti.engine.repository.Model;
 import org.activiti.engine.repository.ProcessDefinition;
 import org.activiti.engine.runtime.ProcessInstance;
 import org.activiti.engine.task.Task;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Transformer;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.ImmutablePair;
@@ -59,6 +60,7 @@ import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.patch.PasswordPatch;
 import org.apache.syncope.common.lib.patch.UserPatch;
 import org.apache.syncope.common.lib.to.UserTO;
+import org.apache.syncope.common.lib.to.WorkflowDefinitionTO;
 import org.apache.syncope.common.lib.to.WorkflowFormPropertyTO;
 import org.apache.syncope.common.lib.to.WorkflowFormTO;
 import org.apache.syncope.core.provisioning.api.PropagationByResource;
@@ -68,6 +70,7 @@ import 
org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.apache.syncope.core.spring.BeanUtils;
 import 
org.apache.syncope.core.persistence.api.attrvalue.validation.InvalidEntityException;
 import 
org.apache.syncope.core.persistence.api.attrvalue.validation.ParsingValidationException;
+import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.provisioning.api.WorkflowResult;
 import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
@@ -83,14 +86,12 @@ import 
org.springframework.transaction.annotation.Transactional;
  */
 public class FlowableUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
 
+    protected static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
     protected static final String[] PROPERTY_IGNORE_PROPS = { "type" };
 
     public static final String WF_PROCESS_ID = "userWorkflow";
 
-    public static final String WF_PROCESS_RESOURCE = "userWorkflow.bpmn20.xml";
-
-    public static final String WF_DGRM_RESOURCE = 
"userWorkflow.userWorkflow.png";
-
     public static final String USER = "user";
 
     public static final String WF_EXECUTOR = "wfExecutor";
@@ -128,14 +129,14 @@ public class FlowableUserWorkflowAdapter extends 
AbstractUserWorkflowAdapter {
     @Resource(name = "adminUser")
     protected String adminUser;
 
+    @Autowired
+    protected DomainProcessEngine engine;
+
     @Override
     public boolean supportsDefinitionEdit() {
         return true;
     }
 
-    @Autowired
-    protected DomainProcessEngine engine;
-
     @Override
     public String getPrefix() {
         return "ACT_";
@@ -464,128 +465,22 @@ public class FlowableUserWorkflowAdapter extends 
AbstractUserWorkflowAdapter {
         return new WorkflowResult<>(updated.getKey(), null, performedTasks);
     }
 
-    protected ProcessDefinition getProcessDefinition() {
-        try {
-            return 
engine.getRepositoryService().createProcessDefinitionQuery().
-                    
processDefinitionKey(FlowableUserWorkflowAdapter.WF_PROCESS_ID).latestVersion().singleResult();
-        } catch (ActivitiException e) {
-            throw new WorkflowException("While accessing process " + 
FlowableUserWorkflowAdapter.WF_PROCESS_ID, e);
-        }
-
-    }
-
-    protected Model getModel(final ProcessDefinition procDef) {
-        try {
-            Model model = engine.getRepositoryService().createModelQuery().
-                    deploymentId(procDef.getDeploymentId()).singleResult();
-            if (model == null) {
-                throw new NotFoundException("Could not find Model for 
deployment " + procDef.getDeploymentId());
-            }
-            return model;
-        } catch (Exception e) {
-            throw new WorkflowException("While accessing process " + 
FlowableUserWorkflowAdapter.WF_PROCESS_ID, e);
-        }
-    }
-
-    protected void exportProcessResource(final String resourceName, final 
OutputStream os) {
-        ProcessDefinition procDef = getProcessDefinition();
-
-        InputStream procDefIS = 
engine.getRepositoryService().getResourceAsStream(procDef.getDeploymentId(),
-                resourceName);
-        try {
-            IOUtils.copy(procDefIS, os);
-        } catch (IOException e) {
-            LOG.error("While exporting workflow definition {}", 
procDef.getKey(), e);
-        } finally {
-            IOUtils.closeQuietly(procDefIS);
-        }
-    }
-
-    protected void exportProcessModel(final OutputStream os) {
-        Model model = getModel(getProcessDefinition());
-
-        ObjectMapper objectMapper = new ObjectMapper();
-        try {
-            ObjectNode modelNode = (ObjectNode) 
objectMapper.readTree(model.getMetaInfo());
-            modelNode.put(ModelDataJsonConstants.MODEL_ID, model.getId());
-            modelNode.replace(MODEL_DATA_JSON_MODEL,
-                    
objectMapper.readTree(engine.getRepositoryService().getModelEditorSource(model.getId())));
-
-            os.write(modelNode.toString().getBytes());
-        } catch (IOException e) {
-            LOG.error("While exporting workflow definition {}", model.getId(), 
e);
-        }
-    }
-
-    @Override
-    public void exportDefinition(final WorkflowDefinitionFormat format, final 
OutputStream os) {
-        switch (format) {
-            case JSON:
-                exportProcessModel(os);
-                break;
-
-            case XML:
-            default:
-                exportProcessResource(WF_PROCESS_RESOURCE, os);
-        }
-    }
-
-    @Override
-    public void exportDiagram(final OutputStream os) {
-        exportProcessResource(WF_DGRM_RESOURCE, os);
-    }
-
-    @Override
-    public void importDefinition(final WorkflowDefinitionFormat format, final 
String definition) {
-        Model model = getModel(getProcessDefinition());
-        switch (format) {
-            case JSON:
-                JsonNode definitionNode;
-                try {
-                    definitionNode = new ObjectMapper().readTree(definition);
-                    if (definitionNode.has(MODEL_DATA_JSON_MODEL)) {
-                        definitionNode = 
definitionNode.get(MODEL_DATA_JSON_MODEL);
-                    }
-                    if 
(!definitionNode.has(BpmnJsonConverter.EDITOR_CHILD_SHAPES)) {
-                        throw new IllegalArgumentException(
-                                "Could not find JSON node " + 
BpmnJsonConverter.EDITOR_CHILD_SHAPES);
-                    }
-
-                    BpmnModel bpmnModel = new 
BpmnJsonConverter().convertToBpmnModel(definitionNode);
-                    FlowableImportUtils.fromXML(engine, new 
BpmnXMLConverter().convertToXML(bpmnModel));
-                } catch (Exception e) {
-                    throw new WorkflowException("While updating process "
-                            + FlowableUserWorkflowAdapter.WF_PROCESS_RESOURCE, 
e);
-                }
-
-                FlowableImportUtils.fromJSON(
-                        engine, definitionNode.toString().getBytes(), 
getProcessDefinition(), model);
-                break;
-
-            case XML:
-            default:
-                FlowableImportUtils.fromXML(engine, definition.getBytes());
-
-                FlowableImportUtils.fromJSON(engine, getProcessDefinition(), 
model);
-        }
-    }
-
-    protected WorkflowFormPropertyType fromFlowableFormType(final FormType 
flowableFormType) {
+    protected WorkflowFormPropertyType fromActivitiFormType(final FormType 
activitiFormType) {
         WorkflowFormPropertyType result = WorkflowFormPropertyType.String;
 
-        if ("string".equals(flowableFormType.getName())) {
+        if ("string".equals(activitiFormType.getName())) {
             result = WorkflowFormPropertyType.String;
         }
-        if ("long".equals(flowableFormType.getName())) {
+        if ("long".equals(activitiFormType.getName())) {
             result = WorkflowFormPropertyType.Long;
         }
-        if ("enum".equals(flowableFormType.getName())) {
+        if ("enum".equals(activitiFormType.getName())) {
             result = WorkflowFormPropertyType.Enum;
         }
-        if ("date".equals(flowableFormType.getName())) {
+        if ("date".equals(activitiFormType.getName())) {
             result = WorkflowFormPropertyType.Date;
         }
-        if ("boolean".equals(flowableFormType.getName())) {
+        if ("boolean".equals(activitiFormType.getName())) {
             result = WorkflowFormPropertyType.Boolean;
         }
 
@@ -680,7 +575,7 @@ public class FlowableUserWorkflowAdapter extends 
AbstractUserWorkflowAdapter {
         for (FormProperty fProp : properties) {
             WorkflowFormPropertyTO propertyTO = new WorkflowFormPropertyTO();
             BeanUtils.copyProperties(fProp, propertyTO, PROPERTY_IGNORE_PROPS);
-            propertyTO.setType(fromFlowableFormType(fProp.getType()));
+            propertyTO.setType(fromActivitiFormType(fProp.getType()));
 
             if (propertyTO.getType() == WorkflowFormPropertyType.Date) {
                 propertyTO.setDatePattern((String) 
fProp.getType().getInformation("datePattern"));
@@ -782,14 +677,14 @@ public class FlowableUserWorkflowAdapter extends 
AbstractUserWorkflowAdapter {
                 throw new ActivitiException("NULL result");
             }
         } catch (ActivitiException e) {
-            throw new NotFoundException("Flowable Task " + taskId, e);
+            throw new NotFoundException("Activiti Task " + taskId, e);
         }
 
         TaskFormData formData;
         try {
             formData = engine.getFormService().getTaskFormData(task.getId());
         } catch (ActivitiException e) {
-            throw new NotFoundException("Form for Flowable Task " + taskId, e);
+            throw new NotFoundException("Form for Activiti Task " + taskId, e);
         }
 
         if (!adminUser.equals(authUser)) {
@@ -884,4 +779,173 @@ public class FlowableUserWorkflowAdapter extends 
AbstractUserWorkflowAdapter {
 
         return new WorkflowResult<>(userPatch, propByRes, postTasks);
     }
+
+    protected Model getModel(final ProcessDefinition procDef) {
+        try {
+            Model model = engine.getRepositoryService().createModelQuery().
+                    deploymentId(procDef.getDeploymentId()).singleResult();
+            if (model == null) {
+                throw new NotFoundException("Could not find Model for 
deployment " + procDef.getDeploymentId());
+            }
+            return model;
+        } catch (Exception e) {
+            throw new WorkflowException("While accessing process " + 
procDef.getKey(), e);
+        }
+    }
+
+    @Override
+    public List<WorkflowDefinitionTO> getDefinitions() {
+        try {
+            return CollectionUtils.collect(
+                    
engine.getRepositoryService().createProcessDefinitionQuery().latestVersion().list(),
+                    new Transformer<ProcessDefinition, WorkflowDefinitionTO>() 
{
+
+                @Override
+                public WorkflowDefinitionTO transform(final ProcessDefinition 
procDef) {
+                    WorkflowDefinitionTO defTO = new WorkflowDefinitionTO();
+                    defTO.setKey(procDef.getKey());
+                    defTO.setName(procDef.getName());
+
+                    try {
+                        defTO.setModelId(getModel(procDef).getId());
+                    } catch (NotFoundException e) {
+                        LOG.warn("No model found for definition {}, ignoring", 
procDef.getDeploymentId(), e);
+                    }
+
+                    defTO.setMain(WF_PROCESS_ID.equals(procDef.getKey()));
+
+                    return defTO;
+                }
+            }, new ArrayList<WorkflowDefinitionTO>());
+        } catch (ActivitiException e) {
+            throw new WorkflowException("While listing available process 
definitions", e);
+        }
+    }
+
+    protected ProcessDefinition getProcessDefinitionByKey(final String key) {
+        try {
+            return 
engine.getRepositoryService().createProcessDefinitionQuery().
+                    processDefinitionKey(key).latestVersion().singleResult();
+        } catch (ActivitiException e) {
+            throw new WorkflowException("While accessing process " + key, e);
+        }
+
+    }
+
+    protected ProcessDefinition getProcessDefinitionByDeploymentId(final 
String deploymentId) {
+        try {
+            return 
engine.getRepositoryService().createProcessDefinitionQuery().
+                    deploymentId(deploymentId).latestVersion().singleResult();
+        } catch (ActivitiException e) {
+            throw new WorkflowException("While accessing deployment " + 
deploymentId, e);
+        }
+
+    }
+
+    protected void exportProcessModel(final String key, final OutputStream os) 
{
+        Model model = getModel(getProcessDefinitionByKey(key));
+
+        try {
+            ObjectNode modelNode = (ObjectNode) 
OBJECT_MAPPER.readTree(model.getMetaInfo());
+            modelNode.put(ModelDataJsonConstants.MODEL_ID, model.getId());
+            modelNode.replace(MODEL_DATA_JSON_MODEL,
+                    
OBJECT_MAPPER.readTree(engine.getRepositoryService().getModelEditorSource(model.getId())));
+
+            os.write(modelNode.toString().getBytes());
+        } catch (IOException e) {
+            LOG.error("While exporting workflow definition {}", model.getId(), 
e);
+        }
+    }
+
+    protected void exportProcessResource(final String deploymentId, final 
String resourceName, final OutputStream os) {
+        InputStream procDefIS = engine.getRepositoryService().
+                getResourceAsStream(deploymentId, resourceName);
+        try {
+            IOUtils.copy(procDefIS, os);
+        } catch (IOException e) {
+            LOG.error("While exporting {}", resourceName, e);
+        } finally {
+            IOUtils.closeQuietly(procDefIS);
+        }
+    }
+
+    @Override
+    public void exportDefinition(final String key, final 
WorkflowDefinitionFormat format, final OutputStream os) {
+        switch (format) {
+            case JSON:
+                exportProcessModel(key, os);
+                break;
+
+            case XML:
+            default:
+                ProcessDefinition procDef = getProcessDefinitionByKey(key);
+                exportProcessResource(procDef.getDeploymentId(), 
procDef.getResourceName(), os);
+        }
+    }
+
+    @Override
+    public void exportDiagram(final String key, final OutputStream os) {
+        ProcessDefinition procDef = getProcessDefinitionByKey(key);
+        if (procDef == null) {
+            throw new NotFoundException("Workflow process definition for " + 
key);
+        }
+        exportProcessResource(procDef.getDeploymentId(), 
procDef.getDiagramResourceName(), os);
+    }
+
+    @Override
+    public void importDefinition(final String key, final 
WorkflowDefinitionFormat format, final String definition) {
+        ProcessDefinition procDef = getProcessDefinitionByKey(key);
+        String resourceName = procDef == null ? key + ".bpmn20.xml" : 
procDef.getResourceName();
+        Deployment deployment;
+        switch (format) {
+            case JSON:
+                JsonNode definitionNode;
+                try {
+                    definitionNode = OBJECT_MAPPER.readTree(definition);
+                    if (definitionNode.has(MODEL_DATA_JSON_MODEL)) {
+                        definitionNode = 
definitionNode.get(MODEL_DATA_JSON_MODEL);
+                    }
+                    if 
(!definitionNode.has(BpmnJsonConverter.EDITOR_CHILD_SHAPES)) {
+                        throw new IllegalArgumentException(
+                                "Could not find JSON node " + 
BpmnJsonConverter.EDITOR_CHILD_SHAPES);
+                    }
+
+                    BpmnModel bpmnModel = new 
BpmnJsonConverter().convertToBpmnModel(definitionNode);
+                    deployment = FlowableDeployUtils.deployDefinition(
+                            engine,
+                            resourceName,
+                            new BpmnXMLConverter().convertToXML(bpmnModel));
+                } catch (Exception e) {
+                    throw new WorkflowException("While creating or updating 
process " + key, e);
+                }
+                break;
+
+            case XML:
+            default:
+                deployment = FlowableDeployUtils.deployDefinition(
+                        engine,
+                        resourceName,
+                        definition.getBytes());
+        }
+
+        procDef = getProcessDefinitionByDeploymentId(deployment.getId());
+        if (!key.equals(procDef.getKey())) {
+            throw new WorkflowException("Mismatching key: expected " + key + 
", found " + procDef.getKey());
+        }
+        FlowableDeployUtils.deployModel(engine, procDef);
+    }
+
+    @Override
+    public void deleteDefinition(final String key) {
+        ProcessDefinition procDef = getProcessDefinitionByKey(key);
+        if (WF_PROCESS_ID.equals(procDef.getKey())) {
+            throw new WorkflowException("Cannot delete the main process " + 
WF_PROCESS_ID);
+        }
+
+        try {
+            
engine.getRepositoryService().deleteDeployment(procDef.getDeploymentId());
+        } catch (Exception e) {
+            throw new WorkflowException("While deleting " + key, e);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/7a440618/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractAnyObjectWorkflowAdapter.java
----------------------------------------------------------------------
diff --git 
a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractAnyObjectWorkflowAdapter.java
 
b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractAnyObjectWorkflowAdapter.java
index 34f1a0c..df35de5 100644
--- 
a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractAnyObjectWorkflowAdapter.java
+++ 
b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractAnyObjectWorkflowAdapter.java
@@ -25,12 +25,14 @@ import 
org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
 import org.apache.syncope.core.provisioning.api.WorkflowResult;
 import org.apache.syncope.core.provisioning.api.data.AnyObjectDataBinder;
 import org.apache.syncope.core.workflow.api.AnyObjectWorkflowAdapter;
+import org.apache.syncope.core.workflow.api.AnyObjectWorkflowDefinitionAdapter;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = { 
Throwable.class })
-public abstract class AbstractAnyObjectWorkflowAdapter implements 
AnyObjectWorkflowAdapter {
+public abstract class AbstractAnyObjectWorkflowAdapter
+        implements AnyObjectWorkflowAdapter, 
AnyObjectWorkflowDefinitionAdapter {
 
     @Autowired
     protected AnyObjectDataBinder dataBinder;

http://git-wip-us.apache.org/repos/asf/syncope/blob/7a440618/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractGroupWorkflowAdapter.java
----------------------------------------------------------------------
diff --git 
a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractGroupWorkflowAdapter.java
 
b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractGroupWorkflowAdapter.java
index 952edb2..7b1fd3e 100644
--- 
a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractGroupWorkflowAdapter.java
+++ 
b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractGroupWorkflowAdapter.java
@@ -25,12 +25,13 @@ import 
org.apache.syncope.core.persistence.api.entity.group.Group;
 import org.apache.syncope.core.provisioning.api.WorkflowResult;
 import org.apache.syncope.core.provisioning.api.data.GroupDataBinder;
 import org.apache.syncope.core.workflow.api.GroupWorkflowAdapter;
+import org.apache.syncope.core.workflow.api.GroupWorkflowDefinitionAdapter;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = { 
Throwable.class })
-public abstract class AbstractGroupWorkflowAdapter implements 
GroupWorkflowAdapter {
+public abstract class AbstractGroupWorkflowAdapter implements 
GroupWorkflowAdapter, GroupWorkflowDefinitionAdapter {
 
     @Autowired
     protected GroupDataBinder dataBinder;

http://git-wip-us.apache.org/repos/asf/syncope/blob/7a440618/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractUserWorkflowAdapter.java
----------------------------------------------------------------------
diff --git 
a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractUserWorkflowAdapter.java
 
b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractUserWorkflowAdapter.java
index 546d03b..48c6d60 100644
--- 
a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractUserWorkflowAdapter.java
+++ 
b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractUserWorkflowAdapter.java
@@ -27,6 +27,7 @@ import 
org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.provisioning.api.WorkflowResult;
 import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
 import org.apache.syncope.core.workflow.api.UserWorkflowAdapter;
+import org.apache.syncope.core.workflow.api.UserWorkflowDefinitionAdapter;
 import org.identityconnectors.common.Base64;
 import org.identityconnectors.common.security.EncryptorFactory;
 import org.slf4j.Logger;
@@ -36,7 +37,7 @@ import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = { 
Throwable.class })
-public abstract class AbstractUserWorkflowAdapter implements 
UserWorkflowAdapter {
+public abstract class AbstractUserWorkflowAdapter implements 
UserWorkflowAdapter, UserWorkflowDefinitionAdapter {
 
     protected static final Logger LOG = 
LoggerFactory.getLogger(UserWorkflowAdapter.class);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/7a440618/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java
----------------------------------------------------------------------
diff --git 
a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java
 
b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java
index 90bf7e0..0a866f6 100644
--- 
a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java
+++ 
b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java
@@ -23,6 +23,7 @@ import java.util.Collections;
 import java.util.List;
 import org.apache.syncope.common.lib.patch.AnyObjectPatch;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
+import org.apache.syncope.common.lib.to.WorkflowDefinitionTO;
 import org.apache.syncope.common.lib.to.WorkflowFormTO;
 import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
@@ -73,37 +74,47 @@ public class DefaultAnyObjectWorkflowAdapter extends 
AbstractAnyObjectWorkflowAd
     }
 
     @Override
-    public void exportDefinition(final WorkflowDefinitionFormat format, final 
OutputStream os) {
+    public List<WorkflowFormTO> getForms() {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public WorkflowFormTO getForm(final String workflowId) {
+        return null;
+    }
+
+    @Override
+    public WorkflowFormTO claimForm(final String taskId) {
         throw new WorkflowException(new UnsupportedOperationException("Not 
supported."));
     }
 
     @Override
-    public void exportDiagram(final OutputStream os) {
+    public WorkflowResult<AnyObjectPatch> submitForm(final WorkflowFormTO 
form) {
         throw new WorkflowException(new UnsupportedOperationException("Not 
supported."));
     }
 
     @Override
-    public void importDefinition(final WorkflowDefinitionFormat format, final 
String definition) {
+    public List<WorkflowDefinitionTO> getDefinitions() {
         throw new WorkflowException(new UnsupportedOperationException("Not 
supported."));
     }
 
     @Override
-    public List<WorkflowFormTO> getForms() {
-        return Collections.emptyList();
+    public void exportDefinition(final String key, final 
WorkflowDefinitionFormat format, final OutputStream os) {
+        throw new WorkflowException(new UnsupportedOperationException("Not 
supported."));
     }
 
     @Override
-    public WorkflowFormTO getForm(final String workflowId) {
-        return null;
+    public void exportDiagram(final String key, final OutputStream os) {
+        throw new WorkflowException(new UnsupportedOperationException("Not 
supported."));
     }
 
     @Override
-    public WorkflowFormTO claimForm(final String taskId) {
+    public void importDefinition(final String key, final 
WorkflowDefinitionFormat format, final String definition) {
         throw new WorkflowException(new UnsupportedOperationException("Not 
supported."));
     }
 
     @Override
-    public WorkflowResult<AnyObjectPatch> submitForm(final WorkflowFormTO 
form) {
+    public void deleteDefinition(final String key) {
         throw new WorkflowException(new UnsupportedOperationException("Not 
supported."));
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/7a440618/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java
----------------------------------------------------------------------
diff --git 
a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java
 
b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java
index 6036700..6763138 100644
--- 
a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java
+++ 
b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java
@@ -23,6 +23,7 @@ import java.util.Collections;
 import java.util.List;
 import org.apache.syncope.common.lib.patch.GroupPatch;
 import org.apache.syncope.common.lib.to.GroupTO;
+import org.apache.syncope.common.lib.to.WorkflowDefinitionTO;
 import org.apache.syncope.common.lib.to.WorkflowFormTO;
 import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
@@ -73,38 +74,47 @@ public class DefaultGroupWorkflowAdapter extends 
AbstractGroupWorkflowAdapter {
     }
 
     @Override
-    public void exportDefinition(final WorkflowDefinitionFormat format, final 
OutputStream os) {
-        throw new WorkflowException(new UnsupportedOperationException("Not 
supported."));
+    public List<WorkflowFormTO> getForms() {
+        return Collections.emptyList();
     }
 
     @Override
-    public void exportDiagram(final OutputStream os) {
+    public WorkflowFormTO getForm(final String workflowId) {
+        return null;
+    }
+
+    @Override
+    public WorkflowFormTO claimForm(final String taskId) {
         throw new WorkflowException(new UnsupportedOperationException("Not 
supported."));
     }
 
     @Override
-    public void importDefinition(final WorkflowDefinitionFormat format, final 
String definition) {
+    public WorkflowResult<GroupPatch> submitForm(final WorkflowFormTO form) {
         throw new WorkflowException(new UnsupportedOperationException("Not 
supported."));
     }
 
     @Override
-    public List<WorkflowFormTO> getForms() {
-        return Collections.emptyList();
+    public List<WorkflowDefinitionTO> getDefinitions() {
+        throw new WorkflowException(new UnsupportedOperationException("Not 
supported."));
     }
 
     @Override
-    public WorkflowFormTO getForm(final String workflowId) {
-        return null;
+    public void exportDefinition(final String key, final 
WorkflowDefinitionFormat format, final OutputStream os) {
+        throw new WorkflowException(new UnsupportedOperationException("Not 
supported."));
     }
 
     @Override
-    public WorkflowFormTO claimForm(final String taskId) {
+    public void exportDiagram(final String key, final OutputStream os) {
         throw new WorkflowException(new UnsupportedOperationException("Not 
supported."));
     }
 
     @Override
-    public WorkflowResult<GroupPatch> submitForm(final WorkflowFormTO form) {
+    public void importDefinition(final String key, final 
WorkflowDefinitionFormat format, final String definition) {
         throw new WorkflowException(new UnsupportedOperationException("Not 
supported."));
     }
 
+    @Override
+    public void deleteDefinition(final String key) {
+        throw new WorkflowException(new UnsupportedOperationException("Not 
supported."));
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/7a440618/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java
----------------------------------------------------------------------
diff --git 
a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java
 
b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java
index f4fd4ca..d389e28 100644
--- 
a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java
+++ 
b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java
@@ -27,6 +27,7 @@ import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.common.lib.patch.PasswordPatch;
 import org.apache.syncope.common.lib.patch.UserPatch;
 import org.apache.syncope.common.lib.to.UserTO;
+import org.apache.syncope.common.lib.to.WorkflowDefinitionTO;
 import org.apache.syncope.common.lib.to.WorkflowFormTO;
 import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
@@ -178,43 +179,52 @@ public class DefaultUserWorkflowAdapter extends 
AbstractUserWorkflowAdapter {
     }
 
     @Override
-    public void exportDefinition(final WorkflowDefinitionFormat format, final 
OutputStream os) {
-        throw new WorkflowException(new UnsupportedOperationException("Not 
supported."));
+    public List<WorkflowFormTO> getForms() {
+        return Collections.emptyList();
     }
 
     @Override
-    public void exportDiagram(final OutputStream os) {
+    public WorkflowFormTO getForm(final String workflowId) {
+        return null;
+    }
+
+    @Override
+    public WorkflowFormTO claimForm(final String taskId) {
         throw new WorkflowException(new UnsupportedOperationException("Not 
supported."));
     }
 
     @Override
-    public void importDefinition(final WorkflowDefinitionFormat format, final 
String definition) {
+    public WorkflowResult<UserPatch> submitForm(final WorkflowFormTO form) {
         throw new WorkflowException(new UnsupportedOperationException("Not 
supported."));
     }
 
     @Override
-    public List<WorkflowFormTO> getForms() {
-        return Collections.emptyList();
+    public WorkflowResult<String> requestCertify(final User user) {
+        throw new UnsupportedOperationException("Not supported.");
     }
 
     @Override
-    public WorkflowFormTO getForm(final String workflowId) {
-        return null;
+    public List<WorkflowDefinitionTO> getDefinitions() {
+        throw new WorkflowException(new UnsupportedOperationException("Not 
supported."));
     }
 
     @Override
-    public WorkflowFormTO claimForm(final String taskId) {
+    public void exportDefinition(final String key, final 
WorkflowDefinitionFormat format, final OutputStream os) {
         throw new WorkflowException(new UnsupportedOperationException("Not 
supported."));
     }
 
     @Override
-    public WorkflowResult<UserPatch> submitForm(final WorkflowFormTO form) {
+    public void exportDiagram(final String key, final OutputStream os) {
         throw new WorkflowException(new UnsupportedOperationException("Not 
supported."));
     }
 
     @Override
-    public WorkflowResult<String> requestCertify(final User user) {
-        throw new UnsupportedOperationException("Not supported.");
+    public void importDefinition(final String key, final 
WorkflowDefinitionFormat format, final String definition) {
+        throw new WorkflowException(new UnsupportedOperationException("Not 
supported."));
     }
 
+    @Override
+    public void deleteDefinition(final String key) {
+        throw new WorkflowException(new UnsupportedOperationException("Not 
supported."));
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/7a440618/fit/console-reference/pom.xml
----------------------------------------------------------------------
diff --git a/fit/console-reference/pom.xml b/fit/console-reference/pom.xml
index a75d2e2..ec549e6 100644
--- a/fit/console-reference/pom.xml
+++ b/fit/console-reference/pom.xml
@@ -157,8 +157,8 @@ under the License.
                 </copy>
                 <replaceregexp 
file="${activiti-modeler.directory}/editor-app/editor/oryx.debug.js" 
match="ORYX.CONFIG.ROOT_PATH =.*&quot;editor/&quot;; //TODO: Remove last 
slash!!" replace="BASE_PATH = window.location.toString().substr(0, 
window.location.toString().indexOf('/wicket')); ORYX.CONFIG.ROOT_PATH = 
BASE_PATH + &quot;/activiti-modeler/editor-app/editor/&quot;;" byline="true" />
                 <replace 
file="${activiti-modeler.directory}/editor-app/editor/oryx.debug.js" token="new 
Ajax.Request(ACTIVITI.CONFIG.contextRoot + '/editor/stencilset?version=' + 
Date.now(), {" value="new Ajax.Request(window.location.toString().substr(0, 
window.location.toString().indexOf('/activiti-modeler')) + 
&quot;/activiti-modeler/stencilset.json&quot;, {" />
-                <replace 
file="${activiti-modeler.directory}/editor-app/editor/oryx.debug.js" 
token="ORYX.Editor.createByUrl(modelUrl);" value="modelUrl = BASE_PATH + 
&quot;/workflowDefGET&quot;; ORYX.Editor.createByUrl(modelUrl);" />
-                <replace 
file="${activiti-modeler.directory}/editor-app/editor/oryx.debug.js" 
token="ORYX.Editor.createByUrl = function(modelUrl){" value="modelUrl = 
BASE_PATH + &quot;/workflowDefGET&quot;; ORYX.Editor.createByUrl = 
function(modelUrl){" />                
+                <replace 
file="${activiti-modeler.directory}/editor-app/editor/oryx.debug.js" 
token="ORYX.Editor.createByUrl(modelUrl);" value="modelUrl = BASE_PATH + 
&quot;/workflowDefGET?modelId=&quot; + modelId; 
ORYX.Editor.createByUrl(modelUrl);" />
+                <replace 
file="${activiti-modeler.directory}/editor-app/editor/oryx.debug.js" 
token="ORYX.Editor.createByUrl = function(modelUrl){" value="modelUrl = 
BASE_PATH + &quot;/workflowDefGET?modelId=&quot; + modelId; 
ORYX.Editor.createByUrl = function(modelUrl){" />                
                 <replace 
file="${activiti-modeler.directory}/editor-app/configuration/toolbar-default-actions.js"
 token="window.location.href = &quot;./&quot;;" value="window.close();" />
                                                
                 <copy file="${basedir}/src/main/resources/url-config.js" 
todir="${activiti-modeler.directory}/editor-app/configuration" overwrite="true" 
/>

http://git-wip-us.apache.org/repos/asf/syncope/blob/7a440618/fit/console-reference/src/main/resources/url-config.js
----------------------------------------------------------------------
diff --git a/fit/console-reference/src/main/resources/url-config.js 
b/fit/console-reference/src/main/resources/url-config.js
index 89a91d7..8019a6e 100644
--- a/fit/console-reference/src/main/resources/url-config.js
+++ b/fit/console-reference/src/main/resources/url-config.js
@@ -21,7 +21,7 @@ var KISBPM = KISBPM || {};
 KISBPM.URL = {
   getModel: function (modelId) {
     return window.location.toString().substr(0, 
window.location.toString().indexOf('/activiti-modeler')) 
-            + "/workflowDefGET";
+            + "/workflowDefGET?modelId=" + modelId;
   },
   getStencilSet: function () {
     return window.location.toString().substr(0, 
window.location.toString().indexOf('/activiti-modeler')) 
@@ -29,6 +29,6 @@ KISBPM.URL = {
   },
   putModel: function (modelId) {
     return window.location.toString().substr(0, 
window.location.toString().indexOf('/activiti-modeler')) 
-            + "/workflowDefPUT";
+            + "/workflowDefPUT?modelId" + modelId;
   }
 };

http://git-wip-us.apache.org/repos/asf/syncope/blob/7a440618/fit/core-reference/src/test/java/org/apache/syncope/fit/core/WorkflowITCase.java
----------------------------------------------------------------------
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/WorkflowITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/WorkflowITCase.java
index 89f4190..529c13e 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/WorkflowITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/WorkflowITCase.java
@@ -28,52 +28,55 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import javax.ws.rs.core.Response;
+import org.apache.commons.collections4.IterableUtils;
+import org.apache.commons.collections4.Predicate;
 import org.apache.commons.io.IOUtils;
+import org.apache.syncope.common.lib.to.WorkflowDefinitionTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.fit.AbstractITCase;
 import org.junit.Assume;
+import org.junit.BeforeClass;
 import org.junit.Test;
 
 public class WorkflowITCase extends AbstractITCase {
 
-    private void exportDefinition(final AnyTypeKind type) throws IOException {
-        Response response = workflowService.exportDefinition(type);
-        assertTrue(response.getMediaType().toString().
-                
startsWith(clientFactory.getContentType().getMediaType().toString()));
-        assertTrue(response.getEntity() instanceof InputStream);
-        String definition = IOUtils.toString((InputStream) 
response.getEntity(), StandardCharsets.UTF_8);
-        assertNotNull(definition);
-        assertFalse(definition.isEmpty());
-    }
+    private static String defaultUserKey = null;
 
-    @Test
-    public void exportUserDefinition() throws IOException {
+    @BeforeClass
+    public static void findDefault() {
         
Assume.assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
-        exportDefinition(AnyTypeKind.USER);
-    }
+        WorkflowDefinitionTO found = IterableUtils.find(
+                workflowService.list(AnyTypeKind.USER.name()), new 
Predicate<WorkflowDefinitionTO>() {
 
-    @Test
-    public void getGroupDefinition() throws IOException {
-        
Assume.assumeTrue(ActivitiDetector.isActivitiEnabledForGroups(syncopeService));
-        exportDefinition(AnyTypeKind.GROUP);
+            @Override
+            public boolean evaluate(final WorkflowDefinitionTO object) {
+                return object.isMain();
+            }
+        });
+        if (found != null) {
+            defaultUserKey = found.getKey();
+        }
+        assertNotNull(defaultUserKey);
     }
 
-    private void importDefinition(final AnyTypeKind type) throws IOException {
-        Response response = workflowService.exportDefinition(type);
+    @Test
+    public void exportUserDefinition() throws IOException {
+        
Assume.assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
+        Response response = workflowService.get(AnyTypeKind.USER.name(), 
defaultUserKey);
+        assertTrue(response.getMediaType().toString().
+                
startsWith(clientFactory.getContentType().getMediaType().toString()));
+        assertTrue(response.getEntity() instanceof InputStream);
         String definition = IOUtils.toString((InputStream) 
response.getEntity(), StandardCharsets.UTF_8);
-
-        workflowService.importDefinition(type, definition);
+        assertNotNull(definition);
+        assertFalse(definition.isEmpty());
     }
 
     @Test
     public void updateUserDefinition() throws IOException {
         
Assume.assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
-        importDefinition(AnyTypeKind.USER);
-    }
+        Response response = workflowService.get(AnyTypeKind.USER.name(), 
defaultUserKey);
+        String definition = IOUtils.toString((InputStream) 
response.getEntity(), StandardCharsets.UTF_8);
 
-    @Test
-    public void updateGroupDefinition() throws IOException {
-        
Assume.assumeTrue(ActivitiDetector.isActivitiEnabledForGroups(syncopeService));
-        importDefinition(AnyTypeKind.GROUP);
+        workflowService.set(AnyTypeKind.USER.name(), defaultUserKey, 
definition);
     }
 }

Reply via email to