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 */
018package org.apache.commons.digester.annotations.utils;
019
020import java.lang.annotation.Annotation;
021
022import org.apache.commons.beanutils.MethodUtils;
023
024/**
025 * Simple utility class to introspect annotations.
026 *
027 * @since 2.1
028 */
029public 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}