Hi Francesco

Thanks for your help. There was one small issue with your example, since on
user creation you do not have a usermod on the execution yet. But that was
easily fixed.

I have used the following code and rule in my workflow to get this working.
Might I suggest that we use this in the standard deployment of Syncope? I
think that provisioning via the workflow is functionality that should be
included out of the box. The version I made is parameterized via the
workflow (description of usage is included) so it is not specific to my
project.

import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.Expression;
import org.apache.syncope.client.mod.UserMod;
import org.apache.syncope.core.persistence.beans.user.SyncopeUser;
import org.apache.syncope.core.propagation.PropagationByResource;
import org.apache.syncope.core.workflow.ActivitiUserWorkflowAdapter;
import org.apache.syncope.core.workflow.WorkflowException;
import org.apache.syncope.core.workflow.activiti.AbstractActivitiDelegate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * This workflow service task allows to provision a resource to a user from
the workflow.
 *
 * Use the following code in the workflow:
 *
 *          <serviceTask id="addResource" name="Add Resource"

activiti:class="org.apache.syncope.core.workflow.activiti.ProvisionResources">
                <extensionElements>
                    <activiti:field name="resource"
stringValue="%%YOUR_RESOURCE%%"/>
                </extensionElements>
            </serviceTask>
 */
public class ProvisionResources extends AbstractActivitiDelegate {

    protected static final Logger LOG =
LoggerFactory.getLogger(ProvisionResources.class);

    private Expression resource;

    public void setResource(Expression resource) {
        this.resource = resource;
    }

    @Override
    protected void doExecute(DelegateExecution execution) throws Exception {
        String resourceName = (String) resource.getValue(execution);

        if (resourceName == null || resourceName.isEmpty()) {
            throw new WorkflowException(new IllegalStateException("Please
specify a resource"));
        }

        SyncopeUser user = (SyncopeUser)
execution.getVariable(ActivitiUserWorkflowAdapter.SYNCOPE_USER);
        UserMod userMod = (UserMod)
execution.getVariable(ActivitiUserWorkflowAdapter.USER_MOD);
        if (userMod == null) {
            userMod = new UserMod();
        }

        userMod.addResourceToBeAdded(resourceName);

        // update SyncopeUser
        PropagationByResource propByRes = dataBinder.update(user, userMod);

        // report updated user and propagation by resource as result
        execution.setVariable(ActivitiUserWorkflowAdapter.SYNCOPE_USER,
user);
        execution.setVariable(ActivitiUserWorkflowAdapter.PROP_BY_RESOURCE,
propByRes);

    }
}


On Tue, Apr 23, 2013 at 10:38 AM, Francesco Chicchiriccò <
[email protected]> wrote:

>  On 22/04/2013 21:40, Jesse van Bekkum wrote:
>
> Hi
>
>  Quick question.
>
>  How can you provision a resource to a user from the workflow? I have a
> workflow, and after creating a user with a rest call, I want, depending on
> the path through the workflow, to automatically provision a resource.
>
>  I tried this in a workflow step:
>
>          ResourceDAO resourceDAO = CONTEXT.getBean(ResourceDAO.class);
>         ExternalResource idp = resourceDAO.find("IDP_RESOURCE");
>         SyncopeUser user = (SyncopeUser)
>         execution.getVariable(ActivitiUserWorkflowAdapter.SYNCOPE_USER);
>         user.addResource(idp);
>
>  But after creation the user had no resources. In the past (0.7) we have
> used manual propagation, by retrieving the propagation handler from the
> context and firing it, but that seems a bit inelegant to me.
>
>  What is the preferred solution to this (I think common) scenario?
>
>
> Hi Jesse,
> please take a look at the Update task [1]: you could change the
> doExecute() method there to match the logic expressed above
>
>
>         SyncopeUser user = (SyncopeUser)
> execution.getVariable(ActivitiUserWorkflowAdapter.SYNCOPE_USER);
>         UserMod userMod = (UserMod)
> execution.getVariable(ActivitiUserWorkflowAdapter.USER_MOD);
>
> // YOUR step, e.g. add resource
> userMod.addResourceToBeAdded("IDP_RESOURCE");
>
>         // update SyncopeUser
>         PropagationByResource propByRes = dataBinder.update(user, userMod);
>
>         // report updated user and propagation by resource as result
>         execution.setVariable(ActivitiUserWorkflowAdapter.SYNCOPE_USER,
> user);
>
> execution.setVariable(ActivitiUserWorkflowAdapter.PROP_BY_RESOURCE,
> propByRes);
>
> Please note the final statements execution.setVariable() - without these
> the changes are not propagated back to the flow.
>
> Regards.
>
> [1]
> https://svn.apache.org/repos/asf/syncope/branches/1_1_X/core/src/main/java/org/apache/syncope/core/workflow/user/activiti/task/Update.java
>
> --
> Francesco Chicchiriccò
>
> ASF Member, Apache Syncope PMC chair, Apache Cocoon PMC 
> Memberhttp://people.apache.org/~ilgrosso/
>
>

Reply via email to