blueocean-plugin/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/AbstractRunImpl.java

224 lines
6.0 KiB
Java

package io.jenkins.blueocean.service.embedded.rest;
import hudson.model.Action;
import hudson.model.Run;
import io.jenkins.blueocean.commons.ServiceException;
import io.jenkins.blueocean.rest.Reachable;
import io.jenkins.blueocean.rest.hal.Link;
import io.jenkins.blueocean.rest.model.BlueActionProxy;
import io.jenkins.blueocean.rest.model.BlueChangeSetEntry;
import io.jenkins.blueocean.rest.model.BluePipelineNodeContainer;
import io.jenkins.blueocean.rest.model.BluePipelineStepContainer;
import io.jenkins.blueocean.rest.model.BlueQueueItem;
import io.jenkins.blueocean.rest.model.BlueRun;
import io.jenkins.blueocean.rest.model.Container;
import io.jenkins.blueocean.rest.model.Containers;
import io.jenkins.blueocean.rest.model.GenericResource;
import org.kohsuke.stapler.Stapler;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Basic {@link BlueRun} implementation.
*
* @author Vivek Pandey
*/
public class AbstractRunImpl<T extends Run> extends BlueRun {
protected final T run;
private final Link parent;
public AbstractRunImpl(T run, Link parent) {
this.run = run;
this.parent = parent;
}
//TODO: It serializes jenkins Run model children, enable this code after fixing it
// /**
// * Allow properties reachable through {@link Run} to be exposed upon request (via the tree parameter).
// */
// @Exported
// public T getRun() {
// return run;
// }
/**
* Subtype should return
*/
public Container<BlueChangeSetEntry> getChangeSet() {
return null;
}
@Override
public String getOrganization() {
return OrganizationImpl.INSTANCE.getName();
}
@Override
public String getId() {
return run.getId();
}
@Override
public String getPipeline() {
return run.getParent().getName();
}
@Override
public Date getStartTime() {
return new Date(run.getStartTimeInMillis());
}
@Override
public Date getEnQueueTime() {
return new Date(run.getTimeInMillis());
}
@Override
public BlueRunState getStateObj() {
if(!run.hasntStartedYet() && run.isLogUpdated()) {
return BlueRunState.RUNNING;
} else if(!run.isLogUpdated()){
return BlueRunState.FINISHED;
} else {
return BlueRunState.QUEUED;
}
}
@Override
public BlueRunResult getResult() {
return run.getResult() != null ? BlueRunResult.valueOf(run.getResult().toString()) : BlueRunResult.UNKNOWN;
}
@Override
public Date getEndTime() {
if (!run.isBuilding()) {
return new Date(run.getStartTimeInMillis() + run.getDuration());
}
return null;
}
@Override
public Long getDurationInMillis() {
return run.getDuration();
}
@Override
public Long getEstimatedDurtionInMillis() {
return run.getEstimatedDuration();
}
@Override
public String getRunSummary() {
return run.getBuildStatusSummary().message;
}
@Override
public String getType() {
return run.getClass().getSimpleName();
}
@Override
public Object getLog() {
return new LogResource(run.getLogText());
}
@Override
public BlueQueueItem replay() {
return null;
}
@Override
public Container<BlueArtifact> getArtifacts() {
Map<String, BlueArtifact> m = new HashMap<String, BlueArtifact>();
List<Run.Artifact> artifacts = run.getArtifacts();
for (final Run.Artifact artifact: artifacts) {
m.put(artifact.getFileName(), new BlueArtifact() {
@Override
public String getName() {
return artifact.getFileName();
}
@Override
public String getUrl() {
return Stapler.getCurrentRequest().getContextPath() +
"/" + run.getUrl()+"artifact/"+ artifact.getHref();
}
@Override
public long getSize() {
try {
return artifact.getFileSize();
} catch (NumberFormatException e) {
return 0;
}
}
@Override
public Link getLink() {
return new Link(getUrl());
}
});
}
return Containers.fromResourceMap(getLink(),m);
}
@Override
public BluePipelineNodeContainer getNodes() {
return null; // default
}
@Override
public BluePipelineStepContainer getSteps() {
return null;
}
public Collection<BlueActionProxy> getActions() {
return PipelineImpl.getActionProxies(run.getAllActions(), this);
}
protected static BlueRun getBlueRun(Run r, Reachable parent){
for(BlueRunFactory runFactory:BlueRunFactory.all()){
BlueRun blueRun = runFactory.getRun(r,parent);
if(blueRun != null){
return blueRun;
}
}
return new AbstractRunImpl<>(r, parent.getLink());
}
@Override
public BlueRun stop() {
throw new ServiceException.NotImplementedException("Stop should be implemented on a subclass");
}
/**
* Handles HTTP path handled by actions or other extensions
*
* @param token path token that an action or extension can handle
*
* @return action or extension that handles this path.
*/
public Object getDynamic(String token) {
for (Action a : run.getAllActions()) {
if (token.equals(a.getUrlName()))
return new GenericResource<>(a);
}
return null;
}
@Override
public Link getLink() {
if(parent == null){
return OrganizationImpl.INSTANCE.getLink().rel(String.format("pipelines/%s/runs/%s", run.getParent().getName(), getId()));
}
return parent.rel("runs/"+getId());
}
}