It's all about the answers!

Ask a question

How to get previous values (state) of an ITimeSheetEntry?


Eduardo Bello (4401621) | asked Jul 28 '11, 9:52 a.m.
Hi,

I'm developing an IOperationParticipant that needs to detect the exact change on time tracking.

In order to get previous values of an WorkItem attribute inside an IOperationParticipant, I simply use:


IWorkItem oldWorkItem = (IWorkItem) saveParameter.getOldState();


But as far as I know, ITimeSheetEntry is linked to a WorkItem using endpoint WorkItemEndPoints.WORK_TIME. So my question is: How to get previous states of those linked objects, or what is the extension point to listen to ITimeSheetEntry changes?

I tried this, but obviously didn't work, because it gets the current values of the links:

List<ITimeSheetEntry> listTimeChildren = new ArrayList<ITimeSheetEntry>();

IWorkItemServer service = getService(IWorkItemServer.class);
IWorkItemReferences workItemReferences = service.resolveWorkItemReferences(oldWorkItem , null);
List<IReference> listReferences = workItemReferences.getReferences(WorkItemEndPoints.WORK_TIME);
for (IReference reference : listReferences) {
if (reference.isItemReference()) {
referencedItem = ((IItemReference) reference).getReferencedItem();
if (referencedItem instanceof ITimeSheetEntryHandle) {
timeChild = (ITimeSheetEntry) repositoryItemService.fetchItem(referencedItem, null);
listTimeChildren.add(timeChild);

}
}
}


For new or deleted ITimeSheetEntry, I can use getCreatedReferences and getDeletedReferences. But if the user change a value of an existing entry, I'm unable to find out what entry has been changed.

Comments
Rubin Zheng commented Sep 01 '13, 3:17 a.m.

Any idea?  I have the same question. 

3 answers



permanent link
Rubin Zheng (1698) | answered Sep 03 '13, 9:30 a.m.
 I worked out a workaround that traverse all  ITimeSheetEntry.modified() and get the TimeSheetEntry which modified in last a few seconds in the followup action.  

permanent link
Nate Decker (37812854) | answered Apr 02 '15, 9:47 a.m.
edited Apr 02 '15, 9:49 a.m.

This is an old question, but for anyone that is still wondering, I have a more direct way than looking at the recently modified timesheets.

IWorkItemServer service = getService(IWorkItemServer.class);

ArrayList<IReference> newLinks = new ArrayList<IReference>();

ArrayList<IReference> oldLinks = new ArrayList<IReference>();

IWorkItemReferences newReferences = saveParameter.getNewReferences();

newLinks.addAll(newReferences.getReferences(WorkItemEndPoints.WORK_TIME));

if(saveParameter.getOldState() != null) {

     IWorkItem previousWI = (IWorkItem) (saveParameter.getOldState());

     IWorkItemReferences oldReferences = service.resolveWorkItemReferences((IWorkItemHandle) previousWI.getItemHandl(), monitor);

     oldLinks.addAll(oldReferences.getReferences(WorkItemEndPoints.WORK_TIME));  

}

As usual, remember that if you are using the IWorkItemServer object, you'll need to add the "requiredService" node to the plugin.xml of your MANIFEST.MF file.


permanent link
Ralph Schoon (56.0k23642) | answered Apr 02 '15, 9:55 a.m.
FORUM ADMINISTRATOR / FORUM MODERATOR / JAZZ DEVELOPER
In general for IAuditables, and ITimeSheetEntry, you can get the two possible predecessors like this:

        IAuditable.getPredecessorState()
        IAuditable.getMergePredecessorState()

Assuming that that history is actually preserved.

Your answer


Register or to post your answer.