001 /* $Id: AnnotationUtils.java 992060 2010-09-02 19:09:47Z simonetripodi $
002 *
003 * Licensed to the Apache Software Foundation (ASF) under one or more
004 * contributor license agreements. See the NOTICE file distributed with
005 * this work for additional information regarding copyright ownership.
006 * The ASF licenses this file to You under the Apache License, Version 2.0
007 * (the "License"); you may not use this file except in compliance with
008 * 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, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018 package org.apache.commons.digester.annotations.utils;
019
020 import java.lang.annotation.Annotation;
021
022 import org.apache.commons.beanutils.MethodUtils;
023
024 /**
025 * Simple utility class to introspect annotations.
026 *
027 * @since 2.1
028 */
029 public class AnnotationUtils {
030
031 /**
032 * The {@code value} string constant.
033 */
034 private static final String VALUE = "value";
035
036 /**
037 * The {@code pattern} string constant.
038 */
039 private static final String PATTERN = "pattern";
040
041 /**
042 * This class can't be instantiated.
043 */
044 private AnnotationUtils() {
045 // this class can' be instantiated
046 }
047
048 /**
049 * Extract the {@code value()} from annotation.
050 *
051 * @param annotation the annotation has to be introspected.
052 * @return the annotation {@code value()}.
053 */
054 public static Object getAnnotationValue(Annotation annotation) {
055 return invokeAnnotationMethod(annotation, VALUE);
056 }
057
058 /**
059 * Extract the {@code pattern()} from annotation.
060 *
061 * @param annotation the annotation has to be introspected.
062 * @return the annotation {@code pattern()}.
063 */
064 public static String getAnnotationPattern(Annotation annotation) {
065 Object ret = invokeAnnotationMethod(annotation, PATTERN);
066 if (ret != null) {
067 return (String) ret;
068 }
069 return null;
070 }
071
072 /**
073 * Extract the Annotations array {@code value()} from annotation if present,
074 * nul otherwise.
075 *
076 * @param annotation the annotation has to be introspected.
077 * @return the annotation {@code value()} as Annotations array.
078 */
079 public static Annotation[] getAnnotationsArrayValue(Annotation annotation) {
080 Object value = getAnnotationValue(annotation);
081 if (value != null
082 && value.getClass().isArray()
083 && Annotation.class.isAssignableFrom(value.getClass().getComponentType())) {
084 return (Annotation[]) value;
085 }
086 return null;
087 }
088
089 /**
090 * Invokes an annotation method.
091 *
092 * @param annotationn the annotation has to be introspected.
093 * @param method the method name to execute.
094 * @return the annotation method value, null if any error occurs.
095 */
096 private static Object invokeAnnotationMethod(Annotation annotation, String method) {
097 try {
098 return MethodUtils.invokeExactMethod(annotation, method, null);
099 } catch (Throwable t) {
100 return null;
101 }
102 }
103
104 }