001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one
003: * or more contributor license agreements. See the NOTICE file
004: * distributed with this work for additional information
005: * regarding copyright ownership. The ASF licenses this file
006: * to you under the Apache License, Version 2.0 (the
007: * "License"); you may not use this file except in compliance
008: * with the License. You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing,
013: * software distributed under the License is distributed on an
014: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015: * KIND, either express or implied. See the License for the
016: * specific language governing permissions and limitations
017: * under the License.
018: */
019: package org.apache.axis2.jaxws.runtime.description.injection.impl;
020:
021: import org.apache.axis2.java.security.AccessController;
022: import org.apache.axis2.jaxws.description.ServiceDescription;
023: import org.apache.axis2.jaxws.runtime.description.injection.ResourceInjectionServiceRuntimeDescription;
024:
025: import javax.annotation.PostConstruct;
026: import javax.annotation.PreDestroy;
027: import javax.annotation.Resource;
028: import java.lang.reflect.Field;
029: import java.lang.reflect.Method;
030: import java.security.PrivilegedAction;
031: import java.util.ArrayList;
032: import java.util.List;
033:
034: public class ResourceInjectionServiceRuntimeDescriptionBuilder {
035:
036: /** Intentionally Private */
037: private ResourceInjectionServiceRuntimeDescriptionBuilder() {
038: }
039:
040: /**
041: * create
042: *
043: * @param opDesc
044: * @param implClassName
045: * @return
046: */
047: static public ResourceInjectionServiceRuntimeDescription create(
048: ServiceDescription serviceDesc, Class implClass) {
049: ResourceInjectionServiceRuntimeDescriptionImpl desc = new ResourceInjectionServiceRuntimeDescriptionImpl(
050: getKey(implClass), serviceDesc);
051:
052: boolean value = hasResourceAnnotation(implClass);
053: desc.setResourceAnnotation(value);
054:
055: Method method = getPostConstructMethod(implClass);
056: desc.setPostConstructMethod(method);
057:
058: method = getPreDestroyMethod(implClass);
059: desc.setPreDestroyMethod(method);
060:
061: return desc;
062: }
063:
064: static public String getKey(Class implClass) {
065: return "Resource Injection:" + implClass.getCanonicalName();
066: }
067:
068: /**
069: * @param implClass
070: * @return true if Field or Method has a @Resource annotation
071: */
072: static private boolean hasResourceAnnotation(Class implClass) {
073: // Getting this information is expensive, but fortunately is cached.
074: List<Field> fields = getFields(implClass);
075: for (Field field : fields) {
076: if (field.getAnnotation(Resource.class) != null) {
077: return true;
078: }
079: }
080: List<Method> methods = getMethods(implClass);
081: for (Method method : methods) {
082: if (method.getAnnotation(Resource.class) != null) {
083: return true;
084: }
085: }
086: return false;
087:
088: }
089:
090: static private Method getPostConstructMethod(Class implClass) {
091: List<Method> methods = getMethods(implClass);
092: for (Method method : methods) {
093: if (method.getAnnotation(PostConstruct.class) != null) {
094: return method;
095: }
096: }
097: return null;
098: }
099:
100: static private Method getPreDestroyMethod(Class implClass) {
101: List<Method> methods = getMethods(implClass);
102: for (Method method : methods) {
103: if (method.getAnnotation(PreDestroy.class) != null) {
104: return method;
105: }
106: }
107: return null;
108: }
109:
110: /**
111: * Gets all of the fields in this class and the super classes
112: *
113: * @param beanClass
114: * @return
115: */
116: static private List<Field> getFields(final Class beanClass) {
117: // This class must remain private due to Java 2 Security concerns
118: List<Field> fields;
119: fields = (List<Field>) AccessController
120: .doPrivileged(new PrivilegedAction() {
121: public Object run() {
122: List<Field> fields = new ArrayList<Field>();
123: Class cls = beanClass;
124: while (cls != null) {
125: Field[] fieldArray = cls
126: .getDeclaredFields();
127: for (Field field : fieldArray) {
128: fields.add(field);
129: }
130: cls = cls.getSuperclass();
131: }
132: return fields;
133: }
134: });
135:
136: return fields;
137: }
138:
139: /**
140: * Gets all of the fields in this class and the super classes
141: *
142: * @param beanClass
143: * @return
144: */
145: static private List<Method> getMethods(final Class beanClass) {
146: // This class must remain private due to Java 2 Security concerns
147: List<Method> methods;
148: methods = (List<Method>) AccessController
149: .doPrivileged(new PrivilegedAction() {
150: public Object run() {
151: List<Method> methods = new ArrayList<Method>();
152: Class cls = beanClass;
153: while (cls != null) {
154: Method[] methodArray = cls
155: .getDeclaredMethods();
156: for (Method method : methodArray) {
157: methods.add(method);
158: }
159: cls = cls.getSuperclass();
160: }
161: return methods;
162: }
163: });
164:
165: return methods;
166: }
167: }
|