Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix #284 - Allow setting of job order #297

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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"));
Expand All @@ -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"));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -11,6 +13,8 @@
public class Config {

private boolean displayCommitters;
private Comparator<Job<?, ?>> order;
private String explicitOrder;
private BuildFailureAnalyzerDisplayedField buildFailureAnalyzerDisplayedField;

public static Config defaultConfig() {
Expand All @@ -31,6 +35,16 @@ public static Config defaultConfig() {

public void setOrder(Comparator<Job<?, ?>> order) {
this.order = order;
setupForExplicit();
}

public String getExplicitOrder() {
return explicitOrder;
}

public void setExplicitOrder(String explicitOrder) {
this.explicitOrder = explicitOrder;
setupForExplicit();
}

public BuildFailureAnalyzerDisplayedField getBuildFailureAnalyzerDisplayedField() {
Expand All @@ -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 {
Expand All @@ -73,6 +94,5 @@ public enum BuildFailureAnalyzerDisplayedField {
@Override
public String toString() { return value; }
}

private Comparator<Job<?, ?>> order;

}
Original file line number Diff line number Diff line change
@@ -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<Job<?, ?>> {
private Map<String, Integer> 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, Integer>();
String[] builds = explicitOrder.split("[ ,]+");
for (int i = 0; i < builds.length; i++) {
order.put(builds[i], i);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,16 +56,24 @@
<f:textbox name="title" value="${it.title}"/>
</f:entry>

<f:entry title="${%Ordered by}">
<select name="order" class="setting-input">
<f:option value="ByName" selected='${it.currentOrder()=="ByName"}'>${%Name}</f:option>
<f:option value="ByDisplayName" selected="${it.currentOrder()=='ByDisplayName'}">${%Display name}</f:option>
<f:option value="ByFullName" selected="${it.currentOrder()=='ByFullName'}">${%Full name}</f:option>
<f:option value="ByStatus" selected="${it.currentOrder()=='ByStatus'}">${%Status}</f:option>
<f:option value="ByLastBuildTime" selected="${it.currentOrder()=='ByLastBuildTime'}">${%Last build time}</f:option>
<f:option value="ByEstimatedDuration" selected="${it.currentOrder()=='ByEstimatedDuration'}">${%Estimated duration}</f:option>
</select>
</f:entry>
<f:radioBlock title="${%Sort jobs}" name="order" checked="${it.currentOrder()!='ExplicitOrder'}" value="sorted">
<f:entry title="${%Ordered by}">
<select name="orderSelect" class="setting-input">
<f:option value="ByName" selected='${it.currentOrder()=="ByName"}'>${%Name}</f:option>
<f:option value="ByDisplayName" selected="${it.currentOrder()=='ByDisplayName'}">${%Display name}</f:option>
<f:option value="ByFullName" selected="${it.currentOrder()=='ByFullName'}">${%Full name}</f:option>
<f:option value="ByStatus" selected="${it.currentOrder()=='ByStatus'}">${%Status}</f:option>
<f:option value="ByLastBuildTime" selected="${it.currentOrder()=='ByLastBuildTime'}">${%Last build time}</f:option>
<f:option value="ByEstimatedDuration" selected="${it.currentOrder()=='ByEstimatedDuration'}">${%Estimated duration}</f:option>
</select>
</f:entry>
</f:radioBlock>

<f:radioBlock title="${%Specify order}" name="order" checked="${it.currentOrder()=='ExplicitOrder'}" value="explicit">
<f:entry title="${%Order of jobs:}" help="${descriptor.getHelpFile('explicitOrder')}">
<f:textbox name="explicitOrder" field="explicitOrder" value="${it.explicitOrder()}" />
</f:entry>
</f:radioBlock>

</f:section>

Expand Down Expand Up @@ -98,4 +106,4 @@
}());
</script>

</j:jelly>
</j:jelly>
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<div>
<p>
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.
</p>
<p>
Example:<br/>
<code>my-build, your-build, his-folder/another-build</code>
</p>
</div>
Original file line number Diff line number Diff line change
@@ -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<Item> {

@Override
public String getFullName() {
return "";
}

@Override
public String getFullDisplayName() {
return "";
}

@Override
public Collection<Item> 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<MockProject, MockBuild> {

protected MockProject(String name) {
super(new EmptyItemGroup(), name);
}

@Override
public DescribableList<Publisher, Descriptor<Publisher>> getPublishersList() {
return null;
}

@Override
protected Class<MockBuild> getBuildClass() {
return null;
}

@Override
public boolean isFingerprintConfigured() {
return false;
}


}

private class MockBuild extends AbstractBuild<MockProject, MockBuild> {

protected MockBuild(MockProject job) throws IOException {
super(job);
}

@Override
public void run() {

}

}

private Job<?, ?> mockJob(String fullName) {
Job<?, ?> mock = new MockProject(fullName);
return mock;
}
}