diff --git a/pom.xml b/pom.xml index 7f99824..32e45ba 100644 --- a/pom.xml +++ b/pom.xml @@ -4,13 +4,13 @@ org.jenkins-ci.plugins plugin - 3.9 + 3.43 cppcheck hpi Jenkins Cppcheck Plug-in - 1.25-SNAPSHOT + 1.26-SNAPSHOT http://wiki.jenkins-ci.org/display/JENKINS/Cppcheck+Plugin @@ -48,15 +48,14 @@ UTF-8 1.6 1.6 - 2.2.1 - 2.2.1.1 + 2.3.0 2.1 5.0 4.12 1.8.5 2.0 2.60.3 - 7 + 8 @@ -80,16 +79,12 @@ structs 1.7 - - javax.xml.bind - jaxb-api - ${jaxb.api.version} - + - com.sun.xml.bind - jaxb-impl - ${jaxb.impl.version} + io.jenkins.plugins + jaxb + ${jaxb.version} diff --git a/src/main/java/com/thalesgroup/hudson/plugins/cppcheck/util/AbstractCppcheckBuildAction.java b/src/main/java/com/thalesgroup/hudson/plugins/cppcheck/util/AbstractCppcheckBuildAction.java index a77891b..2e102cc 100644 --- a/src/main/java/com/thalesgroup/hudson/plugins/cppcheck/util/AbstractCppcheckBuildAction.java +++ b/src/main/java/com/thalesgroup/hudson/plugins/cppcheck/util/AbstractCppcheckBuildAction.java @@ -24,9 +24,10 @@ import hudson.model.*; import org.kohsuke.stapler.StaplerProxy; +import jenkins.model.RunAction2; -public abstract class AbstractCppcheckBuildAction extends Actionable implements Action, HealthReportingAction, StaplerProxy { - protected Run owner; +public abstract class AbstractCppcheckBuildAction extends Actionable implements RunAction2, HealthReportingAction, StaplerProxy { + protected transient Run owner; protected AbstractCppcheckBuildAction(Run owner) { this.owner = owner; @@ -49,4 +50,16 @@ public T getPreviousResult() { public Run getOwner() { return owner; } + + public void setOwner(Run owner) { + this.owner = owner; + } + + public void onAttached(Run r) { + setOwner(r); + } + + public void onLoad(Run r) { + setOwner(r); + } } diff --git a/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckBuildAction.java b/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckBuildAction.java index e442151..c59ebc5 100644 --- a/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckBuildAction.java +++ b/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckBuildAction.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; import com.thalesgroup.hudson.plugins.cppcheck.util.AbstractCppcheckBuildAction; @@ -17,6 +18,8 @@ import org.jenkinsci.plugins.cppcheck.config.CppcheckConfigSeverityEvaluation; import org.jenkinsci.plugins.cppcheck.util.CppcheckBuildHealthEvaluator; +import javax.annotation.Nonnull; + /** * @author Gregory Boissinot */ @@ -24,9 +27,9 @@ public class CppcheckBuildAction extends AbstractCppcheckBuildAction implements public static final String URL_NAME = "cppcheckResult"; - private CppcheckResult result; + private final CppcheckResult result; + private final CppcheckConfig config; - private List projectActions; /** * The health report percentage. * @@ -34,15 +37,14 @@ public class CppcheckBuildAction extends AbstractCppcheckBuildAction implements */ private int healthReportPercentage; - public CppcheckBuildAction(Run owner, CppcheckResult result, CppcheckConfig config, + public CppcheckBuildAction(@Nonnull Run owner, @Nonnull CppcheckResult result, @Nonnull CppcheckConfig config, int healthReportPercentage) { super(owner); + this.result = result; + this.config = config; this.healthReportPercentage = healthReportPercentage; - - List projectActions = new ArrayList<>(); - projectActions.add(new CppcheckProjectAction(owner, config.getConfigGraph())); - this.projectActions = projectActions; + } public String getIconFileName() { @@ -65,6 +67,10 @@ public CppcheckResult getResult() { return this.result; } + public CppcheckConfig getConfig() { + return this.config; + } + Run getBuild() { return this.owner; } @@ -121,6 +127,18 @@ private Object readResolve() { @Override public Collection getProjectActions() { - return this.projectActions; + + if (this.owner == null) { + return Collections.emptySet(); + } else { + return Collections.singleton(new CppcheckProjectAction(owner.getParent())); + } + } + + @Override + public synchronized void setOwner(Run owner) { + super.setOwner(owner); + + this.result.setOwner(owner); } } diff --git a/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckProjectAction.java b/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckProjectAction.java index f97757f..48c95d6 100644 --- a/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckProjectAction.java +++ b/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckProjectAction.java @@ -2,6 +2,7 @@ import java.io.IOException; import java.util.Calendar; +import javax.annotation.Nonnull; import hudson.model.AbstractProject; import hudson.model.Job; import hudson.model.Run; @@ -21,77 +22,38 @@ * @author Gregory Boissinot */ public class CppcheckProjectAction extends AbstractCppcheckProjectAction { - /** Cppcheck graph configuration. */ - private final CppcheckConfigGraph configGraph; public String getSearchUrl() { return getUrlName(); } - public CppcheckProjectAction(final Run run, - CppcheckConfigGraph configGraph) { - super(run); - this.configGraph = configGraph; - } - private boolean isRunCompleted(Run run) { - if (run == null) { - return false; - } - - if (run.isBuilding()) { - return false; - } - - if (run.getResult() == Result.SUCCESS || run.getResult() == Result.UNSTABLE) { - return true; - } - - return false; + public CppcheckProjectAction(@Nonnull final Job job) { + super(job); } - + + @Override public Run getLastFinishedBuild() { - // get the very last build - no matter of its result or buildstate and search towards previous builds until the first successful or unstable result was found. - Run prevCompletedRun = run.getPreviousBuild(); - - Run lastRun = prevCompletedRun; - if (lastRun != null) - { - while(lastRun != null && lastRun.getNextBuild() != null) { - lastRun = lastRun.getNextBuild(); - } - } - else - { - return prevCompletedRun; - } - - while(lastRun != null) { - if (isRunCompleted(lastRun)) { - return lastRun; - - } - lastRun = lastRun.getPreviousBuild(); - } - return null; - } + Run lastBuild = getJob().getLastBuild(); + while (lastBuild != null + && (lastBuild.isBuilding() || lastBuild.getAction(CppcheckBuildAction.class) == null)) + { + lastBuild = lastBuild.getPreviousBuild(); + } - public final Run getProject() { - CppcheckBuildAction lastAction = getLastFinishedBuildAction(); - return (lastAction != null) ? lastAction.getOwner() : null; - } - - public Run getRun() { - return super.run; + return lastBuild; } - /** - * Get build action of the last finished build. - * - * @return the build action or null - */ - public CppcheckBuildAction getLastFinishedBuildAction() { - Run lastBuild = getLastFinishedBuild(); - return (lastBuild != null) ? lastBuild.getAction(CppcheckBuildAction.class) : null; + + @Override + public Run getLastResultBuild() { + for (Run b = getJob().getLastBuild(); b != null; b = b.getPreviousBuiltBuild()) + { + CppcheckBuildAction r = b.getAction(CppcheckBuildAction.class); + + if (r != null) + return b; + } + return null; } public final boolean isDisplayGraph() { @@ -101,36 +63,24 @@ public final boolean isDisplayGraph() { return false; } - //Affect previous - b = b.getPreviousBuild(); - if (b != null) { - - for (; b != null; b = b.getPreviousBuild()) { - if (b.getResult().isWorseOrEqualTo(Result.FAILURE)) { - continue; - } - CppcheckBuildAction action = b.getAction(CppcheckBuildAction.class); - if (action == null || action.getResult() == null) { - continue; - } - CppcheckResult result = action.getResult(); - if (result == null) - continue; - - return true; - } - } - return false; - } + // Affect previous + for (b = b.getPreviousBuild(); b != null; b = b.getPreviousBuild()) + { + if (b.getResult() == null || b.getResult().isWorseOrEqualTo(Result.FAILURE)) + continue; - public Integer getLastResultBuild() { - Run b = getLastFinishedBuild(); - if (b != null) { - return b.getNumber(); - } - return null; - } + CppcheckBuildAction action = b.getAction(CppcheckBuildAction.class); + if (action == null || + action.getResult() == null || + action.getConfig() == null || + action.getConfig().getConfigGraph() == null) + continue; + return true; + } + + return false; + } public String getDisplayName() { return Messages.cppcheck_CppcheckResults(); @@ -153,17 +103,29 @@ public void doGraph(StaplerRequest req, StaplerResponse rsp) throws IOException return; } - Graph g = new CppcheckGraph(lastBuild, getDataSetBuilder().build(), - Messages.cppcheck_NumberOfErrors(), - configGraph.getXSize(), - configGraph.getYSize()); + Run lastBuildWithResult = getLastResultBuild(); + CppcheckBuildAction lastAction = lastBuildWithResult.getAction(CppcheckBuildAction.class); + CppcheckConfigGraph configGraph = (lastAction != null) ? + ((lastAction.getConfig() != null) ? + lastAction.getConfig().getConfigGraph() : null) : null; + + if (configGraph == null) { + rsp.sendRedirect2(req.getContextPath() + "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/images/headless.png"); + return; + } + + Graph g = new CppcheckGraph(lastBuild, getDataSetBuilder(configGraph).build(), Messages.cppcheck_NumberOfErrors(), + configGraph.getXSize(), configGraph.getYSize()); g.doPng(req, rsp); } - private DataSetBuilder getDataSetBuilder() { + private DataSetBuilder getDataSetBuilder(CppcheckConfigGraph configGraph) { DataSetBuilder dsb = new DataSetBuilder(); + if (configGraph == null) + return dsb; + Run lastBuild = getLastFinishedBuild(); CppcheckBuildAction lastAction = lastBuild.getAction(CppcheckBuildAction.class); @@ -171,7 +133,7 @@ private DataSetBuilder getDataSetBuilder // numBuildsInGraph <= 1 means unlimited for (CppcheckBuildAction a = lastAction; - a != null && (configGraph.getNumBuildsInGraph() <= 1 || numBuilds < configGraph.getNumBuildsInGraph()); + (a != null) && (configGraph.getNumBuildsInGraph() <= 1 || numBuilds < configGraph.getNumBuildsInGraph()); a = a.getPreviousResult(), ++numBuilds) { ChartUtil.NumberOnlyBuildLabel label = new ChartUtil.NumberOnlyBuildLabel(a.getOwner()); diff --git a/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckResult.java b/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckResult.java index 58df0da..5eb6133 100644 --- a/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckResult.java +++ b/src/main/java/org/jenkinsci/plugins/cppcheck/CppcheckResult.java @@ -115,10 +115,14 @@ public CppcheckStatistics getStatistics() { return statistics; } - public Run getOwner() { + public synchronized Run getOwner() { return owner; } + public synchronized void setOwner(Run owner) { + this.owner = owner; + } + public CppcheckSourceContainer getCppcheckSourceContainer() { return lazyLoadSourceContainer(); } diff --git a/src/main/java/org/jenkinsci/plugins/cppcheck/util/AbstractCppcheckProjectAction.java b/src/main/java/org/jenkinsci/plugins/cppcheck/util/AbstractCppcheckProjectAction.java index 1157b41..aa8d2ec 100644 --- a/src/main/java/org/jenkinsci/plugins/cppcheck/util/AbstractCppcheckProjectAction.java +++ b/src/main/java/org/jenkinsci/plugins/cppcheck/util/AbstractCppcheckProjectAction.java @@ -1,27 +1,29 @@ package org.jenkinsci.plugins.cppcheck.util; import hudson.model.Actionable; +import hudson.model.ProminentProjectAction; +import hudson.model.Job; import hudson.model.Run; -import hudson.model.Action; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; import java.io.IOException; +import javax.annotation.Nonnull; /** * @author Gregory Boissinot */ -public abstract class AbstractCppcheckProjectAction extends Actionable implements Action { +public abstract class AbstractCppcheckProjectAction extends Actionable implements ProminentProjectAction { - protected final Run run; + protected final transient Job job; - public AbstractCppcheckProjectAction(Run run) { - this.run = run; + public AbstractCppcheckProjectAction(@Nonnull Job job) { + this.job = job; } - public Run getRun() { - return run; + @Nonnull public Job getJob() { + return job; } public String getIconFileName() { @@ -34,12 +36,12 @@ public String getSearchUrl() { protected abstract Run getLastFinishedBuild(); - protected abstract Integer getLastResultBuild(); + protected abstract Run getLastResultBuild(); public abstract void doGraph(StaplerRequest req, StaplerResponse rsp) throws IOException; public void doIndex(StaplerRequest req, StaplerResponse rsp) throws IOException { - Integer buildNumber = getLastResultBuild(); + Integer buildNumber = (getLastResultBuild() != null) ? getLastResultBuild().getNumber() : null; if (buildNumber == null) { rsp.sendRedirect2("nodata"); } else {