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