/**
 *
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.activemq.openwire.tool;

import java.io.File;

import org.apache.activemq.openwire.tool.commands.CommandClassGenerator;
import org.apache.activemq.openwire.tool.makefiles.AmqCppMakefileGenerator;
import org.apache.activemq.openwire.tool.marshallers.AmqCppMarshallingClassesGenerator;
import org.apache.activemq.openwire.tool.marshallers.AmqCppMarshallingHeadersGenerator;
import org.apache.activemq.openwire.tool.tests.AmqCppTestMarshallingClassesGenerator;
import org.apache.activemq.openwire.tool.tests.AmqCppTestMarshallingHeadersGenerator;
import org.apache.activemq.openwire.tool.tests.AmqCppTestRegistryGenerator;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.codehaus.jam.JamService;
import org.codehaus.jam.JamServiceFactory;
import org.codehaus.jam.JamServiceParams;

/**
 *
 * @version $Revision: 384826 $
 */
public class AmqCppGeneratorTask extends Task {

    int maxVersion = 3;
    File source = new File(".");
    File target = new File(".");

    public static void main(String[] args) {

        Project project = new Project();
        project.init();
        AmqCppGeneratorTask generator = new AmqCppGeneratorTask();
        generator.setProject(project);

        if( args.length > 0 ) {
            generator.maxVersion = Integer.parseInt(args[0]);
            System.out.println( "Generator Max Version: " + Integer.parseInt(args[0]) );
        }

        if( args.length > 1 ) {
            generator.source = new File(args[1]);
            System.out.println( "Generator Source: " + generator.source );
        }

        if( args.length > 2 ) {
            generator.target = new File(args[2]);
            System.out.println( "Generator Source: " + generator.target );
        }

        generator.execute();
    }

    public void execute() throws BuildException {
        try {

            String sourceDir = source+"/src/main/java";

            System.out.println("Parsing source files in: " + sourceDir);

            JamServiceFactory jamServiceFactory = JamServiceFactory.getInstance();
            JamServiceParams params = jamServiceFactory.createServiceParams();
            File[] dirs = new File[]{new File(sourceDir)};
            params.includeSourcePattern(dirs, "**/*.java");
            JamService jam = jamServiceFactory.createService(params);

            {
                CommandClassGenerator script = new CommandClassGenerator();
                script.setJam(jam);
                script.setTargetDir(target+"/src/main");
                script.setOpenwireVersion(maxVersion);
                script.run();
            }
            {
                AmqCppMakefileGenerator script = new AmqCppMakefileGenerator(
                    "activemq/commands" );
                script.setTargetDir(target+"/src/main");
                script.run();
            }

            for( int i = 1; i <= maxVersion; ++i ) {

                {
                    AmqCppMarshallingHeadersGenerator script = new AmqCppMarshallingHeadersGenerator();
                    script.setJam(jam);
                    script.setTargetDir(target+"/src/main");
                    script.setOpenwireVersion(i);
                    script.run();
                }
                {
                    AmqCppMarshallingClassesGenerator script = new AmqCppMarshallingClassesGenerator();
                    script.setJam(jam);
                    script.setTargetDir(target+"/src/main");
                    script.setOpenwireVersion(i);
                    script.run();
                }
                {
                   AmqCppTestMarshallingHeadersGenerator script = new AmqCppTestMarshallingHeadersGenerator();
                    script.setJam(jam);
                    script.setTargetDir(target+"/src/test");
                    script.setOpenwireVersion(i);
                    script.run();
                }
                {
                    AmqCppTestMarshallingClassesGenerator script = new AmqCppTestMarshallingClassesGenerator();
                    script.setJam(jam);
                    script.setTargetDir(target+"/src/test");
                    script.setOpenwireVersion(i);
                    script.run();
                }
                {
                    AmqCppMakefileGenerator script = new AmqCppMakefileGenerator(
                        "activemq/wireformat/openwire/marshal/v" + i );
                    script.setTargetDir(target+"/src/main");
                    script.run();
                }
                {
                    AmqCppMakefileGenerator script = new AmqCppMakefileGenerator(
                        "activemq/wireformat/openwire/marshal/v" + i );
                    script.setTargetDir(target+"/src/test");
                    script.run();
                }
            }

        } catch (Exception e) {
            throw new BuildException(e);
        }
    }

    public int getMaxVersion() {
        return maxVersion;
    }

    public void setMaxVersion(int version) {
        this.maxVersion = version;
    }

    public File getSource() {
        return source;
    }

    public void setSource(File basedir) {
        this.source = basedir;
    }

    public File getTarget() {
        return target;
    }

    public void setTarget(File target) {
        this.target = target;
    }

}
