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 2011/09/03 01:57:51 UTC

svn commit: r1164764 - in /tapestry/tapestry5/trunk: tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ tapestry-core/src/test/resources/ tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ tapestry-ioc/src/main/java/org/apac...

Author: hlship
Date: Fri Sep  2 23:57:50 2011
New Revision: 1164764

URL: http://svn.apache.org/viewvc?rev=1164764&view=rev
Log:
TAP5-1627: Enable OperationTracker to produce debug trace of all operations

Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentInstantiatorSourceImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/resources/log4j.properties
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/IOCMessages.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ModuleImpl.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/OperationTrackerImpl.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ReloadableObjectCreatorSource.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/resources/org/apache/tapestry5/ioc/internal/IOCStrings.properties
    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=1164764&r1=1164763&r2=1164764&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 Fri Sep  2 23:57:50 2011
@@ -95,6 +95,9 @@ public final class ComponentInstantiator
 
     private final Map<String, ComponentModel> classToModel = CollectionFactory.newMap();
 
+    private final MethodDescription GET_COMPONENT_RESOURCES = PlasticUtils.getMethodDescription(
+            ComponentResourcesAware.class, "getComponentResources");
+
     private final ConstructorCallback REGISTER_AS_PAGE_LIFECYCLE_LISTENER = new ConstructorCallback()
     {
         public void onConstruct(Object instance, InstanceContext context)
@@ -326,9 +329,6 @@ public final class ComponentInstantiator
                 });
     }
 
-    private MethodDescription GET_COMPONENT_RESOURCES = PlasticUtils.getMethodDescription(
-            ComponentResourcesAware.class, "getComponentResources");
-
     private void implementComponentInterface(PlasticClass plasticClass)
     {
         plasticClass.introduceInterface(Component.class);

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/resources/log4j.properties
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/resources/log4j.properties?rev=1164764&r1=1164763&r2=1164764&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/resources/log4j.properties (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/resources/log4j.properties Fri Sep  2 23:57:50 2011
@@ -1,17 +1,3 @@
-# Copyright 2005, 2006, 2007, 2008, 2009 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=INFO, A1
 
 # A1 is set to be a ConsoleAppender. 
@@ -29,4 +15,5 @@ log4j.category.org.apache.tapestry5.inte
 
 
 # Turn off much of the racket from Selenium when it runs
-log4j.category.org.openqa.selenium.server=warn
\ No newline at end of file
+log4j.category.org.openqa.selenium.server=warn
+log4j.category.org.apache.tapestry5.ioc.Registry=debug

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/IOCMessages.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/IOCMessages.java?rev=1164764&r1=1164763&r2=1164764&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/IOCMessages.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/IOCMessages.java Fri Sep  2 23:57:50 2011
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007, 2008, 2009 The Apache Software Foundation
+// Copyright 2006, 2007, 2008, 2009, 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.
@@ -54,11 +54,6 @@ final class IOCMessages
                 .getReturnType().getCanonicalName());
     }
 
-    public static String builderLocked()
-    {
-        return MESSAGES.get("builder-locked");
-    }
-
     static String serviceWrongInterface(String serviceId, Class actualInterface, Class requestedInterface)
     {
         return MESSAGES.format("service-wrong-interface", serviceId, actualInterface.getName(),
@@ -115,11 +110,6 @@ final class IOCMessages
                                serviceInterface.getName());
     }
 
-    static String creatingService(String serviceId)
-    {
-        return MESSAGES.format("creating-service", serviceId);
-    }
-
     static String invokingMethod(String methodId)
     {
         return MESSAGES.format("invoking-method", methodId);

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ModuleImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ModuleImpl.java?rev=1164764&r1=1164763&r2=1164764&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ModuleImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ModuleImpl.java Fri Sep  2 23:57:50 2011
@@ -14,7 +14,16 @@
 
 package org.apache.tapestry5.ioc.internal;
 
-import static java.lang.String.format;
+import org.apache.tapestry5.ioc.*;
+import org.apache.tapestry5.ioc.annotations.Local;
+import org.apache.tapestry5.ioc.def.*;
+import org.apache.tapestry5.ioc.internal.services.JustInTimeObjectCreator;
+import org.apache.tapestry5.ioc.internal.util.*;
+import org.apache.tapestry5.ioc.services.AspectDecorator;
+import org.apache.tapestry5.ioc.services.PlasticProxyFactory;
+import org.apache.tapestry5.ioc.services.Status;
+import org.apache.tapestry5.plastic.*;
+import org.slf4j.Logger;
 
 import java.io.ObjectStreamException;
 import java.io.Serializable;
@@ -22,40 +31,9 @@ import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
-import org.apache.tapestry5.ioc.*;
-import org.apache.tapestry5.ioc.annotations.Local;
-import org.apache.tapestry5.ioc.def.ContributionDef;
-import org.apache.tapestry5.ioc.def.ContributionDef2;
-import org.apache.tapestry5.ioc.def.DecoratorDef;
-import org.apache.tapestry5.ioc.def.ModuleDef;
-import org.apache.tapestry5.ioc.def.ModuleDef2;
-import org.apache.tapestry5.ioc.def.ServiceDef;
-import org.apache.tapestry5.ioc.def.ServiceDef2;
-import org.apache.tapestry5.ioc.def.ServiceDef3;
-import org.apache.tapestry5.ioc.internal.services.JustInTimeObjectCreator;
-import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
-import org.apache.tapestry5.ioc.internal.util.ConcurrentBarrier;
-import org.apache.tapestry5.ioc.internal.util.InjectionResources;
-import org.apache.tapestry5.ioc.internal.util.InternalUtils;
-import org.apache.tapestry5.ioc.internal.util.MapInjectionResources;
-import org.apache.tapestry5.ioc.services.AspectDecorator;
-import org.apache.tapestry5.ioc.services.PlasticProxyFactory;
-import org.apache.tapestry5.ioc.services.Status;
-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.PlasticClassTransformer;
-import org.apache.tapestry5.plastic.PlasticField;
-import org.apache.tapestry5.plastic.PlasticMethod;
-import org.slf4j.Logger;
+import static java.lang.String.format;
 
 @SuppressWarnings("all")
 public class ModuleImpl implements Module
@@ -93,13 +71,15 @@ public class ModuleImpl implements Modul
      */
     private final static ConcurrentBarrier BARRIER = new ConcurrentBarrier();
 
-    /** "Magic" method related to Externalizable that allows the Proxy object to replace itself with the token. */
+    /**
+     * "Magic" method related to Externalizable that allows the Proxy object to replace itself with the token.
+     */
     private static final MethodDescription WRITE_REPLACE = new MethodDescription(Modifier.PRIVATE, "java.lang.Object",
             "writeReplace", null, null, new String[]
-            { ObjectStreamException.class.getName() });
+            {ObjectStreamException.class.getName()});
 
     public ModuleImpl(InternalRegistry registry, ServiceActivityTracker tracker, ModuleDef moduleDef,
-            PlasticProxyFactory proxyFactory, Logger logger)
+                      PlasticProxyFactory proxyFactory, Logger logger)
     {
         this.registry = registry;
         this.tracker = tracker;
@@ -131,8 +111,7 @@ public class ModuleImpl implements Modul
         try
         {
             return serviceInterface.cast(service);
-        }
-        catch (ClassCastException ex)
+        } catch (ClassCastException ex)
         {
             // This may be overkill: I don't know how this could happen
             // given that the return type of the method determines
@@ -186,11 +165,9 @@ public class ModuleImpl implements Modul
 
     /**
      * Locates the service proxy for a particular service (from the service definition).
-     * 
-     * @param def
-     *            defines the service
-     * @param eagerLoadProxies
-     *            collection into which proxies for eager loaded services are added (or null)
+     *
+     * @param def              defines the service
+     * @param eagerLoadProxies collection into which proxies for eager loaded services are added (or null)
      * @return the service proxy
      */
     private Object findOrCreate(final ServiceDef3 def, final Collection<EagerLoadServiceProxy> eagerLoadProxies)
@@ -255,9 +232,8 @@ public class ModuleImpl implements Modul
 
     /**
      * Creates the service and updates the cache of created services.
-     * 
-     * @param eagerLoadProxies
-     *            a list into which any eager loaded proxies should be added
+     *
+     * @param eagerLoadProxies a list into which any eager loaded proxies should be added
      */
     private Object create(final ServiceDef3 def, final Collection<EagerLoadServiceProxy> eagerLoadProxies)
     {
@@ -265,7 +241,11 @@ public class ModuleImpl implements Modul
 
         final Logger logger = registry.getServiceLogger(serviceId);
 
-        String description = IOCMessages.creatingService(serviceId);
+        final Class serviceInterface = def.getServiceInterface();
+
+        String description = String.format("Creating %s service %s",
+                serviceInterface.isInterface() ? "proxy for" : "non-proxied instance of",
+                serviceId);
 
         if (logger.isDebugEnabled())
             logger.debug(description);
@@ -286,14 +266,13 @@ public class ModuleImpl implements Modul
 
                     ObjectCreator creator = def.createServiceCreator(resources);
 
-                    Class serviceInterface = def.getServiceInterface();
-
-                    ServiceLifecycle2 lifecycle = registry.getServiceLifecycle(def.getServiceScope());
 
                     // For non-proxyable services, we immediately create the service implementation
                     // and return it. There's no interface to proxy, which throws out the possibility of
                     // deferred instantiation, service lifecycles, and decorators.
 
+                    ServiceLifecycle2 lifecycle = registry.getServiceLifecycle(def.getServiceScope());
+
                     if (!serviceInterface.isInterface())
                     {
                         if (lifecycle.requiresProxy())
@@ -305,7 +284,7 @@ public class ModuleImpl implements Modul
                         return creator.createObject();
                     }
 
-                    creator = new OperationTrackingObjectCreator(registry, "Invoking service creator " + creator.toString(), creator);
+                    creator = new OperationTrackingObjectCreator(registry, String.format("Realizing service %s via %s", serviceId, creator), creator);
 
                     creator = new LifecycleWrappedServiceCreator(lifecycle, resources, creator);
 
@@ -343,8 +322,7 @@ public class ModuleImpl implements Modul
                     tracker.setStatus(serviceId, Status.VIRTUAL);
 
                     return proxy;
-                }
-                catch (Exception ex)
+                } catch (Exception ex)
                 {
                     throw new RuntimeException(IOCMessages.errorBuildingService(serviceId, def, ex), ex);
                 }
@@ -453,16 +431,13 @@ public class ModuleImpl implements Modul
             InternalUtils.injectIntoFields(result, locator, resources, registry);
 
             return result;
-        }
-        catch (InvocationTargetException ex)
+        } catch (InvocationTargetException ex)
         {
             fail = ex.getTargetException();
-        }
-        catch (Exception ex)
+        } catch (Exception ex)
         {
             fail = ex;
-        }
-        finally
+        } finally
         {
             insideConstructor = false;
         }
@@ -483,7 +458,7 @@ public class ModuleImpl implements Modul
     }
 
     private Object createProxyInstance(final ObjectCreator creator, final ServiceProxyToken token,
-            final Class serviceInterface, final Class serviceImplementation, final String description)
+                                       final Class serviceInterface, final Class serviceImplementation, final String description)
     {
         ClassInstantiator instantiator = proxyFactory.createProxy(serviceInterface, new PlasticClassTransformer()
         {
@@ -546,8 +521,7 @@ public class ModuleImpl implements Modul
             if (serviceDef.getServiceId().equalsIgnoreCase(def.getServiceId()))
             {
                 result.add(def);
-            }
-            else
+            } else
             {
                 if (markerMatched(serviceDef, def))
                 {

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/OperationTrackerImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/OperationTrackerImpl.java?rev=1164764&r1=1164763&r2=1164764&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/OperationTrackerImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/OperationTrackerImpl.java Fri Sep  2 23:57:50 2011
@@ -1,4 +1,4 @@
-// Copyright 2008, 2009, 2010 The Apache Software Foundation
+// Copyright 2008, 2009, 2010, 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.
@@ -23,7 +23,7 @@ import org.slf4j.Logger;
 
 /**
  * Core implementation that manages a logger and catches and reports exception.
- * 
+ *
  * @see org.apache.tapestry5.ioc.internal.PerThreadOperationTracker
  */
 public class OperationTrackerImpl implements OperationTracker
@@ -43,6 +43,7 @@ public class OperationTrackerImpl implem
     {
         assert InternalUtils.isNonBlank(description);
         assert operation != null;
+
         invoke(description, new Invokable<Void>()
         {
             public Void invoke()
@@ -58,29 +59,45 @@ public class OperationTrackerImpl implem
     {
         assert InternalUtils.isNonBlank(description);
         assert operation != null;
+
+        long startNanos = System.nanoTime();
+
+        if (logger.isDebugEnabled())
+        {
+            logger.debug(String.format("[%3d] --> %s", operations.getDepth() + 1, description));
+        }
+
         operations.push(description);
 
         try
         {
-            return operation.invoke();
-        }
-        catch (RuntimeException ex)
+            T result = operation.invoke();
+
+            if (logger.isDebugEnabled())
+            {
+                long elapsedNanos = System.nanoTime() - startNanos;
+                double elapsedMillis = ((double) elapsedNanos) / 1000000.d;
+
+                logger.debug(String.format("[%3d] <-- %s [%,.2f ms]", operations.getDepth(), description, elapsedMillis));
+            }
+
+            return result;
+
+        } catch (RuntimeException ex)
         {
             logAndRethrow(ex);
 
             throw ex;
-        }
-        catch (Error ex)
+        } catch (Error ex)
         {
             if (!logged)
             {
                 log(ex);
                 logged = true;
             }
-            
+
             throw ex;
-        }
-        finally
+        } finally
         {
             operations.pop();
 
@@ -89,6 +106,8 @@ public class OperationTrackerImpl implem
             if (operations.isEmpty())
                 logged = false;
         }
+
+
     }
 
     private void logAndRethrow(Throwable ex)

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=1164764&r1=1164763&r2=1164764&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 Fri Sep  2 23:57:50 2011
@@ -14,13 +14,13 @@
 
 package org.apache.tapestry5.ioc.internal;
 
-import java.lang.reflect.Method;
-
 import org.apache.tapestry5.ioc.ObjectCreator;
 import org.apache.tapestry5.ioc.ServiceBuilderResources;
 import org.apache.tapestry5.ioc.services.PlasticProxyFactory;
 import org.apache.tapestry5.services.UpdateListenerHub;
 
+import java.lang.reflect.Method;
+
 /**
  * Responsible for creating a {@link ReloadableServiceImplementationObjectCreator} for a service implementation.
  */
@@ -38,7 +38,7 @@ public class ReloadableObjectCreatorSour
     private final boolean eagerLoad;
 
     public ReloadableObjectCreatorSource(PlasticProxyFactory proxyFactory, Method bindMethod,
-            Class serviceInterfaceClass, Class serviceImplementationClass, boolean eagerLoad)
+                                         Class serviceInterfaceClass, Class serviceImplementationClass, boolean eagerLoad)
     {
         this.proxyFactory = proxyFactory;
         this.bindMethod = bindMethod;
@@ -47,6 +47,7 @@ public class ReloadableObjectCreatorSour
         this.eagerLoad = eagerLoad;
     }
 
+
     public ObjectCreator constructCreator(final ServiceBuilderResources resources)
     {
         return new ObjectCreator()
@@ -55,6 +56,12 @@ public class ReloadableObjectCreatorSour
             {
                 return createReloadableProxy(resources);
             }
+
+            @Override
+            public String toString()
+            {
+                return proxyFactory.getMethodLocation(bindMethod).toString();
+            }
         };
     }
 

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java?rev=1164764&r1=1164763&r2=1164764&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/InternalUtils.java Fri Sep  2 23:57:50 2011
@@ -14,89 +14,41 @@
 
 package org.apache.tapestry5.ioc.internal.util;
 
+import org.apache.tapestry5.func.Mapper;
+import org.apache.tapestry5.func.Predicate;
+import org.apache.tapestry5.ioc.*;
+import org.apache.tapestry5.ioc.annotations.*;
+import org.apache.tapestry5.ioc.def.*;
+import org.apache.tapestry5.ioc.internal.NullAnnotationProvider;
+import org.apache.tapestry5.ioc.services.ClassFabUtils;
+import org.apache.tapestry5.ioc.services.Coercion;
+import org.apache.tapestry5.ioc.services.PlasticProxyFactory;
+import org.apache.tapestry5.plastic.MethodAdvice;
+import org.apache.tapestry5.plastic.MethodInvocation;
+import org.apache.tapestry5.plastic.PlasticUtils;
+
+import javax.inject.Named;
 import java.io.Closeable;
 import java.io.IOException;
 import java.lang.annotation.Annotation;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
-import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.lang.reflect.Type;
+import java.lang.reflect.*;
 import java.net.URL;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import javax.inject.Named;
-
-import org.apache.tapestry5.func.F;
-import org.apache.tapestry5.func.Flow;
-import org.apache.tapestry5.func.Mapper;
-import org.apache.tapestry5.func.Predicate;
-import org.apache.tapestry5.ioc.AdvisorDef;
-import org.apache.tapestry5.ioc.AdvisorDef2;
-import org.apache.tapestry5.ioc.AnnotationAccess;
-import org.apache.tapestry5.ioc.AnnotationProvider;
-import org.apache.tapestry5.ioc.Configuration;
-import org.apache.tapestry5.ioc.IOCConstants;
-import org.apache.tapestry5.ioc.Invokable;
-import org.apache.tapestry5.ioc.Locatable;
-import org.apache.tapestry5.ioc.Location;
-import org.apache.tapestry5.ioc.MappedConfiguration;
-import org.apache.tapestry5.ioc.ModuleBuilderSource;
-import org.apache.tapestry5.ioc.ObjectCreator;
-import org.apache.tapestry5.ioc.ObjectLocator;
-import org.apache.tapestry5.ioc.OperationTracker;
-import org.apache.tapestry5.ioc.OrderedConfiguration;
-import org.apache.tapestry5.ioc.ServiceAdvisor;
-import org.apache.tapestry5.ioc.ServiceBuilderResources;
-import org.apache.tapestry5.ioc.ServiceDecorator;
-import org.apache.tapestry5.ioc.ServiceLifecycle;
-import org.apache.tapestry5.ioc.ServiceLifecycle2;
-import org.apache.tapestry5.ioc.ServiceResources;
-import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.ioc.annotations.InjectResource;
-import org.apache.tapestry5.ioc.annotations.InjectService;
-import org.apache.tapestry5.ioc.annotations.PostInjection;
-import org.apache.tapestry5.ioc.annotations.ServiceId;
-import org.apache.tapestry5.ioc.def.ContributionDef;
-import org.apache.tapestry5.ioc.def.ContributionDef2;
-import org.apache.tapestry5.ioc.def.DecoratorDef;
-import org.apache.tapestry5.ioc.def.DecoratorDef2;
-import org.apache.tapestry5.ioc.def.ModuleDef;
-import org.apache.tapestry5.ioc.def.ModuleDef2;
-import org.apache.tapestry5.ioc.def.ServiceDef;
-import org.apache.tapestry5.ioc.def.ServiceDef2;
-import org.apache.tapestry5.ioc.def.ServiceDef3;
-import org.apache.tapestry5.ioc.internal.NullAnnotationProvider;
-import org.apache.tapestry5.ioc.internal.services.AnnotationProviderChain;
-import org.apache.tapestry5.ioc.services.ClassFabUtils;
-import org.apache.tapestry5.ioc.services.Coercion;
-import org.apache.tapestry5.ioc.services.PlasticProxyFactory;
-import org.apache.tapestry5.plastic.MethodAdvice;
-import org.apache.tapestry5.plastic.MethodInvocation;
-
 /**
  * Utilities used within various internal implementations of the tapestry-ioc module.
  */
 @SuppressWarnings("all")
 public class InternalUtils
 {
-    /** @since 5.2.2 */
+    /**
+     * @since 5.2.2
+     */
     public static final boolean SERVICE_CLASS_RELOADING_ENABLED = Boolean.parseBoolean(System.getProperty(
             IOCConstants.SERVICE_CLASS_RELOADING_ENABLED, "true"));
 
@@ -111,18 +63,18 @@ public class InternalUtils
     private static final Pattern NAME_PATTERN = Pattern.compile("^[_|$]*([\\p{javaJavaIdentifierPart}]+?)[_|$]*$",
             Pattern.CASE_INSENSITIVE);
 
-    /** @since 5.3 */
+    /**
+     * @since 5.3
+     */
     public static AnnotationProvider NULL_ANNOTATION_PROVIDER = new NullAnnotationProvider();
 
     /**
      * Converts a method to a user presentable string using a {@link PlasticProxyFactory} to obtain a {@link Location}
      * (where possible). {@link #asString(Method)} is used under the covers, to present a detailed, but not excessive,
      * description of the class, method and parameters.
-     * 
-     * @param method
-     *            method to convert to a string
-     * @param proxyFactory
-     *            used to obtain the {@link Location}
+     *
+     * @param method       method to convert to a string
+     * @param proxyFactory used to obtain the {@link Location}
      * @return the method formatted for presentation to the user
      */
     public static String asString(Method method, PlasticProxyFactory proxyFactory)
@@ -135,7 +87,7 @@ public class InternalUtils
     /**
      * Converts a method to a user presentable string consisting of the containing class name, the method name, and the
      * short form of the parameter list (the class name of each parameter type, shorn of the package name portion).
-     * 
+     *
      * @param method
      * @return short string representation
      */
@@ -218,12 +170,10 @@ public class InternalUtils
 
     /**
      * Finds a specific annotation type within an array of annotations.
-     * 
+     *
      * @param <T>
-     * @param annotations
-     *            to search
-     * @param annotationClass
-     *            to match
+     * @param annotations     to search
+     * @param annotationClass to match
      * @return the annotation instance, if found, or null otherwise
      */
     public static <T extends Annotation> T findAnnotation(Annotation[] annotations, Class<T> annotationClass)
@@ -238,7 +188,7 @@ public class InternalUtils
     }
 
     private static Object calculateInjection(Class injectionType, Type genericType, final Annotation[] annotations,
-            ObjectLocator locator, InjectionResources resources)
+                                             ObjectLocator locator, InjectionResources resources)
     {
         AnnotationProvider provider = new AnnotationProvider()
         {
@@ -262,7 +212,10 @@ public class InternalUtils
 
         Named named = provider.getAnnotation(Named.class);
 
-        if (named != null) { return locator.getService(named.value(), injectionType); }
+        if (named != null)
+        {
+            return locator.getService(named.value(), injectionType);
+        }
 
         // In the absence of @InjectService, try some autowiring. First, does the
         // parameter type match one of the resources (the parameter defaults)?
@@ -282,7 +235,7 @@ public class InternalUtils
     }
 
     public static Object[] calculateParametersForMethod(Method method, ObjectLocator locator,
-            InjectionResources resources, OperationTracker tracker)
+                                                        InjectionResources resources, OperationTracker tracker)
     {
 
         return calculateParameters(locator, resources, method.getParameterTypes(), method.getGenericParameterTypes(),
@@ -290,7 +243,7 @@ public class InternalUtils
     }
 
     public static Object[] calculateParametersForConstructor(Constructor constructor, ObjectLocator locator,
-            InjectionResources resources, OperationTracker tracker)
+                                                             InjectionResources resources, OperationTracker tracker)
     {
 
         return calculateParameters(locator, resources, constructor.getParameterTypes(),
@@ -298,8 +251,8 @@ public class InternalUtils
     }
 
     public static Object[] calculateParameters(final ObjectLocator locator, final InjectionResources resources,
-            Class[] parameterTypes, final Type[] genericTypes, Annotation[][] parameterAnnotations,
-            OperationTracker tracker)
+                                               Class[] parameterTypes, final Type[] genericTypes, Annotation[][] parameterAnnotations,
+                                               OperationTracker tracker)
     {
         int parameterCount = parameterTypes.length;
 
@@ -331,18 +284,14 @@ public class InternalUtils
     /**
      * Injects into the fields (of all visibilities) when the {@link org.apache.tapestry5.ioc.annotations.Inject} or
      * {@link org.apache.tapestry5.ioc.annotations.InjectService} annotations are present.
-     * 
-     * @param object
-     *            to be initialized
-     * @param locator
-     *            used to resolve external dependencies
-     * @param resources
-     *            provides injection resources for fields
-     * @param tracker
-     *            track operations
+     *
+     * @param object    to be initialized
+     * @param locator   used to resolve external dependencies
+     * @param resources provides injection resources for fields
+     * @param tracker   track operations
      */
     public static void injectIntoFields(final Object object, final ObjectLocator locator,
-            final InjectionResources resources, OperationTracker tracker)
+                                        final InjectionResources resources, OperationTracker tracker)
     {
         Class clazz = object.getClass();
 
@@ -352,9 +301,11 @@ public class InternalUtils
 
             for (final Field f : fields)
             {
-                // Ignore all static fields.
+                // Ignore all static and final fields.
 
-                if (Modifier.isStatic(f.getModifiers()))
+                int fieldModifiers = f.getModifiers();
+
+                if (Modifier.isStatic(fieldModifiers) || Modifier.isFinal(fieldModifiers))
                     continue;
 
                 final AnnotationProvider ap = new AnnotationProvider()
@@ -365,8 +316,9 @@ public class InternalUtils
                     }
                 };
 
-                String description = String.format("Calculating injection value for field '%s' (%s)", f.getName(),
-                        ClassFabUtils.toJavaClassName(f.getType()));
+                String description = String.format("Calculating possible injection value for field %s.%s (%s)",
+                        clazz.getName(), f.getName(),
+                        PlasticUtils.toTypeName(f.getType()));
 
                 tracker.run(description, new Runnable()
                 {
@@ -406,8 +358,7 @@ public class InternalUtils
                             if (named == null)
                             {
                                 inject(object, f, locator.getObject(fieldType, ap));
-                            }
-                            else
+                            } else
                             {
                                 inject(object, f, locator.getService(named.value(), fieldType));
                             }
@@ -426,7 +377,7 @@ public class InternalUtils
     }
 
     public static void invokePostInjectionMethods(final Object object, final ObjectLocator locator,
-            final InjectionResources injectionResources, final OperationTracker tracker)
+                                                  final InjectionResources injectionResources, final OperationTracker tracker)
     {
         for (final Method m : object.getClass().getMethods())
         {
@@ -447,12 +398,10 @@ public class InternalUtils
                                 injectionResources, tracker);
 
                         m.invoke(object, parameters);
-                    }
-                    catch (InvocationTargetException ex)
+                    } catch (InvocationTargetException ex)
                     {
                         fail = ex.getTargetException();
-                    }
-                    catch (Exception ex)
+                    } catch (Exception ex)
                     {
                         fail = ex;
                     }
@@ -475,8 +424,7 @@ public class InternalUtils
             field.set(target, value);
 
             // Is there a need to setAccessible back to false?
-        }
-        catch (Exception ex)
+        } catch (Exception ex)
         {
             throw new RuntimeException(String.format("Unable to set field '%s' of %s to %s: %s", field.getName(),
                     target, value, toMessage(ex)));
@@ -494,11 +442,9 @@ public class InternalUtils
     /**
      * Joins together some number of elements. If a value in the list is the empty string, it is replaced with the
      * string "(blank)".
-     * 
-     * @param elements
-     *            objects to be joined together
-     * @param separator
-     *            used between elements when joining
+     *
+     * @param elements  objects to be joined together
+     * @param separator used between elements when joining
      */
     public static String join(List elements, String separator)
     {
@@ -536,7 +482,7 @@ public class InternalUtils
 
     /**
      * Creates a sorted copy of the provided elements, then turns that into a comma separated list.
-     * 
+     *
      * @return the elements converted to strings, sorted, joined with comma ... or "(none)" if the elements are null or
      *         empty
      */
@@ -570,7 +516,10 @@ public class InternalUtils
 
     public static boolean isEmptyCollection(Object input)
     {
-        if (input instanceof Collection) { return ((Collection) input).isEmpty(); }
+        if (input instanceof Collection)
+        {
+            return ((Collection) input).isEmpty();
+        }
 
         return false;
     }
@@ -612,9 +561,8 @@ public class InternalUtils
 
     /**
      * Extracts the string keys from a map and returns them in sorted order. The keys are converted to strings.
-     * 
-     * @param map
-     *            the map to extract keys from (may be null)
+     *
+     * @param map the map to extract keys from (may be null)
      * @return the sorted keys, or the empty set if map is null
      */
 
@@ -643,11 +591,10 @@ public class InternalUtils
 
     /**
      * Gets a value from a map (which may be null).
-     * 
+     *
      * @param <K>
      * @param <V>
-     * @param map
-     *            the map to extract from (may be null)
+     * @param map the map to extract from (may be null)
      * @param key
      * @return the value from the map, or null if the map is null
      */
@@ -723,9 +670,8 @@ public class InternalUtils
      * is not determined which will be returned (don't build a class like that!). In addition, if a constructor is
      * annotated with {@link org.apache.tapestry5.ioc.annotations.Inject}, it will be used (no check for multiple such
      * constructors is made, only at most a single constructor should have the annotation).
-     * 
-     * @param clazz
-     *            to search for a constructor for
+     *
+     * @param clazz to search for a constructor for
      * @return the constructor to be used to instantiate the class, or null if no appropriate constructor was found
      */
     public static Constructor findAutobuildConstructor(Class clazz)
@@ -783,7 +729,7 @@ public class InternalUtils
     }
 
     private static <T extends Annotation> Constructor findConstructorByAnnotation(Constructor[] constructors,
-            Class<T> annotationClass)
+                                                                                  Class<T> annotationClass)
     {
         for (Constructor c : constructors)
         {
@@ -797,17 +743,12 @@ public class InternalUtils
     /**
      * Adds a value to a specially organized map where the values are lists of objects. This somewhat simulates a map
      * that allows multiple values for the same key.
-     * 
-     * @param map
-     *            to store value into
-     * @param key
-     *            for which a value is added
-     * @param value
-     *            to add
-     * @param <K>
-     *            the type of key
-     * @param <V>
-     *            the type of the list
+     *
+     * @param map   to store value into
+     * @param key   for which a value is added
+     * @param value to add
+     * @param <K>   the type of key
+     * @param <V>   the type of the list
      */
     public static <K, V> void addToMapList(Map<K, List<V>> map, K key, V value)
     {
@@ -824,9 +765,8 @@ public class InternalUtils
 
     /**
      * Validates that the marker annotation class had a retention policy of runtime.
-     * 
-     * @param markerClass
-     *            the marker annotation class
+     *
+     * @param markerClass the marker annotation class
      */
     public static void validateMarkerAnnotation(Class markerClass)
     {
@@ -850,8 +790,7 @@ public class InternalUtils
             try
             {
                 stream.close();
-            }
-            catch (IOException ex)
+            } catch (IOException ex)
             {
                 // Ignore.
             }
@@ -859,9 +798,8 @@ public class InternalUtils
 
     /**
      * Extracts the message from an exception. If the exception's message is null, returns the exceptions class name.
-     * 
-     * @param exception
-     *            to extract message from
+     *
+     * @param exception to extract message from
      * @return message or class name
      */
     public static String toMessage(Throwable exception)
@@ -890,7 +828,9 @@ public class InternalUtils
                             constructor));
     }
 
-    /** @since 5.3 */
+    /**
+     * @since 5.3
+     */
     public static final Mapper<Class, AnnotationProvider> CLASS_TO_AP_MAPPER = new Mapper<Class, AnnotationProvider>()
     {
         public AnnotationProvider map(final Class element)
@@ -900,7 +840,9 @@ public class InternalUtils
 
     };
 
-    /** @since 5.3 */
+    /**
+     * @since 5.3
+     */
     public static AnnotationProvider toAnnotationProvider(final Class element)
     {
         return new AnnotationProvider()
@@ -910,9 +852,13 @@ public class InternalUtils
                 return annotationClass.cast(element.getAnnotation(annotationClass));
             }
         };
-    };
+    }
+
+    ;
 
-    /** @since 5.3 */
+    /**
+     * @since 5.3
+     */
     public static final Mapper<Method, AnnotationProvider> METHOD_TO_AP_MAPPER = new Mapper<Method, AnnotationProvider>()
     {
         public AnnotationProvider map(final Method element)
@@ -929,18 +875,18 @@ public class InternalUtils
         try
         {
             return containingClass.getMethod(methodName, parameterTypes);
-        }
-        catch (SecurityException ex)
+        } catch (SecurityException ex)
         {
             throw new RuntimeException(ex);
-        }
-        catch (NoSuchMethodException ex)
+        } catch (NoSuchMethodException ex)
         {
             return null;
         }
     }
 
-    /** @since 5.3 */
+    /**
+     * @since 5.3
+     */
     public static ServiceDef3 toServiceDef3(ServiceDef sd)
     {
         if (sd instanceof ServiceDef3)
@@ -1093,7 +1039,9 @@ public class InternalUtils
         };
     }
 
-    /** @since 5.1.0.2 */
+    /**
+     * @since 5.1.0.2
+     */
     public static ServiceLifecycle2 toServiceLifecycle2(final ServiceLifecycle lifecycle)
     {
         if (lifecycle instanceof ServiceLifecycle2)
@@ -1118,9 +1066,11 @@ public class InternalUtils
         };
     }
 
-    /** @since 5.2.0 */
+    /**
+     * @since 5.2.0
+     */
     public static <T extends Comparable<T>> List<T> matchAndSort(Collection<? extends T> collection,
-            Predicate<T> predicate)
+                                                                 Predicate<T> predicate)
     {
         assert predicate != null;
 
@@ -1159,19 +1109,19 @@ public class InternalUtils
             }
 
             public void contribute(ModuleBuilderSource moduleSource, ServiceResources resources,
-                    Configuration configuration)
+                                   Configuration configuration)
             {
                 contribution.contribute(moduleSource, resources, configuration);
             }
 
             public void contribute(ModuleBuilderSource moduleSource, ServiceResources resources,
-                    OrderedConfiguration configuration)
+                                   OrderedConfiguration configuration)
             {
                 contribution.contribute(moduleSource, resources, configuration);
             }
 
             public void contribute(ModuleBuilderSource moduleSource, ServiceResources resources,
-                    MappedConfiguration configuration)
+                                   MappedConfiguration configuration)
             {
                 contribution.contribute(moduleSource, resources, configuration);
             }
@@ -1225,6 +1175,11 @@ public class InternalUtils
                 return null;
             }
 
+            @Override
+            public String toString()
+            {
+                return advisor.toString();
+            }
         };
     }
 
@@ -1269,6 +1224,11 @@ public class InternalUtils
                 return null;
             }
 
+            @Override
+            public String toString()
+            {
+                return decorator.toString();
+            }
         };
     }
 
@@ -1276,7 +1236,7 @@ public class InternalUtils
      * Determines if the indicated class is stored as a locally accessible file
      * (and not, typically, as a file inside a JAR). This is related to automatic
      * reloading of services.
-     * 
+     *
      * @since 5.2.0
      */
     public static boolean isLocalFile(Class clazz)
@@ -1297,7 +1257,7 @@ public class InternalUtils
 
     /**
      * Wraps a {@link Coercion} as a {@link Mapper}.
-     * 
+     *
      * @since 5.2.0
      */
     public static <S, T> Mapper<S, T> toMapper(final Coercion<S, T> coercion)
@@ -1319,7 +1279,7 @@ public class InternalUtils
     /**
      * Generates a unique value for the current execution of the application. This initial UUID value
      * is not easily predictable; subsequent UUIDs are allocated in ascending series.
-     * 
+     *
      * @since 5.2.0
      */
     public static long nextUUID()
@@ -1332,16 +1292,18 @@ public class InternalUtils
      * If present, its value is returned. Otherwise {@link Named} annotation is checked. If present, its value is
      * returned.
      * If neither of the annotations is present, <code>null</code> value is returned
-     * 
-     * @param annotated
-     *            annotated element to get annotations from
+     *
+     * @param annotated annotated element to get annotations from
      * @since 5.3
      */
     public static String getServiceId(AnnotatedElement annotated)
     {
         ServiceId serviceIdAnnotation = annotated.getAnnotation(ServiceId.class);
 
-        if (serviceIdAnnotation != null) { return serviceIdAnnotation.value(); }
+        if (serviceIdAnnotation != null)
+        {
+            return serviceIdAnnotation.value();
+        }
 
         Named namedAnnotation = annotated.getAnnotation(Named.class);
 
@@ -1349,7 +1311,10 @@ public class InternalUtils
         {
             String value = namedAnnotation.value();
 
-            if (InternalUtils.isNonBlank(value)) { return value; }
+            if (InternalUtils.isNonBlank(value))
+            {
+                return value;
+            }
         }
 
         return null;
@@ -1358,13 +1323,12 @@ public class InternalUtils
     /**
      * Converts old-style Tapestry IoC {@link org.apache.tapestry5.ioc.MethodAdvice} to modern
      * Plastic {@link MethodAdvice}.
-     * 
-     * @param iocMethodAdvice
-     *            old style advice
+     *
+     * @param iocMethodAdvice old style advice
      * @return new style advice
      */
     public static MethodAdvice toPlasticMethodAdvice(final org.apache.tapestry5.ioc.MethodAdvice iocMethodAdvice,
-            final AnnotationProvider methodAnnotationProvider)
+                                                     final AnnotationProvider methodAnnotationProvider)
     {
         assert iocMethodAdvice != null;
 

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/resources/org/apache/tapestry5/ioc/internal/IOCStrings.properties
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/resources/org/apache/tapestry5/ioc/internal/IOCStrings.properties?rev=1164764&r1=1164763&r2=1164764&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/resources/org/apache/tapestry5/ioc/internal/IOCStrings.properties (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/resources/org/apache/tapestry5/ioc/internal/IOCStrings.properties Fri Sep  2 23:57:50 2011
@@ -1,4 +1,4 @@
- # Copyright 2006, 2007, 2008, 2009 The Apache Software Foundation
+ # Copyright 2006, 2007, 2008, 2009, 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.
@@ -17,7 +17,6 @@ build-method-wrong-return-type=Method %s
  but the return type (%s) is not acceptable (try an interface).
 decorator-method-wrong-return-type=Method %s is named like a service decorator method, \
   but the return type (%s) is not acceptable (try Object).
-builder-locked=The Registry Builder has created the Registry, further operations are not allowed.
 service-wrong-interface=Service '%s' implements interface %s, which is not compatible with the requested type %s.
 instantiate-builder-error=Unable to instantiate class %s as a module: %s
 builder-method-error=Error invoking service builder method %s (for service '%s'): %s
@@ -32,7 +31,6 @@ many-services-match-marker=Unable to loc
 unknown-scope=Unknown service scope '%s'.
 decorator-returned-wrong-type=Decorator method %s (invoked for service '%s') returned %s, \
   which is not assignable to the %s service interface.
-creating-service=Creating service '%s'.
 invoking-method=Invoking method %s.
 invoking-constructor=Invoking constructor %s.
 recursive-service-build=Construction of service '%s' has failed due to recursion: \

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=1164764&r1=1164763&r2=1164764&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/resources/log4j.properties (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/resources/log4j.properties Fri Sep  2 23:57:50 2011
@@ -17,5 +17,8 @@ log4j.category.org.apache.tapestry5.ioc.
 log4j.category.com.example=debug
 log4j.category.org.apache.tapestry5.ioc.services.TapestryIOCModule.PeriodicExecutor=debug
 
+# This makes things very verbose, but can be useful to figure what's happening and how long its taking.
+# log4j.category.org.apache.tapestry5.ioc.Registry=debug
+
 
 # log4j.category.org.apache.tapestry5.ioc.services.TapestryIOCModule.PlasticProxyFactory=debug