/*
 * The MIT License
 *
 * Copyright (c) 2004-2010, 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 jenkins.model.Jenkins;
import hudson.model.TopLevelItem;
import hudson.Extension;
import hudson.model.Item;
import org.kohsuke.args4j.Argument;


/**
 * Copies a job from CLI.
 * 
 * @author Kohsuke Kawaguchi
 */
@Extension
public class CopyJobCommand extends CLICommand {
    @Override
    public String getShortDescription() {
        return Messages.CopyJobCommand_ShortDescription();
    }

    @Argument(metaVar="SRC",usage="Name of the job to copy",required=true)
    public TopLevelItem src;

    @Argument(metaVar="DST",usage="Name of the new job to be created.",index=1,required=true)
    public String dst;

    protected int run() throws Exception {
        Jenkins h = Jenkins.getInstance();
        h.checkPermission(Item.CREATE);

        if (h.getItem(dst)!=null) {
            stderr.println("Job '"+dst+"' already exists");
            return -1;
        }
        
        h.copy(src,dst);
        return 0;
    }
}


@@ -1280,24 +1280,74 @@
 model.Item;%0A
+import jenkins.model.ModifiableTopLevelItemGroup;%0A
 import org.k
@@ -1903,17 +1903,23 @@
 Jenkins 
-h
+jenkins
  = Jenki
@@ -1944,17 +1944,23 @@
         
-h
+jenkins
 .checkPe
@@ -1999,17 +1999,23 @@
 if (
-h
+jenkins
 .getItem
 (dst
@@ -2010,16 +2010,26 @@
 .getItem
+ByFullName
 (dst)!=n
@@ -2128,24 +2128,25 @@
       %7D%0A
+%0A
         
 %0A       
@@ -2141,18 +2141,653 @@
     
-%0A        h
+ModifiableTopLevelItemGroup ig = jenkins;%0A        int i = dst.lastIndexOf('/');%0A        if (i %3E 0) %7B%0A            String group = dst.substring(0, i);%0A            Item item = jenkins.getItemByFullName(group);%0A            if (item == null) %7B%0A                throw new IllegalArgumentException(%22Unknown ItemGroup %22 + group);%0A            %7D%0A%0A            if (item instanceof ModifiableTopLevelItemGroup) %7B%0A                ig = (ModifiableTopLevelItemGroup) item;%0A            %7D else %7B%0A                throw new IllegalArgumentException(%22Can't create job from CLI in %22 + group);%0A            %7D%0A            dst = dst.substring(i + 1);%0A        %7D%0A%0A        ig
 .cop

support hierarchical ItemGroup on CLI copy