blob: 033dfe598e36a2bc06bf7cbd9b750825be26437d [file] [log] [blame]
package com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins.bfa.Analysed;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins.bfa.Analysis;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins.bfa.NotAnalysed;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins.claim.Claim;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins.claim.Claimed;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.plugins.claim.NotClaimed;
import com.sonyericsson.jenkins.plugins.bfa.model.FailureCauseBuildAction;
import hudson.model.Hudson;
import hudson.model.Run;
import hudson.plugins.claim.ClaimBuildAction;
import java.util.HashSet;
import java.util.Set;
// The pattern around Augmentation is a dubious and quite Poltergeisty. It can probably be
// improved with something akin to a Visitor pattern
public class BuildAugmentor {
public static String CLAIM_PLUGIN = "claim";
public static String ANALYSER_PLUGIN = "build-failure-analyzer";
public static BuildAugmentor fromDetectedPlugins() {
BuildAugmentor augmentor = new BuildAugmentor();
if (isInstalled(CLAIM_PLUGIN)) {
augmentor.support(Claim.class);
}
if (isInstalled(ANALYSER_PLUGIN)) {
augmentor.support(Analysis.class);
}
return augmentor;
}
private static boolean isInstalled(String plugin) {
return Hudson.getInstance().getPlugin(plugin) != null;
}
private Set<Class<? extends Augmentation>> recognisedAugmentations = new HashSet<Class<? extends Augmentation>>();
@SuppressWarnings("unchecked")
public <T extends Augmentation> T detailsOf(Run<?, ?> build, Class<T> augmentation) {
if (augmentation.isAssignableFrom(Claim.class)) {
return (T) detailsOfClaim(build);
} else {
assert augmentation.isAssignableFrom(Analysis.class) : "Unknown augmentation should never happen outside of development";
return (T) detailsOfAnalysis(build);
}
}
private <T extends Augmentation> boolean isSupported(Class<T> augmentation) {
return recognisedAugmentations.contains(augmentation);
}
private Claim detailsOfClaim(Run<?, ?> build) {
if (isSupported(Claim.class)) {
ClaimBuildAction action = build.getAction(ClaimBuildAction.class);
if (action != null) {
return new Claimed(action);
}
}
return new NotClaimed();
}
private Analysis detailsOfAnalysis(Run<?, ?> build) {
if (isSupported(Analysis.class)) {
FailureCauseBuildAction action = build.getAction(FailureCauseBuildAction.class);
if (action != null) {
// Should we also check if failures were found? is it "Analysed" or "HasKnownFailures"
return new Analysed(action);
}
}
return new NotAnalysed();
}
public void support(Class<? extends Augmentation> typeOfAugmentation) {
recognisedAugmentations.add(typeOfAugmentation);
}
}