01: // Copyright 2006, 2007 The Apache Software Foundation
02: //
03: // Licensed under the Apache License, Version 2.0 (the "License");
04: // you may not use this file except in compliance with the License.
05: // You may obtain a copy of the License at
06: //
07: // http://www.apache.org/licenses/LICENSE-2.0
08: //
09: // Unless required by applicable law or agreed to in writing, software
10: // distributed under the License is distributed on an "AS IS" BASIS,
11: // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12: // See the License for the specific language governing permissions and
13: // limitations under the License.
14:
15: package org.apache.tapestry.ioc.internal;
16:
17: import java.lang.reflect.InvocationTargetException;
18: import java.lang.reflect.Method;
19: import java.util.Map;
20:
21: import org.apache.tapestry.ioc.ServiceBuilderResources;
22: import org.apache.tapestry.ioc.internal.util.InternalUtils;
23:
24: /**
25: * Basic implementation of {@link org.apache.tapestry.ioc.ObjectCreator} that handles invoking a
26: * method on the module builder, and figures out the correct parameters to pass into the annotated
27: * method.
28: */
29: public class ServiceBuilderMethodInvoker extends AbstractServiceCreator {
30: private final Method _builderMethod;
31:
32: public ServiceBuilderMethodInvoker(
33: ServiceBuilderResources resources,
34: String creatorDescription, Method method) {
35: super (resources, creatorDescription);
36:
37: _builderMethod = method;
38: }
39:
40: /**
41: * Returns a map that includes (possibly) an additional mapping containing the collected
42: * configuration data. This involves scanning the builder method's parameters.
43: */
44: private Map<Class, Object> getParameterDefaultsWithConfigurations() {
45: return getParameterDefaultsWithConfiguration(_builderMethod
46: .getParameterTypes(), _builderMethod
47: .getGenericParameterTypes());
48: }
49:
50: /**
51: * Invoked from the proxy to create the actual service implementation.
52: */
53: public Object createObject() {
54: // Defer getting (and possibly instantitating) the module builder until the last possible
55: // moment. If the method is static, there's no need to even get the builder.
56:
57: Object moduleBuilder = InternalUtils.isStatic(_builderMethod) ? null
58: : _resources.getModuleBuilder();
59:
60: Object result = null;
61: Throwable failure = null;
62:
63: try {
64: Object[] parameters = InternalUtils
65: .calculateParametersForMethod(_builderMethod,
66: _resources,
67: getParameterDefaultsWithConfigurations());
68:
69: if (_log.isDebugEnabled())
70: _log.debug(IOCMessages
71: .invokingMethod(_creatorDescription));
72:
73: result = _builderMethod.invoke(moduleBuilder, parameters);
74: } catch (InvocationTargetException ite) {
75: failure = ite.getTargetException();
76: } catch (Exception ex) {
77: failure = ex;
78: }
79:
80: if (failure != null)
81: throw new RuntimeException(IOCMessages.builderMethodError(
82: _creatorDescription, _serviceId, failure), failure);
83:
84: if (result == null)
85: throw new RuntimeException(IOCMessages
86: .builderMethodReturnedNull(_creatorDescription,
87: _serviceId));
88:
89: return result;
90: }
91: }
|