You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@syncope.apache.org by Bob Lannoy <bo...@gmail.com> on 2012/07/03 14:27:56 UTC
Deleting user in job
Hi,
I've written a job to delete users in a specific status (toBeRemoved).
Unfortunately I get a nullpointer exception.
This is what I do:
NodeCond searchCond = new NodeCond();
SyncopeUserCond syncopeUserCond = new SyncopeUserCond();
syncopeUserCond.setSchema("status");
syncopeUserCond.setExpression("toBeRemoved");
syncopeUserCond.setType(org.apache.syncope.client.search.AttributeCond.Type.EQ);
searchCond.setSyncopeUserCond(syncopeUserCond);
searchCond.setType(org.apache.syncope.client.search.NodeCond.Type.LEAF);
List<SyncopeUser>
users=searchDAO.search(EntitlementUtil.getRoleIds(entitlementDAO.findAll()),
searchCond);
for (SyncopeUser user : users){
userDAO.delete(user.getId());
}
The nullpointer exception occurs on the delete. In that method it
looks for memberships but those are empty, thus the nullpointer.
When I look at the user-object in debug mode I see that even the
attributes are not present in the object. So it seems that I do not
get a complete object back from the search. Only the core attributes
like username, status, password, token
The same search in console gives me everything (firstname, last name, ...)
What am I doing wrong?
best regards
Bob
Re: Deleting user in job
Posted by Bob Lannoy <bo...@gmail.com>.
Hi,
thanks for the tip, it works when I use the code from SyncJob.
I think it had to do with the securitysetup (setup dummy admin user) &
reading in the userTO.
regards
Bob
On 3 July 2012 14:48, Francesco Chicchiriccò <il...@apache.org> wrote:
> On 03/07/2012 14:27, Bob Lannoy wrote:
>>
>> Hi,
>>
>> I've written a job to delete users in a specific status (toBeRemoved).
>> Unfortunately I get a nullpointer exception.
>> This is what I do:
>>
>> NodeCond searchCond = new NodeCond();
>> SyncopeUserCond syncopeUserCond = new SyncopeUserCond();
>> syncopeUserCond.setSchema("status");
>> syncopeUserCond.setExpression("toBeRemoved");
>>
>> syncopeUserCond.setType(org.apache.syncope.client.search.AttributeCond.Type.EQ);
>> searchCond.setSyncopeUserCond(syncopeUserCond);
>>
>> searchCond.setType(org.apache.syncope.client.search.NodeCond.Type.LEAF);
>>
>> List<SyncopeUser>
>>
>> users=searchDAO.search(EntitlementUtil.getRoleIds(entitlementDAO.findAll()),
>> searchCond);
>>
>> for (SyncopeUser user : users){
>> userDAO.delete(user.getId());
>> }
>>
>> The nullpointer exception occurs on the delete. In that method it
>> looks for memberships but those are empty, thus the nullpointer.
>> When I look at the user-object in debug mode I see that even the
>> attributes are not present in the object. So it seems that I do not
>> get a complete object back from the search. Only the core attributes
>> like username, status, password, token
>> The same search in console gives me everything (firstname, last name, ...)
>>
>> What am I doing wrong?
>
>
> As far as I can imagine, you are hitting a known JPA issue with lazy loading
> and transactions: to make it short, the SyncopeUser object that you get is
> not "complete", but some collections (i.e. JPA relations) are populated upon
> reading, and this can only happen in a valid transactional scope.
>
> When you call UserDAO.delete(SyncopeUser), this will attempt to use the
> provided object for operations, but since you are outside a transactional
> scope, you'll hit the NPE.
>
> Take a look at SyncJob: it extends AbstractTaskJob (like your job, I
> suppose) and performs almost any operation on SyncopeUser objects by
> delegating to other @Autowired objects living in a transactional scope: look
> in particular the deleteUsers() method.
>
> Hope this helps.
> Regards.
>
> --
> Francesco Chicchiriccò
>
> ASF Member, Apache Cocoon PMC and Apache Syncope PPMC Member
> http://people.apache.org/~ilgrosso/
>
Re: Deleting user in job
Posted by Francesco Chicchiriccò <il...@apache.org>.
On 03/07/2012 14:27, Bob Lannoy wrote:
> Hi,
>
> I've written a job to delete users in a specific status (toBeRemoved).
> Unfortunately I get a nullpointer exception.
> This is what I do:
>
> NodeCond searchCond = new NodeCond();
> SyncopeUserCond syncopeUserCond = new SyncopeUserCond();
> syncopeUserCond.setSchema("status");
> syncopeUserCond.setExpression("toBeRemoved");
> syncopeUserCond.setType(org.apache.syncope.client.search.AttributeCond.Type.EQ);
> searchCond.setSyncopeUserCond(syncopeUserCond);
> searchCond.setType(org.apache.syncope.client.search.NodeCond.Type.LEAF);
>
> List<SyncopeUser>
> users=searchDAO.search(EntitlementUtil.getRoleIds(entitlementDAO.findAll()),
> searchCond);
>
> for (SyncopeUser user : users){
> userDAO.delete(user.getId());
> }
>
> The nullpointer exception occurs on the delete. In that method it
> looks for memberships but those are empty, thus the nullpointer.
> When I look at the user-object in debug mode I see that even the
> attributes are not present in the object. So it seems that I do not
> get a complete object back from the search. Only the core attributes
> like username, status, password, token
> The same search in console gives me everything (firstname, last name, ...)
>
> What am I doing wrong?
As far as I can imagine, you are hitting a known JPA issue with lazy
loading and transactions: to make it short, the SyncopeUser object that
you get is not "complete", but some collections (i.e. JPA relations) are
populated upon reading, and this can only happen in a valid
transactional scope.
When you call UserDAO.delete(SyncopeUser), this will attempt to use the
provided object for operations, but since you are outside a
transactional scope, you'll hit the NPE.
Take a look at SyncJob: it extends AbstractTaskJob (like your job, I
suppose) and performs almost any operation on SyncopeUser objects by
delegating to other @Autowired objects living in a transactional scope:
look in particular the deleteUsers() method.
Hope this helps.
Regards.
--
Francesco Chicchiriccò
ASF Member, Apache Cocoon PMC and Apache Syncope PPMC Member
http://people.apache.org/~ilgrosso/