/*
* The MIT License
*
* Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi
*
* 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.slaves;
import hudson.Extension;
import hudson.model.ComputerSet;
import hudson.model.Descriptor;
import hudson.model.Slave;
import hudson.model.Node;
import hudson.model.Hudson;
import hudson.util.DescriptorList;
import hudson.util.FormValidation;
import hudson.DescriptorExtensionList;
import hudson.Util;
import hudson.model.Failure;
import java.io.IOException;
import java.util.List;
import java.util.ArrayList;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import javax.servlet.ServletException;
/**
* {@link Descriptor} for {@link Slave}.
*
* <h2>Views</h2>
* <p>
* This object needs to have <tt>newInstanceDetail.jelly</tt> view, which shows up in
* <tt>http://server/hudson/computers/new</tt> page as an explanation of this job type.
*
* <h2>Other Implementation Notes</h2>
*
* @author Kohsuke Kawaguchi
*/
public abstract class NodeDescriptor extends Descriptor<Node> {
protected NodeDescriptor(Class<? extends Node> clazz) {
super(clazz);
}
protected NodeDescriptor() {
}
/**
* Can the administrator create this type of nodes from UI?
*
* Return false if it only makes sense for programs to create it, not through the "new node" UI.
*/
public boolean isInstantiable() {
return true;
}
public final String newInstanceDetailPage() {
return '/'+clazz.getName().replace('.','/').replace('$','/')+"/newInstanceDetail.jelly";
}
/**
* Handles the form submission from the "/computer/new" page, which is the first form for creating a new node.
* By default, it shows the configuration page for entering details, but subtypes can override this differently.
*
* @param name
* Name of the new node.
*/
public void handleNewNodePage(ComputerSet computerSet, String name, StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
computerSet.checkName(name);
req.setAttribute("descriptor", this);
req.getView(computerSet,"_new.jelly").forward(req,rsp);
}
@Override
public String getConfigPage() {
return getViewPage(clazz, "configure-entries.jelly");
}
public FormValidation doCheckName(@QueryParameter String value ) {
String name = Util.fixEmptyAndTrim(value);
if(name==null)
return FormValidation.error(Messages.NodeDescripter_CheckName_Mandatory());
try {
Hudson.checkGoodName(name);
} catch (Failure f) {
return FormValidation.error(f.getMessage());
}
return FormValidation.ok();
}
/**
* Returns all the registered {@link NodeDescriptor} descriptors.
*/
public static DescriptorExtensionList<Node,NodeDescriptor> all() {
return Hudson.getInstance().<Node,NodeDescriptor>getDescriptorList(Node.class);
}
/**
* All the registered instances.
* @deprecated as of 1.286
* Use {@link #all()} for read access, and {@link Extension} for registration.
*/
public static final DescriptorList<Node> ALL = new DescriptorList<Node>(Node.class);
public static List<NodeDescriptor> allInstantiable() {
List<NodeDescriptor> r = new ArrayList<NodeDescriptor>();
for (NodeDescriptor d : all())
if(d.isInstantiable())
r.add(d);
return r;
}
}