You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2009/07/16 09:27:34 UTC

svn commit: r794564 - in /sling/trunk/contrib/jcr/compiler: pom.xml src/main/java/org/apache/sling/jcr/compiler/impl/JcrJavaCompilerImpl.java

Author: cziegeler
Date: Thu Jul 16 07:27:34 2009
New Revision: 794564

URL: http://svn.apache.org/viewvc?rev=794564&view=rev
Log:
Replace use of dynamic import package * with new commons class loader. Fix possible multi threading problems.

Modified:
    sling/trunk/contrib/jcr/compiler/pom.xml
    sling/trunk/contrib/jcr/compiler/src/main/java/org/apache/sling/jcr/compiler/impl/JcrJavaCompilerImpl.java

Modified: sling/trunk/contrib/jcr/compiler/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/jcr/compiler/pom.xml?rev=794564&r1=794563&r2=794564&view=diff
==============================================================================
--- sling/trunk/contrib/jcr/compiler/pom.xml (original)
+++ sling/trunk/contrib/jcr/compiler/pom.xml Thu Jul 16 07:27:34 2009
@@ -62,7 +62,6 @@
                         <Private-Package>
                             org.apache.sling.jcr.compiler.impl
                         </Private-Package>
-                        <DynamicImport-Package>*</DynamicImport-Package>
                     </instructions>
                 </configuration>
             </plugin>
@@ -77,8 +76,8 @@
 	    </dependency>
 	    <dependency>
 	        <groupId>org.apache.sling</groupId>
-	        <artifactId>org.apache.sling.jcr.classloader</artifactId>
-	        <version>2.0.2-incubator</version>
+	        <artifactId>org.apache.sling.commons.classloader</artifactId>
+	        <version>0.9.0-SNAPSHOT</version>
 	    </dependency>
         <dependency>
             <groupId>org.apache.sling</groupId>

Modified: sling/trunk/contrib/jcr/compiler/src/main/java/org/apache/sling/jcr/compiler/impl/JcrJavaCompilerImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/jcr/compiler/src/main/java/org/apache/sling/jcr/compiler/impl/JcrJavaCompilerImpl.java?rev=794564&r1=794563&r2=794564&view=diff
==============================================================================
--- sling/trunk/contrib/jcr/compiler/src/main/java/org/apache/sling/jcr/compiler/impl/JcrJavaCompilerImpl.java (original)
+++ sling/trunk/contrib/jcr/compiler/src/main/java/org/apache/sling/jcr/compiler/impl/JcrJavaCompilerImpl.java Thu Jul 16 07:27:34 2009
@@ -29,6 +29,7 @@
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
+import org.apache.sling.commons.classloader.DynamicClassLoaderManager;
 import org.apache.sling.commons.compiler.ClassWriter;
 import org.apache.sling.commons.compiler.CompileUnit;
 import org.apache.sling.commons.compiler.CompilerEnvironment;
@@ -36,42 +37,36 @@
 import org.apache.sling.commons.compiler.JavaCompiler;
 import org.apache.sling.commons.compiler.Options;
 import org.apache.sling.jcr.api.SlingRepository;
-import org.apache.sling.jcr.classloader.RepositoryClassLoaderProvider;
 import org.apache.sling.jcr.compiler.JcrJavaCompiler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * <code>JcrJavaCompilerImpl</code> ...
- * 
+ *
  * @scr.component metatype="no"
  * @scr.service interface="org.apache.sling.jcr.compiler.JcrJavaCompiler"
  */
 public class JcrJavaCompilerImpl implements JcrJavaCompiler, CompilerEnvironment {
 
     /** Logger instance */
-    private static final Logger log = LoggerFactory.getLogger(JcrJavaCompilerImpl.class);
-
-    private static final String CLASSLOADER_NAME = "admin";
+    private final Logger log = LoggerFactory.getLogger(JcrJavaCompilerImpl.class);
 
     /** @scr.reference */
     protected JavaCompiler compiler;
-    
+
     /** @scr.reference */
-    protected RepositoryClassLoaderProvider clp;
+    protected DynamicClassLoaderManager dynamicClassLoaderManager;
+
+    /** The class loader used to compile the classes. */
+    protected ClassLoader javaClassLoader;
 
     /** @scr.reference */
-    protected SlingRepository rep;
-    
-    // only accessed locally within scope of compile() method
-    private ClassLoader cl;
+    protected SlingRepository repository;
 
-    // only accessed locally within scope of compile() method
+    /** The session. */
     private Session session;
 
-    public JcrJavaCompilerImpl() {
-    }
-
     //------------------------------------------------------< JcrJavaCompiler >
     /* (non-Javadoc)
      * @see org.apache.sling.jcr.compiler.JcrJavaCompiler#compile(java.lang.String[], java.lang.String, org.apache.sling.commons.compiler.ErrorHandler, boolean, java.lang.String)
@@ -79,7 +74,7 @@
     public boolean compile(String[] srcFiles, String outputDir,
             ErrorHandler errorHandler, boolean generateDebug, String javaVersion)
             throws Exception {
-        
+
         if (javaVersion == null) {
             javaVersion = System.getProperty("java.specification.version");
         }
@@ -87,61 +82,49 @@
         if (outputDir == null) {
             throw new Exception("outputDir can not be null");
         }
-        
+
         ErrorHandlerWrapper handler = new ErrorHandlerWrapper(errorHandler);
 
-        cl = clp.getClassLoader(CLASSLOADER_NAME);
-        try {
-            session = rep.loginAdministrative(null);
-            
-            ClassWriter classWriter;
-            if (outputDir.startsWith("file://")) {
-                // write class files to local file system;
-                // only subdirectories of the system temp dir 
-                // will be accepted
-                File tempDir = new File(System.getProperty("java.io.tmpdir"));
-                File outDir = new File(outputDir.substring("file://".length()));
-                if (!outDir.isAbsolute()) {
-                    outDir = new File(tempDir, outputDir.substring("file://".length()));
-                } 
-                if (!outDir.getCanonicalPath().startsWith(tempDir.getCanonicalPath())) {
-                    throw new Exception("illegal outputDir (not a temp dir): " + outputDir);
-                }
-                outDir.mkdir();
-                classWriter = new FileClassWriter(outDir);
-            } else {
-                // write class files to the repository  (default)
-                if (!session.itemExists(outputDir)) {
-                    throw new Exception("outputDir does not exist: " + outputDir);
-                }
-                
-                Item item = session.getItem(outputDir);
-                if (item.isNode()) {
-                    Node folder = (Node) item;
-                    if (!folder.isNodeType("nt:folder")) {
-                        throw new Exception("outputDir must be a node of type nt:folder");
-                    }
-                    classWriter = new JcrClassWriter(folder);
-                } else {
+        ClassWriter classWriter;
+        if (outputDir.startsWith("file://")) {
+            // write class files to local file system;
+            // only subdirectories of the system temp dir
+            // will be accepted
+            File tempDir = new File(System.getProperty("java.io.tmpdir"));
+            File outDir = new File(outputDir.substring("file://".length()));
+            if (!outDir.isAbsolute()) {
+                outDir = new File(tempDir, outputDir.substring("file://".length()));
+            }
+            if (!outDir.getCanonicalPath().startsWith(tempDir.getCanonicalPath())) {
+                throw new Exception("illegal outputDir (not a temp dir): " + outputDir);
+            }
+            outDir.mkdir();
+            classWriter = new FileClassWriter(outDir);
+        } else {
+            // write class files to the repository  (default)
+            if (!session.itemExists(outputDir)) {
+                throw new Exception("outputDir does not exist: " + outputDir);
+            }
+
+            Item item = session.getItem(outputDir);
+            if (item.isNode()) {
+                Node folder = (Node) item;
+                if (!folder.isNodeType("nt:folder")) {
                     throw new Exception("outputDir must be a node of type nt:folder");
                 }
+                classWriter = new JcrClassWriter(folder);
+            } else {
+                throw new Exception("outputDir must be a node of type nt:folder");
             }
+        }
 
-            CompileUnit[] units = new CompileUnit[srcFiles.length];
-            for (int i = 0; i < units.length; i++) {
-                units[i] = createCompileUnit(srcFiles[i]);
-            }
-            compiler.compile(units, this, classWriter, handler, 
-                    new Options(javaVersion, generateDebug));
-        } finally {
-            // cleanup
-            clp.ungetClassLoader(cl);
-            if (session != null) {
-                session.logout();
-                session = null;
-            }
+        CompileUnit[] units = new CompileUnit[srcFiles.length];
+        for (int i = 0; i < units.length; i++) {
+            units[i] = createCompileUnit(srcFiles[i]);
         }
-        
+        compiler.compile(units, this, classWriter, handler,
+                new Options(javaVersion, generateDebug));
+
         return handler.getNumErrors() == 0;
     }
 
@@ -150,7 +133,7 @@
      * @see org.apache.sling.commons.compiler.CompilerEnvironment#findClass(java.lang.String)
      */
     public byte[] findClass(String className) throws Exception {
-        InputStream in = cl.getResourceAsStream(className.replace('.', '/') + ".class");
+        InputStream in = this.javaClassLoader.getResourceAsStream(className.replace('.', '/') + ".class");
         if (in == null) {
             return null;
         }
@@ -174,7 +157,7 @@
      * @see org.apache.sling.commons.compiler.CompilerEnvironment#isPackage(java.lang.String)
      */
     public boolean isPackage(String packageName) {
-        InputStream in = cl.getResourceAsStream(packageName.replace('.', '/') + ".class");
+        InputStream in = this.javaClassLoader.getResourceAsStream(packageName.replace('.', '/') + ".class");
         if (in != null) {
             try {
                 in.close();
@@ -182,7 +165,7 @@
             }
             return false;
         }
-        // FIXME need a better way to determine whether a name resolves 
+        // FIXME need a better way to determine whether a name resolves
         // to a package
         int pos = packageName.lastIndexOf('.');
         if (pos != -1) {
@@ -228,9 +211,9 @@
         };
     }
 
-    private char[] readTextResource(String resourcePath) 
+    private char[] readTextResource(String resourcePath)
             throws RepositoryException, IOException {
-        String relPropPath = resourcePath.substring(1) 
+        String relPropPath = resourcePath.substring(1)
                 + "/jcr:content/jcr:data";
         InputStream in = session.getRootNode().getProperty(relPropPath).getStream();
         Reader reader = new InputStreamReader(in);
@@ -282,4 +265,64 @@
             handler.onWarning(msg, sourceFile, line, position);
         }
     }
+
+    /**
+     * Bind the class load provider.
+     * @param repositoryClassLoaderProvider the new provider
+     */
+    protected void bindDynamicClassLoaderManager(DynamicClassLoaderManager rclp) {
+        if ( this.javaClassLoader != null ) {
+            this.ungetClassLoader();
+        }
+        this.getClassLoader(rclp);
+    }
+
+    /**
+     * Unbind the class loader provider.
+     * @param repositoryClassLoaderProvider the old provider
+     */
+    protected void unbindDynamicClassLoaderManager(DynamicClassLoaderManager rclp) {
+        if ( this.dynamicClassLoaderManager == rclp ) {
+            this.ungetClassLoader();
+        }
+    }
+
+    /**
+     * Get the class loader
+     */
+    private void getClassLoader(DynamicClassLoaderManager rclp) {
+        this.dynamicClassLoaderManager = rclp;
+        this.javaClassLoader = rclp.getDynamicClassLoader();
+    }
+
+    /**
+     * Unget the class loader
+     */
+    private void ungetClassLoader() {
+        this.dynamicClassLoaderManager = null;
+        this.javaClassLoader = null;
+    }
+
+    protected void bindRepository(final SlingRepository repo) {
+        if ( this.session != null ) {
+            this.session.logout();
+            this.session = null;
+        }
+        try {
+            this.session = repo.loginAdministrative(null);
+        } catch (RepositoryException re) {
+            log.error("Unable to open admin session.", re);
+        }
+        this.repository = repo;
+    }
+
+    protected void unbindRepository(final SlingRepository repo) {
+        if ( this.repository == repo ) {
+            if ( this.session != null ) {
+                this.session.logout();
+                this.session = null;
+            }
+            this.repository = null;
+        }
+    }
 }