/* * Copyright 2017 ThoughtWorks, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.thoughtworks.go.domain.activity; import com.thoughtworks.go.domain.cctray.viewers.NoOne; import com.thoughtworks.go.domain.cctray.viewers.Viewers; import com.thoughtworks.go.util.DateUtils; import org.apache.commons.lang.StringUtils; import org.jdom2.Element; import org.jdom2.output.XMLOutputter; import java.util.Date; import java.util.HashSet; import java.util.Set; public class ProjectStatus { public static final Date DEFAULT_LAST_BUILD_TIME = new Date(); public static final String DEFAULT_LAST_BUILD_STATUS = "Success"; public static final String SITE_URL_PREFIX = "__SITE_URL_PREFIX__"; private String name; private String activity; private String lastBuildStatus = "Success"; private String lastBuildLabel; private final Set<String> breakers; private Date lastBuildTime; private String webUrl; public static final String DEFAULT_LAST_BUILD_LABEL = "1"; private volatile Viewers viewers; private String cachedXmlRepresentation; public ProjectStatus(String name, String activity, String lastBuildStatus, String lastBuildLabel, Date lastBuildTime, String webUrl) { this(name, activity, lastBuildStatus, lastBuildLabel, lastBuildTime, webUrl, new HashSet<>()); } public ProjectStatus(String name, String activity, String webUrl) { this(name, activity, DEFAULT_LAST_BUILD_STATUS, DEFAULT_LAST_BUILD_LABEL, DEFAULT_LAST_BUILD_TIME, webUrl); } public ProjectStatus(String name, String activity, String lastBuildStatus, String lastBuildLabel, Date lastBuildTime, String webUrl, Set<String> breakers) { this.name = name; this.activity = activity; this.lastBuildStatus = lastBuildStatus; this.lastBuildLabel = lastBuildLabel; this.breakers = breakers; this.lastBuildTime = lastBuildTime == null ? DEFAULT_LAST_BUILD_TIME : lastBuildTime; this.webUrl = webUrl; this.viewers = NoOne.INSTANCE; } public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } ProjectStatus that = (ProjectStatus) o; if (activity != null ? !activity.equals(that.activity) : that.activity != null) { return false; } if (lastBuildLabel != null ? !lastBuildLabel.equals(that.lastBuildLabel) : that.lastBuildLabel != null) { return false; } if (lastBuildStatus != null ? !lastBuildStatus.equals(that.lastBuildStatus) : that.lastBuildStatus != null) { return false; } if (lastBuildTime != null ? !lastBuildTime.equals(that.lastBuildTime) : that.lastBuildTime != null) { return false; } if (name != null ? !name.equals(that.name) : that.name != null) { return false; } if (webUrl != null ? !webUrl.equals(that.webUrl) : that.webUrl != null) { return false; } if (breakers != null ? !breakers.equals(that.breakers) : that.breakers != null) { return false; } return true; } public int hashCode() { int result; result = (name != null ? name.hashCode() : 0); result = 31 * result + (activity != null ? activity.hashCode() : 0); result = 31 * result + (lastBuildStatus != null ? lastBuildStatus.hashCode() : 0); result = 31 * result + (lastBuildLabel != null ? lastBuildLabel.hashCode() : 0); result = 31 * result + (lastBuildTime != null ? lastBuildTime.hashCode() : 0); result = 31 * result + (webUrl != null ? webUrl.hashCode() : 0); result = 31 * result + (breakers != null ? breakers.hashCode() : 0); return result; } public String toString() { return String.format("ProjectStatus[%s, %s, %s, %s, %s, %s, %s]", name, activity, lastBuildStatus, lastBuildLabel, DateUtils.formatISO8601(lastBuildTime) + "(" + lastBuildTime.getTime() + ")", webUrl, breakers); } public String getLastBuildLabel() { return lastBuildLabel; } public Date getLastBuildTime() { return lastBuildTime; } public String getLastBuildStatus() { return lastBuildStatus; } public String name() { return name; } public Element ccTrayXmlElement(String fullContextPath) { Element element = new Element("Project"); element.setAttribute("name", name); element.setAttribute("activity", activity); element.setAttribute("lastBuildStatus", lastBuildStatus); element.setAttribute("lastBuildLabel", lastBuildLabel); element.setAttribute("lastBuildTime", DateUtils.formatIso8601ForCCTray(lastBuildTime)); element.setAttribute("webUrl", fullContextPath + "/" + webUrl); if (!breakers.isEmpty()) { addBreakers(element); } return element; } public Viewers viewers() { return viewers; } public ProjectStatus updateViewers(Viewers viewers) { this.viewers = viewers; return this; } public boolean canBeViewedBy(String userName) { return viewers.contains(userName); } public String xmlRepresentation() { if (cachedXmlRepresentation == null) { cachedXmlRepresentation = new XMLOutputter().outputString(ccTrayXmlElement(SITE_URL_PREFIX)); } return cachedXmlRepresentation; } public Set<String> getBreakers() { return breakers; } private void addBreakers(Element element) { Element messages = new Element("messages"); Element message = new Element("message"); String breakerNames = StringUtils.join(breakers, ", "); message.setAttribute("text", breakerNames); message.setAttribute("kind", "Breakers"); messages.addContent(message); element.addContent(messages); } public static class NullProjectStatus extends ProjectStatus { public NullProjectStatus(String name) { super(name, "", DEFAULT_LAST_BUILD_STATUS, DEFAULT_LAST_BUILD_LABEL, DEFAULT_LAST_BUILD_TIME, ""); } @Override public String xmlRepresentation() { return ""; } } }