Hi,

The updateAttr function in my prior email exists within my 'logic' class.
I.e. org.apache.syncope.core.logic.AttributeLogic

The second code block within the same email is what would/could exist within 
the Rest-CXF class of the extension.

If I remove the @Transactional annotation on the updateAttr function, I start 
getting 'Could not find EntityManager for domain Master' exceptions, from my 
userDAO.findByUsername() call, (userDAO being autowired within the logic class).
I have also tried passing through the UserDAO from the LogicContext class 
however that does not work either.
On Tuesday, 28 November 2023 at 13:14, Francesco Chicchiriccò 
<ilgro...@apache.org> wrote:

> Hi,
> I assume the code below lies inside a REST service implementation class.
>
> Basically, it manipulates payload objects (UserCR, AttrPatch and so on) then 
> invokes UserLogic for actual processing.
>
> If so, then you should remove @Transactional from such method as by doing so 
> you are essentially breaking the transaction mechanism as managed by 
> UserLogic.
>
> HTH
> Regards.
>
> On 28/11/23 11:53, GCHQDeveloper29 wrote:
>
>> Hi there,
>>
>> I'm hoping to gain some advice (or report a bug in the case I've not just 
>> been a fool!).
>> I'm currently on version 3.0.4, although plan to move to 3.0.5 soon, and am 
>> using version 1.5.7 of the LDAP connector.
>>
>> I have a slightly different version of the following function sat behind a 
>> rest endpoint, but am observing peculiar behaviour when calling the rest 
>> endpoint (hence triggering an update in userLogic).
>>
>> ```
>> @Transactional
>> public Response updateAttr(final UpdateAttrTO updateAttrTO, final String 
>> attribute)
>> {
>> // key can either be the username or the UUID of the user
>> String key = updateAttrTO.getKey();
>> String attrVal = updateAttrTO.getAttrVal();
>>
>> try {
>> // getUser gets the user object, first trying by username, then by UUID
>> User user = getUser(key);
>> String uuid = user.getKey();
>> String username = user.getUsername();
>>
>> // Create the patch and user update request
>> Attr attr = new Attr.Builder(attribute)
>> .value(attrVal)
>> .build();
>>
>> AttrPatch patch = new AttrPatch.Builder(attr)
>> .operation(attrVal == "" ? PatchOperation.DELETE : 
>> PatchOperation.ADD_REPLACE)
>> .build();
>>
>> UserUR userUR = new UserUR.Builder(uuid)
>> .plainAttr(patch)
>> .build();
>>
>> // Attempt to patch the user
>> ProvisioningResult<UserTO> provisioningResult = userLogic.update(userUR, 
>> false);
>>
>> return Response.ok().build();
>>
>> }
>> // Catch if a user cannot be found
>> catch (NotFoundException e)
>> {
>> return Response.status(400, e.getLocalizedMessage()).build();
>> }
>> // Catch any other unanticipated error
>> catch (Exception e)
>> {
>> return Response.status(500, e.getLocalizedMessage()).build();
>> } }
>> ```
>>
>> The above function can be called as below (I use rest parameters in 
>> actuality):
>> ```
>> UpdateAttrTO updateAttrTO = new UpdateAttrTO();
>> updateAttrTO.setKey("ExampleKey");
>> updateAttrTO.setAttrVal("ExampleAttrVal");
>> return updateAttr(updateAttrTO, "ExampleAttribute");
>> ```
>>
>> When I do this, the value gets updated within syncopes database, however the 
>> propogation task (to an LDAP connector), updates the downstream resource 
>> with the previous value.
>> For example, if I were to do the following for a user "user123", that does 
>> not initially have "ExampleAttribute" set, the downstream resource is always 
>> one value behind:
>>
>> ```
>> // ----
>> // Syncope value - N/A
>> // Downstream LDAP resource - N/A
>> // ----
>>
>> UpdateAttrTO updateAttrTO1 = new UpdateAttrTO();
>> updateAttrTO1.setKey("user123");
>> updateAttrTO1.setAttrVal("1111"); updateAttr(updateAttrTO1, 
>> "ExampleAttribute");
>>
>> // -----
>> // Syncope value - "1111"
>> // Downstream LDAP resource - N/A
>> // -----
>>
>> UpdateAttrTO updateAttrTO2 = new UpdateAttrTO();
>> updateAttrTO2.setKey("user123");
>> updateAttrTO2.setAttrVal("2222");
>> updateAttr(updateAttrTO2, "ExampleAttribute");
>>
>> // ----
>> // Syncope value - "2222"
>> // Downstream LDAP resource - "1111"
>> // ----
>> ```
>>
>> Hopefully I explained the situation sufficiently, if not please let me know 
>> and I can try to give some more detail.
>>
>> Kind Regards, GCHQDeveloper29.
>
> --
> Francesco Chicchiriccò
>
> Tirasa - Open Source Excellence
> http://www.tirasa.net/
> Member at The Apache Software Foundation
> Syncope, Cocoon, Olingo, CXF, OpenJPA, PonyMail
> http://home.apache.org/~ilgrosso/

Reply via email to