On 30/04/2013 10:09, Jesse van Bekkum wrote:
Hi Francisco

Sounds like a fine idea. My username is Jesse van Bekkum. You can give me write access.

We have to wait for your ICLA to be received and notified: have you already sent it?

Regards.

On Tue, Apr 30, 2013 at 8:52 AM, Francesco Chicchiriccò <[email protected] <mailto:[email protected]>> wrote:

    On 29/04/2013 15:42, Jesse van Bekkum wrote:
    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.

    Jesse,
    this sounds like a nice extension: why don't you report it in a
    wiki page under [2]?

    You need to:
     1. complete and submit an ICLA [3]
     2. create a wiki user (if not already done) and tell me the
    username so that I can grant you write access to the wiki

    WDYT?

    Regards.


    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] <mailto:[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

    [2]
    https://cwiki.apache.org/confluence/display/SYNCOPE/Extending+Syncope
    [3] http://www.apache.org/dev/new-committers-guide.html#cla

--
Francesco Chicchiriccò

ASF Member, Apache Syncope PMC chair, Apache Cocoon PMC Member
http://people.apache.org/~ilgrosso/

Reply via email to