/*
 * Copyright 2004 The Apache Software Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.pluto.util.cli;

import java.io.File;
import java.io.IOException;

import org.apache.commons.cli.Options;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.PosixParser;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.HelpFormatter;
import org.apache.pluto.util.assemble.Assembler;
import org.apache.pluto.util.assemble.AssemblerFactory;
import org.apache.pluto.util.assemble.AssemblerConfig;
import org.apache.pluto.util.UtilityException;

/**
 * Command Line Interface to the Pluto Assembler.
 *
 * @author <a href="ddewolf@apache.org">David H. DeWolf</a>
 * @version 1.0
 * @since Oct 15, 2004
 */
public class AssemblerCLI {

    private Options options;
    private String[] args;

    public AssemblerCLI(String[] args) {
        this.args = args;
        options = new Options();
        Option destination =
            new Option("d" , "destination", true,
                       "specify where the resulting webapp should be written ");
        destination.setArgName("file");

        Option debug =
            new Option("debug", false, "print debug information.");
        options.addOption(destination);
        options.addOption(debug);
    }

    public void run() throws ParseException, IOException, UtilityException {
        CommandLineParser parser = new PosixParser();
        CommandLine line = parser.parse(options, args);

        String[] args = line.getArgs();
        if(args.length != 1) {
            abort();
            return;
        }

        String dest = line.getOptionValue("file");
        if(dest == null) {
            dest = args[0];
        }

        File source = new File(args[0]);
        File result   = new File(dest);
        result.getParentFile().mkdirs();

        if(!source.exists()) {
            System.out.println("File does not exist: "+source.getCanonicalPath());
        }


        System.out.println("-----------------------------------------------");
        System.out.println("Assembling: "+source.getCanonicalPath());
        System.out.println("        to: "+result.getCanonicalPath());

        File webXml = new File(args[0], Assembler.SERVLET_XML);
        File portletXml = new File(args[0], Assembler.PORTLET_XML);

        AssemblerConfig config = new AssemblerConfig();
        config.setWebappDescriptor(webXml);
        config.setPortletDescriptor(portletXml);
        config.setDestination(webXml);
        
        Assembler assembler = AssemblerFactory.getFactory()
            .createAssembler(config);

        config.setPortletDescriptor(portletXml);
        config.setWebappDescriptor(webXml);

        assembler.assemble(config);

        System.out.println("Complete!");
    }

    public void abort() {
        HelpFormatter help = new HelpFormatter();
        help.defaultArgName = "webapp";
        help.defaultWidth = 60;
        help.printHelp("assemble", options);
    }

    public static void main(String[] args)
    throws ParseException, IOException, UtilityException {
        new AssemblerCLI(args).run();
    }
}

