1 package com.fasterxml.jackson.databind.introspect;
2
3 import java.lang.annotation.Annotation;
4 import java.lang.reflect.Type;
5
6 import com.fasterxml.jackson.databind.JavaType;
7
8 /**
9  * Intermediate base class that encapsulates features that
10  * constructors and methods share.
11  */

12 public abstract class AnnotatedWithParams
13     extends AnnotatedMember
14 {
15     private static final long serialVersionUID = 1L;
16
17     /**
18      * Annotations associated with parameters of the annotated
19      * entity (method or constructor parameters)
20      */

21     protected final AnnotationMap[] _paramAnnotations;
22
23     /*
24     /**********************************************************
25     /* Life-cycle
26     /**********************************************************
27      */

28
29     protected AnnotatedWithParams(TypeResolutionContext ctxt, AnnotationMap annotations, AnnotationMap[] paramAnnotations)
30     {
31         super(ctxt, annotations);
32         _paramAnnotations = paramAnnotations;
33     }
34
35     /**
36      * @since 2.8.1
37      */

38     protected AnnotatedWithParams(AnnotatedWithParams base, AnnotationMap[] paramAnnotations) {
39         super(base);
40         _paramAnnotations = paramAnnotations;
41     }
42
43     /**
44      * Method called to override a method parameter annotation,
45      * usually due to a mix-in
46      * annotation masking or overriding an annotation 'real' method
47      * has.
48      */

49     public final void addOrOverrideParam(int paramIndex, Annotation a)
50     {
51         AnnotationMap old = _paramAnnotations[paramIndex];
52         if (old == null) {
53             old = new AnnotationMap();
54             _paramAnnotations[paramIndex] = old;
55         }
56         old.add(a);
57     }
58
59     /**
60      * Method called by parameter object when an augmented instance is created;
61      * needs to replace parameter with new instance
62      */

63     protected AnnotatedParameter replaceParameterAnnotations(int index, AnnotationMap ann)
64     {
65         _paramAnnotations[index] = ann;
66         return getParameter(index);
67     }
68
69     /*
70     /**********************************************************
71     /* Extended API
72     /**********************************************************
73      */

74
75     public final AnnotationMap getParameterAnnotations(int index)
76     {
77         if (_paramAnnotations != null) {
78             if (index >= 0 && index < _paramAnnotations.length) {
79                 return _paramAnnotations[index];
80             }
81         }
82         return null;
83     }
84
85     public final AnnotatedParameter getParameter(int index) {
86         return new AnnotatedParameter(this, getParameterType(index),
87                 _typeContext, getParameterAnnotations(index), index);
88     }
89
90     public abstract int getParameterCount();
91
92     public abstract Class<?> getRawParameterType(int index);
93
94     /**
95      * @since 2.7
96      */

97     public abstract JavaType getParameterType(int index);
98
99     /**
100      * @deprecated Since 2.7, remove in 2.9
101      */

102     @Deprecated
103     public abstract Type getGenericParameterType(int index);
104
105     public final int getAnnotationCount() { return _annotations.size(); }
106
107     /**
108      * Method that can be used to (try to) call this object without arguments.
109      * This may succeed or fail, depending on expected number
110      * of arguments: caller needs to take care to pass correct number.
111      * Exceptions are thrown directly from actual low-level call.
112      *<p>
113      * Note: only works for constructors and static methods.
114      */

115     public abstract Object call() throws Exception;
116
117     /**
118      * Method that can be used to (try to) call this object with specified arguments.
119      * This may succeed or fail, depending on expected number
120      * of arguments: caller needs to take care to pass correct number.
121      * Exceptions are thrown directly from actual low-level call.
122      *<p>
123      * Note: only works for constructors and static methods.
124      */

125     public abstract Object call(Object[] args) throws Exception;
126
127     /**
128      * Method that can be used to (try to) call this object with single arguments.
129      * This may succeed or fail, depending on expected number
130      * of arguments: caller needs to take care to pass correct number.
131      * Exceptions are thrown directly from actual low-level call.
132      *<p>
133      * Note: only works for constructors and static methods.
134      */

135     public abstract Object call1(Object arg) throws Exception;
136 }
137