You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@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();