diff --git a/core/src/main/java/hudson/model/ComputerSet.java b/core/src/main/java/hudson/model/ComputerSet.java
index de77e2e48e1632a364623e7555ca30ed6ed498cb..7951e65d19bf91e328a925166dc771f5a5414b5c 100644
--- a/core/src/main/java/hudson/model/ComputerSet.java
+++ b/core/src/main/java/hudson/model/ComputerSet.java
@@ -27,6 +27,7 @@ import hudson.Util;
import hudson.slaves.NodeDescriptor;
import hudson.model.Descriptor.FormException;
import hudson.node_monitors.NodeMonitor;
+import hudson.util.FormFieldValidator;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
@@ -165,7 +166,13 @@ public final class ComputerSet extends AbstractModelObject {
final Hudson app = Hudson.getInstance();
app.checkPermission(Hudson.ADMINISTER); // TODO: new permission?
- if (checkName(req, rsp, name)) return;
+ try {
+ checkName(name);
+ } catch (ParseException e) {
+ rsp.setStatus(SC_BAD_REQUEST);
+ sendError(e,req,rsp);
+ return;
+ }
if(mode!=null && mode.equals("copy")) {
Node src = app.getNode(from);
@@ -208,14 +215,16 @@ public final class ComputerSet extends AbstractModelObject {
try {
final Hudson app = Hudson.getInstance();
app.checkPermission(Hudson.ADMINISTER); // TODO: new permission?
-
- if (checkName(req, rsp, name)) return;
+ checkName(name);
Node result = NodeDescriptor.all().find(type).newInstance(req, req.getSubmittedForm());
app.addNode(result);
// take the user back to the slave list top page
rsp.sendRedirect2(".");
+ } catch (ParseException e) {
+ rsp.setStatus(SC_BAD_REQUEST);
+ sendError(e,req,rsp);
} catch (FormException e) {
sendError(e,req,rsp);
}
@@ -224,27 +233,35 @@ public final class ComputerSet extends AbstractModelObject {
/**
* Makes sure that the given name is good as a slave name.
*/
- private boolean checkName(StaplerRequest req, StaplerResponse rsp, String name) throws IOException, ServletException {
- if(name==null) {
- rsp.sendError(HttpServletResponse.SC_BAD_REQUEST,"Query parameter 'name' is required");
- return true;
- }
+ private void checkName(String name) throws ParseException {
+ if(name==null)
+ throw new ParseException("Query parameter 'name' is required",0);
+
name = name.trim();
+ Hudson.checkGoodName(name);
- try {
- Hudson.checkGoodName(name);
- } catch (ParseException e) {
- rsp.setStatus(SC_BAD_REQUEST);
- sendError(e,req,rsp);
- return true;
- }
+ if(Hudson.getInstance().getNode(name)!=null)
+ throw new ParseException(Messages.ComputerSet_SlaveAlreadyExists(name),0);
- if(Hudson.getInstance().getNode(name)!=null) {
- rsp.setStatus(SC_BAD_REQUEST);
- sendError(Messages.ComputerSet_SlaveAlreadyExists(name),req,rsp);
- return true;
- }
- return false;
+ // looks good
+ }
+
+ /**
+ * Makes sure that the given name is good as a slave name.
+ */
+ public void doCheckName(StaplerRequest req, StaplerResponse rsp, @QueryParameter final String value) throws IOException, ServletException {
+ new FormFieldValidator(req,rsp,Hudson.ADMINISTER) { // TODO: new permission?
+ protected void check() throws IOException, ServletException {
+ if(Util.fixEmpty(value)==null)
+ ok(); // nothing is entered yet
+ else try {
+ checkName(value);
+ ok();
+ } catch (ParseException e) {
+ error(e.getMessage());
+ }
+ }
+ }.process();
}
public Api getApi() {
diff --git a/core/src/main/resources/hudson/model/ComputerSet/new.jelly b/core/src/main/resources/hudson/model/ComputerSet/new.jelly
index 06010172aed9c177527bd041d6101754e5716b62..1a84ad666e822bdcf2f3a94b6b4bc31a3f0dadf1 100644
--- a/core/src/main/resources/hudson/model/ComputerSet/new.jelly
+++ b/core/src/main/resources/hudson/model/ComputerSet/new.jelly
@@ -31,11 +31,11 @@ THE SOFTWARE.
-->
-
-
+
+
+ descriptors="${slaves}" checkUrl="computer/checkName" xmlns:n="/lib/hudson/newFromList" />
-
\ No newline at end of file
+
diff --git a/core/src/main/resources/hudson/model/View/newJob.jelly b/core/src/main/resources/hudson/model/View/newJob.jelly
index 69076cc351e020f84022dad797bd00bfc5b49d14..de0ba223feb53501d8fc01ae639f927f69764818 100644
--- a/core/src/main/resources/hudson/model/View/newJob.jelly
+++ b/core/src/main/resources/hudson/model/View/newJob.jelly
@@ -26,13 +26,13 @@ THE SOFTWARE.
"New Project" page.
-->
-
-
-
-
+
+
+
+
+ descriptors="${jobs}" checkUrl="itemExistsCheck" xmlns:n="/lib/hudson/newFromList" />
-
-
\ No newline at end of file
+
+
diff --git a/core/src/main/resources/lib/hudson/newFromList/form.jelly b/core/src/main/resources/lib/hudson/newFromList/form.jelly
index 530f5b429f6f8eae68b8e89ea4116b8759dc2d54..929f192db848747985a1fcb7d954f85b39e324db 100644
--- a/core/src/main/resources/lib/hudson/newFromList/form.jelly
+++ b/core/src/main/resources/lib/hudson/newFromList/form.jelly
@@ -30,11 +30,12 @@ THE SOFTWARE.
@nameTitle : title of the name text field
@copyTitle : title of the copy option
@copyNames : options of names to choose from as the copy source. null to hide "copy" option
+ @checkUrl : form field validation url
-->
-
@@ -88,4 +89,4 @@ THE SOFTWARE.
}
updateOk(okButton.getForm());
]]>
-
\ No newline at end of file
+