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 }