You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2010/09/01 20:57:38 UTC

svn commit: r991652 - in /tapestry/tapestry5/trunk/tapestry-ioc/src: main/java/org/apache/tapestry5/ioc/internal/AbstractReloadableObjectCreator.java test/java/org/apache/tapestry5/ioc/ReloadTest.java

Author: hlship
Date: Wed Sep  1 18:57:38 2010
New Revision: 991652

URL: http://svn.apache.org/viewvc?rev=991652&view=rev
Log:
Add a few simplifications to service reloading, and don't bother to track time modified of inner classes

Modified:
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AbstractReloadableObjectCreator.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ReloadTest.java

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AbstractReloadableObjectCreator.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AbstractReloadableObjectCreator.java?rev=991652&r1=991651&r2=991652&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AbstractReloadableObjectCreator.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AbstractReloadableObjectCreator.java Wed Sep  1 18:57:38 2010
@@ -68,8 +68,6 @@ public abstract class AbstractReloadable
 
     private final String implementationClassName;
 
-    private final String packageName;
-
     private final String classFilePath;
 
     private final Logger logger;
@@ -78,14 +76,16 @@ public abstract class AbstractReloadable
 
     private final URLChangeTracker changeTracker = new URLChangeTracker();
 
-    private Object instance;
+    /**
+     * The set of class names that should be loaded by the class loader. This is necessary to support
+     * reloading the class when a base class changes, and to properly support access to protected methods.
+     */
+    private final Set<String> classesToLoad = CollectionFactory.newSet();
 
-    private File classFile;
+    private Object instance;
 
     private boolean firstTime = true;
 
-    private final Set<String> classesToLoad = CollectionFactory.newSet();
-
     protected AbstractReloadableObjectCreator(ClassLoader baseClassLoader, String implementationClassName,
             Logger logger, OperationTracker tracker)
     {
@@ -94,18 +94,9 @@ public abstract class AbstractReloadable
         this.logger = logger;
         this.tracker = tracker;
 
-        packageName = toPackageName(implementationClassName);
-
         classFilePath = ClassFabUtils.getPathForClassNamed(implementationClassName);
     }
 
-    private String toPackageName(String name)
-    {
-        int dotx = name.lastIndexOf('.');
-
-        return dotx < 0 ? "" : name.substring(0, dotx);
-    }
-
     public synchronized void checkForUpdates()
     {
         if (instance == null)
@@ -119,7 +110,6 @@ public abstract class AbstractReloadable
                     implementationClassName));
 
         instance = null;
-        classFile = null;
         changeTracker.clear();
     }
 
@@ -137,8 +127,6 @@ public abstract class AbstractReloadable
         {
             public Object invoke()
             {
-                updateTrackingInfo();
-
                 Class reloadedClass = reloadImplementationClass();
 
                 return createInstance(reloadedClass);
@@ -201,18 +189,6 @@ public abstract class AbstractReloadable
         return result;
     }
 
-    private void updateTrackingInfo()
-    {
-        URL url = baseClassLoader.getResource(classFilePath);
-
-        if (url == null)
-            throw new RuntimeException(String.format(
-                    "Unable to reload class %s as it has been deleted. You may need to restart the application.",
-                    implementationClassName));
-
-        classFile = ClassFabUtils.toFileFromFileProtocolURL(url);
-    }
-
     private boolean shouldLoadClassNamed(String name)
     {
         return classesToLoad.contains(name);
@@ -250,7 +226,6 @@ public abstract class AbstractReloadable
             add(nc.getName());
         }
 
-
         ctClass.instrument(new ExprEditor()
         {
             public void edit(ConstructorCall c) throws CannotCompileException
@@ -278,6 +253,9 @@ public abstract class AbstractReloadable
 
     private void trackClassFileChanges(String className)
     {
+        if (isInnerClassName(className))
+            return;
+
         String path = ClassFabUtils.getPathForClassNamed(className);
 
         URL url = baseClassLoader.getResource(path);
@@ -287,6 +265,11 @@ public abstract class AbstractReloadable
         changeTracker.add(url);
     }
 
+    private boolean isInnerClassName(String className)
+    {
+        return className.indexOf('$') >= 0;
+    }
+
     /** Is the class an inner class of some other class already marked to be loaded by the special class loader? */
     private boolean isInnerClass(String className)
     {

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ReloadTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ReloadTest.java?rev=991652&r1=991651&r2=991652&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ReloadTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/ReloadTest.java Wed Sep  1 18:57:38 2010
@@ -167,7 +167,7 @@ public class ReloadTest extends IOCTestC
         }
         catch (RuntimeException ex)
         {
-            assertMessageContains(ex, "Unable to reload", CLASS, "deleted");
+            assertMessageContains(ex, "Unable to reload", CLASS);
         }
 
         registry.shutdown();