/*******************************************************************************
* Copyright (c) 2013, 2016 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.model.Run;
import hudson.scm.RepositoryBrowser;
import hudson.scm.ChangeLogSet;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.logging.Logger;
import org.kohsuke.stapler.export.ExportedBean;
@ExportedBean(defaultVisibility=999)
public class RTCChangeLogSet extends ChangeLogSet<RTCChangeLogSetEntry> {
private static final Logger LOGGER = Logger.getLogger(RTCChangeLogSet.class.getName());
@ExportedBean(defaultVisibility=999)
public static class ComponentDescriptor implements Comparable<ComponentDescriptor> {
private String itemId;
private String name;
public ComponentDescriptor(String componentItemId, String componentName) {
this.itemId = componentItemId;
this.name = componentName;
}
public String getItemId() {
return itemId;
}
public String getName() {
return name;
}
public int compareTo(ComponentDescriptor o) {
// sort by name, but also be consistent with equals
if (name != null && o.name != null) {
int result = name.compareTo(o.name);
if (result == 0) {
return itemId.compareTo(o.itemId);
}
return result;
} else if (name == null && o.name == null) {
return itemId.compareTo(o.itemId);
} else if (name == null) {
return -1;
} else {
return 1;
}
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime
* result
+ ((itemId == null) ? 0 : itemId
.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ComponentDescriptor other = (ComponentDescriptor) obj;
if (itemId == null) {
if (other.itemId != null)
return false;
} else if (!itemId.equals(other.itemId))
return false;
return true;
}
}
private String baselineSetItemId;
private String baselineSetName;
private String workspaceItemId;
private String workspaceName;
private String buildDefinitionName;
private String buildDefinitionItemId;
private String streamName;
private String streamItemId;
private boolean isPersonalBuild;
private String previousBuildUrl;
private List<RTCChangeLogComponentEntry> componentChanges;
private Map<String, List<RTCChangeLogChangeSetEntry>> changesAccepted;
private Map<String, List<RTCChangeLogChangeSetEntry>> changesDiscarded;
private int changesAcceptedCount;
private int changesDiscardedCount;
private TreeSet<ComponentDescriptor> affectedComponents;
private transient boolean componentChangesSorted;
private transient List<RTCChangeLogSetEntry> allChanges;
public RTCChangeLogSet(Run<?, ?> build, RepositoryBrowser<?> browser) {
super(build, browser);
LOGGER.finest("RTCChangeLogset construtor : Begin");
this.componentChanges = new ArrayList<RTCChangeLogComponentEntry>(0);
this.affectedComponents = new TreeSet<ComponentDescriptor>();
this.changesAccepted = new HashMap<String, List<RTCChangeLogChangeSetEntry>>();
this.changesDiscarded = new HashMap<String, List<RTCChangeLogChangeSetEntry>>();
this.changesAcceptedCount = 0;
this.changesDiscardedCount = 0;
}
public Iterator<RTCChangeLogSetEntry> iterator() {
LOGGER.finest("RTCChangeLogset iterator : Begin");
List<RTCChangeLogSetEntry> changes = getAllChanges();
LOGGER.finest("RTCChangeLogset iterator End");
return changes.iterator();
}
@Override
public String getKind() {
LOGGER.finest("RTCChangeLogSet getKind : Begin");
return "RTC";
}
@Override
public boolean isEmptySet() {
LOGGER.finest("RTCChangeLogSet isEmptySet : Begin");
return changesAccepted.isEmpty() && changesDiscarded.isEmpty() && componentChanges.isEmpty();
}
private List<RTCChangeLogSetEntry> getAllChanges() {
LOGGER.finest("RTCChangeLogset getAllChanges : Begin");
if (allChanges == null) {
ArrayList<RTCChangeLogSetEntry> changes = new ArrayList<RTCChangeLogSetEntry>();
for (RTCChangeLogComponentEntry componentChange : componentChanges) {
changes.add(componentChange);
}
for (List<RTCChangeLogChangeSetEntry> changeSets : changesAccepted.values()) {
changes.addAll(changeSets);
}
for (List<RTCChangeLogChangeSetEntry> changeSets : changesDiscarded.values()) {
changes.addAll(changeSets);
}
allChanges = changes;
}
return allChanges;
}
public void add(RTCChangeLogComponentEntry entry) {
LOGGER.finest("RTCChangeLogset add RTCChangeLogComponentEntry: Begin");
entry.setParent(this);
componentChanges.add(entry);
}
public void add(RTCChangeLogChangeSetEntry entry) {
LOGGER.finest("RTCChangeLogset add RTCChangeLogChangeSetEntry: Begin");
entry.setParent(this);
List<RTCChangeLogChangeSetEntry> changes;
if (entry.isAccept()) {
changesAcceptedCount++;
changes = changesAccepted.get(entry.getComponentItemId());
if (changes == null) {
changes = new ArrayList<RTCChangeLogChangeSetEntry>();
changesAccepted.put(entry.getComponentItemId(), changes);
}
} else {
changesDiscardedCount++;
changes = changesDiscarded.get(entry.getComponentItemId());
if (changes == null) {
changes = new ArrayList<RTCChangeLogChangeSetEntry>();
changesDiscarded.put(entry.getComponentItemId(), changes);
}
}
changes.add(entry);
ComponentDescriptor componentDescriptor = new ComponentDescriptor(entry.getComponentItemId(), entry.getComponentName());
affectedComponents.add(componentDescriptor);
}
public void setIsPersonalBuild(boolean isPersonal) {
LOGGER.finest("RTCChangeLogset setIsPersonalBuild: Begin");
this.isPersonalBuild = isPersonal;
}
public boolean isPersonalBuild() {
LOGGER.finest("RTCChangeLogset isPersonalBuild: Begin");
return isPersonalBuild;
}
public String getPreviousBuildUrl() {
LOGGER.finest("RTCChangeLogset getPreviousBuildUrl: Begin");
return previousBuildUrl;
}
public void setPreviousBuildUrl(String previousBuildUrl) {
LOGGER.finest("RTCChangeLogset setPreviousBuildUrl: Begin");
this.previousBuildUrl = previousBuildUrl;
}
public void setBaselineSetItemId(String itemId) {
LOGGER.finest("RTCChangeLogset setBaselineSetItemId: Begin");
this.baselineSetItemId = itemId;
}
public String getBaselineSetItemId() {
LOGGER.finest("RTCChangeLogset getBaselineSetItemId: Begin");
return baselineSetItemId;
}
public void setBaselineSetName(String name) {
LOGGER.finest("RTCChangeLogset setBaselineSetName: Begin");
this.baselineSetName = name;
}
public String getBaselineSetName() {
LOGGER.finest("RTCChangeLogset getBaselineSetName: Begin");
return baselineSetName;
}
public void setWorkspaceItemId(String workspaceItemId) {
this.workspaceItemId = workspaceItemId;
}
public String getWorkspaceItemId() {
return workspaceItemId;
}
public void setWorkspaceName(String workspaceName) {
this.workspaceName = workspaceName;
}
public String getWorkspaceName() {
return workspaceName;
}
public void setBuildDefinitionName(String buildDefinitionName) {
this.buildDefinitionName = buildDefinitionName;
}
public String getBuildDefinitionName() {
return buildDefinitionName;
}
public String getBuildDefinitionItemId() {
return buildDefinitionItemId;
}
public void setBuildDefinitionItemId(String buildDefinitionItemId) {
this.buildDefinitionItemId = buildDefinitionItemId;
}
public String getStreamName() {
return streamName;
}
public void setStreamName(String streamName) {
this.streamName = streamName;
}
public String getStreamItemId() {
return streamItemId;
}
public void setStreamItemId(String streamItemId) {
this.streamItemId = streamItemId;
}
public List<RTCChangeLogComponentEntry> getComponentChanges() {
LOGGER.finest("RTCChangeLogset getComponentChanges : Begin");
synchronized (componentChanges) {
if (!componentChangesSorted) {
Collections.sort(componentChanges);
componentChangesSorted = true;
}
}
return componentChanges;
}
public Set<ComponentDescriptor> getAffectedComponents() {
LOGGER.finest("RTCChangeLogset getAffectedComponents : Begin");
return affectedComponents;
}
public List<RTCChangeLogChangeSetEntry> getChangeSetsAccepted(String componentItemId) {
LOGGER.finest("RTCChangeLogset getChangeSetsAccepted : Begin");
List<RTCChangeLogChangeSetEntry> result = changesAccepted.get(componentItemId);
if (result == null) {
return Collections.emptyList();
}
return result;
}
public List<RTCChangeLogChangeSetEntry> getChangeSetsDiscarded(String componentItemId) {
LOGGER.finest("RTCChangeLogset getChangeSetsDiscarded : Begin");
List<RTCChangeLogChangeSetEntry> result = changesDiscarded.get(componentItemId);
if (result == null) {
return Collections.emptyList();
}
return result;
}
public int getComponentChangeCount() {
LOGGER.finest("RTCChangeLogset getComponentChangeCount : Begin");
return componentChanges.size();
}
public int getChangeSetsAcceptedCount() {
LOGGER.finest("RTCChangeLogset getChangeSetsAcceptedCount : Begin");
return changesAcceptedCount;
}
public int getChangeSetsDiscardedCount() {
LOGGER.finest("RTCChangeLogset getChangeSetsDiscardedCount : Begin");
return changesDiscardedCount;
}
}