在RTC中解析IVersionableHandle的路径

时间:2013-05-07 08:42:35

标签: jazz rational-team-concert

如何获取不是最新版本但是RTC scm中之前更改列表的一部分的文件路径。

到目前为止,我所能做到的只有:

IFileItemHandle fileItemHandle = (IFileItemHandle) IFileItem.ITEM_TYPE.createItemHandle(change.afterState().getItemId(), change.afterState().getStateId());
file = versionableManager.fetchCompleteState(fileItemHandle, monitor);

if (file instanceof IFolder) {         
    IFolder folder = (IFolder) file;         
    relativePath = getFilePath(file, workspaceConnection.configuration(changeSet.getComponent()), monitor);
    fileName = folder.getName();      
} else {
    relativePath = getFilePath(file, workspaceConnection.configuration(changeSet.getComponent()), monitor);    
    fileName = ((FileItem) file).getName();     
}

getFilePath 的位置是:

private String getFilePath(IVersionableHandle folder, IConfiguration config, IProgressMonitor monitor, Boolean searchInHistory) throws TeamRepositoryException {
    List lst = new ArrayList<IVersionableHandle>(), ancestors;
    lst.add(folder);
    if (searchInHistory) {
        ancestors = config.determineAncestorsInHistory(lst, monitor);
    } else {
        ancestors = config.locateAncestors(lst, monitor);
    }

    return getFullPath(ancestors);
}

private String getFullPath(List ancestor) throws TeamRepositoryException {
    String directoryPath = "";
    for (Object ancestorObj : ancestor) {
        IAncestorReport ancestorImpl = (IAncestorReport) ancestorObj;
        for (Object nameItemPairObj : ancestorImpl.getNameItemPairs()) {
            INameItemPair nameItemPair = (INameItemPair) nameItemPairObj;
            String pathName = nameItemPair.getName();
            if (pathName != null && !pathName.equals("")) {
                directoryPath = directoryPath + "\\" + pathName;
            }
        }
    }
    return directoryPath;
}

不幸的是它并不完美。如果在以下更改列表中更改了文件名,例如:

Changelist 1:     
add file: src/newFile.java

Changelist 2:     
modify file: src/newFile.java

Changelist 3:     
rename file: src/newFile.java -> src/newFile_rename.java

第一个更改列表中解析的相对路径为:

src/newFile_rename.java

而不是

src/newFile.java

如何让它运作良好?

1 个答案:

答案 0 :(得分:1)

虽然IConfiguration.determineAncestorsInHistory的javadoc未指定,但服务器端等效IScmService.configurationDetermineAncestorsInHistory(最终被调用的内容)在javadoc中说明了这一点:

 * @param versionableItemHandles
 *            a list of versionable items; only the item ids are needed;
 *            must not be <code>null</code>

基本上,determineAncestorsInHistory不查看文件句柄上的状态id,它只查看项目id。

将考虑的文件的特定状态由配置决定。这主要是因为虽然changeset中的文件状态会告诉您该文件的名称,但它不会告诉您父文件夹的名称。这将取决于特定时间工作空间中存在的文件夹的状态,并且对于不同的工作空间可能会有所不同

在接受/创建更改集时,您基本上需要获取代表工作空间的IConfiguration。

我看到这样做的方法是获取IWorkspaceConnection.changeHistory(component)(这实际上是在IFlowNodeConnection上定义的)。您需要通过致电IChangeHistory.previousHistory(monitor)来浏览历史记录,直到找到包含IChangeHistory.recent(monitor)中的变更集的内容。 找到合适的IChangeHistory后,使用IChangeHistory.configuration()进行determineAncestorsInHistory调用。

请注意,此配置表示特定IChangeHistory末尾的工作空间状态,因此要完全准确,您需要检查更改IChangeHistory.recent后发生的更改集,以查看是否有任何修改过您的文件名(或任何包含文件夹的文件名)。

(另一种方法是使用包含变更集的历史记录之前的历史记录配置1,然后查看更改之前发生的更改的效果)