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 =.*"editor/"; //TODO: Remove last slash!!" replace="BASE_PATH = window.location.toString().substr(0, window.location.toString().indexOf('/wicket')); ORYX.CONFIG.ROOT_PATH = BASE_PATH + "/activiti-modeler/editor-app/editor/";" 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')) + "/activiti-modeler/stencilset.json", {" /> - <replace file="${activiti-modeler.directory}/editor-app/editor/oryx.debug.js" token="ORYX.Editor.createByUrl(modelUrl);" value="modelUrl = BASE_PATH + "/workflowDefGET"; 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 + "/workflowDefGET"; 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 + "/workflowDefGET?modelId=" + 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 + "/workflowDefGET?modelId=" + modelId; ORYX.Editor.createByUrl = function(modelUrl){" /> <replace file="${activiti-modeler.directory}/editor-app/configuration/toolbar-default-actions.js" token="window.location.href = "./";" 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); } }