Index: src/main/java/hudson/views/AddRemoveFallbackFilter.java =================================================================== --- src/main/java/hudson/views/AddRemoveFallbackFilter.java (revision 0) +++ src/main/java/hudson/views/AddRemoveFallbackFilter.java (working copy) @@ -0,0 +1,70 @@ +package hudson.views; + +import hudson.Extension; +import hudson.model.Descriptor; +import hudson.model.TopLevelItem; +import hudson.model.View; + +import java.util.ArrayList; +import java.util.List; + +import org.kohsuke.stapler.DataBoundConstructor; + +/** + * Returns all jobs if no jobs added, or all jobs if no jobs added, depending on configuration. + * Does not modify the list of added jobs in the other cases. + * + * @author davidparsson + */ +public class AddRemoveFallbackFilter extends ViewJobFilter { + + private String fallbackTypeString; + private FallbackTypes fallbackType; + + static enum FallbackTypes { + ADD_ALL_IF_NONE_INCLUDED, + REMOVE_ALL_IF_ALL_INCLUDED + } + + @DataBoundConstructor + public AddRemoveFallbackFilter(String fallbackTypeString) { + this.fallbackTypeString = fallbackTypeString; + this.fallbackType = FallbackTypes.valueOf(fallbackTypeString); + } + + Object readResolve() { + if (fallbackTypeString != null) { + this.fallbackType = FallbackTypes.valueOf(fallbackTypeString); + } + return this; + } + + public String getFallbackTypeString() { + return this.fallbackTypeString; + } + + @Override + public List filter(List added, List all, View filteringView) { + if (fallbackType == FallbackTypes.ADD_ALL_IF_NONE_INCLUDED && added.size() == 0) { + return new ArrayList(all); + } else if (fallbackType == FallbackTypes.REMOVE_ALL_IF_ALL_INCLUDED && added.size() == all.size()) { + return new ArrayList(); + } else { + return added; + } + } + + @Extension + public static class DescriptorImpl extends Descriptor { + @Override + public String getDisplayName() { + return "Fallback Filter"; + } + + @Override + public String getHelpFile() { + return "/plugin/view-job-filters/add-remove-fallback-help.html"; + } + } + +} Index: src/main/resources/hudson/views/AddRemoveFallbackFilter/config.jelly =================================================================== --- src/main/resources/hudson/views/AddRemoveFallbackFilter/config.jelly (revision 0) +++ src/main/resources/hudson/views/AddRemoveFallbackFilter/config.jelly (working copy) @@ -0,0 +1,14 @@ + + + + + Index: src/main/webapp/add-remove-fallback-help.html =================================================================== --- src/main/webapp/add-remove-fallback-help.html (revision 0) +++ src/main/webapp/add-remove-fallback-help.html (working copy) @@ -0,0 +1,11 @@ +
+

It is useful to place this filter after other filters, which sometimes may include all jobs or +no jobs.Based on its configuration, this filter can do one of the following things:

+
    +
  • Add all jobs to this view if no jobs are included by the previous filters.
  • +
  • Remove all jobs from this view if all jobs are included by the previous filters.
  • +
+

This filter does not affect the list of jobs in the other cases. In other words, this filter +can act as a fallback filter that ensures that this view either never will be empty or never will +contain all jobs.

+
Index: src/test/java/hudson/views/AddRemoveFallbackFilterTest.java =================================================================== --- src/test/java/hudson/views/AddRemoveFallbackFilterTest.java (revision 0) +++ src/test/java/hudson/views/AddRemoveFallbackFilterTest.java (working copy) @@ -0,0 +1,58 @@ +package hudson.views; + +import hudson.model.TopLevelItem; + +import java.util.List; + +import com.google.common.collect.Lists; + +import static hudson.views.AddRemoveFallbackFilter.FallbackTypes; + +public class AddRemoveFallbackFilterTest extends AbstractHudsonTest { + + private AddRemoveFallbackFilter filter; + private List all; + private List added; + private List filtered; + + public void setUp() throws Exception { + super.setUp(); + all = hudson.getItems(); + assertFalse("Jenkins jobs are required to run these tests", all.isEmpty()); + } + + public void testShouldAddAllJobsWhenNoJobsPresent() throws Exception { + filter = new AddRemoveFallbackFilter(FallbackTypes.ADD_ALL_IF_NONE_INCLUDED.toString()); + added = Lists.newArrayList(); + filtered = filter.filter(added, all, null); + + assertEquals("Expected ALL jobs to be in the filtered list", all, filtered); + } + + public void testShouldNotModifyFilteredListWhenSomeJobPresent() throws Exception { + filter = new AddRemoveFallbackFilter(FallbackTypes.ADD_ALL_IF_NONE_INCLUDED.toString()); + added = Lists.newArrayList(hudson.getItem("Job-1")); + filtered = filter.filter(added, all, null); + + List expected = Lists.newArrayList(hudson.getItem("Job-1")); + assertEquals("Expected only Job-1 to be in the filtered list", expected, filtered); + } + + public void testShouldRemoveAllJobsWhenAllJobsPresent() throws Exception { + filter = new AddRemoveFallbackFilter(FallbackTypes.REMOVE_ALL_IF_ALL_INCLUDED.toString()); + added = hudson.getItems(); + filtered = filter.filter(added, all, null); + + assertTrue("Expected NO jobs to be in the filtered list", filtered.isEmpty()); + } + + public void testShouldNotModifyFilteredListWhenAllJobsNotPresent() throws Exception { + filter = new AddRemoveFallbackFilter(FallbackTypes.REMOVE_ALL_IF_ALL_INCLUDED.toString()); + added = Lists.newArrayList(hudson.getItem("Job-1")); + filtered = filter.filter(added, all, null); + + List expected = Lists.newArrayList(hudson.getItem("Job-1")); + assertEquals("Expected only Job-1 to be in the filtered list", expected, filtered); + } + +}