diff --git a/maven-plugin/src/main/java/hudson/maven/MavenBuild.java b/maven-plugin/src/main/java/hudson/maven/MavenBuild.java index a4180ae1c77b07b18cf19dbb4e271d171e6a7ee2..2a4c65297545469e8f4eca2aaca932589fd4913e 100644 --- a/maven-plugin/src/main/java/hudson/maven/MavenBuild.java +++ b/maven-plugin/src/main/java/hudson/maven/MavenBuild.java @@ -73,7 +73,7 @@ public class MavenBuild extends AbstractMavenBuild { * {@link MavenReporter}s that will contribute project actions. * Can be null if there's none. */ - /*package*/ List projectActionReporters; + /*package*/ List projectActionReporters; /** * {@link ExecutedMojo}s that record what was run. @@ -184,10 +184,22 @@ public class MavenBuild extends AbstractMavenBuild { public void registerAsProjectAction(MavenReporter reporter) { if(projectActionReporters==null) - projectActionReporters = new ArrayList(); + projectActionReporters = new ArrayList(); projectActionReporters.add(reporter); } + public void registerAsProjectAction(MavenProjectActionBuilder builder) { + if(projectActionReporters==null) + projectActionReporters = new ArrayList(); + projectActionReporters.add(builder); + } + + public List getProjectActionBuilders() { + if(projectActionReporters==null) + return Collections.emptyList(); + return Collections.unmodifiableList(projectActionReporters); + } + public List getExecutedMojos() { if(executedMojos==null) return Collections.emptyList(); @@ -374,6 +386,10 @@ public class MavenBuild extends AbstractMavenBuild { MavenBuild.this.registerAsProjectAction(reporter); } + public void registerAsProjectAction(MavenProjectActionBuilder builder) { + MavenBuild.this.registerAsProjectAction(builder); + } + public void registerAsAggregatedProjectAction(MavenReporter reporter) { MavenModuleSetBuild pb = getParentBuild(); if(pb!=null) diff --git a/maven-plugin/src/main/java/hudson/maven/MavenBuildProxy.java b/maven-plugin/src/main/java/hudson/maven/MavenBuildProxy.java index 059f148590d12cbffabf9b99a2a99f6dd5c69b68..8e89221f8a502dfdb15e1d23bc19a48c2b4694a6 100644 --- a/maven-plugin/src/main/java/hudson/maven/MavenBuildProxy.java +++ b/maven-plugin/src/main/java/hudson/maven/MavenBuildProxy.java @@ -128,6 +128,18 @@ public interface MavenBuildProxy { */ void registerAsProjectAction(MavenReporter reporter); + /** + * Nominates that the reporter will contribute a project action + * for this build by using {@link MavenReporter#getProjectActions(MavenModule)}. + * + *

+ * The specified {@link MavenReporter} object will be transferred to the master + * and will become a persisted part of the {@link MavenBuild}. + * + * @since 1.372 + */ + void registerAsProjectAction(MavenProjectActionBuilder builder); + /** * Nominates that the reporter will contribute a project action * for this build by using {@link MavenReporter#getAggregatedProjectAction(MavenModuleSet)}. @@ -214,6 +226,10 @@ public interface MavenBuildProxy { core.registerAsProjectAction(reporter); } + public void registerAsProjectAction(MavenProjectActionBuilder builder) { + core.registerAsProjectAction(builder); + } + public void registerAsAggregatedProjectAction(MavenReporter reporter) { core.registerAsAggregatedProjectAction(reporter); } diff --git a/maven-plugin/src/main/java/hudson/maven/MavenModule.java b/maven-plugin/src/main/java/hudson/maven/MavenModule.java index e4dd9142bb8301a8ba87079874cbde3030052248..25cd3e36faf2cc57b854e74dadafee632027bf87 100644 --- a/maven-plugin/src/main/java/hudson/maven/MavenModule.java +++ b/maven-plugin/src/main/java/hudson/maven/MavenModule.java @@ -412,10 +412,10 @@ public final class MavenModule extends AbstractMavenProject added) { if(build==null) return; - List list = build.projectActionReporters; + List list = build.projectActionReporters; if(list==null) return; - for (MavenReporter step : list) { + for (MavenProjectActionBuilder step : list) { if(!added.add(step.getClass())) continue; // already added try { transientActions.addAll(step.getProjectActions(this)); diff --git a/maven-plugin/src/main/java/hudson/maven/MavenProjectActionBuilder.java b/maven-plugin/src/main/java/hudson/maven/MavenProjectActionBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..711b1f3ef33164eb2100367aa1609ace528153b6 --- /dev/null +++ b/maven-plugin/src/main/java/hudson/maven/MavenProjectActionBuilder.java @@ -0,0 +1,37 @@ +package hudson.maven; + +import hudson.model.AbstractProject; +import hudson.model.Action; +import hudson.tasks.BuildStep; + +import java.util.Collection; + +/** + * Can contribute to project actions. + * + * + * @author Kohsuke Kawaguchi + * @see MavenBuildProxy#registerAsProjectAction(MavenProjectActionBuilder) + */ +public interface MavenProjectActionBuilder { + /** + * Equivalent of {@link BuildStep#getProjectActions(AbstractProject)}. + * + *

+ * Registers a transient action to {@link MavenModule} when it's rendered. + * This is useful if you'd like to display an action at the module level. + * + *

+ * Since this contributes a transient action, the returned {@link Action} + * will not be serialized. + * + *

+ * For this method to be invoked, call + * {@link MavenBuildProxy#registerAsProjectAction(MavenProjectActionBuilder)} during the build. + * + * @return + * can be empty but never null. + * @since 1.341 + */ + public Collection getProjectActions(MavenModule module); +} diff --git a/maven-plugin/src/main/java/hudson/maven/MavenReporter.java b/maven-plugin/src/main/java/hudson/maven/MavenReporter.java index 3fa17a12f72a40aaf90d0710b7378f5dd40dace8..68d0d685eed2a0b84a680b6d087c2c9ca14a35d8 100644 --- a/maven-plugin/src/main/java/hudson/maven/MavenReporter.java +++ b/maven-plugin/src/main/java/hudson/maven/MavenReporter.java @@ -97,7 +97,7 @@ import java.util.Collections; * @author Kohsuke Kawaguchi * @see MavenReporters */ -public abstract class MavenReporter implements Describable, ExtensionPoint, Serializable { +public abstract class MavenReporter implements Describable, ExtensionPoint, Serializable, MavenProjectActionBuilder { /** * Called before the actual maven2 execution begins. * diff --git a/maven-plugin/src/main/java/hudson/maven/reporters/SurefireArchiver.java b/maven-plugin/src/main/java/hudson/maven/reporters/SurefireArchiver.java index 81ca20f8d7e9aa78572f0e060cb0f2167af2df15..0dff12bedf9b71e6a5a19eb5fe3d427bc7af9525 100644 --- a/maven-plugin/src/main/java/hudson/maven/reporters/SurefireArchiver.java +++ b/maven-plugin/src/main/java/hudson/maven/reporters/SurefireArchiver.java @@ -30,6 +30,7 @@ import hudson.maven.MavenBuildProxy; import hudson.maven.MavenBuildProxy.BuildCallable; import hudson.maven.MavenBuilder; import hudson.maven.MavenModule; +import hudson.maven.MavenProjectActionBuilder; import hudson.maven.MavenReporter; import hudson.maven.MavenReporterDescriptor; import hudson.maven.MojoInfo; @@ -113,7 +114,7 @@ public class SurefireArchiver extends MavenReporter { sr.setResult(result,listener); if(result.getFailCount()>0) build.setResult(Result.UNSTABLE); - build.registerAsProjectAction(SurefireArchiver.this); + build.registerAsProjectAction(new FactoryImpl()); return result.getFailCount(); } }); @@ -128,9 +129,13 @@ public class SurefireArchiver extends MavenReporter { return true; } - - public Collection getProjectActions(MavenModule module) { - return Collections.singleton(new TestResultProjectAction(module)); + /** + * Part of the serialization data attached to {@link MavenBuild}. + */ + static final class FactoryImpl implements MavenProjectActionBuilder { + public Collection getProjectActions(MavenModule module) { + return Collections.singleton(new TestResultProjectAction(module)); + } } private boolean isSurefireTest(MojoInfo mojo) { diff --git a/test/src/test/java/hudson/maven/reporters/SurefireArchiverTest.java b/test/src/test/java/hudson/maven/reporters/SurefireArchiverTest.java new file mode 100644 index 0000000000000000000000000000000000000000..4d3f176e3a98d3ac89876d0734d1ec81712ce9c1 --- /dev/null +++ b/test/src/test/java/hudson/maven/reporters/SurefireArchiverTest.java @@ -0,0 +1,39 @@ +package hudson.maven.reporters; + +import hudson.maven.MavenBuild; +import hudson.maven.MavenModuleSet; +import hudson.maven.MavenModuleSetBuild; +import hudson.maven.MavenProjectActionBuilder; +import hudson.maven.reporters.SurefireArchiver.FactoryImpl; +import hudson.model.Result; +import org.jvnet.hudson.test.ExtractResourceSCM; +import org.jvnet.hudson.test.HudsonTestCase; + +/** + * @author Kohsuke Kawaguchi + */ +public class SurefireArchiverTest extends HudsonTestCase { + public void testSerialization() throws Exception { + configureDefaultMaven(); + MavenModuleSet m = createMavenProject(); + m.setScm(new ExtractResourceSCM(getClass().getResource("../maven-surefire-unstable.zip"))); + m.setGoals("install"); + + MavenModuleSetBuild b = m.scheduleBuild2(0).get(); + assertBuildStatus(Result.UNSTABLE, b); + + + MavenBuild mb = b.getModuleLastBuilds().values().iterator().next(); + boolean foundFactory=false,foundSurefire=false; + for (MavenProjectActionBuilder x : mb.getProjectActionBuilders()) { + if (x instanceof FactoryImpl) + foundFactory = true; + if (x instanceof SurefireArchiver) + foundSurefire = true; + } + + assertTrue(foundFactory); + assertFalse(foundSurefire); + } + +}