001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    
018    package org.apache.commons.jci.examples.commandline;
019    
020    import java.io.File;
021    import java.net.URL;
022    import java.net.URLClassLoader;
023    import java.util.Iterator;
024    
025    import org.apache.commons.cli.CommandLine;
026    import org.apache.commons.cli.CommandLineParser;
027    import org.apache.commons.cli.GnuParser;
028    import org.apache.commons.cli.Option;
029    import org.apache.commons.cli.OptionBuilder;
030    import org.apache.commons.cli.Options;
031    import org.apache.commons.jci.compilers.CompilationResult;
032    import org.apache.commons.jci.compilers.JavaCompiler;
033    import org.apache.commons.jci.compilers.JavaCompilerFactory;
034    import org.apache.commons.jci.compilers.JavaCompilerSettings;
035    import org.apache.commons.jci.problems.CompilationProblem;
036    import org.apache.commons.jci.problems.CompilationProblemHandler;
037    import org.apache.commons.jci.readers.FileResourceReader;
038    import org.apache.commons.jci.readers.ResourceReader;
039    import org.apache.commons.jci.stores.FileResourceStore;
040    import org.apache.commons.jci.stores.ResourceStore;
041    
042    /**
043     * A simple front end to jci mimicking the javac command line
044     *
045     * @author tcurdt
046     */
047    public final class CommandlineCompiler {
048        
049        public static void main( String[] args ) throws Exception {
050    
051            final Options options = new Options();
052    
053            options.addOption(
054                    OptionBuilder.withArgName("a.jar:b.jar")
055                        .hasArg()
056                        .withValueSeparator( ':' )
057                        .withDescription("Specify where to find user class files")
058                        .create( "classpath" ));
059    
060            options.addOption(
061                    OptionBuilder.withArgName("release")
062                        .hasArg()
063                        .withDescription("Provide source compatibility with specified release")
064                        .create( "source" ));
065    
066            options.addOption(
067                    OptionBuilder.withArgName("release")
068                        .hasArg()
069                        .withDescription("Generate class files for specific VM version")
070                        .create( "target" ));
071    
072            options.addOption(
073                    OptionBuilder.withArgName("path")
074                        .hasArg()
075                        .withDescription("Specify where to find input source files")
076                        .create( "sourcepath" ));
077    
078            options.addOption(
079                    OptionBuilder.withArgName("directory")
080                        .hasArg()
081                        .withDescription("Specify where to place generated class files")
082                        .create( "d" ));
083    
084            options.addOption(
085                    OptionBuilder.withArgName("num")
086                        .hasArg()
087                        .withDescription("Stop compilation after these number of errors")
088                        .create( "Xmaxerrs" ));
089    
090            options.addOption(
091                    OptionBuilder.withArgName("num")
092                        .hasArg()
093                        .withDescription("Stop compilation after these number of warning")
094                        .create( "Xmaxwarns" ));
095    
096            options.addOption(
097                    OptionBuilder.withDescription("Generate no warnings")
098                        .create( "nowarn" ));
099    
100    //        final HelpFormatter formatter = new HelpFormatter();
101    //        formatter.printHelp("jci", options);
102    
103            final CommandLineParser parser = new GnuParser();
104            final CommandLine cmd = parser.parse(options, args, true);
105    
106            ClassLoader classloader = CommandlineCompiler.class.getClassLoader();
107            File sourcepath = new File(".");
108            File targetpath = new File(".");
109            int maxerrs = 10;
110            int maxwarns = 10;
111            final boolean nowarn = cmd.hasOption("nowarn");
112    
113    
114            final JavaCompiler compiler = new JavaCompilerFactory().createCompiler("eclipse");
115            final JavaCompilerSettings settings = compiler.createDefaultSettings();
116    
117    
118            for (Iterator it = cmd.iterator(); it.hasNext();) {
119                final Option option = (Option) it.next();
120                if ("classpath".equals(option.getOpt())) {
121                    final String[] values = option.getValues();
122                    final URL[] urls = new URL[values.length];
123                    for (int i = 0; i < urls.length; i++) {
124                        urls[i] = new File(values[i]).toURL();
125                    }
126                    classloader = new URLClassLoader(urls);
127                } else if ("source".equals(option.getOpt())) {
128                    settings.setSourceVersion(option.getValue());
129                } else if ("target".equals(option.getOpt())) {
130                    settings.setTargetVersion(option.getValue());
131                } else if ("sourcepath".equals(option.getOpt())) {
132                    sourcepath = new File(option.getValue());
133                } else if ("d".equals(option.getOpt())) {
134                    targetpath = new File(option.getValue());
135                } else if ("Xmaxerrs".equals(option.getOpt())) {
136                    maxerrs = Integer.parseInt(option.getValue());
137                } else if ("Xmaxwarns".equals(option.getOpt())) {
138                    maxwarns = Integer.parseInt(option.getValue());
139                }
140            }
141    
142            final ResourceReader reader = new FileResourceReader(sourcepath);
143            final ResourceStore store = new FileResourceStore(targetpath);
144            
145            final int maxErrors = maxerrs;
146            final int maxWarnings = maxwarns;
147            compiler.setCompilationProblemHandler(new CompilationProblemHandler() {
148                int errors = 0;
149                int warnings = 0;
150                public boolean handle(final CompilationProblem pProblem) {
151    
152                    if (pProblem.isError()) {
153                        System.err.println(pProblem);
154    
155                        errors++;
156    
157                        if (errors >= maxErrors) {
158                            return false;
159                        }
160                    } else {
161                        if (!nowarn) {
162                            System.err.println(pProblem);
163                        }
164    
165                        warnings++;
166    
167                        if (warnings >= maxWarnings) {
168                            return false;
169                        }
170                    }
171    
172                    return true;
173                }
174            });
175            
176            final String[] resource = cmd.getArgs();
177            
178            for (int i = 0; i < resource.length; i++) {
179                System.out.println("compiling " + resource[i]);
180            }
181            
182            final CompilationResult result = compiler.compile(resource, reader, store, classloader);
183            
184            System.out.println( result.getErrors().length + " errors");
185            System.out.println( result.getWarnings().length + " warnings");
186    
187        }
188    }