1 package com.fasterxml.jackson.databind.deser.impl;
2 
3 import com.fasterxml.jackson.annotation.JacksonInject;
4 import com.fasterxml.jackson.databind.AnnotationIntrospector;
5 import com.fasterxml.jackson.databind.PropertyName;
6 import com.fasterxml.jackson.databind.introspect.AnnotatedParameter;
7 import com.fasterxml.jackson.databind.introspect.AnnotatedWithParams;
8 import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition;
9 
10 public final class CreatorCandidate
11 {
12     protected final AnnotationIntrospector _intr;
13     protected final AnnotatedWithParams _creator;
14     protected final int _paramCount;
15     protected final Param[] _params;
16 
CreatorCandidate(AnnotationIntrospector intr, AnnotatedWithParams ct, Param[] params, int count)17     protected CreatorCandidate(AnnotationIntrospector intr,
18             AnnotatedWithParams ct, Param[] params, int count) {
19         _intr = intr;
20         _creator = ct;
21         _params = params;
22         _paramCount = count;
23     }
24 
construct(AnnotationIntrospector intr, AnnotatedWithParams creator, BeanPropertyDefinition[] propDefs)25     public static CreatorCandidate construct(AnnotationIntrospector intr,
26             AnnotatedWithParams creator, BeanPropertyDefinition[] propDefs)
27     {
28         final int pcount = creator.getParameterCount();
29         Param[] params = new Param[pcount];
30         for (int i = 0; i < pcount; ++i) {
31             AnnotatedParameter annParam = creator.getParameter(i);
32             JacksonInject.Value injectId = intr.findInjectableValue(annParam);
33             params[i] = new Param(annParam, (propDefs == null) ? null : propDefs[i], injectId);
34         }
35         return new CreatorCandidate(intr, creator, params, pcount);
36     }
37 
creator()38     public AnnotatedWithParams creator() { return _creator; }
paramCount()39     public int paramCount() { return _paramCount; }
injection(int i)40     public JacksonInject.Value injection(int i) { return _params[i].injection; }
parameter(int i)41     public AnnotatedParameter parameter(int i) { return _params[i].annotated; }
propertyDef(int i)42     public BeanPropertyDefinition propertyDef(int i) { return _params[i].propDef; }
43 
paramName(int i)44     public PropertyName paramName(int i) {
45         BeanPropertyDefinition propDef = _params[i].propDef;
46         if (propDef != null) {
47             return propDef.getFullName();
48         }
49         return null;
50     }
51 
explicitParamName(int i)52     public PropertyName explicitParamName(int i) {
53         BeanPropertyDefinition propDef = _params[i].propDef;
54         if (propDef != null) {
55             if (propDef.isExplicitlyNamed()) {
56                 return propDef.getFullName();
57             }
58         }
59         return null;
60     }
61 
findImplicitParamName(int i)62     public PropertyName findImplicitParamName(int i) {
63         String str = _intr.findImplicitPropertyName(_params[i].annotated);
64         if (str != null && !str.isEmpty()) {
65             return PropertyName.construct(str);
66         }
67         return null;
68     }
69 
70     /**
71      * Specialized accessor that finds index of the one and only parameter
72      * with NO injection and returns that; or, if none or more than one found,
73      * returns -1.
74      */
findOnlyParamWithoutInjection()75     public int findOnlyParamWithoutInjection()
76     {
77         int missing = -1;
78         for (int i = 0; i < _paramCount; ++i) {
79             if (_params[i].injection == null) {
80                 if (missing >= 0) {
81                     return -1;
82                 }
83                 missing = i;
84             }
85         }
86         return missing;
87     }
88 
89     @Override
toString()90     public String toString() {
91         return _creator.toString();
92     }
93 
94     public final static class Param {
95         public final AnnotatedParameter annotated;
96         public final BeanPropertyDefinition propDef;
97         public final JacksonInject.Value injection;
98 
Param(AnnotatedParameter p, BeanPropertyDefinition pd, JacksonInject.Value i)99         public Param(AnnotatedParameter p, BeanPropertyDefinition pd,
100                 JacksonInject.Value i)
101         {
102             annotated = p;
103             propDef = pd;
104             injection = i;
105         }
106 
fullName()107         public PropertyName fullName() {
108             if (propDef == null) {
109                 return null;
110             }
111             return propDef.getFullName();
112         }
113 
hasFullName()114         public boolean hasFullName() {
115             if (propDef == null) {
116                 return false;
117             }
118             PropertyName n = propDef.getFullName();
119             return n.hasSimpleName();
120         }
121     }
122 }
123