001 package org.apache.commons.digester3.annotations.utils;
002
003 /*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements. See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership. The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License. You may obtain a copy of the License at
011 *
012 * http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied. See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022 import static org.apache.commons.beanutils.MethodUtils.invokeExactMethod;
023
024 import java.lang.annotation.Annotation;
025
026 /**
027 * Simple utility class to introspect annotations.
028 *
029 * @since 2.1
030 */
031 public class AnnotationUtils
032 {
033
034 /**
035 * The {@code value} string constant.
036 */
037 private static final String VALUE = "value";
038
039 /**
040 * The {@code pattern} string constant.
041 */
042 private static final String PATTERN = "pattern";
043
044 /**
045 * The {@code namespaceURI} string constant.
046 */
047 private static final String NAMESPACE_URI = "namespaceURI";
048
049 /**
050 * The {@code namespaceURI} string constant.
051 */
052 private static final String FIRE_ON_BEGIN = "fireOnBegin";
053
054 /**
055 * This class can't be instantiated.
056 */
057 private AnnotationUtils()
058 {
059 // this class can' be instantiated
060 }
061
062 /**
063 * Extract the {@code value()} from annotation.
064 *
065 * @param annotation the annotation has to be introspected.
066 * @return the annotation {@code value()}.
067 */
068 public static Object getAnnotationValue( Annotation annotation )
069 {
070 return invokeAnnotationMethod( annotation, VALUE );
071 }
072
073 /**
074 * Extract the {@code pattern()} from annotation.
075 *
076 * @param annotation the annotation has to be introspected.
077 * @return the annotation {@code pattern()}.
078 */
079 public static String getAnnotationPattern( Annotation annotation )
080 {
081 Object ret = invokeAnnotationMethod( annotation, PATTERN );
082 if ( ret != null )
083 {
084 return (String) ret;
085 }
086 return null;
087 }
088
089 /**
090 * Extract the {@code namespaceURI()} from annotation.
091 *
092 * @param annotation The annotation has to be introspected
093 * @return The annotation {@code namespaceURI()}
094 */
095 public static String getAnnotationNamespaceURI( Annotation annotation )
096 {
097 Object ret = invokeAnnotationMethod( annotation, NAMESPACE_URI );
098 if ( ret != null )
099 {
100 return (String) ret;
101 }
102 return null;
103 }
104
105 /**
106 * Extract the {@code fireOnBegin()} from annotation.
107 *
108 * @param annotation The annotation has to be introspected
109 * @return The annotation {@code fireOnBegin()}
110 */
111 public static boolean getFireOnBegin( Annotation annotation )
112 {
113 Object ret = invokeAnnotationMethod( annotation, FIRE_ON_BEGIN );
114 if ( ret != null )
115 {
116 return (Boolean) ret;
117 }
118 return false;
119 }
120
121 /**
122 * Extract the Annotations array {@code value()} from annotation if present, nul otherwise.
123 *
124 * @param annotation the annotation has to be introspected.
125 * @return the annotation {@code value()} as Annotations array.
126 */
127 public static Annotation[] getAnnotationsArrayValue( Annotation annotation )
128 {
129 Object value = getAnnotationValue( annotation );
130 if ( value != null && value.getClass().isArray()
131 && Annotation.class.isAssignableFrom( value.getClass().getComponentType() ) )
132 {
133 return (Annotation[]) value;
134 }
135 return null;
136 }
137
138 /**
139 * Invokes an annotation method.
140 *
141 * @param annotationn the annotation has to be introspected.
142 * @param method the method name to execute.
143 * @return the annotation method value, null if any error occurs.
144 */
145 private static Object invokeAnnotationMethod( Annotation annotation, String method )
146 {
147 try
148 {
149 return invokeExactMethod( annotation, method, null );
150 }
151 catch ( Throwable t )
152 {
153 return null;
154 }
155 }
156
157 }