Author: tcurdt
Date: Mon Aug 13 13:16:36 2007
New Revision: 565501

URL: http://svn.apache.org/viewvc?view=rev&rev=565501
Log:
simplify janino compiler for https://issues.apache.org/jira/browse/JCI-53


Modified:
    
commons/proper/jci/trunk/compilers/janino/src/main/java/org/apache/commons/jci/compilers/JaninoJavaCompiler.java
    
commons/proper/jci/trunk/core/src/main/java/org/apache/commons/jci/stores/ResourceStore.java

Modified: 
commons/proper/jci/trunk/compilers/janino/src/main/java/org/apache/commons/jci/compilers/JaninoJavaCompiler.java
URL: 
http://svn.apache.org/viewvc/commons/proper/jci/trunk/compilers/janino/src/main/java/org/apache/commons/jci/compilers/JaninoJavaCompiler.java?view=diff&rev=565501&r1=565500&r2=565501
==============================================================================
--- 
commons/proper/jci/trunk/compilers/janino/src/main/java/org/apache/commons/jci/compilers/JaninoJavaCompiler.java
 (original)
+++ 
commons/proper/jci/trunk/compilers/janino/src/main/java/org/apache/commons/jci/compilers/JaninoJavaCompiler.java
 Mon Aug 13 13:16:36 2007
@@ -17,10 +17,11 @@
 
 package org.apache.commons.jci.compilers;
 
-import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -33,24 +34,20 @@
 import org.apache.commons.jci.utils.ConversionUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.codehaus.janino.ClassLoaderIClassLoader;
+import org.codehaus.janino.CachingJavaSourceClassLoader;
 import org.codehaus.janino.CompileException;
 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.FilterWarningHandler;
 import org.codehaus.janino.Location;
-import org.codehaus.janino.Parser;
-import org.codehaus.janino.Scanner;
-import org.codehaus.janino.UnitCompiler;
 import org.codehaus.janino.WarningHandler;
-import org.codehaus.janino.Scanner.LocatedException;
 import org.codehaus.janino.UnitCompiler.ErrorHandler;
-import org.codehaus.janino.util.ClassFile;
+import org.codehaus.janino.util.StringPattern;
+import org.codehaus.janino.util.resource.Resource;
+import org.codehaus.janino.util.resource.ResourceCreator;
+import org.codehaus.janino.util.resource.ResourceFinder;
 
 /**
- * @author [EMAIL PROTECTED]
+ * @author tcurdt
  */
 public final class JaninoJavaCompiler extends AbstractJavaCompiler {
 
@@ -66,100 +63,138 @@
        defaultSettings = pSettings;
     }
     
-    private class CompilingIClassLoader extends IClassLoader {
+    private final static class JciResource implements Resource {
 
-        private final Map types = new HashMap();
-        private final ResourceReader resourceReader;
-        private final Map classes;
-        private final Collection problems = new ArrayList();
-
-        private CompilingIClassLoader(final ResourceReader pResourceReader, 
final Map pClasses, final ClassLoader classLoader) {
-            super( new ClassLoaderIClassLoader( classLoader ) );
-            resourceReader = pResourceReader;
-            classes = pClasses;
-            super.postConstruct();
-        }
-
-        protected Collection getProblems() {
-            return problems;
-        }
-        
-        protected IClass findIClass(final String pType) {
-            final String className = Descriptor.toClassName(pType);
-            if (types.containsKey(pType)) {
-                return (IClass) types.get(pType);
-            }
-            
-            // FIXME: should not be tied to the extension            
-            final String resourceNameFromClass = className.replace('.', '/') + 
".java";
-
-            final byte[] content = 
resourceReader.getBytes(resourceNameFromClass);
-            if (content == null) {
-                return null;
-            }
-            final Reader reader = new BufferedReader(new StringReader(new 
String(content)));
-            Scanner scanner = null;
-            try {
-                scanner = new Scanner(resourceNameFromClass, reader);
-                final Java.CompilationUnit unit = new 
Parser(scanner).parseCompilationUnit();
-                final UnitCompiler uc = new UnitCompiler(unit, this);
-                uc.setCompileErrorHandler(new ErrorHandler() {
-                    public void handleError(final String pMessage, final 
Location pOptionalLocation) throws CompileException {
-                        final CompilationProblem problem = new 
JaninoCompilationProblem(pOptionalLocation, pMessage, true);
-                        if (problemHandler != null) {
-                            problemHandler.handle(problem);
-                        }
-                        problems.add(problem);
-                    }
-                });
-                uc.setWarningHandler(new WarningHandler() {
-                    public void handleWarning(final String pHandle, final 
String pMessage, final Location pOptionalLocation) {
-                        final CompilationProblem problem = new 
JaninoCompilationProblem(pOptionalLocation, pMessage, false);
-                        if (problemHandler != null) {
-                            problemHandler.handle(problem);
-                        }
-                        problems.add(problem);
-                    }
-                });
-                log.debug("compile " + className);
-                final ClassFile[] classFiles = 
uc.compileUnit(DebuggingInformation.ALL);
-                for (int i = 0; i < classFiles.length; i++) {
-                    log.debug("compiled " + classFiles[i].getThisClassName());
-                    classes.put(classFiles[i].getThisClassName(), 
classFiles[i].toByteArray());
-                }
-                final IClass ic = uc.findClass(className);
-                if (null != ic) {
-                    types.put(pType, ic);
-                }
-                return ic;
-            } catch (final LocatedException e) {
-                problems.add(new JaninoCompilationProblem(e));
-            } catch (final IOException e) {
-                problems.add(new 
JaninoCompilationProblem(resourceNameFromClass, "IOException:" + 
e.getMessage(), true));
-            } catch (final Exception e) {
-                problems.add(new 
JaninoCompilationProblem(resourceNameFromClass, "Exception:" + e.getMessage(), 
true));
-            } finally {
-                if (scanner != null) {
-                    try {
-                        scanner.close();
-                    } catch (IOException e) {
-                        log.error("IOException occured while compiling " + 
className, e);
-                    }
-                }
-            }
-            return null;
-        }
+       private final String name;
+       private final byte[] bytes;
+       
+       public JciResource( final String pName, final byte[] pBytes ) {
+               name = pName;
+               bytes = pBytes;
+       }
+       
+               public String getFileName() {
+                       return name;
+               }
+
+               public long lastModified() {
+                       return 0;
+               }
+
+               public InputStream open() throws IOException {
+                       return new ByteArrayInputStream(bytes);
+               }
     }
 
+    private final class JciOutputStream extends ByteArrayOutputStream {
+
+       private final String name;
+       private final ResourceStore store;
+
+       public JciOutputStream( final String pName, final ResourceStore pStore 
) {
+               name = pName;
+               store = pStore;
+       }
+
+               public void close() throws IOException {
+                       super.close();
+
+                       final byte[] bytes = toByteArray();
+                       
+                       log.debug("writing " + name + " (" + bytes.length + 
")");
+
+                       store.write(name, bytes);
+               }
+    }
+    
     public CompilationResult compile( final String[] pSourceNames, final 
ResourceReader pResourceReader, final ResourceStore pStore, final ClassLoader 
pClassLoader, final JavaCompilerSettings pSettings ) {
 
+       final Collection problems = new ArrayList();
+               
+       final CachingJavaSourceClassLoader cl = new 
CachingJavaSourceClassLoader(
+                       pClassLoader,
+                       new ResourceFinder() {
+
+                                       public Resource findResource( final 
String pSourceName ) {
+                                               final String name = pSourceName;
+                                               final byte[] bytes = 
pResourceReader.getBytes(name);
+                                               
+                                               if (bytes == null) {
+                                                       log.debug("failed to 
find source " + name);
+                                                       return null;
+                                               }
+                                               
+                                               log.debug("reading " + name + " 
(" + bytes.length + ")");
+                                               
+                                               return new 
JciResource(pSourceName, bytes);
+                                       }
+               
+                       },
+                       pSettings.getSourceEncoding(),
+                       new ResourceFinder() {
+
+                                       public Resource findResource( final 
String pResourceName ) {
+                                               final String name = 
pResourceName;
+                                               final byte[] bytes = 
pStore.read(name);
+                                               
+                                               if (bytes == null) {
+                                                       log.debug("failed to 
find " + name);
+                                                       return null;
+                                               }
+
+                                               log.debug("reading " + name + " 
(" + bytes.length + ")");
+                                               
+                                               return new 
JciResource(pResourceName, bytes);
+                                       }
+               
+                       },
+                       new ResourceCreator() {
+
+                                       public OutputStream createResource( 
final String pResourceName ) throws IOException {
+                                               return new 
JciOutputStream(pResourceName, pStore);
+                                       }
+
+                                       public boolean deleteResource( final 
String pResourceName ) {
+                                               log.debug("removing " + 
pResourceName);
+
+                                               pStore.remove(pResourceName);
+                                               return true;
+                                       }
+                               
+                       },
+                       
pSettings.isDebug()?DebuggingInformation.ALL:DebuggingInformation.NONE
+                       );
+       
+       
+       cl.setCompileErrorHandler(new ErrorHandler() {
+                       public void handleError( final String pMessage, final 
Location pLocation ) throws CompileException {
+                               final CompilationProblem problem = new 
JaninoCompilationProblem(pLocation.getFileName(), pLocation, pMessage, true);
+                               if (problemHandler != null) {
+                                       problemHandler.handle(problem);
+                               }
+                               problems.add(problem);
+                       }
+       });
+       
+       final StringPattern[] pattern = StringPattern.PATTERNS_NONE;
+       cl.setWarningHandler(new FilterWarningHandler(pattern, new 
WarningHandler() {
+                       public void handleWarning( final String pHandle, final 
String pMessage, final Location pLocation ) {
+                               final CompilationProblem problem = new 
JaninoCompilationProblem(pLocation.getFileName(), pLocation, pMessage, false);
+                               if (problemHandler != null) {
+                                       problemHandler.handle(problem);
+                               }
+                               problems.add(problem);
+                       }               
+       }));
+       
+       
+       
         final Map classFilesByName = new HashMap();       
         
-        final CompilingIClassLoader icl = new 
CompilingIClassLoader(pResourceReader, classFilesByName, pClassLoader);
         for (int i = 0; i < pSourceNames.length; i++) {
-            log.debug("compiling " + pSourceNames[i]);
+            log.debug("compiling " + pSourceNames[i]);            
             try {
-                               
icl.loadIClass(Descriptor.fromClassName(ConversionUtils.convertResourceToClassName(pSourceNames[i])));
+                               
cl.loadClass(ConversionUtils.convertResourceToClassName(pSourceNames[i]));
                        } catch (ClassNotFoundException e) {
                                log.error(e);
                        }
@@ -172,7 +207,6 @@
             
pStore.write(ConversionUtils.convertClassToResourcePath(clazzName), 
(byte[])entry.getValue());
         }
         
-        final Collection problems = icl.getProblems();
         final CompilationProblem[] result = new 
CompilationProblem[problems.size()];
         problems.toArray(result);
         return new CompilationResult(result);

Modified: 
commons/proper/jci/trunk/core/src/main/java/org/apache/commons/jci/stores/ResourceStore.java
URL: 
http://svn.apache.org/viewvc/commons/proper/jci/trunk/core/src/main/java/org/apache/commons/jci/stores/ResourceStore.java?view=diff&rev=565501&r1=565500&r2=565501
==============================================================================
--- 
commons/proper/jci/trunk/core/src/main/java/org/apache/commons/jci/stores/ResourceStore.java
 (original)
+++ 
commons/proper/jci/trunk/core/src/main/java/org/apache/commons/jci/stores/ResourceStore.java
 Mon Aug 13 13:16:36 2007
@@ -25,5 +25,6 @@
 
     void write( final String pResourceName, final byte[] pResourceData );
     byte[] read( final String pResourceName );
+    //FIXME: return the result of the remove
     void remove( final String pResourceName );
 }


Reply via email to