On 30/04/2013 10:21, Jesse van Bekkum wrote:
No, I was just reading the requirements. I will get to it, but I will also need permission from Everett. The complete procedure will probably take a while I see.

Ok, let's wait for that.

Regards.

On Tue, Apr 30, 2013 at 10:15 AM, Francesco Chicchiriccò <ilgro...@apache.org <mailto:ilgro...@apache.org>> wrote:

    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ò
    <ilgro...@apache.org <mailto:ilgro...@apache.org>> 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ò
        <ilgro...@apache.org <mailto:ilgro...@apache.org>> 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