提交 bf97df36 编写于 作者: K kohsuke

Added delete-job, enable-job, and disable-job command.

git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@19119 71c3de6d-444a-0410-be80-ed276b4c234a
上级 5107d8d7
...@@ -707,6 +707,12 @@ THE SOFTWARE. ...@@ -707,6 +707,12 @@ THE SOFTWARE.
<artifactId>jinterop-wmi</artifactId> <artifactId>jinterop-wmi</artifactId>
<version>1.0</version> <version>1.0</version>
</dependency> </dependency>
<dependency>
<groupId>org.kohsuke.metainf-services</groupId>
<artifactId>metainf-services</artifactId>
<version>1.1</version>
<optional>true</optional>
</dependency>
<!-- offline profiler API to put in the classpath if we need it --> <!-- offline profiler API to put in the classpath if we need it -->
<!--dependency> <!--dependency>
......
...@@ -32,6 +32,13 @@ import hudson.remoting.Callable; ...@@ -32,6 +32,13 @@ import hudson.remoting.Callable;
import hudson.model.Hudson; import hudson.model.Hudson;
import org.kohsuke.args4j.CmdLineParser; import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.spi.OptionHandler;
import org.jvnet.tiger_types.Types;
import org.apache.commons.discovery.resource.classes.DiscoverClasses;
import org.apache.commons.discovery.resource.ClassLoaders;
import org.apache.commons.discovery.resource.names.DiscoverServiceNames;
import org.apache.commons.discovery.ResourceClassIterator;
import org.apache.commons.discovery.ResourceNameIterator;
import java.io.PrintStream; import java.io.PrintStream;
import java.io.InputStream; import java.io.InputStream;
...@@ -196,4 +203,21 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable { ...@@ -196,4 +203,21 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable {
} }
return null; return null;
} }
static {
// register option handlers that are defined
ClassLoaders cls = new ClassLoaders();
cls.put(Hudson.getInstance().getPluginManager().uberClassLoader);
ResourceNameIterator servicesIter =
new DiscoverServiceNames(cls).findResourceNames(OptionHandler.class.getName());
final ResourceClassIterator itr =
new DiscoverClasses(cls).findResourceClasses(servicesIter);
while(itr.hasNext()) {
Class h = itr.nextResourceClass().loadClass();
Class c = Types.erasure(Types.getTypeArgument(Types.getBaseClass(h, OptionHandler.class), 0));
CmdLineParser.registerHandler(c,h);
}
}
} }
...@@ -37,31 +37,26 @@ import java.io.Serializable; ...@@ -37,31 +37,26 @@ import java.io.Serializable;
* @author Kohsuke Kawaguchi * @author Kohsuke Kawaguchi
*/ */
@Extension @Extension
public class CopyJobCommand extends CLICommand implements Serializable { public class CopyJobCommand extends CLICommand {
@Override @Override
public String getShortDescription() { public String getShortDescription() {
return "Copies a job"; return "Copies a job";
} }
@Argument(metaVar="SRC",usage="Name of the job to copy") @Argument(metaVar="SRC",usage="Name of the job to copy")
public String src; public TopLevelItem src;
@Argument(metaVar="DST",usage="Name of the new job to be created.",index=1) @Argument(metaVar="DST",usage="Name of the new job to be created.",index=1)
public String dst; public String dst;
protected int run() throws Exception { protected int run() throws Exception {
Hudson h = Hudson.getInstance(); Hudson h = Hudson.getInstance();
TopLevelItem s = h.getItem(src);
if (s==null) {
stderr.println("No such job '"+src+"' perhaps you meant "+ AbstractProject.findNearest(src)+"?");
return -1;
}
if (h.getItem(dst)!=null) { if (h.getItem(dst)!=null) {
stderr.println("Job '"+dst+"' already exists"); stderr.println("Job '"+dst+"' already exists");
return -1; return -1;
} }
h.copy(s,dst); h.copy(src,dst);
return 0; return 0;
} }
} }
......
/*
* The MIT License
*
* Copyright (c) 2004-2009, Sun Microsystems, 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.cli;
import hudson.model.TopLevelItem;
import hudson.Extension;
import org.kohsuke.args4j.Argument;
/**
* Deletes a job.
* @author Kohsuke Kawaguchi
*/
@Extension
public class DeleteJobCommand extends CLICommand {
@Override
public String getShortDescription() {
return "Deletes a job";
}
@Argument
public TopLevelItem job;
protected int run() throws Exception {
job.delete();
return 0;
}
}
package hudson.cli;
import hudson.Extension;
import hudson.model.AbstractProject;
import org.kohsuke.args4j.Argument;
/**
* Disables a job.
*
* @author Kohsuke Kawaguchi
*/
@Extension
public class DisableJobCommand extends CLICommand {
@Argument
public AbstractProject src;
public String getShortDescription() {
return "Disables a job";
}
protected int run() throws Exception {
src.makeDisabled(true);
return 0;
}
}
package hudson.cli;
import hudson.Extension;
import hudson.model.AbstractProject;
import org.kohsuke.args4j.Argument;
/**
* Enables a job.
*
* @author Kohsuke Kawaguchi
*/
@Extension
public class EnableJobCommand extends CLICommand {
@Argument
public AbstractProject src;
public String getShortDescription() {
return "Enables a previously disabled job";
}
protected int run() throws Exception {
src.makeDisabled(false);
return 0;
}
}
/*
* The MIT License
*
* Copyright (c) 2004-2009, Sun Microsystems, 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.cli.handlers;
import hudson.model.AbstractProject;
import hudson.model.Hudson;
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.OptionDef;
import org.kohsuke.args4j.spi.OptionHandler;
import org.kohsuke.args4j.spi.Parameters;
import org.kohsuke.args4j.spi.Setter;
import org.kohsuke.MetaInfServices;
/**
* Refer to {@link AbstractProject} by its name.
*
* @author Kohsuke Kawaguchi
*/
@MetaInfServices
public class AbstractProjectOptionHandler extends OptionHandler<AbstractProject> {
public AbstractProjectOptionHandler(CmdLineParser parser, OptionDef option, Setter<AbstractProject> setter) {
super(parser, option, setter);
}
@Override
public int parseArguments(Parameters params) throws CmdLineException {
Hudson h = Hudson.getInstance();
String src = params.getParameter(0);
AbstractProject s = h.getItemByFullName(src,AbstractProject.class);
if (s==null)
throw new CmdLineException("No such job '"+src+"' perhaps you meant "+ AbstractProject.findNearest(src)+"?");
setter.addValue(s);
return 1;
}
@Override
public String getDefaultMetaVariable() {
return "JOB";
}
}
package hudson.cli.handlers;
import hudson.model.AbstractProject;
import hudson.model.Hudson;
import hudson.model.TopLevelItem;
import org.kohsuke.MetaInfServices;
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.OptionDef;
import org.kohsuke.args4j.spi.OptionHandler;
import org.kohsuke.args4j.spi.Parameters;
import org.kohsuke.args4j.spi.Setter;
/**
* Refers to {@link TopLevelItem} by its name.
*
* @author Kohsuke Kawaguchi
*/
@MetaInfServices
public class TopLevelItemOptionHandler extends OptionHandler<TopLevelItem> {
public TopLevelItemOptionHandler(CmdLineParser parser, OptionDef option, Setter<TopLevelItem> setter) {
super(parser, option, setter);
}
@Override
public int parseArguments(Parameters params) throws CmdLineException {
Hudson h = Hudson.getInstance();
String src = params.getParameter(0);
TopLevelItem s = h.getItem(src);
if (s==null)
throw new CmdLineException("No such job '"+src+"' perhaps you meant "+ AbstractProject.findNearest(src)+"?");
setter.addValue(s);
return 1;
}
@Override
public String getDefaultMetaVariable() {
return "JOB";
}
}
/**
* {@link OptionHandler} implementations for Hudson.
*/
package hudson.cli.handlers;
import org.kohsuke.args4j.spi.OptionHandler;
\ No newline at end of file
...@@ -186,6 +186,11 @@ public interface Item extends PersistenceRoot, SearchableModelObject, AccessCont ...@@ -186,6 +186,11 @@ public interface Item extends PersistenceRoot, SearchableModelObject, AccessCont
*/ */
public void save() throws IOException; public void save() throws IOException;
/**
* Deletes this item.
*/
public void delete() throws IOException, InterruptedException;
public static final PermissionGroup PERMISSIONS = new PermissionGroup(Item.class,Messages._Item_Permissions_Title()); public static final PermissionGroup PERMISSIONS = new PermissionGroup(Item.class,Messages._Item_Permissions_Title());
public static final Permission CREATE = new Permission(PERMISSIONS,"Create", Permission.CREATE); public static final Permission CREATE = new Permission(PERMISSIONS,"Create", Permission.CREATE);
public static final Permission DELETE = new Permission(PERMISSIONS,"Delete", Permission.DELETE); public static final Permission DELETE = new Permission(PERMISSIONS,"Delete", Permission.DELETE);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册