How to fetch userid of the modifier of Work Item usind a server side extension?
I am working on creating a server-side plugin feature.
I have created a server- side OperationPartcipant.
However, I am not able to get userid for the user who has modified the work item.
Currently I am using below code:
Object data = operation.getOperationData();
saveParameter = (ISaveParameter) data;
IWorkItem newState = (IWorkItem) saveParameter.getNewState();
String modified= newState.getModifiedBy().getItemId().getUuidValue();
Using above code I am getting a UUID value(maybe of user).
Is there a better way to do this?
Any suggestions/ tips would be helpful.
Thanks!
Accepted answer
Start reading here: https://rsjazz.wordpress.com/2015/09/30/learning-to-fly-getting-started-with-the-rtc-java-apis/
See https://rsjazz.wordpress.com/2014/05/26/only-owner-can-close-workitem-advisor/ it contains almost all the code you need.
The code would look similar to:
IContributorHandle modifierHandle = workItem.getModifiedBy();
IRepositoryItemService repositoryItemService=getService(IRepositoryItemService.class);
IContributor modifier = (IContributor) repositoryItemService.fetchItem(modifierHandle , IRepositoryItemService.COMPLETE);
Comments
Hi,
The code provided along with minor modifications worked.
However, when I save a Work Item in Web the value is returned as null for the "IContributor modifier" when workitem.getModifiedBy() is passed. While the same code works fine when workitem.getCreator() is passed.
The code is working fine when the changes in the Work Item are made in Eclipse Client.
Is this a known issue/limitation? Or am I doing something wrong?
I really don't like bothering you guys so much. So is there a documentation available which clearly mentions which services to call, when to call them and the dependencies which should be added to use them.
Blogs provided by you guys is very helpful! Real life like implementation and usage of the code really helps a lot.
Thanks
there is no 'doc'. this is a long time problem.. there are tons of behaviors that you have to discover..
sounds like you have found another bug.
All my server extensions so far have always worked in any UI. I would not expect any issues for server extensions. For attribute customization. You are limited to common API that should also work on client and server.
while I agree, I have had one experience where the data is not accurate unless I go get another copy from the system. it is also in a participant. my approval injector.
I shouldn't need to, but it doesn't work otherwise.
try this
// Get the full state of the parent work item so we can edit it
IWorkItem cleancopy = (IWorkItem) fWorkItemServer.getAuditableCommon().resolveAuditable(workItem, IWorkItem.FULL_PROFILE, monitor);
and see if cleanCopy..getModifiedBy() works every time.. it should
If this is in a participant or pre-condition the user in which this extension runs is the modifier of the workitem. This is how they work. So you can get the user context like in https://rsjazz.wordpress.com/2014/05/26/only-owner-can-close-workitem-advisor/ namely the loggedin contributor:
IContributorHandle loggedIn = this.getAuthenticatedContributor();
In the example above I have not even thought to use the modified by attribute. Otherwise I would have expected it to be in the newState.
One other answer
what is needed is a few sentences that describe the data model, using persistent identifiers (handles) in objects, and NOT object references themselves.
and this code needs to go away, and have a method on the base ITeamRepository class that does it
IRepositoryItemService repositoryItemService=getService(IRepositoryItemService.class);
xxx= repositoryItemService.fetchItem(modifierHandle , IRepositoryItemService.COMPLETE);
everyone needs to do this and until you get the model and know the names, its impossible to get your head around it.