/******************************************************************************* * Copyright (c) 2013, 2015 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package com.ibm.team.build.internal.hjplugin; import hudson.Util; import hudson.model.User; import hudson.scm.EditType; import hudson.scm.ChangeLogSet; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.logging.Logger; import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.ExportedBean; @ExportedBean(defaultVisibility=999) public class RTCChangeLogChangeSetEntry extends RTCChangeLogSetEntry { private static final Logger LOGGER = Logger.getLogger(RTCChangeLogChangeSetEntry.class.getName()); private static final String FORMAT = "yyyy-MM-dd HH:mm:ss"; //$NON-NLS-1$ @ExportedBean(defaultVisibility=999) public static class ChangeDesc implements Comparable<ChangeDesc> { /** * Kind constant indicating the change has equivalent "before" and "after" states. */ private static final int NONE = 0x00; /** * Kind constant indicating the addition of a versionable item */ private static final int ADD = 0x01; /** * Kind constant indicating the modification of a versionable item */ private static final int MODIFY = 0x02; /** * Kind constant indicating that the item's name has changed in this * transition. */ private static final int RENAME = 0x04; /** * Kind constant indicating that the item's parent has changed in this * transition. */ private static final int REPARENT = 0x08; /** * Kind constant indicating the deletion of a versionable item */ private static final int DELETE = 0x10; private String name; private String itemType; private String itemId; private String stateId; private int kind; public void setKind(int kind) { this.kind = kind; } public void setName(String versionableName) { this.name = versionableName; } public void setItemType(String versionableItemType) { this.itemType = versionableItemType; } public void setItemId(String versionableItemId) { this.itemId = versionableItemId; } public void setStateId(String versionableStateId) { this.stateId = versionableStateId; } public String getName() { // if a folder and not the root folder append a slash on the end of the name if (isFolderChange() && this.name.length() != 1) { return this.name + "/"; //$NON-NLS-1$ } return this.name; } public String getItemId() { return itemId; } public String getStateId() { return stateId; } public boolean isFolderChange() { return itemType != null && itemType.endsWith("Folder"); //$NON-NLS-1$ } public String getModificationKind() { String result; if (kind == NONE) { result = Messages.RTCChangeLogChangeSetEntry_no_changes(); } else if (kind == ADD) { result = Messages.RTCChangeLogChangeSetEntry_added(); } else if (kind == DELETE) { result = Messages.RTCChangeLogChangeSetEntry_deleted(); } else if (((kind & MODIFY) == MODIFY) && ((kind & (RENAME + REPARENT)) != 0)) { result = Messages.RTCChangeLogChangeSetEntry_moved_modified(); } else if ((kind & MODIFY) == MODIFY) { result = Messages.RTCChangeLogChangeSetEntry_modified(); } else if ((kind & (RENAME + REPARENT)) != 0) { result = Messages.RTCChangeLogChangeSetEntry_moved(); } else { result = Messages.RTCChangeLogChangeSetEntry_unknown(); } return result; } public EditType getType() { EditType result; if (kind == ADD) { result = EditType.ADD; } else if (kind == DELETE) { result = EditType.DELETE; } else { result = EditType.EDIT; } return result; } public int compareTo(ChangeDesc o) { return name.compareTo(o.name); } } @ExportedBean(defaultVisibility=999) public static class WorkItemDesc { private String number; private String summary; public void setNumber(String number) { this.number = number; } public void setSummary(String summary) { this.summary = summary; } public String getNumber() { return number; } public String getSummary() { return summary; } public String getMsg() { return number + ": " + summary; //$NON-NLS-1$ } } private String action; private String changeSetItemId; private String componentItemId; private String componentName; private String owner; private String comment; private long additionalChanges; private Date changeSetModDate; private List<ChangeDesc> changes; private boolean changesSorted; private List<WorkItemDesc> workItems; private WorkItemDesc primaryWorkItem; private static final String RTCWI_START_TAG = "<rtcwi>"; //$NON-NLS-1$ private static final String RTCWI_END_TAG = "</rtcwi>"; //$NON-NLS-1$ private static final String RTCCS_START_TAG = "<rtccs>"; //$NON-NLS-1$ private static final String RTCCS_END_TAG = "</rtccs>"; //$NON-NLS-1$ public RTCChangeLogChangeSetEntry() { LOGGER.finest("RTCChangeLogChangeSetEntry : Instantiating a changelog set entry"); //$NON-NLS-1$ changes = new ArrayList<RTCChangeLogChangeSetEntry.ChangeDesc>(); workItems = new ArrayList<RTCChangeLogChangeSetEntry.WorkItemDesc>(0); } public String getChangeSetItemId() { return changeSetItemId; } public String getComponentItemId() { return componentItemId; } public String getComponentName() { return componentName; } @Override @Exported public String getMsg() { LOGGER.finest("RTCChangeLogChangeSetEntry.getMsg : Begin"); if (primaryWorkItem == null) { return comment; } else { if (workItems.size() > 0) { StringBuilder res = new StringBuilder(); res.append(RTCWI_START_TAG); res.append(primaryWorkItem.getMsg()); res.append(RTCWI_END_TAG); for (WorkItemDesc wiDesc : workItems) { res.append(RTCWI_START_TAG); res.append(wiDesc.getMsg()); res.append(RTCWI_END_TAG); } res.append(RTCCS_START_TAG); res.append(comment); res.append(RTCCS_END_TAG); return res.toString(); } return primaryWorkItem.getMsg() + " - " + comment; //$NON-NLS-1$ } } public String getComment() { return comment; } public WorkItemDesc getWorkItem() { return primaryWorkItem; } public List<WorkItemDesc> getAdditionalWorkItems() { return workItems; } @Override @Exported public User getAuthor() { LOGGER.finest("RTCChangeLogSetEntry.getAuthor : Begin"); return User.get(owner); } @Override @Exported public Collection<String> getAffectedPaths() { LOGGER.finest("RTCChangeLogSetEntry.getAffectedPaths : Begin"); List<String> result; List<ChangeDesc> affectedVersionables = getAffectedVersionables(); if (affectedVersionables == null) { result = new ArrayList<String>(1); } else { result = new ArrayList<String>(affectedVersionables.size() + 1); for (ChangeDesc change : affectedVersionables) { result.add(change.name); } } if (additionalChanges > 0) { result.add(Messages.RTCChangeLogChangeSetEntry_changes(additionalChanges)); } return result; } public List<ChangeDesc> getAffectedVersionables() { if (!changesSorted) { Collections.sort(changes); changesSorted = true; } return changes; } public boolean isTooManyChanges() { return additionalChanges > 0; } public String getTooManyChangesMsg() { return Messages.RTCChangeLogChangeSetEntry_too_many_changes(additionalChanges); } @Override @Exported public long getTimestamp() { LOGGER.finest("RTCChangeLogChangeSetEntry.getTimeStamp : Begin"); return changeSetModDate.getTime(); } public String getChangeSetModDate() { SimpleDateFormat formatter = new SimpleDateFormat(FORMAT); return formatter.format(changeSetModDate); } public String getOwner() { return owner; } public boolean isAccept() { return action.equalsIgnoreCase("Added"); //$NON-NLS-1$ } public void setAction(String action) { this.action = action; } public void setAdditionalChanges(int additionalChanges) { this.additionalChanges = additionalChanges; } public void setDate(String dateStr) { this.changeSetModDate = new Date(Long.parseLong(dateStr)); } public void setComment(String comment) { this.comment = Util.fixEmptyAndTrim(comment); } public void setOwner(String owner) { this.owner = owner; } public void setChangeSetItemId(String itemId) { this.changeSetItemId = itemId; } public void setComponentItemId(String itemId) { this.componentItemId = itemId; } public void setComponentName(String componentName) { this.componentName = componentName; } public void addChange(RTCChangeLogChangeSetEntry.ChangeDesc change) { this.changes.add(change); } public void addWorkItem(RTCChangeLogChangeSetEntry.WorkItemDesc workItem) { if (this.primaryWorkItem == null) { this.primaryWorkItem = workItem; } else { this.workItems.add(workItem); } } public String getWorkspaceItemId() { ChangeLogSet parent = getParent(); if (parent instanceof RTCChangeLogSet) { return ((RTCChangeLogSet) parent).getWorkspaceItemId(); } return null; } }