On 14/05/2013 15:14, Jesse van Bekkum wrote:
> 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?

It might be related on some optimizations made in the provisioning
layer: in 1.1.X an update is triggered towards an external resource only
if one or more of the mapped attributes is different from what is
actually read from the same resource. In this respect, this might not be
a bug.

I cannot tell you more, some additional investigation - with DEBUG
logging - is required.

Regards.

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