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/05/04 01:18:10 UTC
svn commit: r1099294 - in
/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal:
AbstractMethodInvokingInstrumenter.java ConstructorServiceCreator.java
RegistryImpl.java ServiceBuilderMethodInvoker.java
Author: hlship
Date: Tue May 3 23:18:09 2011
New Revision: 1099294
URL: http://svn.apache.org/viewvc?rev=1099294&view=rev
Log:
TAP5-1519: Ensure that all calls to invoke methods and constructors with dependencies are tracked with the OperationTracker
Modified:
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AbstractMethodInvokingInstrumenter.java
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ConstructorServiceCreator.java
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ServiceBuilderMethodInvoker.java
Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AbstractMethodInvokingInstrumenter.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AbstractMethodInvokingInstrumenter.java?rev=1099294&r1=1099293&r2=1099294&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AbstractMethodInvokingInstrumenter.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/AbstractMethodInvokingInstrumenter.java Tue May 3 23:18:09 2011
@@ -14,6 +14,7 @@
package org.apache.tapestry5.ioc.internal;
+import org.apache.tapestry5.ioc.Invokable;
import org.apache.tapestry5.ioc.ModuleBuilderSource;
import org.apache.tapestry5.ioc.ObjectLocator;
import org.apache.tapestry5.ioc.OperationTracker;
@@ -83,34 +84,47 @@ public class AbstractMethodInvokingInstr
return InternalUtils.isStatic(method) ? null : moduleSource.getModuleBuilder();
}
- protected Object invoke(InjectionResources injectionResources)
+ protected Object invoke(final InjectionResources injectionResources)
{
- Object result = null;
- Throwable failure = null;
+ final String methodId = toString();
- if (logger.isDebugEnabled())
- logger.debug(String.format("Invoking method %s", this));
-
- try
- {
- Object[] parameters = InternalUtils.calculateParametersForMethod(method, resources, injectionResources,
- resources.getTracker());
+ String description = String.format("Invoking method %s", methodId);
- result = method.invoke(getModuleInstance(), parameters);
- }
- catch (InvocationTargetException ite)
- {
- failure = ite.getTargetException();
- }
- catch (Exception ex)
+ if (logger.isDebugEnabled())
{
- failure = ex;
+ logger.debug(description);
}
- if (failure != null)
- throw new RuntimeException(String.format("Exception invoking method %s: %s", this,
- InternalUtils.toMessage(failure)), failure);
+ return resources.getTracker().invoke(description, new Invokable<Object>()
+ {
+ public Object invoke()
+ {
+ Object result = null;
+ Throwable failure = null;
+
+ try
+ {
+ Object[] parameters = InternalUtils.calculateParametersForMethod(method, resources,
+ injectionResources, resources.getTracker());
+
+ result = method.invoke(getModuleInstance(), parameters);
+ }
+ catch (InvocationTargetException ite)
+ {
+ failure = ite.getTargetException();
+ }
+ catch (Exception ex)
+ {
+ failure = ex;
+ }
+
+ if (failure != null)
+ throw new RuntimeException(String.format("Exception invoking method %s: %s", methodId,
+ InternalUtils.toMessage(failure)), failure);
+
+ return result;
+ }
+ });
- return result;
}
}
Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ConstructorServiceCreator.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ConstructorServiceCreator.java?rev=1099294&r1=1099293&r2=1099294&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ConstructorServiceCreator.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ConstructorServiceCreator.java Tue May 3 23:18:09 2011
@@ -1,10 +1,10 @@
-// Copyright 2007, 2008 The Apache Software Foundation
+// Copyright 2007, 2008, 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
+// 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,
@@ -14,6 +14,7 @@
package org.apache.tapestry5.ioc.internal;
+import org.apache.tapestry5.ioc.Invokable;
import org.apache.tapestry5.ioc.ServiceBuilderResources;
import org.apache.tapestry5.ioc.internal.util.InjectionResources;
import org.apache.tapestry5.ioc.internal.util.InternalUtils;
@@ -29,7 +30,7 @@ public class ConstructorServiceCreator e
private final Constructor constructor;
public ConstructorServiceCreator(ServiceBuilderResources resources, String creatorDescription,
- Constructor constructor)
+ Constructor constructor)
{
super(resources, creatorDescription);
@@ -44,39 +45,47 @@ public class ConstructorServiceCreator e
public Object createObject()
{
- Throwable failure = null;
- Object result = null;
-
- InternalUtils.validateConstructorForAutobuild(constructor);
-
- InjectionResources injectionResources = createInjectionResources();
-
- try
- {
- Object[] parameters = InternalUtils.calculateParametersForConstructor(constructor, resources,
- injectionResources,
- resources.getTracker());
-
- if (logger.isDebugEnabled()) logger.debug(IOCMessages.invokingConstructor(creatorDescription));
-
- result = constructor.newInstance(parameters);
-
- InternalUtils.injectIntoFields(result, resources, injectionResources, resources.getTracker());
- }
- catch (InvocationTargetException ite)
- {
- failure = ite.getTargetException();
- }
- catch (Exception ex)
+ return resources.getTracker().invoke("Invoking " + creatorDescription, new Invokable<Object>()
{
- failure = ex;
- }
-
- if (failure != null)
- throw new RuntimeException(IOCMessages.constructorError(creatorDescription, serviceId, failure), failure);
-
- InternalUtils.invokePostInjectionMethods(result, resources, injectionResources, resources.getTracker());
+ public Object invoke()
+ {
+ Throwable failure = null;
+ Object result = null;
+
+ InternalUtils.validateConstructorForAutobuild(constructor);
+
+ InjectionResources injectionResources = createInjectionResources();
+
+ try
+ {
+ Object[] parameters = InternalUtils.calculateParametersForConstructor(constructor, resources,
+ injectionResources, resources.getTracker());
+
+ if (logger.isDebugEnabled())
+ logger.debug(IOCMessages.invokingConstructor(creatorDescription));
+
+ result = constructor.newInstance(parameters);
+
+ InternalUtils.injectIntoFields(result, resources, injectionResources, resources.getTracker());
+ }
+ catch (InvocationTargetException ite)
+ {
+ failure = ite.getTargetException();
+ }
+ catch (Exception ex)
+ {
+ failure = ex;
+ }
+
+ if (failure != null)
+ throw new RuntimeException(IOCMessages.constructorError(creatorDescription, serviceId, failure),
+ failure);
+
+ InternalUtils.invokePostInjectionMethods(result, resources, injectionResources, resources.getTracker());
+
+ return result;
+ }
+ });
- return result;
}
}
Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java?rev=1099294&r1=1099293&r2=1099294&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/RegistryImpl.java Tue May 3 23:18:09 2011
@@ -1051,7 +1051,8 @@ public class RegistryImpl implements Reg
}
};
- return proxyFactory.createProxy(interfaceClass, justInTime, String.format("<Autobuild proxy %s(%s)>", implementationClass.getName(), interfaceClass.getName()));
+ return proxyFactory.createProxy(interfaceClass, justInTime,
+ String.format("<Autobuild proxy %s(%s)>", implementationClass.getName(), interfaceClass.getName()));
}
private <T> T createReloadingProxy(Class<T> interfaceClass, final Class<? extends T> implementationClass,
@@ -1062,7 +1063,8 @@ public class RegistryImpl implements Reg
getService(UpdateListenerHub.class).addUpdateListener(creator);
- return proxyFactory.createProxy(interfaceClass, (ObjectCreator<T>) creator, String.format("<Autoreload proxy %s(%s)>", implementationClass.getName(), interfaceClass.getName()));
+ return proxyFactory.createProxy(interfaceClass, (ObjectCreator<T>) creator,
+ String.format("<Autoreload proxy %s(%s)>", implementationClass.getName(), interfaceClass.getName()));
}
public Object provideServiceProxy(String serviceId)
Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ServiceBuilderMethodInvoker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ServiceBuilderMethodInvoker.java?rev=1099294&r1=1099293&r2=1099294&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ServiceBuilderMethodInvoker.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/ServiceBuilderMethodInvoker.java Tue May 3 23:18:09 2011
@@ -1,10 +1,10 @@
-// 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.
// You may obtain a copy of the License at
//
-// http://www.apache.org/licenses/LICENSE-2.0
+// 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,
@@ -14,6 +14,8 @@
package org.apache.tapestry5.ioc.internal;
+import org.apache.tapestry5.ioc.Invokable;
+import org.apache.tapestry5.ioc.OperationTracker;
import org.apache.tapestry5.ioc.ServiceBuilderResources;
import org.apache.tapestry5.ioc.internal.util.InternalUtils;
@@ -28,8 +30,7 @@ public class ServiceBuilderMethodInvoker
{
private final Method builderMethod;
- public ServiceBuilderMethodInvoker(ServiceBuilderResources resources,
- String creatorDescription, Method method)
+ public ServiceBuilderMethodInvoker(ServiceBuilderResources resources, String creatorDescription, Method method)
{
super(resources, creatorDescription);
@@ -44,46 +45,47 @@ public class ServiceBuilderMethodInvoker
// Defer getting (and possibly instantitating) the module instance until the last possible
// moment. If the method is static, there's no need to even get the builder.
- Object moduleInstance = InternalUtils.isStatic(builderMethod)
- ? null
- : resources.getModuleBuilder();
+ final Object moduleInstance = InternalUtils.isStatic(builderMethod) ? null : resources.getModuleBuilder();
- Object result = null;
- Throwable failure = null;
+ final OperationTracker tracker = resources.getTracker();
- try
+ return tracker.invoke(String.format("Invoking " + creatorDescription), new Invokable<Object>()
{
- Object[] parameters = InternalUtils.calculateParametersForMethod(
- builderMethod,
- resources,
- createInjectionResources(), resources.getTracker());
-
- if (logger.isDebugEnabled())
- logger.debug(IOCMessages.invokingMethod(creatorDescription));
-
- result = builderMethod.invoke(moduleInstance, parameters);
- }
- catch (InvocationTargetException ite)
- {
- failure = ite.getTargetException();
- }
- catch (Exception ex)
- {
- failure = ex;
- }
-
- if (failure != null)
- throw new RuntimeException(IOCMessages.builderMethodError(
- creatorDescription,
- serviceId,
- failure), failure);
-
- if (result == null)
- throw new RuntimeException(IOCMessages.builderMethodReturnedNull(
- creatorDescription,
- serviceId));
-
- return result;
+ public Object invoke()
+ {
+ final OperationTracker tracker = resources.getTracker();
+ Object result = null;
+ Throwable failure = null;
+
+ try
+ {
+ Object[] parameters = InternalUtils.calculateParametersForMethod(builderMethod, resources,
+ createInjectionResources(), tracker);
+
+ if (logger.isDebugEnabled())
+ logger.debug(IOCMessages.invokingMethod(creatorDescription));
+
+ result = builderMethod.invoke(moduleInstance, parameters);
+ }
+ catch (InvocationTargetException ite)
+ {
+ failure = ite.getTargetException();
+ }
+ catch (Exception ex)
+ {
+ failure = ex;
+ }
+
+ if (failure != null)
+ throw new RuntimeException(IOCMessages.builderMethodError(creatorDescription, serviceId, failure),
+ failure);
+
+ if (result == null)
+ throw new RuntimeException(IOCMessages.builderMethodReturnedNull(creatorDescription, serviceId));
+
+ return result;
+ }
+ });
}
@Override