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 extends Action> 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 {