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 2010/09/02 08:31:01 UTC

svn commit: r991822 - in /sling/trunk/contrib/commons/fsclassloader: ./ src/main/java/org/apache/sling/commons/fsclassloader/impl/ src/main/resources/META-INF/

Author: cziegeler
Date: Thu Sep  2 06:31:01 2010
New Revision: 991822

URL: http://svn.apache.org/viewvc?rev=991822&view=rev
Log:
Update implementation to support latest dynamic class loader features.

Added:
    sling/trunk/contrib/commons/fsclassloader/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSDynamicClassLoader.java   (with props)
Modified:
    sling/trunk/contrib/commons/fsclassloader/NOTICE
    sling/trunk/contrib/commons/fsclassloader/pom.xml
    sling/trunk/contrib/commons/fsclassloader/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderProvider.java
    sling/trunk/contrib/commons/fsclassloader/src/main/resources/META-INF/NOTICE

Modified: sling/trunk/contrib/commons/fsclassloader/NOTICE
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/commons/fsclassloader/NOTICE?rev=991822&r1=991821&r2=991822&view=diff
==============================================================================
--- sling/trunk/contrib/commons/fsclassloader/NOTICE (original)
+++ sling/trunk/contrib/commons/fsclassloader/NOTICE Thu Sep  2 06:31:01 2010
@@ -1,5 +1,5 @@
 Apache Sling FileSystem ClassLoader
-Copyright 2009 The Apache Software Foundation
+Copyright 2009-2010 The Apache Software Foundation
 
 Apache Sling is based on source code originally developed 
 by Day Software (http://www.day.com/).

Modified: sling/trunk/contrib/commons/fsclassloader/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/commons/fsclassloader/pom.xml?rev=991822&r1=991821&r2=991822&view=diff
==============================================================================
--- sling/trunk/contrib/commons/fsclassloader/pom.xml (original)
+++ sling/trunk/contrib/commons/fsclassloader/pom.xml Thu Sep  2 06:31:01 2010
@@ -88,7 +88,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.commons.classloader</artifactId>
-            <version>1.1.0</version>
+            <version>1.2.0</version>
             <scope>provided</scope>
         </dependency>
     </dependencies>

Modified: sling/trunk/contrib/commons/fsclassloader/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/commons/fsclassloader/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderProvider.java?rev=991822&r1=991821&r2=991822&view=diff
==============================================================================
--- sling/trunk/contrib/commons/fsclassloader/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderProvider.java (original)
+++ sling/trunk/contrib/commons/fsclassloader/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderProvider.java Thu Sep  2 06:31:01 2010
@@ -27,7 +27,8 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.apache.sling.commons.classloader.ClassLoaderWriter;
 import org.apache.sling.commons.classloader.DynamicClassLoaderProvider;
@@ -47,12 +48,19 @@ public class FSClassLoaderProvider
     /** File root */
     private File root;
 
+    /** All classloaders */
+    private List<FSDynamicClassLoader> loaders = new ArrayList<FSDynamicClassLoader>();
+
     /**
      * @see org.apache.sling.commons.classloader.DynamicClassLoaderProvider#getClassLoader(ClassLoader)
      */
     public ClassLoader getClassLoader(final ClassLoader parent) {
         try {
-            return new URLClassLoader(new URL[] {this.root.toURL()}, parent);
+            final FSDynamicClassLoader cl = new FSDynamicClassLoader(new URL[] {this.root.toURL()}, parent);
+            synchronized ( this.loaders ) {
+                this.loaders.add(cl);
+            }
+            return cl;
         } catch (MalformedURLException e) {
             // this should never happen, but who knows
             throw new RuntimeException(e);
@@ -62,20 +70,38 @@ public class FSClassLoaderProvider
     /**
      * @see org.apache.sling.commons.classloader.DynamicClassLoaderProvider#release(java.lang.ClassLoader)
      */
-    public void release(ClassLoader classLoader) {
-        // nothing to do here
+    public void release(final ClassLoader classLoader) {
+        synchronized ( this.loaders ) {
+            this.loaders.remove(classLoader);
+        }
     }
 
+    private void checkClassLoaders(final String filePath) {
+        if ( filePath.endsWith(".class") ) {
+            // remove store directory and .class
+            final String path = filePath.substring(this.root.getAbsolutePath().length() + 1, filePath.length() - 6);
+            // convert to a class name
+            final String className = path.replace(File.separatorChar, '.');
+            synchronized ( this.loaders ) {
+                for(final FSDynamicClassLoader cl : this.loaders ) {
+                    cl.check(className);
+                }
+            }
+        }
+    }
     //---------- SCR Integration ----------------------------------------------
 
     /**
      * @see org.apache.sling.commons.classloader.ClassLoaderWriter#delete(java.lang.String)
      */
-    public boolean delete(String name) {
+    public boolean delete(final String name) {
         final String path = cleanPath(name);
         final File file = new File(path);
         if ( file.exists() ) {
-            return file.delete();
+            final boolean result = file.delete();
+            if ( result ) {
+                this.checkClassLoaders(file.getAbsolutePath());
+            }
         }
         // file does not exist so we return false
         return false;
@@ -84,7 +110,7 @@ public class FSClassLoaderProvider
     /**
      * @see org.apache.sling.commons.classloader.ClassLoaderWriter#getOutputStream(java.lang.String)
      */
-    public OutputStream getOutputStream(String name) {
+    public OutputStream getOutputStream(final String name) {
         final String path = cleanPath(name);
         final File file = new File(path);
         final File parentDir = file.getParentFile();
@@ -92,6 +118,9 @@ public class FSClassLoaderProvider
             parentDir.mkdirs();
         }
         try {
+            if ( file.exists() ) {
+                this.checkClassLoaders(path);
+            }
             return new FileOutputStream(path);
         } catch (FileNotFoundException e) {
             throw new RuntimeException(e);
@@ -101,11 +130,15 @@ public class FSClassLoaderProvider
     /**
      * @see org.apache.sling.commons.classloader.ClassLoaderWriter#rename(java.lang.String, java.lang.String)
      */
-    public boolean rename(String oldName, String newName) {
+    public boolean rename(final String oldName, final String newName) {
         final String oldPath = cleanPath(oldName);
         final String newPath = cleanPath(newName);
         final File old = new File(oldPath);
-        return old.renameTo(new File(newPath));
+        final boolean result = old.renameTo(new File(newPath));
+        if ( result ) {
+            this.checkClassLoaders(oldPath);
+        }
+        return result;
     }
 
     /**
@@ -131,7 +164,7 @@ public class FSClassLoaderProvider
     /**
      * @see org.apache.sling.commons.classloader.ClassLoaderWriter#getInputStream(java.lang.String)
      */
-    public InputStream getInputStream(String name)
+    public InputStream getInputStream(final String name)
     throws IOException {
         final String path = cleanPath(name);
         final File file = new File(path);
@@ -141,7 +174,7 @@ public class FSClassLoaderProvider
     /**
      * @see org.apache.sling.commons.classloader.ClassLoaderWriter#getLastModified(java.lang.String)
      */
-    public long getLastModified(String name) {
+    public long getLastModified(final String name) {
         final String path = cleanPath(name);
         final File file = new File(path);
         if ( file.exists() ) {
@@ -157,7 +190,7 @@ public class FSClassLoaderProvider
      * Create the root directory.
      * @param componentContext
      */
-    protected void activate(ComponentContext componentContext) {
+    protected void activate(final ComponentContext componentContext) {
         // get the file root
         this.root = new File(componentContext.getBundleContext().getDataFile(""), "classes");
         this.root.mkdirs();
@@ -168,7 +201,7 @@ public class FSClassLoaderProvider
      * Create the root directory.
      * @param componentContext
      */
-    protected void deactivate(ComponentContext componentContext) {
+    protected void deactivate(final ComponentContext componentContext) {
         this.root = null;
     }
 }

Added: sling/trunk/contrib/commons/fsclassloader/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSDynamicClassLoader.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/commons/fsclassloader/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSDynamicClassLoader.java?rev=991822&view=auto
==============================================================================
--- sling/trunk/contrib/commons/fsclassloader/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSDynamicClassLoader.java (added)
+++ sling/trunk/contrib/commons/fsclassloader/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSDynamicClassLoader.java Thu Sep  2 06:31:01 2010
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.sling.commons.fsclassloader.impl;
+
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.sling.commons.classloader.DynamicClassLoader;
+
+public class FSDynamicClassLoader
+    extends URLClassLoader
+    implements DynamicClassLoader {
+
+    private boolean isDirty = false;
+
+    private final Set<String> hit = Collections.synchronizedSet(new HashSet<String>());
+    private final Set<String> miss = Collections.synchronizedSet(new HashSet<String>());
+
+    public FSDynamicClassLoader(final URL[] urls, final ClassLoader parent) {
+        super(urls, parent);
+    }
+
+    /**
+     * @see org.apache.sling.commons.classloader.DynamicClassLoader#isLive()
+     */
+    public boolean isLive() {
+        return !isDirty;
+    }
+
+    /**
+     * @see java.lang.ClassLoader#loadClass(java.lang.String)
+     */
+    public Class<?> loadClass(final String name) throws ClassNotFoundException {
+        try {
+            final Class<?> c = super.loadClass(name);
+            this.hit.add(name);
+            return c;
+        } catch (final ClassNotFoundException cnfe) {
+            this.miss.add(name);
+            throw cnfe;
+        }
+    }
+
+    public void check(final String className) {
+       this.isDirty = hit.contains(className) || miss.contains(className);
+    }
+}

Propchange: sling/trunk/contrib/commons/fsclassloader/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSDynamicClassLoader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/contrib/commons/fsclassloader/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSDynamicClassLoader.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Propchange: sling/trunk/contrib/commons/fsclassloader/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSDynamicClassLoader.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: sling/trunk/contrib/commons/fsclassloader/src/main/resources/META-INF/NOTICE
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/commons/fsclassloader/src/main/resources/META-INF/NOTICE?rev=991822&r1=991821&r2=991822&view=diff
==============================================================================
--- sling/trunk/contrib/commons/fsclassloader/src/main/resources/META-INF/NOTICE (original)
+++ sling/trunk/contrib/commons/fsclassloader/src/main/resources/META-INF/NOTICE Thu Sep  2 06:31:01 2010
@@ -1,5 +1,5 @@
 Apache Sling FileSystem ClassLoader
-Copyright 2009 The Apache Software Foundation
+Copyright 2009-2010 The Apache Software Foundation
 
 Apache Sling is based on source code originally developed 
 by Day Software (http://www.day.com/).