1 package com.fasterxml.jackson.databind.introspect;
2
3 import java.util.HashMap;
4 import java.util.Map;
5
6 import com.fasterxml.jackson.databind.type.ClassKey;
7
8
18 public class SimpleMixInResolver
19 implements ClassIntrospector.MixInResolver,
20 java.io.Serializable
21 {
22 private static final long serialVersionUID = 1L;
23
24
28 protected final ClassIntrospector.MixInResolver _overrides;
29
30
33 protected Map<ClassKey,Class<?>> _localMixIns;
34
35 public SimpleMixInResolver(ClassIntrospector.MixInResolver overrides) {
36 _overrides = overrides;
37 }
38
39 protected SimpleMixInResolver(ClassIntrospector.MixInResolver overrides,
40 Map<ClassKey,Class<?>> mixins) {
41 _overrides = overrides;
42 _localMixIns = mixins;
43 }
44
45
49 public SimpleMixInResolver withOverrides(ClassIntrospector.MixInResolver overrides) {
50 return new SimpleMixInResolver(overrides, _localMixIns);
51 }
52
53
57 public SimpleMixInResolver withoutLocalDefinitions() {
58 return new SimpleMixInResolver(_overrides, null);
59 }
60
61 public void setLocalDefinitions(Map<Class<?>, Class<?>> sourceMixins) {
62 if (sourceMixins == null || sourceMixins.isEmpty()) {
63 _localMixIns = null;
64 } else {
65 Map<ClassKey,Class<?>> mixIns = new HashMap<ClassKey,Class<?>>(sourceMixins.size());
66 for (Map.Entry<Class<?>,Class<?>> en : sourceMixins.entrySet()) {
67 mixIns.put(new ClassKey(en.getKey()), en.getValue());
68 }
69 _localMixIns = mixIns;
70 }
71 }
72
73 public void addLocalDefinition(Class<?> target, Class<?> mixinSource) {
74 if (_localMixIns == null) {
75 _localMixIns = new HashMap<ClassKey,Class<?>>();
76 }
77 _localMixIns.put(new ClassKey(target), mixinSource);
78 }
79
80 @Override
81 public SimpleMixInResolver copy() {
82 ClassIntrospector.MixInResolver overrides = (_overrides == null)
83 ? null : _overrides.copy();
84 Map<ClassKey,Class<?>> mixIns = (_localMixIns == null)
85 ? null : new HashMap<ClassKey,Class<?>>(_localMixIns);
86 return new SimpleMixInResolver(overrides, mixIns);
87 }
88
89 @Override
90 public Class<?> findMixInClassFor(Class<?> cls)
91 {
92 Class<?> mixin = (_overrides == null) ? null : _overrides.findMixInClassFor(cls);
93 if (mixin == null && (_localMixIns != null)) {
94 mixin = _localMixIns.get(new ClassKey(cls));
95 }
96 return mixin;
97 }
98
99 public int localSize() {
100 return (_localMixIns == null) ? 0 : _localMixIns.size();
101 }
102
103
117 public boolean hasMixIns() {
118 if (_localMixIns == null) {
119
120 if (_overrides == null) {
121 return false;
122 }
123
124 if (_overrides instanceof SimpleMixInResolver) {
125 return ((SimpleMixInResolver) _overrides).hasMixIns();
126 }
127 }
128
129 return true;
130 }
131 }
132