Author: tcurdt Date: Thu Mar 31 14:04:49 2005 New Revision: 159646 URL: http://svn.apache.org/viewcvs?view=rev&rev=159646 Log: initial janino implementation, thanks to Art ([EMAIL PROTECTED])
Added: jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/compilers/janino/ jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/compilers/janino/JaninoJavaCompiler.java Modified: jakarta/commons/sandbox/jci/trunk/.classpath jakarta/commons/sandbox/jci/trunk/project.xml Modified: jakarta/commons/sandbox/jci/trunk/.classpath URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/jci/trunk/.classpath?view=diff&r1=159645&r2=159646 ============================================================================== --- jakarta/commons/sandbox/jci/trunk/.classpath (original) +++ jakarta/commons/sandbox/jci/trunk/.classpath Thu Mar 31 14:04:49 2005 @@ -10,5 +10,6 @@ <classpathentry kind="var" path="MAVEN_REPO/commons-logging/jars/commons-logging-1.0.4.jar"/> <classpathentry kind="var" path="MAVEN_REPO/commons-logging/jars/commons-logging-api-1.0.4.jar"/> <classpathentry kind="var" path="MAVEN_REPO/commons-collections/jars/commons-collections-3.1.jar"/> + <classpathentry kind="var" path="MAVEN_REPO/janino/jars/janino-2.3.0.jar"/> <classpathentry kind="output" path="eclipse"/> </classpath> Modified: jakarta/commons/sandbox/jci/trunk/project.xml URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/jci/trunk/project.xml?view=diff&r1=159645&r2=159646 ============================================================================== --- jakarta/commons/sandbox/jci/trunk/project.xml (original) +++ jakarta/commons/sandbox/jci/trunk/project.xml Thu Mar 31 14:04:49 2005 @@ -69,6 +69,12 @@ <version>3.0.1</version> <type>jar</type> </dependency> + <dependency> + <groupId>janino</groupId> + <artifactId>janino</artifactId> + <version>2.3.0</version> + <type>jar</type> + </dependency> </dependencies> </project> Added: jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/compilers/janino/JaninoJavaCompiler.java URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/compilers/janino/JaninoJavaCompiler.java?view=auto&rev=159646 ============================================================================== --- jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/compilers/janino/JaninoJavaCompiler.java (added) +++ jakarta/commons/sandbox/jci/trunk/src/java/org/apache/commons/jci/compilers/janino/JaninoJavaCompiler.java Thu Mar 31 14:04:49 2005 @@ -0,0 +1,168 @@ +/* + * Copyright 1999-2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.jci.compilers.janino; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.apache.commons.jci.compilers.JavaCompiler; +import org.apache.commons.jci.problems.CompilationProblem; +import org.apache.commons.jci.problems.CompilationProblemHandler; +import org.apache.commons.jci.problems.ConsoleCompilationProblemHandler; +import org.apache.commons.jci.readers.FileResourceReader; +import org.apache.commons.jci.readers.ResourceReader; +import org.apache.commons.jci.stores.MemoryResourceStore; +import org.apache.commons.jci.stores.ResourceStore; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.codehaus.janino.ClassLoaderIClassLoader; +import org.codehaus.janino.DebuggingInformation; +import org.codehaus.janino.Descriptor; +import org.codehaus.janino.IClass; +import org.codehaus.janino.IClassLoader; +import org.codehaus.janino.Java; +import org.codehaus.janino.Parser; +import org.codehaus.janino.Scanner; +import org.codehaus.janino.Java.CompileException; +import org.codehaus.janino.Parser.ParseException; +import org.codehaus.janino.Scanner.ScanException; +import org.codehaus.janino.util.ClassFile; + +/** + * + * @author [EMAIL PROTECTED] + */ +public class JaninoJavaCompiler implements JavaCompiler { + + private final static Log log = LogFactory.getLog(JaninoJavaCompiler.class); + + private class CompilingIClassLoader extends IClassLoader { + + private ResourceReader resourceReader; + private CompilationProblemHandler problemHandler; + private Map classes,types; + private ClassLoaderIClassLoader loader; + + private CompilingIClassLoader(ResourceReader resourceReader, CompilationProblemHandler problemHandler, Map classes) { + super(null); + this.resourceReader = resourceReader; + this.problemHandler = problemHandler; + this.classes = classes; + this.types = new HashMap(); + this.loader = new ClassLoaderIClassLoader(); + super.postConstruct(); + } + + protected IClass findIClass(String type) { + String className = Descriptor.toClassName(type); + if (className.startsWith("java.") || + className.startsWith("javax.") || + className.startsWith("sun.") || + className.startsWith("org.xml.") || + className.startsWith("org.w3c.") + ) { + //Quickly hand these off + return loader.loadIClass(type); + } + //log.debug("Looking for "+className); + if (types.containsKey(type)) { + return (IClass) types.get(type); + } + String fileNameForClass = className.replace('.', File.separatorChar)+".java"; + //log.debug("Using resource reader to find "+fileNameForClass); + if (!resourceReader.isAvailable(fileNameForClass)) { + return loader.loadIClass(type); + } else { + ByteArrayInputStream instream = new ByteArrayInputStream(new String(resourceReader.getContent(fileNameForClass)).getBytes()); + Scanner scanner = null; + try { + scanner = new Scanner(fileNameForClass, instream,"UTF-8"); + Java.CompilationUnit unit = new Parser(scanner).parseCompilationUnit(); + log.debug("compile "+className); + ClassFile[] classFiles = unit.compile(this,DebuggingInformation.ALL); + for (int i=0; i<classFiles.length; i++) { + log.debug("compiled "+classFiles[i].getThisClassName()); + classes.put(classFiles[i].getThisClassName(),classFiles[i].toByteArray()); + } + IClass ic = unit.findClass(className); + if (null != ic) { + types.put(type,ic); + } + return ic; + } catch (ScanException e) { + problemHandler.handle(new CompilationProblem(0, e.getLocation().getFileName(), e.getMessage(), e.getLocation().getLineNumber(), e.getLocation().getLineNumber(), true)); + } catch (ParseException e) { + problemHandler.handle(new CompilationProblem(0, e.getLocation().getFileName(), e.getMessage(), e.getLocation().getLineNumber(), e.getLocation().getLineNumber(), true)); + } catch (IOException e) { + problemHandler.handle(new CompilationProblem(0, fileNameForClass, "IO:" + e.getMessage(), 0, 0, true)); + } catch (CompileException e) { + e.printStackTrace(); + problemHandler.handle(new CompilationProblem(0, e.getLocation().getFileName(), e.getMessage(), e.getLocation().getLineNumber(), e.getLocation().getLineNumber(), true)); + } finally { + if (scanner != null) { + try { + scanner.close(); + } catch (IOException e1) { + log.error(e1); + } + } + } + return null; + } + } + + } + + public void compile(String[] classes, ResourceReader in, + ResourceStore store, CompilationProblemHandler problemHandler) { + //log.debug("compile called "+Arrays.asList(classes)); + Map classFilesByName = new HashMap(); + IClassLoader icl = new CompilingIClassLoader(in, problemHandler, classFilesByName); + for (int i = 0; i < classes.length; i++) { + log.debug("compiling " + classes[i]); + icl.loadIClass(Descriptor.fromClassName(classes[i])); + } + // Store all fully compiled classes + for (Iterator i=classFilesByName.keySet().iterator(); i.hasNext();) { + String name = (String)i.next(); + byte[] bytes = (byte[]) classFilesByName.get(name); + store.write(name,bytes); + } + } + + public static void main(String[] args) throws Exception { + final JavaCompiler compiler = new JaninoJavaCompiler(); + final ConsoleCompilationProblemHandler problemHandler = new ConsoleCompilationProblemHandler(); + + compiler.compile( + args, + new FileResourceReader("classes"), + new MemoryResourceStore(), + problemHandler + ); + + log.debug( + problemHandler.getErrorCount() + " errors, " + + problemHandler.getWarningCount() + " warnings" + ); + } + + +} \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]