Hi Francesco I have used the code above to provision a resource. On a user that has not been created yet (id = null) it works fine. However, on another user who already existed, it does not provision. When I do another update action on that user, even on a completely unrelated attribute, it triggers the provisioning.
I think I did not see this behavior on 1.0.7, but I see it on 1.1.1. Any idea what the cause is? I tried setting the usermod with the id of the existing user, but that did not work. Jesse On Tue, Apr 30, 2013 at 10:22 AM, Francesco Chicchiriccò < [email protected]> wrote: > 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ò < > [email protected]> 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ò < >> [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]> 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 > Memberhttp://people.apache.org/~ilgrosso/ > >
