From a6a148c6244cc1748b10cc0a365582b327f5241a Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Fri, 11 Mar 2011 14:17:02 -0800 Subject: [PATCH] Added a visitor to walk the tree structure of Item&ItemGroup --- core/src/main/java/hudson/model/Item.java | 1 + .../main/java/hudson/model/ItemVisitor.java | 59 +++++++++++++++++++ .../java/hudson/model/ViewDescriptor.java | 30 +++++----- 3 files changed, 74 insertions(+), 16 deletions(-) create mode 100644 core/src/main/java/hudson/model/ItemVisitor.java diff --git a/core/src/main/java/hudson/model/Item.java b/core/src/main/java/hudson/model/Item.java index d35476dc43..f4f2e17002 100644 --- a/core/src/main/java/hudson/model/Item.java +++ b/core/src/main/java/hudson/model/Item.java @@ -60,6 +60,7 @@ import hudson.security.AccessControlled; * * @author Kohsuke Kawaguchi * @see Items + * @see ItemVisitor */ public interface Item extends PersistenceRoot, SearchableModelObject, AccessControlled { /** diff --git a/core/src/main/java/hudson/model/ItemVisitor.java b/core/src/main/java/hudson/model/ItemVisitor.java new file mode 100644 index 0000000000..f63ba1ecc2 --- /dev/null +++ b/core/src/main/java/hudson/model/ItemVisitor.java @@ -0,0 +1,59 @@ +/* + * The MIT License + * + * Copyright (c) 2011, CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package hudson.model; + +/** + * Walks the tree structure that consists of {@link ItemGroup} and {@link Item}. + * + * @author Kohsuke Kawaguchi + * @since 1.402 + */ +public abstract class ItemVisitor { + /** + * Visits an {@link ItemGroup} by visits the member items. + */ + public void onItemGroup(ItemGroup group) { + for (Item i : group.getItems()) + if (i.hasPermission(Item.READ)) + onItem(i); + } + + /** + * Visits an {@link Item}. If it is a group, + * visits the children. + */ + public void onItem(Item i) { + if(i instanceof ItemGroup) + onItemGroup((ItemGroup)i); + } + + /** + * Visits the entire tree rooted at {@code Hudson.getInstance()}. + *

+ * To walk a subtree, call {@link #onItemGroup(ItemGroup)} or {@link #onItem(Item)} + */ + public final void walk() { + onItemGroup(Hudson.getInstance()); + } +} diff --git a/core/src/main/java/hudson/model/ViewDescriptor.java b/core/src/main/java/hudson/model/ViewDescriptor.java index cdf4705adb..d02155dbc9 100644 --- a/core/src/main/java/hudson/model/ViewDescriptor.java +++ b/core/src/main/java/hudson/model/ViewDescriptor.java @@ -25,8 +25,6 @@ package hudson.model; import org.kohsuke.stapler.QueryParameter; -import java.util.Stack; - /** * {@link Descriptor} for {@link View}. * @@ -66,24 +64,24 @@ public abstract class ViewDescriptor extends Descriptor { /** * Auto-completion for the "copy from" field in the new job page. */ - public AutoCompletionCandidates doAutoCompleteCopyNewItemFrom(@QueryParameter String value) { - AutoCompletionCandidates r = new AutoCompletionCandidates(); - - Stack q = new Stack(); - q.push(Hudson.getInstance()); - - while(!q.isEmpty()) { - ItemGroup parent = q.pop(); - for (Item i : parent.getItems()) { - if (i.hasPermission(Item.READ)) - r.add(i.getFullName()); + public AutoCompletionCandidates doAutoCompleteCopyNewItemFrom(@QueryParameter final String value) { + final AutoCompletionCandidates r = new AutoCompletionCandidates(); + new ItemVisitor() { + @Override + public void onItemGroup(ItemGroup group) { // only dig deep when the path matches what's typed. // for example, if 'foo/bar' is typed, we want to show 'foo/barcode' - if(i instanceof ItemGroup && value.startsWith(i.getFullName())) - q.push((ItemGroup)i); + if (value.startsWith(group.getFullName())) + super.onItemGroup(group); + } + + @Override + public void onItem(Item i) { + r.add(i.getFullName()); + super.onItem(i); } - } + }.onItemGroup(Hudson.getInstance()); return r; } -- GitLab