org.jbpm.jpdl.internal.convert.JpdlConverterTool.java Source code

Java tutorial

Introduction

Here is the source code for org.jbpm.jpdl.internal.convert.JpdlConverterTool.java

Source

/*
 * JBoss, Home of Professional Open Source
 * Copyright 2005, JBoss Inc., and individual contributors as indicated
 * by the @authors tag. See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package org.jbpm.jpdl.internal.convert;

import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.net.MalformedURLException;
import java.net.URL;

import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.jbpm.jpdl.internal.convert.exception.IllegalCommandException;
import org.jbpm.jpdl.internal.convert.problem.Problem;

/**
 * Conversion command line tool main class.
 * 
 * @author Jim Ma
 */
public class JpdlConverterTool {

    public static void main(String[] args) {
        JpdlConverterTool jpdlConverterTool = new JpdlConverterTool();

        // Parse and validate the command line arguments
        ConverterContext context = null;
        try {
            context = jpdlConverterTool.parseParam(args);
            jpdlConverterTool.validate(context);
        } catch (IllegalCommandException e) {
            System.err.println(e.getMessage());
            System.err.println(jpdlConverterTool.getUsage());
            return;
        } catch (Exception e) {
            System.err.println(e.getMessage());
            return;
        }

        boolean verbose = false;
        if (context.get(ConverterContext.VERBOSE) != null) {
            verbose = true;
        }
        Jpdl3Converter jpdlConverter = new Jpdl3Converter((URL) context.get(context.PROCESS_FILE_URL));

        try {
            if (verbose) {
                System.out.println(
                        "Loading process file from URL [" + context.get(context.PROCESS_FILE_URL) + "]...");
            }
            Document jpdl4Doc = jpdlConverter.readAndConvert();

            if (verbose) {
                System.out.println("Converting the process file to jPDL4 version....");
            }

            String outputFilePath = (String) context.get(context.OUPUTFILE);
            File outputFile = new File(outputFilePath);

            //well print xml to file
            Writer fileWriter = new FileWriter(outputFile);
            OutputFormat format = OutputFormat.createPrettyPrint();
            XMLWriter writer = new XMLWriter(fileWriter, format);
            writer.write(jpdl4Doc);
            writer.close();

            if (verbose) {
                System.out.println("Generating converted file to:"
                        + (outputFile.isAbsolute() ? outputFile.getAbsolutePath() : outputFile.getName()));
            }

        } catch (Exception e) {

            for (Problem problem : jpdlConverter.problems) {
                if (problem.getLevel() == problem.LEVEL_WARNING) {
                    System.err.println(problem);
                }
                if (problem.getLevel() < problem.LEVEL_WARNING) {
                    System.err.println(problem);
                    if (problem.getException() != null && context.get(ConverterContext.VERBOSE) != null) {
                        problem.getException().printStackTrace(System.err);
                        System.err.println();
                    }
                }
            }

        }
    }

    /**
     * Parses the command line arguments and returns a context 
     * in which the conversion will happen.
     */
    public ConverterContext parseParam(String[] args) throws IllegalCommandException {
        ConverterContext context = new ConverterContext();

        if (args.length == 0) {
            throw new IllegalCommandException("No file for conversion is supplied");
        }

        for (int i = 0; i < args.length; i++) {
            String token = args[i];
            if ("-v".equalsIgnoreCase(token) || "-verbose".equalsIgnoreCase(token)) {
                context.put(ConverterContext.VERBOSE, ConverterContext.VERBOSE);
            } else if ("-o".equalsIgnoreCase(token) || "-output".equalsIgnoreCase(token)) {
                int j = ++i;
                if (j < args.length) {
                    String outputFile = args[j];
                    context.put(ConverterContext.OUPUTFILE, args[j]);
                } else {
                    throw new IllegalCommandException("Missing output file name");
                }
            } else if (token.startsWith("-")) {
                throw new IllegalCommandException("Unknow flag [" + token + "]");
            } else if (context.get(ConverterContext.PROCESS_FILE) == null) {
                context.put(ConverterContext.PROCESS_FILE, token);
            } else {
                throw new IllegalCommandException("Duplicate input process file");
            }

        }
        if (context.get(ConverterContext.PROCESS_FILE) == null) {
            throw new IllegalCommandException("No input process file defined");
        }

        return context;
    }

    public void validate(ConverterContext context) throws Exception {
        String processFile = (String) context.get(ConverterContext.PROCESS_FILE);
        URL processURL = getFileURL(processFile);
        if (processURL == null) {
            throw new IllegalCommandException("Failed to load the process file [" + processFile + "]");
        }
        context.put(context.PROCESS_FILE_URL, processURL);
        //handle the output filename
        if (context.get(ConverterContext.OUPUTFILE) == null) {
            File tmpFile = new File(processURL.getFile());
            String fileName = tmpFile.getName();
            String baseName = fileName;

            int index = fileName.lastIndexOf(".");

            if (index > -1) {
                baseName = fileName.substring(0, index);
            } else {
                baseName = fileName;
            }

            String outputFileName = baseName + ".converted.jpdl.xml";
            File outFile = new File(".", outputFileName);
            context.put(ConverterContext.OUPUTFILE, outFile.getAbsolutePath());
        } else {
            String outputFile = (String) context.get(ConverterContext.OUPUTFILE);
            File file = new File(outputFile);
            if (file.isAbsolute()) {
                if (!file.getParentFile().exists()) {
                    throw new IllegalCommandException("Output directory [" + file.getParent() + "] does not exist");
                }
            } else {
                file = new File(".", outputFile);
            }
            if (!file.exists()) {
                file.createNewFile();
            }
            context.put(ConverterContext.OUPUTFILE, file.getAbsolutePath());
        }

    }

    public URL getFileURL(String fileName) {
        try {
            URL url = new URL(fileName);
            return url;
        } catch (MalformedURLException e1) {
            //Do nothing
        }
        File file = new File(fileName);
        if (file.exists()) {
            try {
                return file.toURL();
            } catch (MalformedURLException e) {
                // Do nothing.
            }

        }
        // load in current directory
        File tmpFile = new File(".", fileName);
        if (file.exists()) {
            try {
                return tmpFile.toURL();
            } catch (MalformedURLException e) {
                // Do nothing
            }
        }

        return null;
    }

    public String getUsage() {
        return "Usage : java org.jbpm.jpdl.internal.convert.JpdlConverterTool <file>\r\n"
                + "        java org.jbpm.jpdl.internal.convert.JpdlConverterTool -v -o <outputfile> <file>";

    }

}