package hudson.drools;
import hudson.model.Hudson;
import hudson.model.Job;
import hudson.model.ParameterValue;
import hudson.model.ParametersAction;
import hudson.model.Result;
import hudson.model.Run;
import hudson.model.StringParameterValue;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
public class RunWrapper implements Externalizable {
private static final long serialVersionUID = 1;
private transient Run<?, ?> run;
public RunWrapper(Run<?, ?> run) {
super();
this.run = run;
}
public RunWrapper() {
}
public Run getRun() {
return run;
}
public String getDisplayName() {
return run.getFullDisplayName();
}
public Result getResult() {
return run.getResult();
}
public boolean isSuccess() {
return run.getResult() == Result.SUCCESS;
}
public boolean isUnstable() {
return run.getResult() == Result.UNSTABLE;
}
public String getProjectName() {
return run.getParent().getName();
}
public int getBuildNumber() {
return run.getNumber();
}
@Override
public String toString() {
return run != null ? run.getFullDisplayName() : "";
}
@Override
public int hashCode() {
return run.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
RunWrapper other = (RunWrapper) obj;
return run == other.run;
}
public void writeExternal(ObjectOutput out) throws IOException {
String s = runToString(run);
out.writeUTF(s);
}
public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException {
String s = in.readUTF();
if (!"".equals(s)) {
run = stringToRun(s);
}
}
public static String runToString(Run run) {
if (run == null)
return "";
Job<?, ?> job = run.getParent();
String convertedValue = job.getName() + "#" + run.getNumber();
return convertedValue;
}
public static Run stringToRun(String id) {
if (id == null || "".equals(id))
return null;
int hash = id.lastIndexOf('#');
if (hash < 0) return null;
String jobName = id.substring(0, hash);
String runNumber = id.substring(hash + 1);
Hudson hudson = Hudson.getInstance();
if (hudson == null)
return null; // in simple unit test
Job<?, ?> job = (Job<?, ?>) hudson.getItemMap().get(jobName);
if (job == null)
return null;
Run<?, ?> run = job.getBuildByNumber(Integer.parseInt(runNumber));
return run;
}
public static final class ConverterImpl implements Converter {
public ConverterImpl() {
}
public boolean canConvert(Class type) {
return type == RunWrapper.class;
}
public void marshal(Object source, HierarchicalStreamWriter writer,
MarshallingContext context) {
RunWrapper src = (RunWrapper) source;
writer.setValue(runToString(src.run));
}
public Object unmarshal(HierarchicalStreamReader reader,
final UnmarshallingContext context) {
String id = reader.getValue();
Run r = stringToRun(id);
if (r != null) return new RunWrapper(r);
int hash = id.lastIndexOf('#');
if (hash > 0) {
String jobName = id.substring(0, hash);
String runNumber = id.substring(hash + 1);
return new NullRunWrapper(jobName, runNumber);
} else {
return new NullRunWrapper();
}
}
}
public static class NullRunWrapper extends RunWrapper {
private String buildNumber;
private String projectName;
public NullRunWrapper() {
// required for Externalizable
}
NullRunWrapper(String projectName, String buildNumber) {
super(null);
this.projectName = projectName;
this.buildNumber = buildNumber;
}
public String getDisplayName() {
return "build unavailable";
}
public Result getResult() {
return Result.NOT_BUILT;
}
public boolean isSuccess() {
return false;
}
public boolean isUnstable() {
return false;
}
public String getProjectName() {
return projectName;
}
@Override
public String toString() {
if (projectName != null && buildNumber != null) {
return projectName + " #" + buildNumber;
} else {
return "<unknown>";
}
}
@Override
public int hashCode() {
return toString().hashCode();
}
}
}