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 +