It's all about the answers!

Ask a question

list of files that are connected to workitem


Yehiel Glass (25538986) | asked Jan 14 '12, 3:55 p.m.
Hi,
How can I get a list of files that are connected to workitem (in change-set)?
I'm working on server advisor and have the workitem.
I thought maybe I can get list of changesets related to this specific workitem and get a list of files contained in these change-sets.
Thanks.

2 answers



permanent link
Yehiel Glass (25538986) | answered Aug 22 '12, 12:15 p.m.
I wrote a plugin that writes the names of the files that contained in a chagesets related to the workitem.
the list of files is written in Description attributes.
The problem is that I get the file list on associate CS to WI, but the developer can associate a new file after the association action (so the file will not be written in my list). So I need a different action to trigger (maybe checkin)

/*******************************************************************************
 * Licensed Materials - Property of IBM (c) Copyright IBM Corporation 2005-2006.
 * All Rights Reserved.
 *
 * Note to U.S. Government Users Restricted Rights: Use, duplication or
 * disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
 ******************************************************************************/
package advisor.example;

import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;

import com.ibm.team.foundation.common.text.XMLString;
import com.ibm.team.process.common.IProcessConfigurationElement;
import com.ibm.team.process.common.advice.AdvisableOperation;
import com.ibm.team.process.common.advice.IAdvisorInfo;
import com.ibm.team.process.common.advice.IAdvisorInfoCollector;
import com.ibm.team.process.common.advice.runtime.IOperationAdvisor;
import com.ibm.team.repository.common.IAuditableHandle;
import com.ibm.team.repository.common.IItemHandle;
import com.ibm.team.repository.common.TeamRepositoryException;
import com.ibm.team.repository.service.AbstractService;
import com.ibm.team.repository.service.IItemServiceIterator;
import com.ibm.team.repository.service.IRepositoryItemService;
import com.ibm.team.repository.service.ItemServiceIteratorFactory;
import com.ibm.team.repository.service.internal.util.StringUtils;
import com.ibm.team.scm.common.IChange;
import com.ibm.team.scm.common.IChangeSet;
import com.ibm.team.scm.common.IChangeSetHandle;
import com.ibm.team.scm.common.IScmService;
import com.ibm.team.scm.common.IVersionable;
import com.ibm.team.scm.common.IVersionableHandle;
import com.ibm.team.scm.common.dto.IAncestorReport;
import com.ibm.team.scm.common.dto.INameItemPair;
import com.ibm.team.scm.common.internal.dto.ServiceConfigurationProvider;
import com.ibm.team.scm.common.process.DeliverOperationData;
import com.ibm.team.scm.common.process.SaveClosedChangeSetOperationData;
import com.ibm.team.workitem.common.IAuditableCommon;
import com.ibm.team.workitem.common.model.IApproval;
import com.ibm.team.workitem.common.model.IApprovals;
import com.ibm.team.workitem.common.model.IAttribute;
import com.ibm.team.workitem.common.model.IWorkItem;
import com.ibm.team.workitem.common.model.IWorkItemHandle;
import com.ibm.team.workitem.common.model.ItemProfile;
import com.ibm.team.workitem.service.IWorkItemServer;

@SuppressWarnings("unchecked")
public class RestrictDeliverOfDeletionsAdvisor extends AbstractService implements IOperationAdvisor {

    private static final String fileSeperator = "˜";
    private static final String endOfLine = "<br/>";
    private static final String fileHasBeenChangeMessage = " <b> שים לב הקובץ השתנה !!! </b>";
    private String lastKey;
   
    public void run(AdvisableOperation operation, IProcessConfigurationElement advisorConfiguration, IAdvisorInfoCollector collector, IProgressMonitor monitor) throws TeamRepositoryException {
        Object operationData = operation.getOperationData();
        if (!(operationData instanceof SaveClosedChangeSetOperationData)) {
            return;
        }
        SaveClosedChangeSetOperationData data = (SaveClosedChangeSetOperationData) operationData;
       
        //General
        //IAuditableCommon common = (IAuditableCommon) this.getService(IAuditableCommon.class);
        //IRepositoryItemService itemService = getService(IRepositoryItemService.class);
        IScmService scmService = getService(IScmService.class);
        IWorkItemServer itemServer= getService(IWorkItemServer.class);
        IRepositoryItemService repositoryItemService = getService(IRepositoryItemService.class);
       
        //Get Change-set and put it in HashMap
        Set<String> fileNameSet = new HashSet<String>(); //set to put new filenames
        IChangeSet changeSet = data.getChangeSet();
        List<IChange> mychanges = changeSet.changes();
        for ( IChange change :  mychanges  ) {
            //case: new> change.afterState(); change or old> change.beforeState(); deleted> change.beforeState()+ delete the filename from the list.
                    IVersionableHandle versionableHandle = change.beforeState();
                    if (versionableHandle == null){
                        versionableHandle = change.afterState();
                    }
                    IVersionable item = (IVersionable) scmService.fetchState(versionableHandle, null, null);                       
                    fileNameSet.add(item.getName());
                    //map.put(item.getName(),"");
            }
       
        //Get Work-item and build a new HashMap from the existing data of the work-item.
        Map<String,String> fileDescriptionMap;// = getFileDescriptionMap();//new HashMap<String,String>();
        String allFileNamesString = ""; //the final string value to set to the WI
        List<? extends IAuditableHandle> mylinks = data.getLinks();
        IAttribute attribute;
        String attrName = "description";
        IWorkItem relatedWorkItem;
        IWorkItem itemCopy;
        for (IAuditableHandle mylink : mylinks) { //need to think if I want the code reviewer to check this file in all workitems..
        //*    ItemProfile<IAuditable> profile = ItemProfile.createFullProfile(IProjectArea.ITEM_TYPE);
            //** ItemProfile<IWorkItem> profile = IWorkItem.SMALL_PROFILE;
        if (mylink instanceof IWorkItemHandle){
            IWorkItemHandle handle = (IWorkItemHandle) mylink;
            relatedWorkItem = (IWorkItem) repositoryItemService.fetchItem(handle, null);
            itemCopy = (IWorkItem)relatedWorkItem.getWorkingCopy();       
            attribute = itemServer.findAttribute(itemCopy.getProjectArea(), attrName, null);
            XMLString lastData = relatedWorkItem.getHTMLDescription();
            String lastDataString = lastData.toString();           
            //need to make parsing on the old data and enter the values to the map.
            fileDescriptionMap = getFileDescriptionMap(lastDataString);
           
            //add new files to the HashMap. If value exist than add a comment. after, write the complete HashMap to the Work-item.
            allFileNamesString = getAttributeContent(fileDescriptionMap, fileNameSet);
            //Object myString = fileNameSet.toString();
            //itemCopy.setValue(attribute, myString);           
            itemCopy.setValue(attribute, allFileNamesString);
            itemServer.saveWorkItem2(itemCopy, null, null);
            }
        }   
    }   
   
    private Map<String, String> getFileDescriptionMap(String lastDataString) {
        Map<String, String> fileDescriptionMap = new HashMap<String, String>();
        if (StringUtils.isEmpty(lastDataString)){
            return fileDescriptionMap;
        }
        String[]  linesArray = lastDataString.split(endOfLine);
        for (String line : linesArray){
            if (line.contains(fileSeperator)){
                int fileSeperatorIndex = line.indexOf(fileSeperator);
                String fileName = line.substring(0, fileSeperatorIndex);
                //remove any <b> or </b>
                while (fileName.startsWith("<b>")){
                    //fileName = fileName.substring(5);
                    fileName = fileName.substring(3, fileName.length()-4);
                }
                /*while (fileName.endsWith("</b>")){
                    fileName = fileName.substring(5, fileName.length()-6);
                }*/
                String fileDescription = line.substring(fileSeperatorIndex + fileSeperator.length());
                fileDescriptionMap.put(fileName, fileDescription);
                lastKey = fileName;
            }
            else{
                //the line is continue for the last description
                String value = fileDescriptionMap.get(lastKey);
                fileDescriptionMap.put(lastKey, value + endOfLine + line );
            }
        }
        return fileDescriptionMap;
    }
   
    private String getAttributeContent(Map<String, String> existingFileDescriptionMap, Set<String>newFileSet){
        String attributeContent = "";
        for (String existingFile : existingFileDescriptionMap.keySet()){
            if (newFileSet.contains(existingFile)){
                attributeContent += newLineContent(existingFile, existingFileDescriptionMap.get(existingFile), true);
                newFileSet.remove(existingFile);
            }
            else {
                attributeContent += newLineContent(existingFile, existingFileDescriptionMap.get(existingFile), false);
            }
        }
       
        for (String newFile : newFileSet){
            attributeContent += newLineContent(newFile, "", false);
        }
        return attributeContent;
    }

    private String newLineContent(String fileName, String fileDescription, boolean hasBeenChange){
        String newLineContent = "<b>" + fileName + "</b>" + fileSeperator + fileDescription;
        if (hasBeenChange && !fileDescription.endsWith(fileHasBeenChangeMessage)){
            newLineContent += fileHasBeenChangeMessage;
        }
        newLineContent += endOfLine;
        return newLineContent;
    }
   
    private String toFullPath(IVersionable versionable/*, List<INameItemPair> segments*/) {
        return versionable.getName();
        /*StringBuffer path = new StringBuffer();
        if(segments.isEmpty()) {
            return versionable.getName();
        }
        for (INameItemPair nameItemPair : segments) {
            if(path.length() != 0) {
                path.append(Path.SEPARATOR);
            }
            // ignore the root folder which doesn't have a name
            if(nameItemPair.getName() != null)
                path.append(nameItemPair.getName());
        }
        return path.toString();*/
    }
}

permanent link
Krzysztof Kaźmierczyk (7.4k375103) | answered Mar 03 '14, 3:14 a.m.
Hello all,
Since 4.0.6 there is added function to see list of changesets associated to work item: https://jazz.net/downloads/rational-team-concert/releases/4.0.6?p=news#locateChangeSets

Your answer


Register or to post your answer.


Dashboards and work items are no longer publicly available, so some links may be invalid. We now provide similar information through other means. Learn more here.