提交 677fdc0a 编写于 作者: C CloudBees DEV@Cloud

Merge commit '78dcd063'

......@@ -38,7 +38,13 @@ import org.apache.commons.lang.StringUtils;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Stack;
import java.util.StringTokenizer;
import javax.annotation.CheckForNull;
import jenkins.model.DirectlyModifiableTopLevelItemGroup;
import org.apache.commons.io.FileUtils;
......@@ -296,39 +302,33 @@ public class Items {
*/
public static <T extends Item> List<T> getAllItems(final ItemGroup root, Class<T> type) {
List<T> r = new ArrayList<T>();
Stack<ItemGroup> q = new Stack<ItemGroup>();
q.push(root);
while(!q.isEmpty()) {
ItemGroup<?> parent = q.pop();
for (Item i : parent.getItems()) {
if(type.isInstance(i)) {
if (i.hasPermission(Item.READ))
r.add(type.cast(i));
}
if(i instanceof ItemGroup)
q.push((ItemGroup)i);
getAllItems(root, type, r);
return r;
}
private static <T extends Item> void getAllItems(final ItemGroup root, Class<T> type, List<T> r) {
List<Item> items = new ArrayList<Item>(((ItemGroup<?>) root).getItems());
Collections.sort(items, new Comparator<Item>() {
@Override public int compare(Item i1, Item i2) {
return name(i1).compareToIgnoreCase(name(i2));
}
}
// sort by relative name, ignoring case
Collections.sort(r, new Comparator<T>() {
@Override
public int compare(T o1, T o2) {
if (o1 == null) {
if (o2 == null) {
return 0;
}
return 1;
String name(Item i) {
String n = i.getName();
if (i instanceof ItemGroup) {
n += '/';
}
if (o2 == null) {
return -1;
}
return o1.getRelativeNameFrom(root).compareToIgnoreCase(o2.getRelativeNameFrom(root));
return n;
}
});
return r;
for (Item i : items) {
if (type.isInstance(i)) {
if (i.hasPermission(Item.READ)) {
r.add(type.cast(i));
}
}
if (i instanceof ItemGroup) {
getAllItems((ItemGroup) i, type, r);
}
}
}
/**
......
......@@ -38,12 +38,20 @@ public class RunParameterValue extends ParameterValue {
@DataBoundConstructor
public RunParameterValue(String name, String runId, String description) {
super(name, description);
this.runId = runId;
this.runId = check(runId);
}
public RunParameterValue(String name, String runId) {
super(name, null);
this.runId = runId;
this.runId = check(runId);
}
private static String check(String runId) {
if (runId == null || runId.indexOf('#') == -1) {
throw new IllegalArgumentException(runId);
} else {
return runId;
}
}
/**
......@@ -57,14 +65,27 @@ public class RunParameterValue extends ParameterValue {
return runId;
}
private String[] split() {
if (runId == null) {
return null;
}
String[] r = runId.split("#");
if (r.length != 2) {
return null;
}
return r;
}
@Exported
public String getJobName() {
return runId.split("#")[0];
String[] r = split();
return r == null ? null : r[0];
}
@Exported
public String getNumber() {
return runId.split("#")[1];
String[] r = split();
return r == null ? null : r[1];
}
@Override
......
......@@ -182,6 +182,7 @@ public class ListJobsCommandTest {
final TopLevelItem item = mock(TopLevelItem.class);
when(item.getName()).thenReturn(name);
when(item.getDisplayName()).thenReturn(name);
return item;
......
/*
* The MIT License
*
* Copyright 2014 Jesse Glick.
*
* 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;
import org.junit.Test;
import static org.junit.Assert.*;
public class RunParameterValueTest {
@SuppressWarnings("ResultOfObjectAllocationIgnored")
@Test public void robustness() throws Exception {
RunParameterValue rpv = new RunParameterValue("whatever", "folder/job#57");
assertEquals("whatever", rpv.getName());
assertEquals("folder/job", rpv.getJobName());
assertEquals("57", rpv.getNumber());
try {
new RunParameterValue("whatever", null);
fail();
} catch (IllegalArgumentException x) {
// good
}
try {
new RunParameterValue("whatever", "invalid");
fail();
} catch (IllegalArgumentException x) {
// good
}
try {
new RunParameterValue("whatever", "invalid", "desc");
fail();
} catch (IllegalArgumentException x) {
// good
}
rpv = (RunParameterValue) Run.XSTREAM2.fromXML("<hudson.model.RunParameterValue><name>whatever</name><runId>bogus</runId></hudson.model.RunParameterValue>");
assertEquals("whatever", rpv.getName());
assertEquals(null, rpv.getJobName());
assertEquals(null, rpv.getNumber());
}
}
/*
* The MIT License
*
* Copyright 2014 Jesse Glick.
*
* 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;
import java.util.Arrays;
import org.junit.Test;
import static org.junit.Assert.*;
import org.junit.Rule;
import org.jvnet.hudson.test.JenkinsRule;
import org.jvnet.hudson.test.MockFolder;
public class ItemsTest {
@Rule public JenkinsRule r = new JenkinsRule();
@Test public void getAllItems() throws Exception {
MockFolder d = r.createFolder("d");
MockFolder sub2 = d.createProject(MockFolder.class, "sub2");
MockFolder sub2a = sub2.createProject(MockFolder.class, "a");
MockFolder sub2c = sub2.createProject(MockFolder.class, "c");
MockFolder sub2b = sub2.createProject(MockFolder.class, "b");
MockFolder sub1 = d.createProject(MockFolder.class, "sub1");
FreeStyleProject root = r.createFreeStyleProject("root");
FreeStyleProject dp = d.createProject(FreeStyleProject.class, "p");
FreeStyleProject sub1q = sub1.createProject(FreeStyleProject.class, "q");
FreeStyleProject sub1p = sub1.createProject(FreeStyleProject.class, "p");
FreeStyleProject sub2ap = sub2a.createProject(FreeStyleProject.class, "p");
FreeStyleProject sub2bp = sub2b.createProject(FreeStyleProject.class, "p");
FreeStyleProject sub2cp = sub2c.createProject(FreeStyleProject.class, "p");
FreeStyleProject sub2alpha = sub2.createProject(FreeStyleProject.class, "alpha");
FreeStyleProject sub2BRAVO = sub2.createProject(FreeStyleProject.class, "BRAVO");
FreeStyleProject sub2charlie = sub2.createProject(FreeStyleProject.class, "charlie");
assertEquals(Arrays.asList(dp, sub1p, sub1q, sub2ap, sub2alpha, sub2bp, sub2BRAVO, sub2cp, sub2charlie), Items.getAllItems(d, FreeStyleProject.class));
assertEquals(Arrays.<Item>asList(sub2a, sub2ap, sub2alpha, sub2b, sub2bp, sub2BRAVO, sub2c, sub2cp, sub2charlie), Items.getAllItems(sub2, Item.class));
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册