syncope-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ilgro...@apache.org
Subject [1/3] syncope git commit: [SYNCOPE-1055] Provide core/workflow-flowable, based on core/workflow-activiti + support for Flowable Modeler in Admin Console
Date Wed, 05 Apr 2017 14:39:25 GMT
Repository: syncope
Updated Branches:
  refs/heads/2_0_X 911009b9e -> 85ddca5ba


http://git-wip-us.apache.org/repos/asf/syncope/blob/85ddca5b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Notify.java
----------------------------------------------------------------------
diff --git a/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Notify.java b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Notify.java
new file mode 100644
index 0000000..687424e
--- /dev/null
+++ b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Notify.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.core.workflow.flowable.task;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.common.lib.to.UserTO;
+import org.apache.syncope.common.lib.types.AuditElements;
+import org.apache.syncope.core.persistence.api.entity.user.User;
+import org.apache.syncope.core.provisioning.api.notification.NotificationManager;
+import org.apache.syncope.core.workflow.flowable.FlowableUserWorkflowAdapter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * General-purpose notification task for usage within workflow.
+ * It requires a pre-existing <tt>Notification</tt> with category <tt>CUSTOM</tt> and result <tt>SUCCESS</tt>.
+ * An <tt>event</tt> workflow variable needs to be provided as well.
+ */
+@Component
+public class Notify extends AbstractFlowableServiceTask {
+
+    @Autowired
+    private NotificationManager notificationManager;
+
+    @Override
+    protected void doExecute(final String executionId) {
+        User user = engine.getRuntimeService().
+                getVariable(executionId, FlowableUserWorkflowAdapter.USER, User.class);
+        UserTO userTO = engine.getRuntimeService().
+                getVariable(executionId, FlowableUserWorkflowAdapter.USER_TO, UserTO.class);
+        String event = engine.getRuntimeService().
+                getVariable(executionId, FlowableUserWorkflowAdapter.EVENT, String.class);
+
+        if (StringUtils.isNotBlank(event)) {
+            notificationManager.createTasks(
+                    AuditElements.EventCategoryType.CUSTOM,
+                    null,
+                    null,
+                    event,
+                    AuditElements.Result.SUCCESS,
+                    userTO,
+                    null,
+                    user.getToken());
+        } else {
+            LOG.debug("Not sending any notification since no event was found");
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/85ddca5b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/PasswordReset.java
----------------------------------------------------------------------
diff --git a/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/PasswordReset.java b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/PasswordReset.java
new file mode 100644
index 0000000..61d9d17
--- /dev/null
+++ b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/PasswordReset.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.core.workflow.flowable.task;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.syncope.common.lib.patch.PasswordPatch;
+import org.apache.syncope.common.lib.patch.UserPatch;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
+import org.apache.syncope.core.persistence.api.dao.UserDAO;
+import org.apache.syncope.core.persistence.api.entity.user.User;
+import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
+import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
+import org.apache.syncope.core.workflow.api.WorkflowException;
+import org.apache.syncope.core.workflow.flowable.FlowableUserWorkflowAdapter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class PasswordReset extends AbstractFlowableServiceTask {
+
+    @Autowired
+    private UserDAO userDAO;
+
+    @Autowired
+    private UserDataBinder dataBinder;
+
+    @Override
+    protected void doExecute(final String executionId) {
+        User user = engine.getRuntimeService().
+                getVariable(executionId, FlowableUserWorkflowAdapter.USER, User.class);
+        String token = engine.getRuntimeService().
+                getVariable(executionId, FlowableUserWorkflowAdapter.TOKEN, String.class);
+        String password = engine.getRuntimeService().
+                getVariable(executionId, FlowableUserWorkflowAdapter.PASSWORD, String.class);
+
+        if (!user.checkToken(token)) {
+            throw new WorkflowException(new IllegalArgumentException("Wrong token: " + token + " for " + user));
+        }
+
+        user.removeToken();
+
+        UserPatch userPatch = new UserPatch();
+        userPatch.setKey(user.getKey());
+        userPatch.setPassword(new PasswordPatch.Builder().
+                onSyncope(true).
+                resources(CollectionUtils.collect(userDAO.findAllResources(user), EntityUtils.keyTransformer())).
+                value(password).build());
+
+        PropagationByResource propByRes = dataBinder.update(user, userPatch);
+
+        // report updated user and propagation by resource as result
+        engine.getRuntimeService().setVariable(executionId, FlowableUserWorkflowAdapter.USER, user);
+        engine.getRuntimeService().setVariable(executionId, FlowableUserWorkflowAdapter.USER_PATCH, userPatch);
+        engine.getRuntimeService().setVariable(executionId, FlowableUserWorkflowAdapter.PROP_BY_RESOURCE, propByRes);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/85ddca5b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Reactivate.java
----------------------------------------------------------------------
diff --git a/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Reactivate.java b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Reactivate.java
new file mode 100644
index 0000000..0052b5a
--- /dev/null
+++ b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Reactivate.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.core.workflow.flowable.task;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class Reactivate extends AbstractFlowableServiceTask {
+
+    @Override
+    protected void doExecute(final String executionId) {
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/85ddca5b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Recertify.java
----------------------------------------------------------------------
diff --git a/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Recertify.java b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Recertify.java
new file mode 100644
index 0000000..6099e0c
--- /dev/null
+++ b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Recertify.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.core.workflow.flowable.task;
+
+import java.util.Date;
+import org.apache.syncope.core.persistence.api.dao.UserDAO;
+import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
+import org.apache.syncope.core.persistence.api.entity.EntityFactory;
+import org.apache.syncope.core.persistence.api.entity.user.User;
+import org.apache.syncope.core.workflow.flowable.FlowableUserWorkflowAdapter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class Recertify extends AbstractFlowableServiceTask {
+
+    @Autowired
+    protected UserDAO userDAO;
+
+    @Autowired
+    protected EntityFactory entityFactory;
+
+    @Autowired
+    protected AnyUtilsFactory anyUtilsFactory;
+
+    @Override
+    protected void doExecute(final String executionId) {
+        LOG.debug("Processing Recertification {}", executionId);
+        User user = engine.getRuntimeService().
+                getVariable(executionId, FlowableUserWorkflowAdapter.USER, User.class);
+        String submitter = engine.getRuntimeService().
+                getVariable(executionId, FlowableUserWorkflowAdapter.FORM_SUBMITTER, String.class);
+
+        LOG.debug("Saving Recertification information for user {}", user.getUsername());
+
+        user.setLastRecertificator(submitter);
+        user.setLastRecertification(new Date(System.currentTimeMillis()));
+
+        userDAO.save(user);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/85ddca5b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Suspend.java
----------------------------------------------------------------------
diff --git a/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Suspend.java b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Suspend.java
new file mode 100644
index 0000000..189d619
--- /dev/null
+++ b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Suspend.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.core.workflow.flowable.task;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class Suspend extends AbstractFlowableServiceTask {
+
+    @Override
+    protected void doExecute(final String executionId) {
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/85ddca5b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Update.java
----------------------------------------------------------------------
diff --git a/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Update.java b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Update.java
new file mode 100644
index 0000000..7f5d9d2
--- /dev/null
+++ b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Update.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.core.workflow.flowable.task;
+
+import org.apache.syncope.common.lib.patch.UserPatch;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
+import org.apache.syncope.core.persistence.api.entity.user.User;
+import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
+import org.apache.syncope.core.workflow.flowable.FlowableUserWorkflowAdapter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class Update extends AbstractFlowableServiceTask {
+
+    @Autowired
+    private UserDataBinder dataBinder;
+
+    @Override
+    protected void doExecute(final String executionId) {
+        User user = engine.getRuntimeService().
+                getVariable(executionId, FlowableUserWorkflowAdapter.USER, User.class);
+        UserPatch userPatch = engine.getRuntimeService().
+                getVariable(executionId, FlowableUserWorkflowAdapter.USER_PATCH, UserPatch.class);
+
+        PropagationByResource propByRes = dataBinder.update(user, userPatch);
+
+        // report updated user and propagation by resource as result
+        engine.getRuntimeService().setVariable(executionId, FlowableUserWorkflowAdapter.USER, user);
+        engine.getRuntimeService().setVariable(executionId, FlowableUserWorkflowAdapter.USER_PATCH, userPatch);
+        engine.getRuntimeService().setVariable(executionId, FlowableUserWorkflowAdapter.PROP_BY_RESOURCE, propByRes);
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/85ddca5b/core/workflow-flowable/src/main/resources/userWorkflow.bpmn20.xml
----------------------------------------------------------------------
diff --git a/core/workflow-flowable/src/main/resources/userWorkflow.bpmn20.xml b/core/workflow-flowable/src/main/resources/userWorkflow.bpmn20.xml
new file mode 100644
index 0000000..20690f3
--- /dev/null
+++ b/core/workflow-flowable/src/main/resources/userWorkflow.bpmn20.xml
@@ -0,0 +1,287 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" 
+             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+             xmlns:flowable="http://flowable.org/bpmn"
+             xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" 
+             xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" 
+             xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" 
+             typeLanguage="http://www.w3.org/2001/XMLSchema" 
+             expressionLanguage="http://www.w3.org/1999/XPath" 
+             targetNamespace="http://www.flowable.org/processdef">
+  
+  <process id="userWorkflow" name="User Workflow" isExecutable="true">
+    <startEvent id="theStart"/>
+    <sequenceFlow id="flow1" sourceRef="theStart" targetRef="create"/>
+    <serviceTask id="create" name="Create" flowable:expression="#{create.execute(execution.processInstanceId)}"/>
+    <sequenceFlow id="flow2" sourceRef="create" targetRef="activate"/>
+    <scriptTask id="activate" name="Activate" scriptFormat="groovy" flowable:autoStoreVariables="false">
+      <script>execution.setVariable("propagateEnable", Boolean.TRUE);</script>
+    </scriptTask>
+    <sequenceFlow id="flow3" sourceRef="activate" targetRef="active"/>
+    <userTask id="active" name="Active"/>
+    <sequenceFlow id="flow8" sourceRef="active" targetRef="activeGw"/>
+    <exclusiveGateway id="activeGw"/>
+    <sequenceFlow id="active2Update" sourceRef="activeGw" targetRef="update">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${task == 'update'}]]></conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="active2Suspend" sourceRef="activeGw" targetRef="suspend">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${task == 'suspend'}]]></conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="active2Delete" sourceRef="activeGw" targetRef="delete">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${task == 'delete'}]]></conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="active2RequestPasswordReset" sourceRef="activeGw" targetRef="generateToken4PasswordReset">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${task == 'requestPasswordReset'}]]></conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="active2ConfirmPasswordReset" sourceRef="activeGw" targetRef="checkToken4ConfirmPasswordReset">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${task == 'confirmPasswordReset'}]]></conditionExpression>
+    </sequenceFlow>
+    <serviceTask id="update" name="Update" flowable:expression="#{update.execute(execution.processInstanceId)}"/>
+    <sequenceFlow id="sid-EA22026A-25F0-4ED0-AB6E-9CE9CE74623C" sourceRef="update" targetRef="active"/>
+    <serviceTask id="suspend" name="Suspend" flowable:expression="#{suspend.execute(execution.processInstanceId)}"/>
+    <sequenceFlow id="flow10" sourceRef="suspend" targetRef="suspended"/>
+    <userTask id="suspended" name="Suspended"/>
+    <sequenceFlow id="flow11" sourceRef="suspended" targetRef="suspendedGw"/>
+    <exclusiveGateway id="suspendedGw"/>
+    <sequenceFlow id="suspended2Reactivate" sourceRef="suspendedGw" targetRef="reactivate">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${task == 'reactivate'}]]></conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="suspended2Delete" sourceRef="suspendedGw" targetRef="delete">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${task == 'delete'}]]></conditionExpression>
+    </sequenceFlow>
+    <serviceTask id="reactivate" name="Reactivate" flowable:expression="#{reactivate.execute(execution.processInstanceId)}"/>
+    <sequenceFlow id="flow12" sourceRef="reactivate" targetRef="active"/>
+    
+    <serviceTask id="generateToken4PasswordReset" name="Generate Token" flowable:expression="#{generateToken.execute(execution.processInstanceId)}"/>
+    <sequenceFlow id="sid-7F78CE07-A7A1-467F-BB4B-40FB234AEFF7" sourceRef="generateToken4PasswordReset" targetRef="notify4RequestPasswordReset"/>
+    <serviceTask id="notify4RequestPasswordReset" name="Notification" flowable:expression="#{notify.execute(execution.processInstanceId)}"/>
+    <sequenceFlow id="sid-CF9ACA40-7750-47C3-A508-7250D24D4F1F" sourceRef="notify4RequestPasswordReset" targetRef="active"/>
+
+    <serviceTask id="checkToken4ConfirmPasswordReset" name="Check token, remove and update password" flowable:expression="#{passwordReset.execute(execution.processInstanceId)}"/>
+    <sequenceFlow id="sid-3E9FE01D-CC60-4A95-B356-CA0DC000FAD6" sourceRef="checkToken4ConfirmPasswordReset" targetRef="notify4ConfirmPasswordReset"/>
+    <serviceTask id="notify4ConfirmPasswordReset" name="Notification" flowable:expression="#{notify.execute(execution.processInstanceId)}"/>
+    <sequenceFlow id="sid-A37806A7-6B7B-48A2-BB37-DAE640231144" sourceRef="notify4ConfirmPasswordReset" targetRef="active"/>
+    
+    <serviceTask id="delete" name="Delete" flowable:expression="#{delete.execute(execution.processInstanceId)}"/>
+    <sequenceFlow id="flow99" sourceRef="delete" targetRef="theEnd"/>
+    <!-- Recertification tasks -->
+    <userTask id="recertificationRequest" name="Recertification Request" flowable:formKey="recertify">
+      <extensionElements>
+        <flowable:formProperty id="username" name="Username" type="string" expression="${user.username}" writable="false"/>
+        <flowable:formProperty id="approve" name="Recertify?" type="boolean" required="true"/>
+        <flowable:formProperty id="rejectReason" name="Reason for not recertifying" type="string" variable="rejectReason"/>
+      </extensionElements>
+    </userTask>
+    <serviceTask id="recertify-task" name="Recertify" flowable:expression="#{recertify.execute(execution.processInstanceId)}"/>
+    <sequenceFlow id="recert-request-start-flow" sourceRef="activeGw" targetRef="recertificationRequest">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${task == 'request-certify'}]]></conditionExpression>
+    </sequenceFlow>
+    <exclusiveGateway id="recert-condition"/>
+    <sequenceFlow id="recert-flow1" sourceRef="recertificationRequest" targetRef="recertify-task"/>
+    <sequenceFlow id="recert-flow2" sourceRef="recertify-task" targetRef="recert-condition"/>
+    <sequenceFlow id="recert-approved-flow" sourceRef="recert-condition" targetRef="active">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${approve}]]></conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="recert-denied-flow" sourceRef="recert-condition" targetRef="suspend">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${!approve}]]></conditionExpression>
+    </sequenceFlow>
+    <!-- End Recertification flow -->
+    <endEvent id="theEnd"/>
+  </process>
+  
+  <bpmndi:BPMNDiagram id="BPMNDiagram_userWorkflow">
+    <bpmndi:BPMNPlane bpmnElement="userWorkflow" id="BPMNPlane_userWorkflow">
+      <bpmndi:BPMNShape bpmnElement="theStart" id="BPMNShape_theStart">
+        <omgdc:Bounds height="35.0" width="35.0" x="540.0" y="521.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="create" id="BPMNShape_create">
+        <omgdc:Bounds height="60.0" width="100.0" x="620.0" y="509.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="activate" id="BPMNShape_activate">
+        <omgdc:Bounds height="80.0" width="100.0" x="828.0" y="500.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="active" id="BPMNShape_active">
+        <omgdc:Bounds height="60.0" width="100.0" x="1030.0" y="511.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="activeGw" id="BPMNShape_activeGw">
+        <omgdc:Bounds height="40.0" width="40.0" x="1400.0" y="520.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="update" id="BPMNShape_update">
+        <omgdc:Bounds height="60.0" width="100.0" x="1370.0" y="615.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="suspend" id="BPMNShape_suspend">
+        <omgdc:Bounds height="60.0" width="100.0" x="1490.0" y="370.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="suspended" id="BPMNShape_suspended">
+        <omgdc:Bounds height="60.0" width="100.0" x="1640.0" y="370.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="suspendedGw" id="BPMNShape_suspendedGw">
+        <omgdc:Bounds height="40.0" width="40.0" x="1820.0" y="380.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="reactivate" id="BPMNShape_reactivate">
+        <omgdc:Bounds height="60.0" width="100.0" x="1940.0" y="290.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="generateToken4PasswordReset" id="BPMNShape_generateToken4PasswordReset">
+        <omgdc:Bounds height="81.0" width="121.0" x="1515.0" y="604.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="notify4RequestPasswordReset" id="BPMNShape_notify4RequestPasswordReset">
+        <omgdc:Bounds height="81.0" width="121.0" x="1515.0" y="750.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="checkToken4ConfirmPasswordReset" id="BPMNShape_checkToken4ConfirmPasswordReset">
+        <omgdc:Bounds height="81.0" width="121.0" x="1725.0" y="664.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="notify4ConfirmPasswordReset" id="BPMNShape_notify4ConfirmPasswordReset">
+        <omgdc:Bounds height="81.0" width="121.0" x="1725.0" y="810.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="delete" id="BPMNShape_delete">
+        <omgdc:Bounds height="60.0" width="100.0" x="1940.0" y="438.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="recertificationRequest" id="BPMNShape_recertificationRequest">
+        <omgdc:Bounds height="80.0" width="100.0" x="1370.0" y="375.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="recertify-task" id="BPMNShape_recertify-task">
+        <omgdc:Bounds height="80.0" width="100.0" x="1230.0" y="375.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="recert-condition" id="BPMNShape_recert-condition">
+        <omgdc:Bounds height="40.0" width="40.0" x="1178.0" y="475.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="theEnd" id="BPMNShape_theEnd">
+        <omgdc:Bounds height="35.0" width="35.0" x="2080.0" y="451.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
+        <omgdi:waypoint x="575.0" y="538.0"></omgdi:waypoint>
+        <omgdi:waypoint x="620.0" y="539.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
+        <omgdi:waypoint x="720.0" y="539.0"></omgdi:waypoint>
+        <omgdi:waypoint x="828.0" y="540.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
+        <omgdi:waypoint x="928.0" y="540.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1030.0" y="541.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow8" id="BPMNEdge_flow8">
+        <omgdi:waypoint x="1130.0" y="541.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1400.0" y="540.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="active2Update" id="BPMNEdge_active2Update">
+        <omgdi:waypoint x="1420.0" y="560.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1420.0" y="615.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="active2Suspend" id="BPMNEdge_active2Suspend">
+        <omgdi:waypoint x="1440.0" y="540.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1540.0" y="540.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1540.0" y="430.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="active2Delete" id="BPMNEdge_active2Delete">
+        <omgdi:waypoint x="1440.0" y="540.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1990.0" y="540.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1990.0" y="498.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="active2RequestPasswordReset" id="BPMNEdge_active2RequestPasswordReset">
+        <omgdi:waypoint x="1440.0" y="540.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1575.0" y="540.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1575.0" y="604.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="active2ConfirmPasswordReset" id="BPMNEdge_active2ConfirmPasswordReset">
+        <omgdi:waypoint x="1440.0" y="540.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1785.0" y="540.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1785.0" y="664.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="sid-EA22026A-25F0-4ED0-AB6E-9CE9CE74623C" id="BPMNEdge_sid-EA22026A-25F0-4ED0-AB6E-9CE9CE74623C">
+        <omgdi:waypoint x="1370.0" y="645.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1080.0" y="645.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1080.0" y="571.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow10" id="BPMNEdge_flow10">
+        <omgdi:waypoint x="1590.0" y="400.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1640.0" y="400.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow11" id="BPMNEdge_flow11">
+        <omgdi:waypoint x="1740.0" y="400.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1820.0" y="400.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="suspended2Reactivate" id="BPMNEdge_suspended2Reactivate">
+        <omgdi:waypoint x="1860.0" y="400.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1902.0" y="400.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1902.0" y="320.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1940.0" y="320.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="suspended2Delete" id="BPMNEdge_suspended2Delete">
+        <omgdi:waypoint x="1860.0" y="400.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1990.0" y="400.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1990.0" y="438.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow12" id="BPMNEdge_flow12">
+        <omgdi:waypoint x="1990.0" y="290.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1990.0" y="261.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1080.0" y="261.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1080.0" y="511.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="sid-7F78CE07-A7A1-467F-BB4B-40FB234AEFF7" id="BPMNEdge_sid-7F78CE07-A7A1-467F-BB4B-40FB234AEFF7">
+        <omgdi:waypoint x="1575.0" y="685.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1575.0" y="750.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="sid-CF9ACA40-7750-47C3-A508-7250D24D4F1F" id="BPMNEdge_sid-CF9ACA40-7750-47C3-A508-7250D24D4F1F">
+        <omgdi:waypoint x="1515.0" y="790.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1080.0" y="790.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1080.0" y="571.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="sid-3E9FE01D-CC60-4A95-B356-CA0DC000FAD6" id="BPMNEdge_sid-3E9FE01D-CC60-4A95-B356-CA0DC000FAD6">
+        <omgdi:waypoint x="1785.0" y="745.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1785.0" y="810.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="sid-A37806A7-6B7B-48A2-BB37-DAE640231144" id="BPMNEdge_sid-A37806A7-6B7B-48A2-BB37-DAE640231144">
+        <omgdi:waypoint x="1725.0" y="850.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1080.0" y="850.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1080.0" y="571.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow99" id="BPMNEdge_flow99">
+        <omgdi:waypoint x="2040.0" y="468.0"></omgdi:waypoint>
+        <omgdi:waypoint x="2080.0" y="468.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="recert-request-start-flow" id="BPMNEdge_recert-request-start-flow">
+        <omgdi:waypoint x="1420.0" y="520.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1420.0" y="455.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="recert-flow1" id="BPMNEdge_recert-flow1">
+        <omgdi:waypoint x="1370.0" y="415.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1330.0" y="415.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="recert-flow2" id="BPMNEdge_recert-flow2">
+        <omgdi:waypoint x="1280.0" y="455.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1280.0" y="495.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1218.0" y="495.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="recert-approved-flow" id="BPMNEdge_recert-approved-flow">
+        <omgdi:waypoint x="1198.0" y="515.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1194.0" y="541.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1130.0" y="541.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="recert-denied-flow" id="BPMNEdge_recert-denied-flow">
+        <omgdi:waypoint x="1198.0" y="475.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1198.0" y="313.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1540.0" y="313.0"></omgdi:waypoint>
+        <omgdi:waypoint x="1540.0" y="370.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</definitions>

http://git-wip-us.apache.org/repos/asf/syncope/blob/85ddca5b/core/workflow-flowable/src/main/resources/workflow.properties
----------------------------------------------------------------------
diff --git a/core/workflow-flowable/src/main/resources/workflow.properties b/core/workflow-flowable/src/main/resources/workflow.properties
new file mode 100644
index 0000000..50c42fc
--- /dev/null
+++ b/core/workflow-flowable/src/main/resources/workflow.properties
@@ -0,0 +1,22 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+wf.directory=${conf.directory}
+historyLevel=activity
+jobExecutorActivate=true
+uwfAdapter=org.apache.syncope.core.workflow.flowable.FlowableUserWorkflowAdapter
+gwfAdapter=org.apache.syncope.core.workflow.java.DefaultGroupWorkflowAdapter
+awfAdapter=org.apache.syncope.core.workflow.java.DefaultAnyObjectWorkflowAdapter

http://git-wip-us.apache.org/repos/asf/syncope/blob/85ddca5b/core/workflow-flowable/src/main/resources/workflowFlowableContext.xml
----------------------------------------------------------------------
diff --git a/core/workflow-flowable/src/main/resources/workflowFlowableContext.xml b/core/workflow-flowable/src/main/resources/workflowFlowableContext.xml
new file mode 100644
index 0000000..517b8d7
--- /dev/null
+++ b/core/workflow-flowable/src/main/resources/workflowFlowableContext.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans   
+                           http://www.springframework.org/schema/beans/spring-beans.xsd
+                           http://www.springframework.org/schema/context
+                           http://www.springframework.org/schema/context/spring-context.xsd">
+
+  <bean id="userWorkflowDef" class="org.apache.syncope.core.spring.ResourceWithFallbackLoader">
+    <property name="primary" value="file:${wf.directory}/userWorkflow.bpmn20.xml"/>
+    <property name="fallback" value="classpath:userWorkflow.bpmn20.xml"/>
+  </bean>
+
+  <bean id="flowableUtils" class="org.apache.syncope.core.workflow.flowable.FlowableUtils"/>
+
+  <bean id="syncopeFlowableUserManager" class="org.apache.syncope.core.workflow.flowable.SyncopeUserManager"/>
+  <bean id="syncopeFlowableGroupManager" class="org.apache.syncope.core.workflow.flowable.SyncopeGroupManager"/>
+
+  <bean class="org.activiti.spring.SpringProcessEngineConfiguration" scope="prototype">
+    <property name="transactionsExternallyManaged" value="true"/>
+    <property name="databaseSchemaUpdate" value="true"/>
+
+    <property name="jpaHandleTransaction" value="true"/>
+    <property name="jpaCloseEntityManager" value="false"/>
+
+    <property name="history" value="${historyLevel}"/>
+    <property name="jobExecutorActivate" value="${jobExecutorActivate}"/>
+
+    <property name="customSessionFactories">
+      <list>
+        <bean class="org.apache.syncope.core.workflow.flowable.SyncopeSessionFactory">
+          <property name="syncopeSession" ref="syncopeFlowableUserManager"/>
+        </bean>
+        <bean class="org.apache.syncope.core.workflow.flowable.SyncopeSessionFactory">
+          <property name="syncopeSession" ref="syncopeFlowableGroupManager"/>
+        </bean>
+      </list>
+    </property>
+    <property name="customPreVariableTypes">
+      <list>
+        <bean class="org.apache.syncope.core.workflow.flowable.SyncopeEntitiesVariableType"/>
+      </list>
+    </property>
+  </bean>
+
+  <bean class="org.apache.syncope.core.workflow.flowable.spring.DomainProcessEngineFactoryBean"/>
+
+  <context:component-scan base-package="org.apache.syncope.core.workflow.flowable"/>
+    
+</beans>

http://git-wip-us.apache.org/repos/asf/syncope/blob/85ddca5b/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 3994923..90bf7e0 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
@@ -37,6 +37,11 @@ import org.apache.syncope.core.workflow.api.WorkflowException;
 public class DefaultAnyObjectWorkflowAdapter extends AbstractAnyObjectWorkflowAdapter {
 
     @Override
+    public boolean supportsDefinitionEdit() {
+        return false;
+    }
+
+    @Override
     public WorkflowResult<String> create(final AnyObjectTO anyObjectTO) {
         AnyObject anyObject = entityFactory.newEntity(AnyObject.class);
         dataBinder.create(anyObject, anyObjectTO);

http://git-wip-us.apache.org/repos/asf/syncope/blob/85ddca5b/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 6b557d6..6036700 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
@@ -37,6 +37,11 @@ import org.apache.syncope.core.workflow.api.WorkflowException;
 public class DefaultGroupWorkflowAdapter extends AbstractGroupWorkflowAdapter {
 
     @Override
+    public boolean supportsDefinitionEdit() {
+        return false;
+    }
+
+    @Override
     public WorkflowResult<String> create(final GroupTO groupTO) {
         Group group = entityFactory.newEntity(Group.class);
         dataBinder.create(group, groupTO);

http://git-wip-us.apache.org/repos/asf/syncope/blob/85ddca5b/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 ff8bc45..f4fd4ca 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
@@ -47,6 +47,11 @@ public class DefaultUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
     private ConfDAO confDAO;
 
     @Override
+    public boolean supportsDefinitionEdit() {
+        return false;
+    }
+
+    @Override
     public WorkflowResult<Pair<String, Boolean>> create(final UserTO userTO, final boolean storePassword) {
         return create(userTO, false, true);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/85ddca5b/fit/console-reference/src/main/resources/console.properties
----------------------------------------------------------------------
diff --git a/fit/console-reference/src/main/resources/console.properties b/fit/console-reference/src/main/resources/console.properties
index 00834e6..3dbfac7 100644
--- a/fit/console-reference/src/main/resources/console.properties
+++ b/fit/console-reference/src/main/resources/console.properties
@@ -29,6 +29,7 @@ rootPath=/syncope/rest/
 useGZIPCompression=true
 
 activitiModelerDirectory=${activiti-modeler.directory}
+flowableModelerDirectory=${flowable-modeler.directory}
 
 reconciliationReportKey=c3520ad9-179f-49e7-b315-d684d216dd97
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/85ddca5b/fit/core-reference/src/test/resources/console.properties
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/resources/console.properties b/fit/core-reference/src/test/resources/console.properties
index 00834e6..3dbfac7 100644
--- a/fit/core-reference/src/test/resources/console.properties
+++ b/fit/core-reference/src/test/resources/console.properties
@@ -29,6 +29,7 @@ rootPath=/syncope/rest/
 useGZIPCompression=true
 
 activitiModelerDirectory=${activiti-modeler.directory}
+flowableModelerDirectory=${flowable-modeler.directory}
 
 reconciliationReportKey=c3520ad9-179f-49e7-b315-d684d216dd97
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/85ddca5b/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 805be1c..557faa0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -377,6 +377,7 @@ under the License.
     <groovy.version>2.4.10</groovy.version>
 
     <activiti.version>5.22.0</activiti.version>
+    <flowable.version>5.23.0</flowable.version>
 
     <camel.version>2.17.6</camel.version>	
 
@@ -403,6 +404,7 @@ under the License.
     <connid.location>file:${bundles.directory}/</connid.location>
     <log.directory>${project.build.directory}/log</log.directory>
     <activiti-modeler.directory>${project.build.directory}/activiti-modeler</activiti-modeler.directory>
+    <flowable-modeler.directory>${project.build.directory}/flowable-modeler</flowable-modeler.directory>
 
     <swagger-core.version>1.5.12</swagger-core.version>    
     <swagger-ui.version>2.2.10</swagger-ui.version>
@@ -572,10 +574,10 @@ under the License.
         <version>${cxf.version}</version>
       </dependency>
       <dependency>
-	<groupId>org.apache.cxf</groupId>
-	<artifactId>cxf-rt-rs-security-sso-saml</artifactId>
-	<version>${cxf.version}</version>
-	<exclusions>
+        <groupId>org.apache.cxf</groupId>
+        <artifactId>cxf-rt-rs-security-sso-saml</artifactId>
+        <version>${cxf.version}</version>
+        <exclusions>
           <exclusion>
             <groupId>org.opensaml</groupId>
             <artifactId>opensaml-xacml-impl</artifactId>
@@ -584,26 +586,26 @@ under the License.
             <groupId>org.opensaml</groupId>
             <artifactId>opensaml-xacml-saml-impl</artifactId>
           </exclusion>
-	  <exclusion>
+          <exclusion>
             <groupId>org.apache.wss4j</groupId>
             <artifactId>wss4j-ws-security-dom</artifactId>
-	  </exclusion>
-	</exclusions>
+          </exclusion>
+        </exclusions>
       </dependency>
       <dependency>
-	<groupId>org.apache.wss4j</groupId>
+        <groupId>org.apache.wss4j</groupId>
         <artifactId>wss4j-ws-security-dom</artifactId>
-	<version>2.1.9</version>
-	<exclusions>
-	  <exclusion>
-	    <groupId>org.jasypt</groupId>
-	    <artifactId>jasypt</artifactId>
-	  </exclusion>
+        <version>2.1.9</version>
+        <exclusions>
+          <exclusion>
+            <groupId>org.jasypt</groupId>
+            <artifactId>jasypt</artifactId>
+          </exclusion>
           <exclusion>
             <groupId>org.apache.geronimo.specs</groupId>
             <artifactId>geronimo-javamail_1.4_spec</artifactId>
           </exclusion>
-	</exclusions>
+        </exclusions>
       </dependency>
       <!-- /CXF -->
 
@@ -1047,6 +1049,54 @@ under the License.
       </dependency>
       <!-- /Activiti -->
 
+      <!-- Flowable -->
+      <dependency>
+        <groupId>org.flowable</groupId>
+        <artifactId>flowable-engine</artifactId>
+        <version>${flowable.version}</version>
+        <exclusions>
+          <exclusion>
+            <groupId>javax.activation</groupId>
+            <artifactId>activation</artifactId>
+          </exclusion>
+          <exclusion>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-beans</artifactId>
+          </exclusion>
+          <exclusion>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-email</artifactId>
+          </exclusion>
+        </exclusions>
+      </dependency>
+      <dependency>
+        <groupId>org.flowable</groupId>
+        <artifactId>flowable-spring</artifactId>
+        <version>${flowable.version}</version>
+        <exclusions>
+          <exclusion>
+            <groupId>commons-dbcp</groupId>
+            <artifactId>commons-dbcp</artifactId>
+          </exclusion>
+          <exclusion>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-log4j12</artifactId>
+          </exclusion>
+        </exclusions>
+      </dependency>
+      <dependency>
+        <groupId>org.flowable</groupId>
+        <artifactId>flowable-json-converter</artifactId>
+        <version>${flowable.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.flowable</groupId>
+        <artifactId>flowable-webapp-explorer2</artifactId>
+        <version>${flowable.version}</version>
+        <type>war</type>
+      </dependency>
+      <!-- /Flowable -->
+
       <!-- Wicket -->
       <dependency>
         <groupId>org.apache.wicket</groupId>


Mime
View raw message