Атрибут IBM RTC Java. Не могу привести к атрибуту IA при изменении элемента Work

Я создал предоставленный Java атрибут для рабочего элемента, который предоставляет набор значений, рассматривая два других атрибута (перечисления) из того же / текущего рабочего элемента, которые вместе образуют путь к каталогу, который предоставленный Java атрибут создаст набор значений, используя имена файлов, вложенных в этот каталог. Он работает хорошо, если рабочий элемент создается впервые, однако при изменении рабочего элемента он не заполняет набор, поэтому можно выбрать новое значение.

Я обнаружил, что когда дело доходит до этого утверждения:

IAttribute currentAttribute = (IAttribute) дескриптор;

Это исключение генерируется. Он не может быть приведен к дескриптору IAttribute, поскольку возвращаемые элементы из workItem.getCustomAttributes() отличаются между новым элементом Wotk и измененным рабочим элементом.

Сообщение об исключении:

com.ibm.team.workitem.common.internal.model.impl.AttributeHandleImpl несовместим с com.ibm.team.workitem.common.model.IAttribute

Я не уверен, почему как получить com.ibm.team.workitem.common.internal.model.impl.AttributeHandleImpl используется для изменения рабочего элемента и...AttributeHandle используется при первом создании рабочего элемента.

Я не уверен, как решить это или привести его к IAttribute, который мне нужен.

public class SpecificArtifactType implements IValueSetProvider<String> {

private List<String> list;

public SpecificArtifactType() {

}

@Override
public List<String> getValueSet(IAttribute attribute, IWorkItem workItem,
        IWorkItemCommon workItemCommon, IConfiguration configuration,
        IProgressMonitor monitor) throws TeamRepositoryException {

    String idValue= "";
    String deliverableArtifactTypeValue= "";



    List<IAttributeHandle> customAttributeHandles= workItem.getCustomAttributes();

    /* 
     * THE DELIVERABLE ARTIFACT AND ID VALUES ARE BOTH USED TO BUILD 
     * THE DIRECTORY PATH WHICH THIS ATTRIBUTE WILL USE TO POPULATE
     * ITS VALUE SET WITH THE ARTIFACTS LOCATED AT THAT LOCATION.
     */

    for (IAttributeHandle handle: customAttributeHandles)
    {   
        IAttribute currentAttribute= (IAttribute) handle;

        if (currentAttribute.getDisplayName()
                .equals(ICustomAttributeDefinitions.ID))
        {
            idValue= getValue(currentAttribute, monitor, workItemCommon, workItem);
        }
        else if (currentAttribute.getDisplayName()
                .equals(ICustomAttributeDefinitions.DELIVERABLE_ARTIFACT_TYPE))
        {
            deliverableArtifactTypeValue= getValue(currentAttribute, monitor, workItemCommon, workItem);
        }   
    }

    // BUILD THE DIRECTORY PATH

    String directory = ICustomAttributeDefinitions.STREAM_ROOT_DIRECTORY
            +deliverableArtifactTypeValue +"\\"+ idValue;

    File folderPath = new File(directory);

    /*
     *  NEED A VALID PATH TO CONTINUE AND ALSO PREVENT TRYING TO 
     *  LIST CHILD ITEMS IF IT'S A FILE.
     */

    if (folderPath.exists() && folderPath.isDirectory())
    {   
        if (folderPath.list().length == 0)
        {
            directoryEmpty();
            return list;
        }

        list= new ArrayList<String>();

        for (String name: folderPath.list())
            list.add(name);
    }
    else invalidDirectoryPath();

    return list;

}
    /*
     *  CONVERT VALUE FROM MODEL IDENTIFIER (EG ID.literal.l01) TO ACTUAL VALUE
     */

private String getValue(IAttribute attribute, 
                            IProgressMonitor monitor, 
                            IWorkItemCommon workItemCommon,
                            IWorkItem workItem) throws TeamRepositoryException
{
    IEnumeration<? extends ILiteral> enumeration= workItemCommon
            .resolveEnumeration(attribute, monitor);

    String value= "";

    List<? extends ILiteral> literals= enumeration.getEnumerationLiterals();

    for (Iterator<? extends ILiteral> iterator= literals.iterator(); iterator.hasNext(); ) 
    {
        ILiteral iLiteral= (ILiteral) iterator.next();

        if (iLiteral.getIdentifier2().equals(workItem.getValue(attribute))) 
        {
            value= iLiteral.getName().toString();
            break;
        }
    }
    return value;
}


private void directoryEmpty(){
    list= new ArrayList<String>(1);
    list.add(ICustomAttributeDefinitions.DIRECTORY_EMPTY);

}

private void invalidDirectoryPath()
{
    list= new ArrayList<String>(1);
    list.add(ICustomAttributeDefinitions.INVALID_DIRECTORY_PATH);
}

}

1 ответ

Там может быть три решения этой проблемы:

1) Когда вы создаете workItem и сохраняете экземпляр workItem, его состояние изменяется, поэтому теперь, когда вы вызываете workItem.getCustomAttributes(), он не будет возвращать желаемый результат. Поэтому вам нужно добавить эту строку перед:

IWorkItem workItem = (IWorkItem) getWorkItemServer()
        .getAuditableCommon()
        .resolveAuditable(savedWorkItem, IWorkItem.FULL_PROFILE, null);

Вы можете легко получить клиентский код против этого серверного кода, это позволит получить сохраненное состояние workItem

2) Вы можете предотвратить возникновение этого исключения, проверив instanceof перед тем как бросить его IAttribute

3) Получить IAttribute по его идентификатору, а затем получить IAttribute от:

WorkItemUIWorkingCopy uiWorkingCopy = (WorkItemUIWorkingCopy)
        workingCopy.getAdapter(IWorkItemUIWorkingCopy.class);
    IAttribute attribute =
        uiWorkingCopy.getResolvedWorkItem().findAttribute(fAttribute.getIdentifier());

Надеюсь, это поможет вам

Другие вопросы по тегам