/* * Copyright 2000-2011 JetBrains s.r.o. * * 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 jetbrains.buildServer.server.rest.model.build; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; import jetbrains.buildServer.ServiceLocator; import jetbrains.buildServer.server.rest.ApiUrlBuilder; import jetbrains.buildServer.server.rest.data.DataProvider; import jetbrains.buildServer.server.rest.model.Comment; import jetbrains.buildServer.server.rest.model.Properties; import jetbrains.buildServer.server.rest.model.Util; import jetbrains.buildServer.server.rest.model.agent.AgentRef; import jetbrains.buildServer.server.rest.model.buildType.BuildTypeRef; import jetbrains.buildServer.server.rest.model.change.ChangesRef; import jetbrains.buildServer.server.rest.model.change.Revisions; import jetbrains.buildServer.server.rest.model.issue.IssueUsages; import jetbrains.buildServer.server.rest.util.BeanFactory; import jetbrains.buildServer.serverSide.*; import jetbrains.buildServer.serverSide.dependency.BuildDependency; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; /** * User: Yegor Yarko * Date: 29.03.2009 */ //todo: add changes //todo: reuse fields code from DataProvider @XmlRootElement(name = "build") @XmlType(propOrder = {"running", "pinned", "history", "personal", "webUrl", "href", "status", "number", "id", "runningBuildInfo", "statusText", "buildType", "startDate", "finishDate", "agent", "comment", "tags", "pinInfo", "properties", "buildDependencies", "revisions", "changes", "issues"}) public class Build { @NotNull protected SBuild myBuild; @NotNull private DataProvider myDataProvider; private ApiUrlBuilder myApiUrlBuilder; @Autowired BeanFactory myFactory; private ServiceLocator myServiceLocator; public Build() { } public Build(@NotNull final SBuild build, @NotNull final DataProvider dataProvider, final ApiUrlBuilder apiUrlBuilder, @NotNull final ServiceLocator serviceLocator, final BeanFactory myFactory) { myBuild = build; myDataProvider = dataProvider; myApiUrlBuilder = apiUrlBuilder; myServiceLocator = serviceLocator; myFactory.autowire(this); } @XmlAttribute public long getId() { return myBuild.getBuildId(); } @XmlAttribute public String getNumber() { return myBuild.getBuildNumber(); } @XmlAttribute public String getHref() { return myApiUrlBuilder.getHref(myBuild); } @XmlAttribute public String getStatus() { return myBuild.getStatusDescriptor().getStatus().getText(); } @XmlAttribute public boolean isHistory() { return myBuild.isOutOfChangesSequence(); } @XmlAttribute public boolean isPinned() { return myBuild.isPinned(); } @XmlAttribute public boolean isPersonal() { return myBuild.isPersonal(); } @XmlAttribute public String getWebUrl() { return myDataProvider.getBuildUrl(myBuild); } @XmlElement public String getStatusText() { return myBuild.getStatusDescriptor().getText(); } @XmlElement public AgentRef getAgent() { final SBuildAgent agent = myDataProvider.findAgentByName(myBuild.getAgentName()); if (agent == null) { return new AgentRef(myBuild.getAgentName()); } return new AgentRef(agent, myApiUrlBuilder); } @XmlElement public BuildTypeRef getBuildType() { return new BuildTypeRef(myBuild.getBuildType(), myDataProvider, myApiUrlBuilder); } //todo: investigate common date formats approach @XmlElement public String getStartDate() { return Util.formatTime(myBuild.getStartDate()); } @XmlElement public String getFinishDate() { return Util.formatTime(myBuild.getFinishDate()); } @XmlElement(defaultValue = "") public Comment getComment() { final jetbrains.buildServer.serverSide.comments.Comment comment = myBuild.getBuildComment(); if (comment != null) { return new Comment(comment, myApiUrlBuilder); } return null; } @XmlElement public Tags getTags() { return new Tags(myBuild.getTags()); } @XmlElement(name = "pinInfo") public Comment getPinInfo(){ if (!myBuild.isFinished()) { return null; } SFinishedBuild finishedBuild = (SFinishedBuild)myBuild; //todo: is this OK? final jetbrains.buildServer.serverSide.comments.Comment pinComment = finishedBuild.getPinComment(); if (pinComment == null){ return null; } return new Comment(pinComment, myApiUrlBuilder); } @XmlElement public Properties getProperties() { return new Properties(myBuild.getBuildPromotion().getParameters()); } @XmlAttribute(name = "running") public Boolean getRunning() { if (myBuild.isFinished()) { return null; } else { return true; } } @XmlElement(name = "running-info") public RunningBuildInfo getRunningBuildInfo() { if (myBuild.isFinished()) { return null; } SRunningBuild runningBuild = myServiceLocator.getSingletonService(RunningBuildsManager.class).findRunningBuildById(myBuild.getBuildId()); if (runningBuild == null){ return null; } return new RunningBuildInfo(runningBuild); } @XmlElement(name = "dependency-build") public List getBuildDependencies() { return getBuildRefs(myBuild.getBuildPromotion().getDependencies(), myDataProvider); } @XmlElement(name = "revisions") public Revisions getRevisions() { return new Revisions(myBuild.getRevisions(), myApiUrlBuilder); } @XmlElement(name = "changes") public ChangesRef getChanges() { return new ChangesRef(myBuild, myApiUrlBuilder); } @XmlElement(name = "relatedIssues") public IssueUsages getIssues() { return new IssueUsages(myBuild.getRelatedIssues(), myBuild, myApiUrlBuilder, myFactory); } private List getBuildRefs(@NotNull Collection dependencies, @NotNull final DataProvider dataProvider) { List result = new ArrayList(dependencies.size()); for (BuildDependency dependency : dependencies) { final SBuild dependOnBuild = dependency.getDependOn().getAssociatedBuild(); if (dependOnBuild != null) { result.add(new BuildRef(dependOnBuild, dataProvider, myApiUrlBuilder)); } } return result; } }