It's all about the answers!

Ask a question

How to update the time tracking section in any RTC Wok item programatically


Vaibhav S (106138) | asked Aug 30 '18, 5:58 a.m.

Hi,,

How to update the time tracking section in any RTC Wok item programmatically

If anyone has achieved this please let me now.

Thanks
Vaibhav

One answer



permanent link
Vaibhav S (106138) | answered Aug 30 '18, 7:08 a.m.

import java.sql.Timestamp;
import java.util.HashMap;
import java.util.List;

import org.eclipse.core.runtime.IProgressMonitor;

import com.ibm.team.links.common.IReference;
import com.ibm.team.links.common.factory.IReferenceFactory;
import com.ibm.team.process.common.IProjectAreaHandle;
import com.ibm.team.repository.client.IItemManager;
import com.ibm.team.repository.client.ITeamRepository;
import com.ibm.team.repository.common.TeamRepositoryException;
import com.ibm.team.workitem.client.IWorkItemClient;
import com.ibm.team.workitem.client.IWorkItemWorkingCopyManager;
import com.ibm.team.workitem.client.WorkItemWorkingCopy;
import com.ibm.team.workitem.common.IWorkItemCommon;
import com.ibm.team.workitem.common.IWorkItemCommon.ITimeCode;
import com.ibm.team.workitem.common.model.Duration;
import com.ibm.team.workitem.common.model.IAttribute;
import com.ibm.team.workitem.common.model.IAttributeHandle;
import com.ibm.team.workitem.common.model.ILiteral;
import com.ibm.team.workitem.common.model.ITimeSheetEntry;
import com.ibm.team.workitem.common.model.ITimeSheetEntryHandle;
import com.ibm.team.workitem.common.model.IWorkItem;
import com.ibm.team.workitem.common.model.IWorkItemHandle;
import com.ibm.team.workitem.common.model.IWorkItemReferences;
import com.ibm.team.workitem.common.model.Identifier;
import com.ibm.team.workitem.common.model.WorkItemEndPoints;

public class UpdateTimeTracking {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

    public UpdateTimeTracking(IWorkItem workItem, HashMap<String, HashMap<Timestamp, ITimeSheetEntry>> trackMap,
            Duration totalDuration) {
        super();
        this.workItem = workItem;
        this.trackMap = trackMap;
        this.totalDuration = totalDuration;
    }

    private IWorkItem workItem = null;
    private HashMap<String, HashMap<Timestamp, ITimeSheetEntry>> trackMap = null;
    private Duration totalDuration = null;

    //masoom
    public void updateOrCreateTimeSheetEntry(WorkItemWorkingCopy destWorkingCopy , ITimeSheetEntry entry, IProgressMonitor monitor,
            ITeamRepository teamRepository, IProjectAreaHandle iProjectAreaHandle) throws TeamRepositoryException
    {

        UpdateTimeTracking updateTimeTracking= new UpdateTimeTracking(destWorkingCopy.getWorkItem(),null,null);
        setWorkItem(destWorkingCopy.getWorkItem());

        //pass detination repo object in this method
        ITimeCode timeCode= updateTimeTracking.calculateTimeCode(entry.getTimeCode(), teamRepository);
        ITimeSheetEntry timeSheet = findTimeSheetEntry(timeCode, entry.getStartDate(), monitor, teamRepository);
        if (timeSheet == null)
        {
            timeSheet = createTimeSheet(teamRepository);
            destWorkingCopy.getReferences().add(WorkItemEndPoints.WORK_TIME, IReferenceFactory.INSTANCE.createReferenceToItem(timeSheet));
            addEntry(timeSheet, monitor, teamRepository);
        } else {
            timeSheet = (ITimeSheetEntry) timeSheet.getWorkingCopy();
        }

        timeSheet.setContextId(entry.getContextId());
        timeSheet.setCreator(entry.getCreator());
        timeSheet.setHoursSpent(entry.getHoursSpent());
        timeSheet.setRequestedModified(entry.getRequestedModified());
        timeSheet.setRequestedStateId(entry.getRequestedStateId());
        timeSheet.setStartDate(entry.getStartDate());
        timeSheet.setTimeCode(timeCode.getTimeCodeLabel());
        timeSheet.setTimeCodeId(entry.getTimeCodeId());
        timeSheet.setTimeSpent(entry.getTimeSpent());
        timeSheet.setWorkType(entry.getWorkType());
        
        IWorkItem destWorkItem= destWorkingCopy.getWorkItem();
        
        IWorkItemClient client = (IWorkItemClient) teamRepository.getClientLibrary(IWorkItemClient.class);
        
        IAttribute attribute = updateTimeTracking.getRtcAttribute(client, iProjectAreaHandle, teamRepository, monitor, "Time Spent");
        
        long l=(long)destWorkItem.getValue(attribute)+1;
        
        double hourSpent= timeSheet.getHoursSpent();
        long l_hourSpent = (new Double(hourSpent)).longValue();
        destWorkItem.setValue(attribute, (l_hourSpent*3600000l)+l);
        
        destWorkingCopy.getDependentItems().add(timeSheet);
        destWorkingCopy.save(monitor);
    }
    
    //masoom
    public IAttribute getRtcAttribute(IWorkItemClient client, IProjectAreaHandle paHandle, ITeamRepository repo,
            IProgressMonitor monitor, String attributeName) throws TeamRepositoryException {
        IAttribute iattribute = null;

        List<IAttribute> customAttrList = client.findAttributes(paHandle, monitor);

        for (IAttributeHandle iAttribute : customAttrList) {
            iattribute = (IAttribute) repo.itemManager().fetchCompleteItem(iAttribute, 0, monitor);

            if (iattribute.getDisplayName().trim().equalsIgnoreCase(attributeName.trim())) {
                break;
            }
        }

        return iattribute;
    }
    
    //masoom: pass destination repo object in this
    private ITimeCode calculateTimeCode(String timeCodeName, ITeamRepository teamRepository) throws TeamRepositoryException {
        // Find the time code
        ITimeCode timeCodeToSet = null;
        
        IWorkItemCommon iWorkItemCommon= getWorkItemCommon(teamRepository);
        //detination WI
        IWorkItem workItem= getWorkItem();
        //destination PA handle
        IProjectAreaHandle iProjectAreaHandle=workItem.getProjectArea();
        
        List<ITimeCode> timeCodes =null;
        timeCodes=iWorkItemCommon.getTimeCodes(iProjectAreaHandle);
        //List<ITimeCode> timeCodes = getWorkItemCommon().getTimeCodes(getWorkItem().getProjectArea());
        
        for (ITimeCode aTimeCode : timeCodes)
        {
            if (aTimeCode.getTimeCodeLabel().equals(timeCodeName))
            {
                timeCodeToSet = aTimeCode;
                break;
            }
        }
        if (timeCodeToSet == null)
        {
            throw new TeamRepositoryException("Timecode not found: "+ timeCodeName);
        }
        return timeCodeToSet;
    }
    
    //masoom
    public void setWorkItem(IWorkItem workItem) {
        // we want to preserve the time tracking data in case the work item is
        // identical with the current one.
        if (this.workItem == null) {
            initialize(workItem);
        } else if (!this.workItem.getItemId().equals(workItem.getItemId())) {
            initialize(workItem);
        }
    }
    
    //masoom
    private ITimeSheetEntry findTimeSheetEntry(ITimeCode timeCode, Timestamp startDate, IProgressMonitor monitor, ITeamRepository teamRepository) throws TeamRepositoryException
    {
        // Get the map with all the time sheets
        HashMap<String, HashMap<Timestamp, ITimeSheetEntry>> map = getTrackMap(monitor,  teamRepository);
        
        if (!map.containsKey(timeCode.getTimeCodeId())) {
            // No entry for TimeCode
            return null;
        }
        // Get all the entries for the TimeCode
        HashMap<Timestamp, ITimeSheetEntry> timeCodeEntries = map.get(timeCode
                .getTimeCodeId());
        if (timeCodeEntries.containsKey(startDate)) {
            // get the entry and return it.
            return timeCodeEntries.get(startDate);
        }
        return null;
    }
    
    //masoom
    private ITimeSheetEntry createTimeSheet(ITeamRepository teamRepository) throws TeamRepositoryException {
        ITimeSheetEntry timeSheet;
        timeSheet = getWorkItemCommon(teamRepository).createTimeSheetEntry(
                getWorkItem().getProjectArea());
        return timeSheet;
    }
    
    //masoom
    private void addEntry(ITimeSheetEntry timeSheetEntry, IProgressMonitor monitor, ITeamRepository teamRepository) throws TeamRepositoryException
    {
        HashMap<String, HashMap<Timestamp, ITimeSheetEntry>> map = getTrackMap(monitor, teamRepository);
        
        String timeCodeID = timeSheetEntry.getTimeCodeId();
        HashMap<Timestamp, ITimeSheetEntry> timeSheetMap = map.get(timeCodeID);
        if (timeSheetMap == null) {
            timeSheetMap = new HashMap<Timestamp, ITimeSheetEntry>();
            map.put(timeCodeID, timeSheetMap);
        }
        if (timeSheetMap.containsKey(timeSheetEntry.getStartDate())) {
            System.out.println("Error: entry already available");
        }
        timeSheetMap.put(timeSheetEntry.getStartDate(), timeSheetEntry);
        setTotalDuration(getTotalDuration().add(timeSheetEntry.getTimeSpent()));
    }
    
    //masoom
    private void setTotalDuration(Duration totalDuration) {
        this.totalDuration = totalDuration;
    }
    
    //masoom
    public Duration getTotalDuration() {
        return totalDuration;
    }
    
    //masoom
    public IWorkItem getWorkItem() {
        return this.workItem;
    }
    
    //masoom
    private void initialize(IWorkItem workItem) {
        this.trackMap = null;
        this.workItem = workItem;
        setTotalDuration(new Duration(0));
    }
    
    //masoom
    private HashMap<String, HashMap<Timestamp, ITimeSheetEntry>> getTrackMap(IProgressMonitor monitor, ITeamRepository teamRepository) throws TeamRepositoryException {
        if (this.trackMap == null)
        {
            this.trackMap = new HashMap<String, HashMap<Timestamp, ITimeSheetEntry>>();
            readTimeSheetEntries(monitor,  teamRepository);
        }
        return this.trackMap;
    }
    
    
    //masoom: login to destination- Pass detination repo object in this method
    private IWorkItemCommon getWorkItemCommon(ITeamRepository teamRepository) throws TeamRepositoryException {
        
        IWorkItemCommon common = (IWorkItemCommon) teamRepository.getClientLibrary(IWorkItemCommon.class);
        return common;
    }

    //masoom
    private void readTimeSheetEntries(IProgressMonitor monitor, ITeamRepository teamRepository)
            throws TeamRepositoryException {
        
        IWorkItemCommon workItemCommon = getWorkItemCommon(teamRepository);
        IWorkItemHandle iWorkItemHandle= (IWorkItemHandle)getWorkItem();
        IWorkItemReferences references = workItemCommon.resolveWorkItemReferences(iWorkItemHandle, monitor);
        List<IReference> referenceList = references.getReferences(WorkItemEndPoints.WORK_TIME);
        for (IReference aReference : referenceList)
        {
            if (aReference.isItemReference())
            {
                Object target = aReference.resolve();
                if (target instanceof ITimeSheetEntryHandle)
                {
                    ITimeSheetEntryHandle timeSheetEntry = (ITimeSheetEntryHandle) target;
                    ITimeSheetEntry tsEntry = (ITimeSheetEntry) ((ITeamRepository) getWorkItem().getOrigin()).itemManager().fetchCompleteItem(timeSheetEntry, IItemManager.REFRESH, monitor);
                    addEntry(tsEntry, monitor,teamRepository);
                }
            }
        }
    }
}






import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;

import org.eclipse.core.runtime.IProgressMonitor;

import com.ibm.team.links.common.IReference;
import com.ibm.team.links.common.factory.IReferenceFactory;
import com.ibm.team.process.common.IProjectArea;
import com.ibm.team.process.common.IProjectAreaHandle;
import com.ibm.team.repository.client.IItemManager;
import com.ibm.team.repository.client.ITeamRepository;
import com.ibm.team.repository.client.TeamPlatform;
import com.ibm.team.repository.client.ITeamRepository.ILoginHandler.ILoginInfo;
import com.ibm.team.repository.common.TeamRepositoryException;
import com.ibm.team.workitem.client.IWorkItemClient;
import com.ibm.team.workitem.client.IWorkItemWorkingCopyManager;
import com.ibm.team.workitem.client.WorkItemWorkingCopy;
import com.ibm.team.workitem.common.IWorkItemCommon;
import com.ibm.team.workitem.common.IWorkItemCommon.ITimeCode;
import com.ibm.team.workitem.common.model.Duration;
import com.ibm.team.workitem.common.model.ILiteral;
import com.ibm.team.workitem.common.model.ITimeSheetEntry;
import com.ibm.team.workitem.common.model.ITimeSheetEntryHandle;
import com.ibm.team.workitem.common.model.IWorkItem;
import com.ibm.team.workitem.common.model.IWorkItemReferences;
import com.ibm.team.workitem.common.model.Identifier;
import com.ibm.team.workitem.common.model.WorkItemEndPoints;

public class TimeTrackingHelper {

    private static final long HOUR_IN_MILLISECONDS = 1000 * 60 * 60;

    // We store the time sheets in a structure that speeds up access
    private HashMap<String, HashMap<Timestamp, ITimeSheetEntry>> trackMap = null;
    // The work item that is currently looked at
    private IWorkItem workItem = null;
    // The total time spent based on all the time sheet entries
    //private Duration totalDuration = null;

    private HashMap<String, HashMap<Timestamp, ITimeSheetEntry>> getTrackMap(IProgressMonitor monitor) throws TeamRepositoryException
    {
        if (this.trackMap == null)
        {
            this.trackMap = new HashMap<String, HashMap<Timestamp, ITimeSheetEntry>>();
            readTimeSheetEntries(monitor);
        }
        return this.trackMap;
    }


    public void setWorkItem(IWorkItem workItem) {
        // we want to preserve the time tracking data in case the work item is identical with the current one.
        if (this.workItem == null) {
            initialize(workItem);
        } else if (!this.workItem.getItemId().equals(workItem.getItemId())) {
            initialize(workItem);
        }
    }

    public IWorkItem getWorkItem() {
        return this.workItem;
    }

    public TimeTrackingHelper() {
        super();
    }

    private void initialize(IWorkItem workItem) {
        this.trackMap = null;
        this.workItem = workItem;
        //setTotalDuration(new Duration(0));
    }

    public void refresh() {
        // Force a refresh
        initialize(null);
    }

    //masoom
    private IWorkItemCommon getWorkItemCommon() {
        return (IWorkItemCommon) ((ITeamRepository) getWorkItem().getOrigin())
                .getClientLibrary(IWorkItemCommon.class);
    }

    //masoom
    private void readTimeSheetEntries(IProgressMonitor monitor)throws TeamRepositoryException
    {
        IWorkItemCommon workItemCommon = getWorkItemCommon();
        IWorkItemReferences references = workItemCommon.resolveWorkItemReferences(getWorkItem(), monitor);
        List<IReference> referenceList = references.getReferences(WorkItemEndPoints.WORK_TIME);
        for (IReference aReference : referenceList)
        {
            if (aReference.isItemReference())
            {
                Object target = aReference.resolve();
                if (target instanceof ITimeSheetEntryHandle)
                {
                    ITimeSheetEntryHandle timeSheetEntry = (ITimeSheetEntryHandle) target;
                    ITimeSheetEntry tsEntry = (ITimeSheetEntry) ((ITeamRepository) getWorkItem().getOrigin()).itemManager().fetchCompleteItem(timeSheetEntry, IItemManager.REFRESH, monitor);
                    addEntry(tsEntry, monitor);
                }
            }
        }
    }

    //masoom
    private void addEntry(ITimeSheetEntry timeSheetEntry, IProgressMonitor monitor) throws TeamRepositoryException
    {
        HashMap<String, HashMap<Timestamp, ITimeSheetEntry>> map = getTrackMap(monitor);
        String timeCodeID = timeSheetEntry.getTimeCodeId();
        HashMap<Timestamp, ITimeSheetEntry> timeSheetMap = map.get(timeCodeID);
        if (timeSheetMap == null) {
            timeSheetMap = new HashMap<Timestamp, ITimeSheetEntry>();
            map.put(timeCodeID, timeSheetMap);
        }
        if (timeSheetMap.containsKey(timeSheetEntry.getStartDate())) {
            System.out.println("Error: entry already available");
        }
        timeSheetMap.put(timeSheetEntry.getStartDate(), timeSheetEntry);
        //setTotalDuration(getTotalDuration().add(timeSheetEntry.getTimeSpent()));
    }

    //masoom
    private void visitEntries(WorkItemWorkingCopy dest_WorkingCopy, IProgressMonitor monitor, ITeamRepository teamRepository, IProjectAreaHandle iProjectAreaHandle) throws TeamRepositoryException
    {
        HashMap<String, HashMap<Timestamp, ITimeSheetEntry>> map = getTrackMap(monitor);
       
        for (Iterator<Entry<String, HashMap<Timestamp, ITimeSheetEntry>>> timeCodeIterator = map.entrySet().iterator(); timeCodeIterator.hasNext();)
        {
            System.out.println("Inside outer map: -----------------");
            Entry<String, HashMap<Timestamp, ITimeSheetEntry>> mapEntry = (Entry<String, HashMap<Timestamp, ITimeSheetEntry>>) timeCodeIterator.next();
            System.out.println("Outer map Key(Time Code ID): "+mapEntry.getKey());
            HashMap<Timestamp, ITimeSheetEntry> values = mapEntry.getValue();
           
            for (Iterator<Entry<Timestamp, ITimeSheetEntry>> entryIterator = values.entrySet().iterator(); entryIterator.hasNext();)
            {
                System.out.println("Inside outer map: -----------------");
                Entry<Timestamp, ITimeSheetEntry> valueEntry = (Entry<Timestamp, ITimeSheetEntry>) entryIterator.next();
               
                System.out.println("Key(Start Date): "+valueEntry.getKey()+" +++++++++++ "+"Value: "+valueEntry.getValue().getStartDate());
               
                TimeTrackingHelper timeTrackingHelper = new TimeTrackingHelper();
                timeTrackingHelper.execute(dest_WorkingCopy, valueEntry.getValue(), monitor,  teamRepository,  iProjectAreaHandle);
            }
        }
    }

    //masoom
    public void execute(WorkItemWorkingCopy dest_WorkingCopy, ITimeSheetEntry entry, IProgressMonitor monitor, ITeamRepository teamRepository, IProjectAreaHandle iProjectAreaHandle){
        try {
            printTimeSheet(dest_WorkingCopy, entry, monitor,  teamRepository,  iProjectAreaHandle);
        } catch (TeamRepositoryException e) {
            e.printStackTrace();
        }
    }
   
    //masoom
    public void printTimeSheet(WorkItemWorkingCopy dest_WorkingCopy, ITimeSheetEntry timeSheetEntry, IProgressMonitor monitor, ITeamRepository teamRepository, IProjectAreaHandle iProjectAreaHandle) throws TeamRepositoryException
    {
        System.out.println("Entry: ");
       
        UpdateTimeTracking updateTimeTracking= new UpdateTimeTracking(null,null,null);
        updateTimeTracking.updateOrCreateTimeSheetEntry(dest_WorkingCopy ,timeSheetEntry, monitor,  teamRepository,  iProjectAreaHandle);
       
        System.out.println(timeSheetToString(timeSheetEntry));
    }
   
    //masoom
    public String timeSheetToString(ITimeSheetEntry timeSheetEntry)
    {
        String entry = "";
        entry += " TimeCode: " + timeSheetEntry.getTimeCode() + "\n";
        entry += " TimeCodeID: " + timeSheetEntry.getTimeCodeId() + "\n";
        entry += " WorkType: " + timeSheetEntry.getWorkType().getStringIdentifier() + "\n";
        entry += " Date: " + SimpleDateFormatUtil.getDate(timeSheetEntry.getStartDate()) + "\n";
        entry += " HoursSpent: " + timeSheetEntry.getHoursSpent() + "\n";
        entry += " TimeSpent: " + timeSheetEntry.getTimeSpent().longValue() + "\n";
        entry += " Creator ID: " + timeSheetEntry.getCreator().getItemId() + "\n";
        entry += " Creation Date: " + timeSheetEntry.getCreationDate() + "\n";
       
        return entry;
    }

    //masoom
    public void printTimeSheets(WorkItemWorkingCopy dest_WorkingCopy, IWorkItem workItem, IProgressMonitor monitor, ITeamRepository teamRepository, IProjectAreaHandle iProjectAreaHandle)
            throws TeamRepositoryException {
        setWorkItem(workItem);
        visitEntries(dest_WorkingCopy, monitor, teamRepository, iProjectAreaHandle);
    }


}

Your answer


Register or to post your answer.