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 2011/04/30 04:05:31 UTC

svn commit: r1098038 - in /tapestry/tapestry5/trunk: tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/ tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/ tapestr...

Author: hlship
Date: Sat Apr 30 02:05:30 2011
New Revision: 1098038

URL: http://svn.apache.org/viewvc?rev=1098038&view=rev
Log:
TAP5-853: Add support for logging the creation of proxies and transformed classes

Added:
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PlasticClassListenerLogger.java
Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/RegistryBuilder.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PlasticProxyFactoryImpl.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/PlasticProxyFactory.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImplTest.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/resources/log4j.properties

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java?rev=1098038&r1=1098037&r2=1098038&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java Sat Apr 30 02:05:30 2011
@@ -33,6 +33,7 @@ import org.apache.tapestry5.ioc.annotati
 import org.apache.tapestry5.ioc.annotations.Primary;
 import org.apache.tapestry5.ioc.annotations.Symbol;
 import org.apache.tapestry5.ioc.internal.services.ClassFactoryImpl;
+import org.apache.tapestry5.ioc.internal.services.PlasticClassListenerLogger;
 import org.apache.tapestry5.ioc.internal.services.PlasticProxyFactoryImpl;
 import org.apache.tapestry5.ioc.internal.util.ClasspathResource;
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
@@ -49,6 +50,8 @@ import org.apache.tapestry5.plastic.Inst
 import org.apache.tapestry5.plastic.InstructionBuilderCallback;
 import org.apache.tapestry5.plastic.MethodDescription;
 import org.apache.tapestry5.plastic.PlasticClass;
+import org.apache.tapestry5.plastic.PlasticClassEvent;
+import org.apache.tapestry5.plastic.PlasticClassListener;
 import org.apache.tapestry5.plastic.PlasticField;
 import org.apache.tapestry5.plastic.PlasticManager;
 import org.apache.tapestry5.plastic.PlasticManagerDelegate;
@@ -66,7 +69,7 @@ import org.slf4j.Logger;
  * A wrapper around a {@link PlasticManager} that allows certain classes to be modified as they are loaded.
  */
 public final class ComponentInstantiatorSourceImpl extends InvalidationEventHubImpl implements
-        ComponentInstantiatorSource, UpdateListener, PlasticManagerDelegate
+        ComponentInstantiatorSource, UpdateListener, PlasticManagerDelegate, PlasticClassListener
 {
 
     private final Set<String> controlledPackageNames = CollectionFactory.newSet();
@@ -168,9 +171,11 @@ public final class ComponentInstantiator
     {
         manager = new PlasticManager(parent, this, controlledPackageNames);
 
+        manager.addPlasticClassListener(this);
+
         classFactory = new ClassFactoryImpl(manager.getClassLoader(), logger);
 
-        proxyFactory = new PlasticProxyFactoryImpl(classFactory, manager.getClassLoader());
+        proxyFactory = new PlasticProxyFactoryImpl(classFactory, manager.getClassLoader(), logger);
 
         classToInstantiator.clear();
         classToModel.clear();
@@ -369,4 +374,13 @@ public final class ComponentInstantiator
 
         return null;
     }
+
+    public void classWillLoad(PlasticClassEvent event)
+    {
+        Logger logger = loggerSource.getLogger("tapestry.transformer." + event.getPrimaryClassName());
+
+        if (logger.isDebugEnabled())
+            logger.debug(event.getDissasembledBytecode());
+    }
+
 }

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/RegistryBuilder.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/RegistryBuilder.java?rev=1098038&r1=1098037&r2=1098038&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/RegistryBuilder.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/RegistryBuilder.java Sat Apr 30 02:05:30 2011
@@ -80,9 +80,10 @@ public final class RegistryBuilder
         // module exists.
 
         Logger classFactoryLogger = loggerSource.getLogger(TapestryIOCModule.class.getName() + ".ClassFactory");
+        Logger proxyFactoryLogger = loggerSource.getLogger(TapestryIOCModule.class.getName() + ".PlasticProxyFactory");
 
         classFactory = new ClassFactoryImpl(this.classLoader, classFactoryLogger);
-        proxyFactory = new PlasticProxyFactoryImpl(classFactory, this.classLoader);
+        proxyFactory = new PlasticProxyFactoryImpl(classFactory, this.classLoader, proxyFactoryLogger);
 
         add(TapestryIOCModule.class);
     }

Added: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PlasticClassListenerLogger.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PlasticClassListenerLogger.java?rev=1098038&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PlasticClassListenerLogger.java (added)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PlasticClassListenerLogger.java Sat Apr 30 02:05:30 2011
@@ -0,0 +1,46 @@
+// Copyright 2011 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.services;
+
+import org.apache.tapestry5.plastic.ClassType;
+import org.apache.tapestry5.plastic.PlasticClassEvent;
+import org.apache.tapestry5.plastic.PlasticClassListener;
+import org.slf4j.Logger;
+import org.slf4j.Marker;
+import org.slf4j.MarkerFactory;
+
+public class PlasticClassListenerLogger implements PlasticClassListener
+{
+    private final Logger logger;
+
+    public PlasticClassListenerLogger(Logger logger)
+    {
+        this.logger = logger;
+    }
+
+    public void classWillLoad(PlasticClassEvent event)
+    {
+        if (logger.isDebugEnabled())
+        {
+            Marker marker = MarkerFactory.getMarker(event.getPrimaryClassName());
+
+            String extendedClassName = event.getType() == ClassType.PRIMARY ? event.getPrimaryClassName() : String
+                    .format("%s (%s for %s)", event.getClassName(), event.getType(), event.getPrimaryClassName());
+
+            logger.debug(marker,
+                    String.format("Loading class %s:\n%s", extendedClassName, event.getDissasembledBytecode()));
+        }
+    }
+}

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PlasticProxyFactoryImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PlasticProxyFactoryImpl.java?rev=1098038&r1=1098037&r2=1098038&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PlasticProxyFactoryImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PlasticProxyFactoryImpl.java Sat Apr 30 02:05:30 2011
@@ -16,7 +16,6 @@ package org.apache.tapestry5.ioc.interna
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
 
 import org.apache.tapestry5.ioc.Location;
 import org.apache.tapestry5.ioc.ObjectCreator;
@@ -26,24 +25,34 @@ import org.apache.tapestry5.ioc.services
 import org.apache.tapestry5.plastic.ClassInstantiator;
 import org.apache.tapestry5.plastic.InstructionBuilder;
 import org.apache.tapestry5.plastic.InstructionBuilderCallback;
-import org.apache.tapestry5.plastic.MethodDescription;
 import org.apache.tapestry5.plastic.PlasticClass;
+import org.apache.tapestry5.plastic.PlasticClassListener;
 import org.apache.tapestry5.plastic.PlasticClassTransformation;
 import org.apache.tapestry5.plastic.PlasticClassTransformer;
 import org.apache.tapestry5.plastic.PlasticField;
 import org.apache.tapestry5.plastic.PlasticManager;
 import org.apache.tapestry5.plastic.PlasticMethod;
+import org.slf4j.Logger;
 
 public class PlasticProxyFactoryImpl implements PlasticProxyFactory
 {
     private final ClassFactory classFactory;
 
+    private final Logger logger;
+
     private final PlasticManager manager;
 
-    public PlasticProxyFactoryImpl(ClassFactory classFactory, ClassLoader parentClassLoader)
+    public PlasticProxyFactoryImpl(ClassFactory classFactory, ClassLoader parentClassLoader, Logger logger)
     {
         this.classFactory = classFactory;
+        this.logger = logger;
+
         manager = new PlasticManager(parentClassLoader);
+
+        if (logger != null)
+        {
+            manager.addPlasticClassListener(new PlasticClassListenerLogger(logger));
+        }
     }
 
     public ClassLoader getClassLoader()
@@ -108,4 +117,14 @@ public class PlasticProxyFactoryImpl imp
         return classFactory.getConstructorLocation(constructor);
     }
 
+    public void addPlasticClassListener(PlasticClassListener listener)
+    {
+        manager.addPlasticClassListener(listener);
+    }
+
+    public void removePlasticClassListener(PlasticClassListener listener)
+    {
+        manager.removePlasticClassListener(listener);
+    }
+
 }

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/PlasticProxyFactory.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/PlasticProxyFactory.java?rev=1098038&r1=1098037&r2=1098038&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/PlasticProxyFactory.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/PlasticProxyFactory.java Sat Apr 30 02:05:30 2011
@@ -20,6 +20,7 @@ import java.lang.reflect.Method;
 import org.apache.tapestry5.ioc.Location;
 import org.apache.tapestry5.ioc.ObjectCreator;
 import org.apache.tapestry5.plastic.ClassInstantiator;
+import org.apache.tapestry5.plastic.PlasticClassListenerHub;
 import org.apache.tapestry5.plastic.PlasticClassTransformation;
 import org.apache.tapestry5.plastic.PlasticClassTransformer;
 
@@ -29,7 +30,7 @@ import org.apache.tapestry5.plastic.Plas
  * 
  * @since 5.3.0
  */
-public interface PlasticProxyFactory
+public interface PlasticProxyFactory extends PlasticClassListenerHub
 {
     /**
      * Returns the class loader used when creating new classes, this is a child class loader

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImplTest.java?rev=1098038&r1=1098037&r2=1098038&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/DefaultModuleDefImplTest.java Sat Apr 30 02:05:30 2011
@@ -52,7 +52,7 @@ public class DefaultModuleDefImplTest ex
     public void setup()
     {
         classFactory = new ClassFactoryImpl();
-        proxyFactory = new PlasticProxyFactoryImpl(classFactory, Thread.currentThread().getContextClassLoader());
+        proxyFactory = new PlasticProxyFactoryImpl(classFactory, Thread.currentThread().getContextClassLoader(), null);
     }
 
     @AfterClass

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/test/resources/log4j.properties
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/resources/log4j.properties?rev=1098038&r1=1098037&r2=1098038&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/resources/log4j.properties (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/resources/log4j.properties Sat Apr 30 02:05:30 2011
@@ -1,17 +1,3 @@
-# Copyright 2005, 2006, 2009, 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.
-
 log4j.rootCategory=WARN, A1
 
 # A1 is set to be a ConsoleAppender. 
@@ -30,4 +16,4 @@ log4j.category.org.apache.tapestry5.ioc.
 
 log4j.category.com.example=debug
 
-
+# log4j.category.org.apache.tapestry5.ioc.services.TapestryIOCModule.PlasticProxyFactory=debug