forked from json-iterator/java
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathExtensionManager.java
More file actions
121 lines (113 loc) · 4.28 KB
/
ExtensionManager.java
File metadata and controls
121 lines (113 loc) · 4.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package com.jsoniter;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
class ExtensionManager {
static List<Extension> extensions = new ArrayList<Extension>();
public static void registerExtension(Extension extension) {
extensions.add(extension);
}
public static Decoder createFieldDecoder(String fieldCacheKey, Binding field) {
for (Extension extension : extensions) {
Decoder decoder = extension.createDecoder(field);
if (decoder != null) {
return decoder;
}
}
return null;
}
public static CustomizedConstructor getCtor(Class clazz) {
for (Extension extension : extensions) {
CustomizedConstructor ctor = extension.getConstructor(clazz);
if (ctor != null) {
for (Binding param : ctor.parameters) {
if (param.fromNames == null) {
param.fromNames = new String[]{param.name};
}
param.clazz = clazz;
updateFromNames(param);
}
return ctor;
}
}
return CustomizedConstructor.DEFAULT_INSTANCE;
}
public static List<Binding> getFields(Class clazz) {
ArrayList<Binding> bindings = new ArrayList<Binding>();
for (Field field : clazz.getFields()) {
if (Modifier.isStatic(field.getModifiers())) {
continue;
}
Binding binding = new Binding();
binding.fromNames = new String[]{field.getName()};
binding.name = field.getName();
binding.valueType = field.getType();
binding.clazz = clazz;
binding.annotations = field.getAnnotations();
updateFromNames(binding);
bindings.add(binding);
}
return bindings;
}
private static void updateFromNames(Binding binding) {
for (Extension extension : extensions) {
String[] fromNames = extension.getBindFrom(binding);
if (fromNames != null) {
binding.fromNames = fromNames;
break;
}
}
}
public static List<CustomizedSetter> getSetters(Class clazz) {
ArrayList<CustomizedSetter> setters = new ArrayList<CustomizedSetter>();
for (Method method : clazz.getMethods()) {
if (Modifier.isStatic(method.getModifiers())) {
continue;
}
String methodName = method.getName();
if (methodName.length() < 4) {
continue;
}
if (!methodName.startsWith("set")) {
continue;
}
Type[] paramTypes = method.getGenericParameterTypes();
if (paramTypes.length != 1) {
continue;
}
String fromName = methodName.substring("set".length());
char[] fromNameChars = fromName.toCharArray();
fromNameChars[0] = Character.toLowerCase(fromNameChars[0]);
fromName = new String(fromNameChars);
CustomizedSetter setter = new CustomizedSetter();
setter.methodName = methodName;
Binding param = new Binding();
param.fromNames = new String[]{fromName};
param.name = fromName;
param.valueType = paramTypes[0];
param.clazz = clazz;
updateFromNames(param);
setter.parameters.add(param);
setters.add(setter);
}
for (Extension extension : extensions) {
List<CustomizedSetter> moreSetters = extension.getSetters(clazz);
if (moreSetters != null) {
for (CustomizedSetter moreSetter : moreSetters) {
for (Binding param : moreSetter.parameters) {
if (param.fromNames == null) {
param.fromNames = new String[]{param.name};
}
param.clazz = clazz;
updateFromNames(param);
}
}
setters.addAll(moreSetters);
}
}
return setters;
}
}