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/03/25 20:34:29 UTC
svn commit: r927557 -
/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/
Author: hlship
Date: Thu Mar 25 19:34:29 2010
New Revision: 927557
URL: http://svn.apache.org/viewvc?rev=927557&view=rev
Log:
TAP5-1079: Refactor out a base class from ReloadableObjectCreator
Added:
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AbstractReloadableObjectCreator.java (contents, props changed)
- copied, changed from r927121, tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ReloadableObjectCreator.java
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ReloadableServiceImplementationObjectCreator.java (with props)
Removed:
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ReloadableObjectCreator.java
Modified:
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ReloadableObjectCreatorSource.java
Copied: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AbstractReloadableObjectCreator.java (from r927121, tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ReloadableObjectCreator.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AbstractReloadableObjectCreator.java?p2=tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AbstractReloadableObjectCreator.java&p1=tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ReloadableObjectCreator.java&r1=927121&r2=927557&rev=927557&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ReloadableObjectCreator.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AbstractReloadableObjectCreator.java Thu Mar 25 19:34:29 2010
@@ -18,24 +18,17 @@ import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
-import java.lang.reflect.Constructor;
import java.net.URL;
-import java.security.ProtectionDomain;
import org.apache.tapestry5.ioc.ObjectCreator;
-import org.apache.tapestry5.ioc.ServiceBuilderResources;
import org.apache.tapestry5.ioc.internal.util.InternalUtils;
import org.apache.tapestry5.ioc.services.ClassFabUtils;
import org.apache.tapestry5.services.UpdateListener;
import org.slf4j.Logger;
-/**
- * Returns an {@link ObjectCreator} for lazily instantiation a given implementation class (with dependencies).
- * Once an instance is instantiated, it is cached ... until the underlying .class file changes, at which point
- * the class is reloaded and a new instance instantiated.
- */
-public class ReloadableObjectCreator implements ObjectCreator, UpdateListener
+public abstract class AbstractReloadableObjectCreator implements ObjectCreator, UpdateListener
{
+
private class ReloadingClassLoader extends ClassLoader
{
private ReloadingClassLoader(ClassLoader parent)
@@ -64,14 +57,10 @@ public class ReloadableObjectCreator imp
}
}
- private final ServiceBuilderResources resources;
-
private final ClassLoader baseClassLoader;
private final String implementationClassName;
- private final ProtectionDomain protectionDomain;
-
private final String classFilePath;
private final Logger logger;
@@ -84,17 +73,14 @@ public class ReloadableObjectCreator imp
private boolean firstTime = true;
- public ReloadableObjectCreator(ServiceBuilderResources resources, ClassLoader baseClassLoader,
- String implementationClassName, ProtectionDomain protectionDomain)
+ protected AbstractReloadableObjectCreator(ClassLoader baseClassLoader, String implementationClassName, Logger logger)
{
- this.resources = resources;
this.baseClassLoader = baseClassLoader;
this.implementationClassName = implementationClassName;
- this.protectionDomain = protectionDomain;
this.classFilePath = ClassFabUtils.getPathForClassNamed(implementationClassName);
- logger = resources.getLogger();
+ this.logger = logger;
}
public synchronized void checkForUpdates()
@@ -128,19 +114,17 @@ public class ReloadableObjectCreator imp
Class reloadedClass = reloadImplementationClass();
- final Constructor constructor = InternalUtils.findAutobuildConstructor(reloadedClass);
-
- if (constructor == null)
- throw new RuntimeException(String.format(
- "Service implementation class %s does not have a suitable public constructor.",
- implementationClassName));
-
- ObjectCreator constructorServiceCreator = new ConstructorServiceCreator(resources, String.format(
- "%s (last modified %tc)", constructor, lastModifiedTimestamp), constructor);
-
- return constructorServiceCreator.createObject();
+ return createInstance(reloadedClass);
}
+ /**
+ * Invoked when an instance of the class is needed. It is the responsibility of this method (as implemented in a
+ * subclass) to instantiate the class and inject dependencies into the class.
+ *
+ * @see InternalUtils#findAutobuildConstructor(Class)
+ */
+ abstract protected Object createInstance(Class clazz);
+
private Class reloadImplementationClass()
{
if (logger.isDebugEnabled())
@@ -222,4 +206,8 @@ public class ReloadableObjectCreator imp
lastModifiedTimestamp = classFile.lastModified();
}
+ public long getLastModifiedTimestamp()
+ {
+ return lastModifiedTimestamp;
+ }
}
Propchange: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AbstractReloadableObjectCreator.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ReloadableObjectCreatorSource.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ReloadableObjectCreatorSource.java?rev=927557&r1=927556&r2=927557&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ReloadableObjectCreatorSource.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ReloadableObjectCreatorSource.java Thu Mar 25 19:34:29 2010
@@ -22,7 +22,7 @@ import org.apache.tapestry5.ioc.services
import org.apache.tapestry5.services.UpdateListenerHub;
/**
- * Responsible for creating a {@link ReloadableObjectCreator} for a service implementation.
+ * Responsible for creating a {@link ReloadableServiceImplementationObjectCreator} for a service implementation.
*/
public class ReloadableObjectCreatorSource implements ObjectCreatorSource
{
@@ -62,9 +62,8 @@ public class ReloadableObjectCreatorSour
private Object createReloadableProxy(ServiceBuilderResources resources)
{
- ReloadableObjectCreator reloadableCreator = new ReloadableObjectCreator(resources, classFactory
- .getClassLoader(), serviceImplementationClass.getName(), serviceImplementationClass
- .getProtectionDomain());
+ ReloadableServiceImplementationObjectCreator reloadableCreator = new ReloadableServiceImplementationObjectCreator(resources, classFactory
+ .getClassLoader(), serviceImplementationClass.getName());
resources.getService(UpdateListenerHub.class).addUpdateListener(reloadableCreator);
Added: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ReloadableServiceImplementationObjectCreator.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ReloadableServiceImplementationObjectCreator.java?rev=927557&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ReloadableServiceImplementationObjectCreator.java (added)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ReloadableServiceImplementationObjectCreator.java Thu Mar 25 19:34:29 2010
@@ -0,0 +1,53 @@
+// Copyright 2010 The Apache Software Foundation
+//
+// Licensed 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.tapestry5.ioc.internal;
+
+import java.lang.reflect.Constructor;
+
+import org.apache.tapestry5.ioc.ObjectCreator;
+import org.apache.tapestry5.ioc.ServiceBuilderResources;
+import org.apache.tapestry5.ioc.internal.util.InternalUtils;
+
+/**
+ * Returns an {@link ObjectCreator} for lazily instantiation a given implementation class (with dependencies).
+ * Once an instance is instantiated, it is cached ... until the underlying .class file changes, at which point
+ * the class is reloaded and a new instance instantiated.
+ */
+public class ReloadableServiceImplementationObjectCreator extends AbstractReloadableObjectCreator
+{
+ private final ServiceBuilderResources resources;
+
+ public ReloadableServiceImplementationObjectCreator(ServiceBuilderResources resources, ClassLoader baseClassLoader,
+ String implementationClassName)
+ {
+ super(baseClassLoader, implementationClassName, resources.getLogger());
+
+ this.resources = resources;
+ }
+
+ protected Object createInstance(Class clazz)
+ {
+ final Constructor constructor = InternalUtils.findAutobuildConstructor(clazz);
+
+ if (constructor == null)
+ throw new RuntimeException(String.format(
+ "Service implementation class %s does not have a suitable public constructor.", clazz.getName()));
+
+ ObjectCreator constructorServiceCreator = new ConstructorServiceCreator(resources, String.format(
+ "%s (last modified %tc)", constructor, getLastModifiedTimestamp()), constructor);
+
+ return constructorServiceCreator.createObject();
+ }
+}
Propchange: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ReloadableServiceImplementationObjectCreator.java
------------------------------------------------------------------------------
svn:eol-style = native