01: /**
02: * Licensed to the Apache Software Foundation (ASF) under one or more
03: * contributor license agreements. See the NOTICE file distributed with
04: * this work for additional information regarding copyright ownership.
05: * The ASF licenses this file to You under the Apache License, Version 2.0
06: * (the "License"); you may not use this file except in compliance with
07: * the License. You may obtain a copy of the License at
08: *
09: * http://www.apache.org/licenses/LICENSE-2.0
10: *
11: * Unless required by applicable law or agreed to in writing, software
12: * distributed under the License is distributed on an "AS IS" BASIS,
13: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14: * See the License for the specific language governing permissions and
15: * limitations under the License.
16: */package org.apache.geronimo.jaxws.builder;
17:
18: import java.lang.reflect.Field;
19: import java.lang.reflect.Method;
20: import java.util.List;
21:
22: import javax.annotation.Resource;
23: import javax.xml.ws.WebServiceContext;
24:
25: import org.apache.geronimo.j2ee.annotation.Holder;
26: import org.apache.geronimo.j2ee.annotation.Injection;
27: import org.apache.xbean.finder.ClassFinder;
28:
29: public class WebServiceContextAnnotationHelper {
30:
31: public static final String RELATIVE_JNDI_NAME = "env/WebServiceContext";
32: public static final String ABSOLUTE_JNDI_NAME = "java:comp/"
33: + RELATIVE_JNDI_NAME;
34:
35: public static void addWebServiceContextInjections(Holder holder,
36: ClassFinder finder) {
37: List<Field> fields = finder.findAnnotatedFields(Resource.class);
38: for (Field field : fields) {
39: Resource resource = (Resource) field
40: .getAnnotation(Resource.class);
41: Class type = getInjectionType(resource.type(), null, field);
42: if (WebServiceContext.class == type) {
43: holder.addInjection(
44: field.getDeclaringClass().getName(),
45: new Injection(field.getDeclaringClass()
46: .getName(), getInjectionName(null,
47: field), ABSOLUTE_JNDI_NAME));
48: }
49: }
50: List<Method> methods = finder
51: .findAnnotatedMethods(Resource.class);
52: for (Method method : methods) {
53: Resource resource = (Resource) method
54: .getAnnotation(Resource.class);
55: Class type = getInjectionType(resource.type(), method, null);
56: if (WebServiceContext.class == type) {
57: holder.addInjection(method.getDeclaringClass()
58: .getName(), new Injection(method
59: .getDeclaringClass().getName(),
60: getInjectionName(method, null),
61: ABSOLUTE_JNDI_NAME));
62: }
63: }
64: }
65:
66: private static Class<?> getInjectionType(Class<?> type,
67: Method method, Field field) {
68: if (type == null || Object.class == type) {
69: if (field != null) {
70: return field.getType();
71: } else if (method != null) {
72: return method.getParameterTypes()[0];
73: } else {
74: throw new IllegalArgumentException(
75: "You must supply exactly one of Method, Field");
76: }
77: } else {
78: return type;
79: }
80: }
81:
82: private static String getInjectionName(Method method, Field field) {
83: if (method != null) {
84: String injectionJavaType = method.getName().substring(3);
85: StringBuilder stringBuilder = new StringBuilder(
86: injectionJavaType);
87: stringBuilder.setCharAt(0, Character
88: .toLowerCase(stringBuilder.charAt(0)));
89: return stringBuilder.toString();
90: } else if (field != null) {
91: return field.getName();
92: } else {
93: throw new IllegalArgumentException(
94: "You must supply exactly one of Method, Field");
95: }
96: }
97:
98: }
|