001    /* $Id: MethodArgument.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.reflect;
019    
020    import java.lang.annotation.Annotation;
021    import java.lang.reflect.AnnotatedElement;
022    
023    /**
024     * Class to supply the missing Java {@code AnnotatedElement} for method
025     * arguments.
026     *
027     * @since 2.1
028     */
029    public final class MethodArgument implements AnnotatedElement {
030    
031        /**
032         * The method argument index.
033         */
034        private final int index;
035    
036        /**
037         * The method argument type.
038         */
039        private final Class<?> parameterType;
040    
041        /**
042         * The method argument annotations.
043         */
044        private final Annotation[] annotations;
045    
046        /**
047         * Creates a new method argument as {@code AnnotatedElement}.
048         *
049         * @param index the method argument index.
050         * @param parameterType the method argument type.
051         * @param annotations the method argument annotations.
052         */
053        public MethodArgument(int index, Class<?> parameterType, Annotation[] annotations) {
054            this.index = index;
055            this.parameterType = parameterType;
056            this.annotations = annotations;
057        }
058    
059        /**
060         * Returns the method argument index.
061         *
062         * @return the method argument index.
063         */
064        public int getIndex() {
065            return this.index;
066        }
067    
068        /**
069         * Returns the method argument type.
070         *
071         * @return the method argument type.
072         */
073        public Class<?> getParameterType() {
074            return this.parameterType;
075        }
076    
077        /**
078         * {@inheritDoc}
079         */
080        public <T extends Annotation> T getAnnotation(Class<T> annotationType) {
081            for (Annotation annotation : this.annotations) {
082                if (annotationType == annotation.annotationType()) {
083                    return annotationType.cast(annotation);
084                }
085            }
086            return null;
087        }
088    
089        /**
090         * {@inheritDoc}
091         */
092        public Annotation[] getAnnotations() {
093            return this.getAnnotationsArrayCopy();
094        }
095    
096        /**
097         * {@inheritDoc}
098         */
099        public Annotation[] getDeclaredAnnotations() {
100            return this.getAnnotationsArrayCopy();
101        }
102    
103        /**
104         * Returns an annotations array, copy of the declared annotations in this
105         * method argument.
106         *
107         * @return an annotations array, copy of the declared annotations in this
108         *         method argument.
109         */
110        private Annotation[] getAnnotationsArrayCopy() {
111            Annotation[] annotations = new Annotation[this.annotations.length];
112            System.arraycopy(this.annotations, 0, annotations, 0, annotations.length);
113            return annotations;
114        }
115    
116        /**
117         * {@inheritDoc}
118         */
119        public boolean isAnnotationPresent(Class<? extends Annotation> annotationType) {
120            for (Annotation annotation : this.annotations) {
121                if (annotationType == annotation.annotationType()) {
122                    return true;
123                }
124            }
125            return false;
126        }
127    
128    }