001: package org.apache.myfaces.config.annotation;
002:
003: /*
004: * Licensed to the Apache Software Foundation (ASF) under one or more
005: * contributor license agreements. See the NOTICE file distributed with
006: * this work for additional information regarding copyright ownership.
007: * The ASF licenses this file to You under the Apache License, Version 2.0
008: * (the "License"); you may not use this file except in compliance with
009: * the License. You may obtain a copy of the License at
010: *
011: * http://www.apache.org/licenses/LICENSE-2.0
012: *
013: * Unless required by applicable law or agreed to in writing, software
014: * distributed under the License is distributed on an "AS IS" BASIS,
015: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016: * See the License for the specific language governing permissions and
017: * limitations under the License.
018: */
019:
020: import org.apache.myfaces.shared_impl.util.ClassUtils;
021:
022: import javax.annotation.PostConstruct;
023: import javax.annotation.PreDestroy;
024: import javax.naming.NamingException;
025: import java.lang.reflect.InvocationTargetException;
026: import java.lang.reflect.Method;
027: import java.lang.reflect.Modifier;
028:
029: /**
030: * See SRV.14.5 Servlet Specification Version 2.5 JSR 154
031: * and Common Annotations for the Java Platform JSR 250
032:
033: */
034:
035: public class NoInjectionAnnotationLifecycleProvider implements
036: LifecycleProvider {
037:
038: public Object newInstance(String className)
039: throws InstantiationException, IllegalAccessException,
040: NamingException, InvocationTargetException,
041: ClassNotFoundException {
042: Class clazz = ClassUtils.classForName(className);
043: Object object = clazz.newInstance();
044: processAnnotations(object);
045: postConstruct(object);
046: return object;
047: }
048:
049: /**
050: * Call postConstruct method on the specified instance.
051: */
052: private void postConstruct(Object instance)
053: throws IllegalAccessException, InvocationTargetException {
054:
055: // TODO the servlet spec is not clear about searching in superclass??
056:
057: Method[] methods = instance.getClass().getDeclaredMethods();
058: Method postConstruct = null;
059: for (Method method : methods) {
060: if (method.isAnnotationPresent(PostConstruct.class)) {
061: // a method that does not take any arguments
062: // the method must not be static
063: // must not throw any checked expections
064: // the return value must be void
065: // the method may be public, protected, package private or private
066:
067: if ((postConstruct != null)
068: || (method.getParameterTypes().length != 0)
069: || (Modifier.isStatic(method.getModifiers()))
070: || (method.getExceptionTypes().length > 0)
071: || (!method.getReturnType().getName().equals(
072: "void"))) {
073: throw new IllegalArgumentException(
074: "Invalid PostConstruct annotation");
075: }
076: postConstruct = method;
077: }
078: }
079:
080: invokeAnnotatedMethod(postConstruct, instance);
081:
082: }
083:
084: public void destroyInstance(Object instance)
085: throws IllegalAccessException, InvocationTargetException {
086:
087: // TODO the servlet spec is not clear about searching in superclass??
088: // May be only check non private fields and methods
089: Method[] methods = instance.getClass().getDeclaredMethods();
090: Method preDestroy = null;
091: for (Method method : methods) {
092: if (method.isAnnotationPresent(PreDestroy.class)) {
093: // must not throw any checked expections
094: // the method must not be static
095: // must not throw any checked expections
096: // the return value must be void
097: // the method may be public, protected, package private or private
098:
099: if ((preDestroy != null)
100: || (method.getParameterTypes().length != 0)
101: || (Modifier.isStatic(method.getModifiers()))
102: || (method.getExceptionTypes().length > 0)
103: || (!method.getReturnType().getName().equals(
104: "void"))) {
105: throw new IllegalArgumentException(
106: "Invalid PreDestroy annotation");
107: }
108: preDestroy = method;
109: }
110: }
111:
112: invokeAnnotatedMethod(preDestroy, instance);
113:
114: }
115:
116: private void invokeAnnotatedMethod(Method method, Object instance)
117: throws IllegalAccessException, InvocationTargetException {
118: // At the end the annotated
119: // method is invoked
120: if (method != null) {
121: boolean accessibility = method.isAccessible();
122: method.setAccessible(true);
123: method.invoke(instance);
124: method.setAccessible(accessibility);
125: }
126: }
127:
128: /**
129: * Inject resources in specified instance.
130: */
131: protected void processAnnotations(Object instance)
132: throws IllegalAccessException, InvocationTargetException,
133: NamingException {
134:
135: }
136:
137: }
|