Error getting Contributor of an approval record
I have 2 Java programs using the java 4.0.0.1 client. One programmatically adds an approval record of type Verification and adds an approver, and one that generates reports that reads that information.
I am getting an exception randomly on the fetchCompleteState() call java.lang.IllegalArgumentException: itemHandle must not be null and must not have a null state id at com.ibm.team.repository.client.internal.ItemManager.fetchCompleteState(ItemManager.java:1014)
The ContributorHandle that I am attempting to fetch is:
com.ibm.team.repository.common.model.impl.ContributorHandleImpl@a330a33 (stateId: <unset>, itemId: [UUID _YVcmYL87Ed2iU6ePvw_uCw], origin: com.ibm.team.repository.client.internal.TeamRepository@5f775f77, immutable:true)
I can see that the stateId: is <unset> but I do not know why. If I look at the work item that I am getting this on in the 4001 RTC Eclipse client, I see the Verification record and the approver (her name is listed) with a state of Pending. I can also view her profile in the client and there is no error.
The approval record is added programmatically using this method:
private void addWASVerificationApproval(IWorkItem wasWorkItem) {
IApprovals approvals = wasWorkItem.getApprovals();
List<IApprovalDescriptor> adList = approvals.getDescriptors();
String suffix = adList.isEmpty() ? "" : " " + (adList.size() + 1);
IApprovalDescriptor descriptor = approvals.createDescriptor(WorkItemApprovals.VERIFICATION_TYPE.getIdentifier(),
"Verification - created by Bridge" + suffix);
// Create the approval
approvals.add(descriptor);
approvals.add(approvals.createApproval(descriptor, wasWorkItem.getCreator()));
}
You can see I pass in the work item "getCreator()" value, which should (I would think) never be invalid.
Please assist in determining how to resolve this issue.
Accepted answer
I assume they would get an exception just like you.
let me look for an example.
Comments
I looked at my approval injector.. I never load the contributor record.. just use the handles.
I think an object without a fullstate could be injected by the importer indirectly..
(users, iterations, releases, ... are things I know of that get created by the importer.
I don't know what other conditions cause it.
If you put a try/catch around this and use the auditable service (client) to load the contributor instead of the item manager does this resolve the problem?
you should be able to test that pretty quickly, as u have a handle to access
1 vote
2 other answers
I agree with Sam and would suggest to wrap the code with a try/catch. That way you can find out the source work item and try to figure out what goes wrong. Without looking at the code that provides the data and fails, I can't say more.
List<IApproval> individualApprovals = approvals.getContents();
for (IApproval approval : individualApprovals) {
IApprovalDescriptor descrip = approval.getDescriptor();
if (descrip.getTypeIdentifier().equals("com.ibm.team.workitem.approvalType.verification")) {
if (approval.getStateIdentifier().equals("com.ibm.team.workitem.approvalState.pending")) {
IContributorHandle owner = approval.getApprover();
IContributor = myRepository.itemManager().fetchCompleteState(owner,null);
}
}
}
I am looking for pending verification records, and for each of those, I need to pull out the Contributors name and emailAddress.
I switched from itemManager to auditableClient and it seems to have resolved this issue on the one I was getting the error on. I am running through the entire report now just to confirm.
Thanks for the pointer/suggestion.
S
Comments
and you could get just those attributes, instead of the fullstate
from one of my apps
auditableClient.fetchCurrentAuditable(owner, ItemProfile.createProfile(IContributor.ITEM_TYPE, new String[] {
IContributor.ARCHIVED_PROPERTY,
IContributor.NAME_PROPERTY,
IContributor.EMAIL_ADDRESS_PROPERTY }), null);
1 vote
you can also run a query for pending approvals..
| nope.. sorry, can't get the approval data out.. you can use it for a filter..
ie, process only workiems WITH a pending approval.