001 package de.java2html.commandline;
002 
003 import java.io.File;
004 
005 import de.java2html.converter.IJavaSourceConverter;
006 import de.java2html.converter.JavaSourceConverterProvider;
007 import de.java2html.options.ConversionOptionsUtilities;
008 import de.java2html.options.JavaSourceConversionOptions;
009 import de.java2html.options.JavaSourceStyleTable;
010 
011 /**
012  
013  * Command line tool to invoke the {@link de.java2html.converter.AbstractJavaSourceConverter} without a GUI.
014  * Also allows handling of complete source trees.
015  
016  * If the -copyToTargetUnprocessedFiles parameter is supplied all files that are NOT processed
017  * by this tool will just be copied to the target directory.
018  
019  * Valid invocations are:
020  <ul>
021  *   <li><code>java -jar java2html.jar -srcdir d:/src [-targetdir d:/src/output] [-filemask *.java] [-converter HTML ¦ LaTeX ¦ XHtml ] [-tabs 4] [-copyToTargetUnprocessedFiles] [-style  KAWA ¦ ECLIPSE]</code>
022  *   <li><code>java -jar java2html.jar -srcfile d:/src/test.java [-targetfile d:/src/output/target.java]  [-converter HTML ¦ LaTeX ¦ XHtml ] [-tabs 4] [-style  KAWA ¦ ECLIPSE]</code>
023  </ul>
024  
025  * default converter is HTML and default filemask is <code>*.java</code>
026  * Other options are set to the default options defined by the <code>java2html.properties</code> file.
027  
028  @author Sanjay Madhavan
029  @author Markus Gebhard
030  */
031 public class Java2HtmlCommandline {
032   private static final String PARAM_TARGETFILE = "targetfile";
033   private static final String PARAM_SRCFILE = "srcfile";
034   private static final String PARAM_STYLE = "style";
035   private static final String FLAG_COPYTOTARGETUNPROCESSEDFILES = "copytotargetunprocessedfiles";
036   private static final String PARAM_TABS = "tabs";
037   private static final String PARAM_CONVERTER = "converter";
038   private static final String PARAM_TARGETDIR = "targetdir";
039   private static final String PARAM_SRCDIR = "srcdir";
040   private static final String PARAM_FILEMASK = "filemask";
041 
042   private static final String DEFAULT_CONVERTER_TYPE_NAME = "HTML";
043   private final static String DEFAULT_FILEMASK = "*.java";
044 
045   /**
046    * Launch this tool with the supplied parameter. See the class comment for valid parameters.
047    *  
048    @param args
049    */
050   public static IJava2HtmlConversion createCommandlineConversion(String[] args)
051       throws IllegalCommandlineParametersException {
052     final CommandlineArguments arguments = new CommandlineArguments(args);
053     if (arguments.isParameterSet(PARAM_SRCDIR)) {
054       return createDirectoryConversion(arguments);
055     }
056     else if (arguments.isParameterSet(PARAM_SRCFILE)) {
057       return createFileConversion(arguments);
058     }
059     else {
060       throw new IllegalCommandlineParametersException("No parameter -srcdir or -srcfile specified.");
061     }
062   }
063 
064   private static IJava2HtmlConversion createFileConversion(CommandlineArguments arguments)
065       throws IllegalCommandlineParametersException {
066     arguments.assertContainsNoUnsupportedFlags(new String[]{});
067     arguments.assertContainsNoUnsupportedParameters(new String[]{
068         PARAM_SRCFILE,
069         PARAM_TARGETFILE,
070         PARAM_CONVERTER,
071         PARAM_TABS,
072         PARAM_STYLE });
073 
074     final String srcFileName = arguments.getRequiredParameterStringValue(PARAM_SRCFILE);
075     final String targetFileName = arguments.getParameterStringValue(PARAM_TARGETFILE, null);
076     final String converterType = arguments.getParameterStringValue(PARAM_CONVERTER, DEFAULT_CONVERTER_TYPE_NAME);
077     final int tabSize = arguments.getParameterPositiveIntValue(PARAM_TABS, JavaSourceConversionOptions
078         .getDefault().getTabSize());
079     final String styleName = arguments
080         .getParameterStringValue(PARAM_STYLE, JavaSourceStyleTable.getDefault().getName());
081 
082     final IJavaSourceConverter converter = getConverter(converterType);
083     if (converter == null) {
084       System.err.println("ERROR: Unknown converter type: " + converterType);
085       printUsage();
086       System.exit(1);
087     }
088 
089     final JavaSourceConversionOptions options = JavaSourceConversionOptions.getDefault();
090     applyStyle(styleName, options);
091 
092     options.setTabSize(tabSize);
093 
094     return new Java2HtmlFileConversion(new File(srcFileName), targetFileName == null null new File(
095         targetFileName), converter, options);
096   }
097 
098   private static IJava2HtmlConversion createDirectoryConversion(CommandlineArguments arguments)
099       throws IllegalCommandlineParametersException {
100     arguments.assertContainsNoUnsupportedFlags(new String[]{ FLAG_COPYTOTARGETUNPROCESSEDFILES });
101     arguments.assertContainsNoUnsupportedParameters(new String[]{
102         PARAM_SRCDIR,
103         PARAM_TARGETDIR,
104         PARAM_CONVERTER,
105         PARAM_TABS,
106         PARAM_STYLE,
107         PARAM_FILEMASK });
108 
109     final String srcDirectoryName = arguments.getRequiredParameterStringValue(PARAM_SRCDIR);
110     final String targetDirectoryName = arguments.getParameterStringValue(PARAM_TARGETDIR, null);
111     final String converterType = arguments.getParameterStringValue(PARAM_CONVERTER, DEFAULT_CONVERTER_TYPE_NAME);
112     final int tabSize = arguments.getParameterPositiveIntValue(PARAM_TABS, JavaSourceConversionOptions
113         .getDefault().getTabSize());
114     final boolean copyUnprocessedFiles = arguments.isFlagSet(FLAG_COPYTOTARGETUNPROCESSEDFILES);
115     final String styleName = arguments
116         .getParameterStringValue(PARAM_STYLE, JavaSourceStyleTable.getDefault().getName());
117 
118     final String fileMask = arguments.getParameterStringValue(PARAM_FILEMASK, DEFAULT_FILEMASK);
119 
120     final IJavaSourceConverter converter = getConverter(converterType);
121     if (converter == null) {
122       System.err.println("ERROR: Unknown converter type: " + converterType);
123       printUsage();
124       System.exit(1);
125     }
126 
127     final JavaSourceConversionOptions options = JavaSourceConversionOptions.getDefault();
128     applyStyle(styleName, options);
129     options.setTabSize(tabSize);
130 
131     return new Java2HtmlDirectoryConversion(new File(srcDirectoryName), converter, targetDirectoryName == null
132         null
133         new File(targetDirectoryName), fileMask, copyUnprocessedFiles, options);
134   }
135 
136   /**
137    * Prints the valid usage of this tool.
138    *
139    */
140   public static void printUsage() {
141     System.out.println("\nValid usage: \n");
142     System.out.println("1. To convert a directory including subdirectories: \n");
143 
144     System.out.println("\tjava -jar java2html.jar -"
145         + PARAM_SRCDIR
146         " d:/src [-"
147         + PARAM_TARGETDIR
148         " d:/src/output] [-"
149         + PARAM_FILEMASK
150         " *.java] [-"
151         + PARAM_CONVERTER
152         " "
153         + getValidConverterNames()
154         "] [-"
155         + PARAM_TABS
156         " 4] [-"
157         + FLAG_COPYTOTARGETUNPROCESSEDFILES
158         "] -"
159         + PARAM_STYLE
160         " [ "
161         + getValidStylesAsString()
162         " ]\n");
163 
164     System.out.println("2. To convert a single file: \n");
165     System.out.println("\tjava -jar java2html.jar -"
166         + PARAM_SRCFILE
167         " d:/src/test.java [-"
168         + PARAM_TARGETFILE
169         " d:/src/output/target.java]  [-"
170         + PARAM_CONVERTER
171         " "
172         + getValidConverterNames()
173         "] [-"
174         + PARAM_TABS
175         " 8]"
176         " -"
177         + PARAM_STYLE
178         " [ "
179         + getValidStylesAsString()
180         " ]\n");
181   }
182 
183   /**
184    * set the style of generation, If the specified style is not a valid style then use the first defined style.
185    @param options
186    @param styleName
187    */
188   private static void applyStyle(String styleName, JavaSourceConversionOptions options)
189       throws IllegalCommandlineParametersException {
190     final JavaSourceStyleTable styleTable = JavaSourceStyleTable.getPredefinedTable(styleName);
191     if (styleTable == null) {
192       throw new IllegalCommandlineParametersException("Unknown style '" + styleName + "'");
193     }
194     options.setStyleTable(styleTable);
195   }
196 
197   /**
198    * Return a list of all defined styles as a string
199    
200    @return String
201    */
202   private static String getValidStylesAsString() {
203     return ConversionOptionsUtilities.getSeparatedString(ConversionOptionsUtilities
204         .getPredefinedStyleTableNames()" | ");
205   }
206 
207   private static String getValidConverterNames() {
208     return ConversionOptionsUtilities.getSeparatedString(
209         JavaSourceConverterProvider.getAllConverterNames(),
210         " | ");
211   }
212 
213   /**
214    * Return a converter instance for the specified converterType 
215    *  or null if no matching converter was found.
216    
217    @param converterType
218    @return JavaSourceConverter
219    */
220   private static IJavaSourceConverter getConverter(String converterType)
221       throws IllegalCommandlineParametersException {
222     final IJavaSourceConverter converter = JavaSourceConverterProvider.getJavaSourceConverterByName(converterType);
223     if (converter == null) {
224       throw new IllegalCommandlineParametersException("Unsupported converter type '" + converterType + "'");
225     }
226     return converter;
227   }
228 }