diff --git a/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView.java b/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView.java index 12e065443..4f059cfbe 100644 --- a/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView.java +++ b/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView.java @@ -91,6 +91,11 @@ public String currentbuildFailureAnalyzerDisplayedField() { return currentConfig().getBuildFailureAnalyzerDisplayedField().getValue(); } + @SuppressWarnings("unused") // used in the configure-entries.jelly form + public String explicitOrder() { + return currentConfig().getExplicitOrder(); + } + @SuppressWarnings("unused") // used in the configure-entries.jelly form public boolean isDisplayCommitters() { return currentConfig().shouldDisplayCommitters(); @@ -116,8 +121,11 @@ protected void submit(StaplerRequest req) throws ServletException, IOException, synchronized (this) { - String requestedOrdering = req.getParameter("order"); - title = req.getParameter("title"); + String requestedOrdering = req.getParameter("orderSelect"); + if ("explicit".equals(req.getParameter("order"))) { + requestedOrdering = "ExplicitOrder"; + } + title = req.getParameter("title"); currentConfig().setDisplayCommitters(json.optBoolean("displayCommitters", true)); currentConfig().setBuildFailureAnalyzerDisplayedField(req.getParameter("buildFailureAnalyzerDisplayedField")); @@ -127,6 +135,7 @@ protected void submit(StaplerRequest req) throws ServletException, IOException, } catch (Exception e) { throw new FormException("Can't order projects by " + requestedOrdering, "order"); } + currentConfig().setExplicitOrder(req.getParameter("explicitOrder")); } } diff --git a/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/Config.java b/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/Config.java index c10b3296f..739e30f13 100644 --- a/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/Config.java +++ b/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/Config.java @@ -2,6 +2,8 @@ import com.google.common.base.Objects; import com.smartcodeltd.jenkinsci.plugins.buildmonitor.order.ByName; +import com.smartcodeltd.jenkinsci.plugins.buildmonitor.order.ExplicitOrder; + import hudson.model.Job; import java.util.Comparator; @@ -11,6 +13,8 @@ public class Config { private boolean displayCommitters; + private Comparator> order; + private String explicitOrder; private BuildFailureAnalyzerDisplayedField buildFailureAnalyzerDisplayedField; public static Config defaultConfig() { @@ -31,6 +35,16 @@ public static Config defaultConfig() { public void setOrder(Comparator> order) { this.order = order; + setupForExplicit(); + } + + public String getExplicitOrder() { + return explicitOrder; + } + + public void setExplicitOrder(String explicitOrder) { + this.explicitOrder = explicitOrder; + setupForExplicit(); } public BuildFailureAnalyzerDisplayedField getBuildFailureAnalyzerDisplayedField() { @@ -56,6 +70,13 @@ public String toString() { .toString(); } + private void setupForExplicit() { + if (order != null && explicitOrder != null && order instanceof ExplicitOrder) { + ExplicitOrder explicit = (ExplicitOrder)order; + explicit.setExplicitOrder(explicitOrder); + } + } + // -- public enum BuildFailureAnalyzerDisplayedField { @@ -73,6 +94,5 @@ public enum BuildFailureAnalyzerDisplayedField { @Override public String toString() { return value; } } - - private Comparator> order; + } \ No newline at end of file diff --git a/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/order/ExplicitOrder.java b/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/order/ExplicitOrder.java new file mode 100644 index 000000000..3f778b047 --- /dev/null +++ b/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/order/ExplicitOrder.java @@ -0,0 +1,32 @@ +package com.smartcodeltd.jenkinsci.plugins.buildmonitor.order; + +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; + +import hudson.model.Job; + +public class ExplicitOrder implements Comparator> { + private Map order; + + @Override + public int compare(Job first, Job second) { + int firstOrder = Integer.MAX_VALUE; + int secondOrder = Integer.MAX_VALUE; + if (order.containsKey(first.getFullName())) { + firstOrder = order.get(first.getFullName()); + } + if (order.containsKey(second.getFullName())) { + secondOrder = order.get(second.getFullName()); + } + return firstOrder - secondOrder; + } + + public void setExplicitOrder(String explicitOrder) { + order = new HashMap(); + String[] builds = explicitOrder.split("[ ,]+"); + for (int i = 0; i < builds.length; i++) { + order.put(builds[i], i); + } + } +} diff --git a/build-monitor-plugin/src/main/resources/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView/configure-entries.jelly b/build-monitor-plugin/src/main/resources/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView/configure-entries.jelly index 3c39f5625..9c57c5df3 100644 --- a/build-monitor-plugin/src/main/resources/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView/configure-entries.jelly +++ b/build-monitor-plugin/src/main/resources/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView/configure-entries.jelly @@ -56,16 +56,24 @@ - - - + + + + + + + + + + + @@ -98,4 +106,4 @@ }()); - \ No newline at end of file + diff --git a/build-monitor-plugin/src/main/resources/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView/help-explicitOrder.html b/build-monitor-plugin/src/main/resources/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView/help-explicitOrder.html new file mode 100644 index 000000000..2abf085cd --- /dev/null +++ b/build-monitor-plugin/src/main/resources/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView/help-explicitOrder.html @@ -0,0 +1,11 @@ +
+

+ You can provide a list of full job names, separated by commas and/or spaces, which will + be displayed in the order that their names are given. In this mode, any job which is + not specified, but is shown in the view, will be placed at the end. +

+

+ Example:
+ my-build, your-build, his-folder/another-build +

+
diff --git a/build-monitor-plugin/src/test/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/order/ExplicitOrderTest.java b/build-monitor-plugin/src/test/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/order/ExplicitOrderTest.java new file mode 100644 index 000000000..861021bbd --- /dev/null +++ b/build-monitor-plugin/src/test/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/order/ExplicitOrderTest.java @@ -0,0 +1,147 @@ +package com.smartcodeltd.jenkinsci.plugins.buildmonitor.order; + +import org.acegisecurity.AccessDeniedException; +import org.junit.Test; + +import java.io.File; +import java.io.IOException; +import java.util.Collection; +import java.util.Collections; + +import hudson.model.AbstractBuild; +import hudson.model.AbstractProject; +import hudson.model.Descriptor; +import hudson.model.Item; +import hudson.model.ItemGroup; +import hudson.model.Job; +import hudson.tasks.Publisher; +import hudson.util.DescribableList; + +import static org.junit.Assert.assertTrue; + +public class ExplicitOrderTest { + @Test + public void separatesBySpaceOrComma() { + ExplicitOrder explicitOrder = new ExplicitOrder(); + explicitOrder.setExplicitOrder("alpha,beta, gamma delta"); + assertTrue(explicitOrder.compare(mockJob("alpha"), mockJob("beta")) < 0); + assertTrue(explicitOrder.compare(mockJob("alpha"), mockJob("gamma")) < 0); + assertTrue(explicitOrder.compare(mockJob("alpha"), mockJob("delta")) < 0); + assertTrue(explicitOrder.compare(mockJob("beta"), mockJob("gamma")) < 0); + assertTrue(explicitOrder.compare(mockJob("beta"), mockJob("delta")) < 0); + assertTrue(explicitOrder.compare(mockJob("gamma"), mockJob("delta")) < 0); + } + + @Test + public void unlistedBuildsLast() { + ExplicitOrder explicitOrder = new ExplicitOrder(); + explicitOrder.setExplicitOrder("alpha beta gamma delta"); + assertTrue(explicitOrder.compare(mockJob("alpha"), mockJob("omega")) < 0); + assertTrue(explicitOrder.compare(mockJob("delta"), mockJob("omega")) < 0); + } + + private class EmptyItemGroup implements ItemGroup { + + @Override + public String getFullName() { + return ""; + } + + @Override + public String getFullDisplayName() { + return ""; + } + + @Override + public Collection getItems() { + return Collections.emptyList(); + } + + @Override + public String getUrl() { + return ""; + } + + @Override + public String getUrlChildPrefix() { + return ""; + } + + @Override + public Item getItem(String name) throws AccessDeniedException { + return null; + } + + @Override + public File getRootDirFor(Item child) { + return null; + } + + @Override + public void onRenamed(Item item, String oldName, String newName) throws IOException { + + } + + @Override + public void onDeleted(Item item) throws IOException { + + } + + @Override + public String getDisplayName() { + return ""; + } + + @Override + public File getRootDir() { + return null; + } + + @Override + public void save() throws IOException { + + } + } + + private class MockProject extends AbstractProject { + + protected MockProject(String name) { + super(new EmptyItemGroup(), name); + } + + @Override + public DescribableList> getPublishersList() { + return null; + } + + @Override + protected Class getBuildClass() { + return null; + } + + @Override + public boolean isFingerprintConfigured() { + return false; + } + + + } + + private class MockBuild extends AbstractBuild { + + protected MockBuild(MockProject job) throws IOException { + super(job); + } + + @Override + public void run() { + + } + + } + + private Job mockJob(String fullName) { + Job mock = new MockProject(fullName); + return mock; + } +} \ No newline at end of file