SLING-4809 : Filesystem classwriter does not delete directories

git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/bundles/commons/fsclassloader@1685721 13f79535-47bb-0310-9956-ffa450edef68
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 74d2a2f..ee6b6bc 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,6 +27,8 @@
 import java.io.OutputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
@@ -152,20 +154,35 @@
     }
 
     private void checkClassLoader(final String filePath) {
-        synchronized ( this ) {
-            final FSDynamicClassLoader currentLoader = this.loader;
-            if ( currentLoader != null && 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, '.');
-                currentLoader.check(className);
+        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 ) {
+                final FSDynamicClassLoader currentLoader = this.loader;
+                if ( currentLoader != null ) {
+                    currentLoader.check(className);
+                }
             }
         }
     }
 
     //---------- SCR Integration ----------------------------------------------
 
+    private boolean deleteRecursive(final File f, final List<String> names) {
+        if ( f.isDirectory() ) {
+            for(final File c : f.listFiles()) {
+                if ( !deleteRecursive(c, names) ) {
+                    return false;
+                }
+            }
+        }
+        names.add(f.getAbsolutePath());
+        return f.delete();
+    }
+
     /**
      * @see org.apache.sling.commons.classloader.ClassLoaderWriter#delete(java.lang.String)
      */
@@ -173,10 +190,13 @@
         final String path = cleanPath(name);
         final File file = new File(path);
         if ( file.exists() ) {
-            final boolean result = file.delete();
-            logger.debug("Deleted {} : {}", name,result);
+            final List<String> names = new ArrayList<String>();
+            final boolean result = deleteRecursive(file, names);
+            logger.debug("Deleted {} : {}", name, result);
             if ( result ) {
-                this.checkClassLoader(file.getAbsolutePath());
+                for(final String n : names ) {
+                    this.checkClassLoader(n);
+                }
             }
 
             return result;