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 }