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