通过 Rational Team Concert API 更改枚举字段值时定期发生不可变 PropertyException

ImmutablePropertyException periodically when changing enum field's value via Rational Team Concert API

通过更改我正在使用的 RTC API 工具的新 RTC 工作项中某些基于枚举的字段来解决此问题。

基本上,我在第一次更改字段时得到 ImmutablePropertyException,但下次它无一例外地工作。

想要摆脱异常。我使用的值 RTC 实际上作为该字段的有效枚举值返回给我。

Assigning RTC work item field: odc.impact a field value of -> Integrity [odc.impact.literal.l4]

EXCEPTION: Could not assign value, even though it was found in the enumeration list: [Unassigned, Installability, Standards, Integrity]

com.ibm.team.repository.common.internal.ImmutablePropertyException at com.ibm.team.repository.common.internal.util.ItemUtil$ProtectAdapter.notifyChanged(ItemUtil.java:2070) at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:380) at com.ibm.team.repository.common.model.impl.StringExtensionEntryImpl.setTypedValue(StringExtensionEntryImpl.java:178) at com.ibm.team.repository.common.model.impl.StringExtensionEntryImpl.setValue(StringExtensionEntryImpl.java:360) at org.eclipse.emf.common.util.BasicEMap.putEntry(BasicEMap.java:303) at org.eclipse.emf.common.util.BasicEMap.put(BasicEMap.java:584) at org.eclipse.emf.common.util.BasicEMap$DelegatingMap.put(BasicEMap.java:799) at com.ibm.team.repository.common.model.impl.ItemImpl.setStringExtension(ItemImpl.java:1228) at com.ibm.team.workitem.common.internal.model.impl.WorkItemImpl.setEnumeration(WorkItemImpl.java:3779) at com.ibm.team.workitem.common.internal.model.impl.WorkItemImpl.setValue(WorkItemImpl.java:2915) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:95) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:56) at java.lang.reflect.Method.invoke(Method.java:620) at com.ibm.team.repository.common.internal.util.ItemStore$ItemInvocationHandler.invoke(ItemStore.java:597) at com.sun.proxy.$Proxy18.setValue(Unknown Source) at com.rtc.vda.WorkItemInitialization.setAttributeValueEx(WorkItemInitialization.java:237) at com.rtc.vda.WorkItemInitialization.setAttributeValue(WorkItemInitialization.java:210) at com.rtc.vda.WorkItemInitialization.execute(WorkItemInitialization.java:186) at com.ibm.team.workitem.client.WorkItemOperation.execute(WorkItemOperation.java:85) at com.ibm.team.workitem.client.WorkItemOperation.doRun(WorkItemOperation.java:272) at com.ibm.team.workitem.client.WorkItemOperation.run(WorkItemOperation.java:242) at com.ibm.team.workitem.client.WorkItemOperation.run(WorkItemOperation.java:189) at com.rtc.vda.RTCUtilities.createWorkItem(RTCUtilities.java:191) at com.rtc.vda.RTCMain.main(RTCMain.java:178)

Assigning: odc.impact -> Integrity [odc.impact.literal.l4]

这是设置枚举值的代码片段:

public boolean setAttributeValueEx (IWorkItem w, String attributeKey, String valueName) {

    // (REO) Get the attribute
    IAttribute a = customAttributesMap.get(attributeKey);

    // (REO) Buffer of valid values for error reporting
    StringBuffer b = new StringBuffer();

    try {
        // (REO) Get the enumeration for this attribute from the repository (DO NOT CACHE IT OR YOU WILL HAVE PROBLEMS)
        IWorkItemClient workItemClient = (IWorkItemClient) rtcParameters.getTeamRepository().getClientLibrary(IWorkItemClient.class);
        IEnumeration<? extends ILiteral> rtcAttrEnumeration = workItemClient.resolveEnumeration(a, curMonitor);

        // (REO) Find an enum value that matches this string and assign it
        for (ILiteral literal : rtcAttrEnumeration.getEnumerationLiterals()) {
            String vName = literal.getName();
            String vId = literal.getIdentifier2().getStringIdentifier();
            b.append(",");
            b.append(vName);
            if (valueName.equalsIgnoreCase(vName)) {
                String msg2 = "Assigning: " + a.getIdentifier() + " -> " + vName + " [" + vId + "]";
                RTCMain.out(msg2);
                w.setValue(a, literal.getIdentifier2()); // (REO) SOURCE OF PERIODIC EXCEPTION
                return true;
            }
        }
    } catch (Exception e) {
        RTCMain.out("EXCEPTION: Could not assign value, even though it was found in the enumeration list:\n\t[" + b + "]");
        e.printStackTrace();
        RTCMain.out("");
        return false;
    }

    RTCMain.out("VALUE NOT FOUND: Valid values are:" + b);
    return false;
}

有人知道为什么我只收到某些字段的周期性 ImmutablePropertyException,以及为什么它在第二次调用时消失了吗?

谢谢!

您只需要使用传递给 execute() 调用的 workingCopy.getWorkItem() 对象,而不是成员变量中的缓存版本。 workingCopy 对象上的属性不是不可变的并且可以正常工作。

public class WorkItemCreator extends WorkItemOperation {

...

    @Override
    protected void execute(WorkItemWorkingCopy workingCopy, IProgressMonitor monitor) throws TeamRepositoryException {

        IWorkItem newWorkItem = workingCopy.getWorkItem();
        // Set attribute values on newWorkItem to avoid ImmutablePropertyExceptions