All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.ow2.mind.doc.Launcher Maven / Gradle / Ivy

There is a newer version: 1.0
Show newest version
/**
 * Copyright (C) 2009 STMicroelectronics
 *
 * This file is part of "Mind Compiler" 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 3 of the
 * License, or (at your option) any later version.
 *
 * This program 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 program.  If not, see .
 *
 * Contact: [email protected]
 *
 * Authors: [email protected]
 * Contributors:
 */
package org.ow2.mind.doc;

import java.io.File;
import java.util.logging.Formatter;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import java.util.logging.StreamHandler;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;

public class Launcher {
  private static final String MINDOC_HOME = "MINDOC_HOME";
  private static final String RESOURCE_DIR_NAME = "resources";
  public static final String DOC_FILES_DIRECTORY = "doc-files";

  public static final Logger logger = Logger.getAnonymousLogger();

  private static final String COMMAND_NAME = "mindoc";

  private static final String DEFAULT_DESTINATION = "./target/doc";
  static final String HTML_RESOURCES_DIR = "resources/html";

  private final static Options options = new Options();
  private static final String DESTINATION_PATH_OPTION = "d";
  private static final String VERBOSE_OPTION = "v";
  private static final String HELP_OPTION = "help";
  private static final String HELP_OPTION_SHORT = "h";
  private static final String OVERVIEW_OPTION = "overview";
  private static final String DOCTITLE_OPTION = "doctitle";

  public static void main(final String[] args) {
    initLogger();

    if(System.getenv(MINDOC_HOME) == null ) {
      logger.severe("MINDOC_HOME variable is not defined. MINDOC_HOME must point to the location where mindoc is installed.");
      System.exit(1);
    }

    final Option destinationPathOption = new Option(DESTINATION_PATH_OPTION, true, "The path where the documentation is generated.");
    //destinationPathOption.setRequired(true);

    final Option verboseOption = new Option(VERBOSE_OPTION, false, "Verbose output.");

    final Option helpDirectoryOption = new Option(HELP_OPTION_SHORT, HELP_OPTION, false, "Print this message and exit.");

    final Option overviewOption = new Option(OVERVIEW_OPTION, true, "Specifies the file that contains the overview documentation.");

    final Option docTitleOption = new Option(DOCTITLE_OPTION, true, "Specifies the title that will be used in the the overview page.");

    options.addOption(destinationPathOption);
    options.addOption(verboseOption);
    options.addOption(helpDirectoryOption);
    options.addOption(overviewOption);
    options.addOption(docTitleOption);

    File sourceDirectories[] = null;
    File targetDirectory = new File(DEFAULT_DESTINATION);
    File overviewFile = null;
    String docTitle = null;

    final CommandLineParser parser = new PosixParser();

    try {
      final CommandLine cmd = parser.parse(options, args);

      if(cmd.hasOption(HELP_OPTION)){
        printHelp();
        System.exit(0);
      }

      if(cmd.hasOption(VERBOSE_OPTION))
        logger.setLevel(Level.ALL);

      if(cmd.getArgs().length >= 1) {
        final String sourceList[] = cmd.getArgs();
        sourceDirectories = new File[sourceList.length];
        for (int i = 0; i < sourceList.length; i++) {
           final File sourceDirectory = new File(sourceList[i]);
          if( !sourceDirectory.isDirectory() ||
              !sourceDirectory.canRead()) {
            logger.severe(String.format("Cannot read source path '%s'.", sourceDirectory.getPath()));
            System.exit(2);
          }
          sourceDirectories[i] = sourceDirectory;
        }
      } else {
        logger.severe("You must specify a source path.");
        printHelp();
        System.exit(1);
      }

      if(cmd.hasOption(DESTINATION_PATH_OPTION)) {
        targetDirectory = new File(cmd.getOptionValue(DESTINATION_PATH_OPTION));
      } else {
        logger.info("Destination directory not specified. Documentation will be generated in default location (" + DEFAULT_DESTINATION + ").");
      }

      if(cmd.hasOption(OVERVIEW_OPTION)) {
        overviewFile = new File(cmd.getOptionValue(OVERVIEW_OPTION));
      }

      if(cmd.hasOption(DOCTITLE_OPTION)) {
        docTitle = cmd.getOptionValue(DOCTITLE_OPTION);
      }
    } catch (final ParseException e) {
      logger.severe( "Command line parse error. Reason: " + e.getMessage() );
      System.exit(1);
    }

    //check destination directory
    if(targetDirectory.exists()) {
      if(!targetDirectory.isDirectory()) {
        logger.severe("Destination path must be a directory.");
        System.exit(1);
      }
      if(!targetDirectory.canWrite()) {
        logger.severe("Cannot write in destination directory.");
        System.exit(1);
      }
    } else {
      if(!targetDirectory.mkdirs()) {
        logger.severe("Cannot create destination directory.");
        System.exit(1);
      }
    }

    runGenarators(sourceDirectories, targetDirectory, new File(getMindocHome(), RESOURCE_DIR_NAME), docTitle, overviewFile);
    ResourceCopier.copyResources(sourceDirectories, targetDirectory);
    logger.info("Documentation generated in " + targetDirectory.getPath());
  }

  private static void runGenarators(final File sourceDirectories[], final File targetDirectory, final File resourceDirectory, final String docTitle, final File overviewFile) {
    try {
      logger.fine("Generating indexes...");
      final DocumentationIndexGenerator indexGenerator = new DocumentationIndexGenerator(sourceDirectories, resourceDirectory, docTitle, overviewFile);
      indexGenerator.generateIndexPages(targetDirectory);

      logger.fine("Generating documentation...");
      final DefinitionTreeDocumentationGenerator definitionGenerator = new DefinitionTreeDocumentationGenerator(sourceDirectories);
      definitionGenerator.generateDocumentation(targetDirectory);
    } catch (final Exception e) {
      logger.severe("Error while generating documentation: " + e.getLocalizedMessage());
      System.exit(1);
    }

  }

  private static void printHelp() {
    final HelpFormatter formatter = new HelpFormatter();
    final String header = " generates documentation for ADL, IDL and implementation files located in .";
    formatter.printHelp(COMMAND_NAME + " [OPTION] ()+", header, options , null);
  }

  static String getMindocHome() {
    return System.getenv(MINDOC_HOME);
  }

  private static void initLogger() {
    final Handler consoleHandler = new ConsoleHandler();
    consoleHandler.setLevel(Level.ALL);
    logger.setLevel(Level.INFO);
    logger.setUseParentHandlers(false);
    logger.addHandler(consoleHandler);
  }

  private static class ConsoleHandler extends StreamHandler {
    public ConsoleHandler() {
      super(System.out, new Formatter() {
        @Override
        public String format(final LogRecord record) {
          final StringBuilder sb = new StringBuilder();
          if(record.getLevel() == Level.SEVERE) {
            sb.append("Error: ");
          } else if (record.getLevel() == Level.WARNING){
            sb.append("Warning: ");
          }
          sb.append(record.getMessage());
          sb.append('\n');
          return sb.toString();
        }
      });
    }

    @Override
    public synchronized void publish(final LogRecord arg0) {
      super.publish(arg0);
      flush();
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy