How to force a Save operation when only changing links in a work item using java plain client?
I am writing a java plain client utility that attempts to force modify a work item, specifically by removing an existing parent link, and then re-adding it. I'm doing this because I also have a couple of server preconditions/followup actions that will run on a Save Operation that is specifically looking for a change in work item links. However, my utility program is "working" in that it removes and re-adds the parent link, but this does NOT kick off the server-side preconditions/followup actions. It appears this only works on a java plain client program if it actually updates a work item attribute value. I know, links are a separate entity inside EWM's database. Side note, using the web UI or the rich client, the act of (e.g.) removing a parent link and clicking Save DOES kick off the server preconditions/followup actions where it does detect the change in links (via ISaveParameter.getNewReferences()).
In the utility, I'm using ILinkManager to deleteLink() and saveLink(). However, this does not trigger a Save Operation on the work item. Therefore, is there another API I can call to simulate a Save Operation (that also detects the link changes)?
|
Accepted answer
Ralph Schoon (63.5k●3●36●46)
| answered Aug 11 '22, 2:32 a.m.
FORUM ADMINISTRATOR / FORUM MODERATOR / JAZZ DEVELOPER edited Aug 11 '22, 4:47 a.m.
// Linking Blocking private static class LinkBlockingWorkItemOperation extends WorkItemOperation { private IWorkItemHandle fOpposite; public LinkBlockingWorkItemOperation(IWorkItemHandle opposite) { super("Linking Blocking Work Item", IWorkItem.FULL_PROFILE); fOpposite = opposite; } @Override protected void execute(WorkItemWorkingCopy workingCopy, IProgressMonitor monitor) throws TeamRepositoryException { IItemReference reference = IReferenceFactory.INSTANCE .createReferenceToItem(fOpposite); workingCopy.getReferences().add(WorkItemEndPoints.BLOCKS_WORK_ITEM, reference); } } Todd Mueller selected this answer as the correct answer
Comments Please also note, that the operation behavior is only triggered for work item links (like parent/child) but not for CLM links that work across servers e.g. Tracks/Contributes to.
Todd Mueller
commented Aug 11 '22, 5:17 p.m.
Thank you Ralph. I am using the WorkItemOperation way of updating the work item. It was inside the execute() method here where I had the code to update a work item attribute value, AND used the ILinkManager to remove/add the link. I believe you're right in that this does not directly do things through the work item itself. I'll play with trying to modify the links on a work item through the work item references as you suggest.
Ralph Schoon
commented Aug 12 '22, 4:36 a.m.
| edited Aug 12 '22, 4:36 a.m.
FORUM ADMINISTRATOR / FORUM MODERATOR / JAZZ DEVELOPER
You have to remove references like this:
workingCopy.getReferences().remove(iReference)
You might also have to add:
workingCopy.getAdditionalSaveParameters().add(IAdditionalSaveParameters.UPDATE_BACKLINKS);
1
Todd Mueller
commented Aug 16 '22, 1:27 a.m.
Thank you Ralph. You were correct in my scenario that I needed to use the work item's references (workingCopy.getReferences()) for removing and adding the parent link instead of using ILinkManager. This solution causes a perceived change on the work item itself, which then kicks off all my preconditions and followup actions, which is the behavior I wanted. Got it working now.
|
Your answer
Dashboards and work items are no longer publicly available, so some links may be invalid. We now provide similar information through other means. Learn more here.