From e5e163f26fdd8de96afa4a71e91d88a64bbfb67b Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Mon, 7 Nov 2011 14:23:35 -0800 Subject: [PATCH] fixing up the semantics and adding a test. --- .../main/java/hudson/matrix/MatrixBuild.java | 30 ++++++------ .../hudson/matrix/MatrixConfiguration.java | 15 +----- .../java/hudson/matrix/MatrixProject.java | 21 ++++++--- .../matrix/NoopMatrixConfigurationSorter.java | 33 +++++++++++++ .../MatrixConfigurationSorter/config.groovy | 1 + .../MatrixProject/configure-entries.jelly | 10 ++-- .../matrix/MatrixConfigurationSorterTest.java | 46 +++++++++++++++++++ 7 files changed, 118 insertions(+), 38 deletions(-) create mode 100644 core/src/main/java/hudson/matrix/NoopMatrixConfigurationSorter.java create mode 100644 core/src/main/resources/hudson/matrix/MatrixConfigurationSorter/config.groovy create mode 100644 test/src/test/java/hudson/matrix/MatrixConfigurationSorterTest.java diff --git a/core/src/main/java/hudson/matrix/MatrixBuild.java b/core/src/main/java/hudson/matrix/MatrixBuild.java index 8dc9d7043b..3e4a48ebe4 100644 --- a/core/src/main/java/hudson/matrix/MatrixBuild.java +++ b/core/src/main/java/hudson/matrix/MatrixBuild.java @@ -29,15 +29,16 @@ import hudson.matrix.listeners.MatrixBuildListener; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.BuildListener; +import hudson.model.Cause.UpstreamCause; import hudson.model.Executor; import hudson.model.Fingerprint; -import jenkins.model.Jenkins; -import hudson.model.JobProperty; import hudson.model.ParametersAction; import hudson.model.Queue; import hudson.model.Result; -import hudson.model.Cause.UpstreamCause; -import hudson.tasks.Publisher; +import jenkins.model.Jenkins; +import org.kohsuke.stapler.StaplerRequest; +import org.kohsuke.stapler.StaplerResponse; +import org.kohsuke.stapler.export.Exported; import java.io.File; import java.io.IOException; @@ -45,13 +46,10 @@ import java.io.PrintStream; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; +import java.util.Comparator; import java.util.HashSet; import java.util.List; - import java.util.TreeSet; -import org.kohsuke.stapler.StaplerRequest; -import org.kohsuke.stapler.StaplerResponse; -import org.kohsuke.stapler.export.Exported; /** * Build of {@link MatrixProject}. @@ -261,11 +259,11 @@ public class MatrixBuild extends AbstractBuild { for (MatrixAggregator a : aggregators) if(!a.startBuild()) return Result.FAILURE; - - MatrixConfigurationSorter sorter = p.getSorter(); - if(p.getSorter()!=null){ - touchStoneConfigurations = new TreeSet(touchStoneConfigurations); - delayedConfigurations = new TreeSet(delayedConfigurations); + + MatrixConfigurationSorter sorter = p.getSorter(); + if (sorter != null) { + touchStoneConfigurations = createTreeSet(touchStoneConfigurations, sorter); + delayedConfigurations = createTreeSet(delayedConfigurations,sorter); } try { @@ -401,6 +399,12 @@ public class MatrixBuild extends AbstractBuild { } } + private TreeSet createTreeSet(Collection items, Comparator sorter) { + TreeSet r = new TreeSet(sorter); + r.addAll(items); + return r; + } + /** * A private exception to help maintain the correct control flow after extracting the 'waitForCompletion' method */ diff --git a/core/src/main/java/hudson/matrix/MatrixConfiguration.java b/core/src/main/java/hudson/matrix/MatrixConfiguration.java index 733acb7dbd..14d7d8af29 100644 --- a/core/src/main/java/hudson/matrix/MatrixConfiguration.java +++ b/core/src/main/java/hudson/matrix/MatrixConfiguration.java @@ -56,7 +56,7 @@ import java.util.Map; * * @author Kohsuke Kawaguchi */ -public class MatrixConfiguration extends Project implements SCMedItem, NonBlockingTask, Comparable { +public class MatrixConfiguration extends Project implements SCMedItem, NonBlockingTask { /** * The actual value combination. */ @@ -290,19 +290,6 @@ public class MatrixConfiguration extends Project throw new UnsupportedOperationException(); } - public int compareTo(MatrixConfiguration that) { - MatrixConfigurationSorter sorter = getParent().getSorter(); - try { - if (sorter != null) { - return getParent().getSorter().compare(this, that); - } else { - return getDisplayName().compareTo(((MatrixConfiguration) that).getDisplayName()); - } - } catch (Exception e) { - throw new IllegalArgumentException(e); - } - } - /** * Returns true if this configuration is a configuration * currently in use today (as opposed to the ones that are diff --git a/core/src/main/java/hudson/matrix/MatrixProject.java b/core/src/main/java/hudson/matrix/MatrixProject.java index 7541c17015..cbe33f1968 100644 --- a/core/src/main/java/hudson/matrix/MatrixProject.java +++ b/core/src/main/java/hudson/matrix/MatrixProject.java @@ -153,8 +153,11 @@ public class MatrixProject extends AbstractProject im public MatrixProject(ItemGroup parent, String name) { super(parent, name); } - - public MatrixConfigurationSorter getSorter(){ + + /** + * @return can be null (to indicate that the configurations should be left to their natural order.) + */ + public MatrixConfigurationSorter getSorter() { return sorter; } @@ -586,12 +589,18 @@ public class MatrixProject extends AbstractProject im checkAxisNames(newAxes); this.axes = new AxisList(newAxes.toList()); + runSequentially = json.optBoolean("runSequentially"); + // set sorter if any sorter is chosen - MatrixConfigurationSorter s = req.bindJSON(MatrixConfigurationSorter.class,json.optJSONObject("sorter")); - s.validate(this); - setSorter(s); + if (runSequentially) { + MatrixConfigurationSorter s = req.bindJSON(MatrixConfigurationSorter.class,json.optJSONObject("sorter")); + if (s!=null) s.validate(this); + if (s instanceof NoopMatrixConfigurationSorter) s=null; + setSorter(s); + } else { + setSorter(null); + } - runSequentially = json.has("runSequentially"); buildWrappers.rebuild(req, json, BuildWrappers.getFor(this)); builders.rebuildHetero(req, json, Builder.all(), "builder"); diff --git a/core/src/main/java/hudson/matrix/NoopMatrixConfigurationSorter.java b/core/src/main/java/hudson/matrix/NoopMatrixConfigurationSorter.java new file mode 100644 index 0000000000..099b03baff --- /dev/null +++ b/core/src/main/java/hudson/matrix/NoopMatrixConfigurationSorter.java @@ -0,0 +1,33 @@ +package hudson.matrix; + +import hudson.Extension; +import hudson.util.FormValidation; +import org.kohsuke.stapler.DataBoundConstructor; + +/** + * Place holder for default "do not sort" {@link MatrixConfigurationSorter}. + * + * @author Kohsuke Kawaguchi + */ +public class NoopMatrixConfigurationSorter extends MatrixConfigurationSorter { + @DataBoundConstructor + public NoopMatrixConfigurationSorter() { + } + + @Override + public void validate(MatrixProject p) throws FormValidation { + // nothing + } + + public int compare(MatrixConfiguration o1, MatrixConfiguration o2) { + return o1.getDisplayName().compareTo(o2.getDisplayName()); + } + + @Extension(ordinal=100) // this is the default + public static class DescriptorImpl extends MatrixConfigurationSorterDescriptor { + @Override + public String getDisplayName() { + return "Doesn't care"; + } + } +} diff --git a/core/src/main/resources/hudson/matrix/MatrixConfigurationSorter/config.groovy b/core/src/main/resources/hudson/matrix/MatrixConfigurationSorter/config.groovy new file mode 100644 index 0000000000..39b2321cea --- /dev/null +++ b/core/src/main/resources/hudson/matrix/MatrixConfigurationSorter/config.groovy @@ -0,0 +1 @@ +// default is empty \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries.jelly b/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries.jelly index f7c16c3eb5..0a13bae520 100644 --- a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries.jelly +++ b/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries.jelly @@ -59,11 +59,11 @@ THE SOFTWARE. addCaption="${%Add axis}"/> - - - - - + + + + + diff --git a/test/src/test/java/hudson/matrix/MatrixConfigurationSorterTest.java b/test/src/test/java/hudson/matrix/MatrixConfigurationSorterTest.java new file mode 100644 index 0000000000..96fc84c3b7 --- /dev/null +++ b/test/src/test/java/hudson/matrix/MatrixConfigurationSorterTest.java @@ -0,0 +1,46 @@ +package hudson.matrix; + +import hudson.util.FormValidation; +import org.jvnet.hudson.test.HudsonTestCase; +import org.jvnet.hudson.test.TestExtension; +import org.kohsuke.stapler.DataBoundConstructor; + +/** + * @author Kohsuke Kawaguchi + */ +public class MatrixConfigurationSorterTest extends HudsonTestCase { + public void testConfigRoundtrip() throws Exception { + MatrixProject p = createMatrixProject(); + configRoundtrip(p); + assertNull(p.getSorter()); + + SorterImpl before = new SorterImpl(); + p.setSorter(before); + p.setRunSequentially(true); + configRoundtrip(p); + Object after = p.getSorter(); + assertNotSame(before,after); + assertSame(before.getClass(),after.getClass()); + } + + public static class SorterImpl extends MatrixConfigurationSorter { + @DataBoundConstructor + public SorterImpl() {} + + @Override + public void validate(MatrixProject p) throws FormValidation { + } + + public int compare(MatrixConfiguration o1, MatrixConfiguration o2) { + return o1.getDisplayName().compareTo(o2.getDisplayName()); + } + + @TestExtension + public static class DescriptorImpl extends MatrixConfigurationSorterDescriptor { + @Override + public String getDisplayName() { + return "Test Sorter"; + } + } + } +} -- GitLab