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();