You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by co...@apache.org on 2003/12/28 08:19:23 UTC

cvs commit: cocoon-2.1/src/java/org/apache/cocoon/components/flow/javascript/fom CompilingClassLoader.java FOM_JavaScriptInterpreter.java

coliver     2003/12/27 23:19:23

  Modified:    src/java/org/apache/cocoon/components/flow/javascript/fom
                        CompilingClassLoader.java
                        FOM_JavaScriptInterpreter.java
  Log:
  Only recompile classes whose source files aren't up to date. Otherwise the cached byte code will be used. Also added experimental fix to provide direct access to javax, org, and com packages
  
  Revision  Changes    Path
  1.3       +26 -8     cocoon-2.1/src/java/org/apache/cocoon/components/flow/javascript/fom/CompilingClassLoader.java
  
  Index: CompilingClassLoader.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/flow/javascript/fom/CompilingClassLoader.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- CompilingClassLoader.java	27 Dec 2003 09:06:26 -0000	1.2
  +++ CompilingClassLoader.java	28 Dec 2003 07:19:23 -0000	1.3
  @@ -76,15 +76,22 @@
   
       SourceResolver sourceResolver;
       JavaCompiler compiler;
  -    Map output = new HashMap();
       List sourcePath = new LinkedList();
       HashSet sourceListeners = new HashSet();
  +    ClassRepository classRepository;
   
       public interface SourceListener {
           public void sourceCompiled(Source src);
           public void sourceCompilationError(Source src, String error);
       }
   
  +    public interface ClassRepository {
  +        public byte[] getCompiledClass(String className);
  +        public void addCompiledClass(String className, 
  +                                     Source source,
  +                                     byte[] contents);
  +    }
  +
       protected Class findClass(String className) 
           throws ClassNotFoundException {
           byte[] bytes = compile(className);
  @@ -92,9 +99,11 @@
       }
   
       public CompilingClassLoader(ClassLoader parent,
  -                                SourceResolver sourceResolver) {
  +                                SourceResolver sourceResolver,
  +                                ClassRepository classRepository) {
           super(parent);
           this.sourceResolver = sourceResolver;
  +        this.classRepository = classRepository;
           this.compiler = new JavaCompilerImpl();
           this.sourcePath.add("");
       }
  @@ -136,6 +145,14 @@
           }
       }
   
  +    public void setClassRepository(ClassRepository rep) {
  +        classRepository = rep;
  +    }
  +
  +    public ClassRepository getClassRepository() {
  +        return classRepository;
  +    }
  +
       public void setSourcePath(String[] path) {
           synchronized (sourcePath) {
               sourcePath.clear();
  @@ -146,7 +163,6 @@
           }
       }
   
  -    
       private Source getSource(String className) {
           synchronized (sourcePath) {
               Iterator iter = sourcePath.iterator();
  @@ -228,7 +244,7 @@
               getClassReader(final String className) 
   		throws IOException {
   		final byte[] bytes = 
  -		    (byte[])output.get(className);
  +		    (byte[])classRepository.getCompiledClass(className);
   		if (bytes != null) {
   		    return new JavaClassReader() {
   			    public String getClassName() {
  @@ -281,9 +297,10 @@
   			    }
   			    s.flush();
   			    System.out.println("Compiled: " + className);
  -			    output.put(className,
  -				    s.toByteArray());
                               Source src = getSource(className);
  +			    classRepository.addCompiledClass(className,
  +                                                             src,
  +                                                             s.toByteArray());
                               notifyListeners(src, null);
                               releaseSource(src);
   			}
  @@ -326,7 +343,8 @@
   
   	private byte[] compile(String className) 
               throws ClassNotFoundException {
  -	    byte[] result = (byte[])output.get(className);
  +	    byte[] result = (byte[])
  +                classRepository.getCompiledClass(className);
   	    if (result != null) {
   		return result;
   	    }
  @@ -354,7 +372,7 @@
                       throw new ClassCompilationException(msg);
                       
                   }
  -                return (byte[])output.get(className);
  +                return (byte[])classRepository.getCompiledClass(className);
               } finally {
                   releaseSource(src);
               }
  
  
  
  1.15      +79 -31    cocoon-2.1/src/java/org/apache/cocoon/components/flow/javascript/fom/FOM_JavaScriptInterpreter.java
  
  Index: FOM_JavaScriptInterpreter.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/flow/javascript/fom/FOM_JavaScriptInterpreter.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- FOM_JavaScriptInterpreter.java	27 Dec 2003 07:30:42 -0000	1.14
  +++ FOM_JavaScriptInterpreter.java	28 Dec 2003 07:19:23 -0000	1.15
  @@ -56,6 +56,7 @@
   import java.io.OutputStream;
   import java.io.Reader;
   import java.util.ArrayList;
  +import java.util.LinkedList;
   import java.util.Iterator;
   import java.util.StringTokenizer;
   import java.util.HashMap;
  @@ -134,7 +135,7 @@
       Global scope;
   
       CompilingClassLoader classLoader;
  -    Map javaSource = new HashMap();
  +    MyClassRepository javaClassRepository = new MyClassRepository();
       String[] javaSourcePath;
   
       /**
  @@ -146,6 +147,66 @@
       JSErrorReporter errorReporter;
       boolean enableDebugger = false;
   
  +    class MyClassRepository implements CompilingClassLoader.ClassRepository {
  +        
  +        Map javaSource = new HashMap();
  +        Map javaClass = new HashMap();
  +        Map sourceToClass = new HashMap();
  +        Map classToSource = new HashMap();
  +
  +        public synchronized void addCompiledClass(String className,
  +                                                  Source src,
  +                                                  byte[] contents) {
  +            javaSource.put(src.getURI(), src.getValidity());
  +            javaClass.put(className, contents);
  +            sourceToClass.put(src.getURI(), className);
  +            classToSource.put(className, src.getURI());
  +        }
  +
  +        public synchronized byte[] getCompiledClass(String className) {
  +            return (byte[])javaClass.get(className);
  +        }
  +
  +        public synchronized boolean upToDateCheck() throws Exception {
  +            SourceResolver sourceResolver = (SourceResolver)
  +                manager.lookup(SourceResolver.ROLE);
  +            Iterator iter = javaSource.entrySet().iterator();
  +            List invalid = new LinkedList();
  +            while (iter.hasNext()) {
  +                Map.Entry e = (Map.Entry)iter.next();
  +                String uri = (String)e.getKey();
  +                SourceValidity validity = 
  +                    (SourceValidity)e.getValue();
  +                int valid = validity.isValid();
  +                if (valid == SourceValidity.UNKNOWN) {
  +                    Source newSrc = null;
  +                    try {
  +                        newSrc = sourceResolver.resolveURI(uri);
  +                        valid = newSrc.getValidity().isValid(validity);
  +                    } catch (Exception ignored) {
  +                    } finally {
  +                        if (newSrc != null) {
  +                            sourceResolver.release(newSrc);
  +                        }
  +                    }
  +                }
  +                if (valid != SourceValidity.VALID) {
  +                    invalid.add(uri);
  +                }
  +            }
  +            iter = invalid.iterator();
  +            while (iter.hasNext()) {
  +                String uri = (String)iter.next();
  +                String className = (String)sourceToClass.get(uri);
  +                sourceToClass.remove(className);
  +                javaClass.remove(className);
  +                javaSource.remove(uri);
  +                classToSource.remove(className);
  +            }
  +            return invalid.size() == 0;
  +        }
  +    }
  +
       /**
        * JavaScript debugger: there's only one of these: it can debug multiple
        * threads executing JS code.
  @@ -195,7 +256,7 @@
           if (reloadScripts) {
               String classPath 
                   = config.getChild("classpath").getValue(null);
  -            synchronized (javaSource) {
  +            synchronized (javaClassRepository) {
                   if (classPath == null) {
                       javaSourcePath = new String[]{""};
                   } else {
  @@ -248,42 +309,19 @@
           if (!reloadScripts) {
               return Thread.currentThread().getContextClassLoader();
           }
  -        synchronized (javaSource) {
  -            SourceResolver sourceResolver = (SourceResolver)
  -                manager.lookup(SourceResolver.ROLE);
  +        synchronized (javaClassRepository) {
               boolean reload = needsRefresh || classLoader == null;
               if (needsRefresh && classLoader != null) {
  -                reload = false;
  -                Iterator iter = javaSource.entrySet().iterator();
  -                while (iter.hasNext()) {
  -                    Map.Entry e = (Map.Entry)iter.next();
  -                    String uri = (String)e.getKey();
  -                    SourceValidity validity = 
  -                        (SourceValidity)e.getValue();
  -                    int valid = validity.isValid();
  -                    if (valid == SourceValidity.UNKNOWN) {
  -                        Source newSrc = 
  -                            sourceResolver.resolveURI(uri);
  -                        valid = newSrc.getValidity().isValid(validity);
  -                        sourceResolver.release(newSrc);
  -                    }
  -                    if (valid != SourceValidity.VALID) {
  -                        reload = true;
  -                        javaSource.clear();
  -                        break;
  -                    }
  -                }
  +                reload = !javaClassRepository.upToDateCheck();
               }
               if (reload) {
                   classLoader = 
                       new CompilingClassLoader(Thread.currentThread().getContextClassLoader(), 
  -                                             sourceResolver);
  +                                             (SourceResolver)manager.lookup(SourceResolver.ROLE),
  +                                             javaClassRepository);
                   classLoader.addSourceListener(new CompilingClassLoader.SourceListener() {
                           public void sourceCompiled(Source src) {
  -                            synchronized (javaSource) {
  -                                javaSource.put(src.getURI(), 
  -                                               src.getValidity());
  -                            }
  +                            // no action
                           }
   
                           public void sourceCompilationError(Source src,
  @@ -366,7 +404,10 @@
   
       public static class ThreadScope extends ScriptableObject {
   
  +        static final String[] builtinPackages = {"javax", "org", "com"};
  +
           ClassLoader classLoader;
  +
           /* true if this scope has assigned any global vars */
           boolean useSession = false;
   
  @@ -423,6 +464,13 @@
                   newPackages.setParentScope(this);
                   newPackages.setPrototype(ScriptableObject.getClassPrototype(this, "JavaPackage"));
                   super.put("Packages", this, newPackages);
  +                for (int i = 0; i < builtinPackages.length; i++) {
  +                    String pkgName = builtinPackages[i];
  +                    Scriptable pkg = new NativeJavaPackage(pkgName, cl);
  +                    pkg.setParentScope(this);
  +                    pkg.setPrototype(ScriptableObject.getClassPrototype(this, "JavaPackage"));
  +                    super.put(pkgName, this, pkg);
  +                }
               }
           }