This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to annotated tag org.apache.sling.commons.fsclassloader-1.0.0 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-commons-fsclassloader.git
commit 77cdabd4b71efae8d094dd86f6076c73d974d796 Author: Carsten Ziegeler <[email protected]> AuthorDate: Thu Sep 2 06:31:01 2010 +0000 Update implementation to support latest dynamic class loader features. git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/contrib/commons/fsclassloader@991822 13f79535-47bb-0310-9956-ffa450edef68 --- NOTICE | 2 +- pom.xml | 2 +- .../fsclassloader/impl/FSClassLoaderProvider.java | 59 ++++++++++++++----- .../fsclassloader/impl/FSDynamicClassLoader.java | 66 ++++++++++++++++++++++ src/main/resources/META-INF/NOTICE | 2 +- 5 files changed, 115 insertions(+), 16 deletions(-) diff --git a/NOTICE b/NOTICE index 7cd62c0..3a1e374 100644 --- a/NOTICE +++ b/NOTICE @@ -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/). diff --git a/pom.xml b/pom.xml index 42ba03b..1c69da5 100644 --- a/pom.xml +++ b/pom.xml @@ -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> diff --git a/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderProvider.java b/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderProvider.java index 5a26d0f..b0911be 100644 --- a/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderProvider.java +++ b/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderProvider.java @@ -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; } } diff --git a/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSDynamicClassLoader.java b/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSDynamicClassLoader.java new file mode 100644 index 0000000..c970d8d --- /dev/null +++ b/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSDynamicClassLoader.java @@ -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); + } +} diff --git a/src/main/resources/META-INF/NOTICE b/src/main/resources/META-INF/NOTICE index 7cd62c0..3a1e374 100644 --- a/src/main/resources/META-INF/NOTICE +++ b/src/main/resources/META-INF/NOTICE @@ -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/). -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
