annotate src/main/java/org/msgpack/template/builder/AbstractTemplateBuilder.java @ 0:cb825acd883a

first commit
author sugi
date Sat, 18 Oct 2014 15:06:15 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
cb825acd883a first commit
sugi
parents:
diff changeset
1 //
cb825acd883a first commit
sugi
parents:
diff changeset
2 // MessagePack for Java
cb825acd883a first commit
sugi
parents:
diff changeset
3 //
cb825acd883a first commit
sugi
parents:
diff changeset
4 // Copyright (C) 2009 - 2013 FURUHASHI Sadayuki
cb825acd883a first commit
sugi
parents:
diff changeset
5 //
cb825acd883a first commit
sugi
parents:
diff changeset
6 // Licensed under the Apache License, Version 2.0 (the "License");
cb825acd883a first commit
sugi
parents:
diff changeset
7 // you may not use this file except in compliance with the License.
cb825acd883a first commit
sugi
parents:
diff changeset
8 // You may obtain a copy of the License at
cb825acd883a first commit
sugi
parents:
diff changeset
9 //
cb825acd883a first commit
sugi
parents:
diff changeset
10 // http://www.apache.org/licenses/LICENSE-2.0
cb825acd883a first commit
sugi
parents:
diff changeset
11 //
cb825acd883a first commit
sugi
parents:
diff changeset
12 // Unless required by applicable law or agreed to in writing, software
cb825acd883a first commit
sugi
parents:
diff changeset
13 // distributed under the License is distributed on an "AS IS" BASIS,
cb825acd883a first commit
sugi
parents:
diff changeset
14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
cb825acd883a first commit
sugi
parents:
diff changeset
15 // See the License for the specific language governing permissions and
cb825acd883a first commit
sugi
parents:
diff changeset
16 // limitations under the License.
cb825acd883a first commit
sugi
parents:
diff changeset
17 //
cb825acd883a first commit
sugi
parents:
diff changeset
18 package org.msgpack.template.builder;
cb825acd883a first commit
sugi
parents:
diff changeset
19
cb825acd883a first commit
sugi
parents:
diff changeset
20 import java.lang.annotation.Annotation;
cb825acd883a first commit
sugi
parents:
diff changeset
21 import java.lang.reflect.AccessibleObject;
cb825acd883a first commit
sugi
parents:
diff changeset
22 import java.lang.reflect.Field;
cb825acd883a first commit
sugi
parents:
diff changeset
23 import java.lang.reflect.GenericArrayType;
cb825acd883a first commit
sugi
parents:
diff changeset
24 import java.lang.reflect.Modifier;
cb825acd883a first commit
sugi
parents:
diff changeset
25 import java.lang.reflect.Type;
cb825acd883a first commit
sugi
parents:
diff changeset
26 import java.util.ArrayList;
cb825acd883a first commit
sugi
parents:
diff changeset
27 import java.util.List;
cb825acd883a first commit
sugi
parents:
diff changeset
28
cb825acd883a first commit
sugi
parents:
diff changeset
29 import org.msgpack.annotation.Beans;
cb825acd883a first commit
sugi
parents:
diff changeset
30 import org.msgpack.annotation.Ignore;
cb825acd883a first commit
sugi
parents:
diff changeset
31 import org.msgpack.annotation.Index;
cb825acd883a first commit
sugi
parents:
diff changeset
32 import org.msgpack.annotation.Message;
cb825acd883a first commit
sugi
parents:
diff changeset
33 import org.msgpack.annotation.MessagePackBeans;
cb825acd883a first commit
sugi
parents:
diff changeset
34 import org.msgpack.annotation.MessagePackMessage;
cb825acd883a first commit
sugi
parents:
diff changeset
35 import org.msgpack.annotation.MessagePackOrdinalEnum;
cb825acd883a first commit
sugi
parents:
diff changeset
36 import org.msgpack.annotation.NotNullable;
cb825acd883a first commit
sugi
parents:
diff changeset
37 import org.msgpack.annotation.Optional;
cb825acd883a first commit
sugi
parents:
diff changeset
38 import org.msgpack.annotation.OrdinalEnum;
cb825acd883a first commit
sugi
parents:
diff changeset
39 import org.msgpack.template.FieldList;
cb825acd883a first commit
sugi
parents:
diff changeset
40 import org.msgpack.template.FieldOption;
cb825acd883a first commit
sugi
parents:
diff changeset
41 import org.msgpack.template.Template;
cb825acd883a first commit
sugi
parents:
diff changeset
42 import org.msgpack.template.TemplateRegistry;
cb825acd883a first commit
sugi
parents:
diff changeset
43 import org.msgpack.template.builder.TemplateBuildException;
cb825acd883a first commit
sugi
parents:
diff changeset
44
cb825acd883a first commit
sugi
parents:
diff changeset
45 public abstract class AbstractTemplateBuilder implements TemplateBuilder {
cb825acd883a first commit
sugi
parents:
diff changeset
46
cb825acd883a first commit
sugi
parents:
diff changeset
47 protected TemplateRegistry registry;
cb825acd883a first commit
sugi
parents:
diff changeset
48
cb825acd883a first commit
sugi
parents:
diff changeset
49 protected AbstractTemplateBuilder(TemplateRegistry registry) {
cb825acd883a first commit
sugi
parents:
diff changeset
50 this.registry = registry;
cb825acd883a first commit
sugi
parents:
diff changeset
51 }
cb825acd883a first commit
sugi
parents:
diff changeset
52
cb825acd883a first commit
sugi
parents:
diff changeset
53 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
54 public <T> Template<T> buildTemplate(final Type targetType)
cb825acd883a first commit
sugi
parents:
diff changeset
55 throws TemplateBuildException {
cb825acd883a first commit
sugi
parents:
diff changeset
56 @SuppressWarnings("unchecked")
cb825acd883a first commit
sugi
parents:
diff changeset
57 Class<T> targetClass = (Class<T>) targetType;
cb825acd883a first commit
sugi
parents:
diff changeset
58 checkClassValidation(targetClass);
cb825acd883a first commit
sugi
parents:
diff changeset
59 FieldOption fieldOption = getFieldOption(targetClass);
cb825acd883a first commit
sugi
parents:
diff changeset
60 FieldEntry[] entries = toFieldEntries(targetClass, fieldOption);
cb825acd883a first commit
sugi
parents:
diff changeset
61 return buildTemplate(targetClass, entries);
cb825acd883a first commit
sugi
parents:
diff changeset
62 }
cb825acd883a first commit
sugi
parents:
diff changeset
63
cb825acd883a first commit
sugi
parents:
diff changeset
64 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
65 public <T> Template<T> buildTemplate(final Class<T> targetClass, final FieldList fieldList)
cb825acd883a first commit
sugi
parents:
diff changeset
66 throws TemplateBuildException {
cb825acd883a first commit
sugi
parents:
diff changeset
67 checkClassValidation(targetClass);
cb825acd883a first commit
sugi
parents:
diff changeset
68 FieldEntry[] entries = toFieldEntries(targetClass, fieldList);
cb825acd883a first commit
sugi
parents:
diff changeset
69 return buildTemplate(targetClass, entries);
cb825acd883a first commit
sugi
parents:
diff changeset
70 }
cb825acd883a first commit
sugi
parents:
diff changeset
71
cb825acd883a first commit
sugi
parents:
diff changeset
72 protected abstract <T> Template<T> buildTemplate(Class<T> targetClass, FieldEntry[] entries);
cb825acd883a first commit
sugi
parents:
diff changeset
73
cb825acd883a first commit
sugi
parents:
diff changeset
74 protected void checkClassValidation(final Class<?> targetClass) {
cb825acd883a first commit
sugi
parents:
diff changeset
75 if (targetClass.isInterface()) {
cb825acd883a first commit
sugi
parents:
diff changeset
76 throw new TemplateBuildException(
cb825acd883a first commit
sugi
parents:
diff changeset
77 "Cannot build template for interface: " + targetClass.getName());
cb825acd883a first commit
sugi
parents:
diff changeset
78 }
cb825acd883a first commit
sugi
parents:
diff changeset
79 if (Modifier.isAbstract(targetClass.getModifiers())) {
cb825acd883a first commit
sugi
parents:
diff changeset
80 throw new TemplateBuildException(
cb825acd883a first commit
sugi
parents:
diff changeset
81 "Cannot build template for abstract class: " + targetClass.getName());
cb825acd883a first commit
sugi
parents:
diff changeset
82 }
cb825acd883a first commit
sugi
parents:
diff changeset
83 if (targetClass.isArray()) {
cb825acd883a first commit
sugi
parents:
diff changeset
84 throw new TemplateBuildException(
cb825acd883a first commit
sugi
parents:
diff changeset
85 "Cannot build template for array class: " + targetClass.getName());
cb825acd883a first commit
sugi
parents:
diff changeset
86 }
cb825acd883a first commit
sugi
parents:
diff changeset
87 if (targetClass.isPrimitive()) {
cb825acd883a first commit
sugi
parents:
diff changeset
88 throw new TemplateBuildException(
cb825acd883a first commit
sugi
parents:
diff changeset
89 "Cannot build template of primitive type: " + targetClass.getName());
cb825acd883a first commit
sugi
parents:
diff changeset
90 }
cb825acd883a first commit
sugi
parents:
diff changeset
91 }
cb825acd883a first commit
sugi
parents:
diff changeset
92
cb825acd883a first commit
sugi
parents:
diff changeset
93 protected FieldOption getFieldOption(Class<?> targetClass) {
cb825acd883a first commit
sugi
parents:
diff changeset
94 Message m = targetClass.getAnnotation(Message.class);
cb825acd883a first commit
sugi
parents:
diff changeset
95 if (m == null) {
cb825acd883a first commit
sugi
parents:
diff changeset
96 return FieldOption.DEFAULT;
cb825acd883a first commit
sugi
parents:
diff changeset
97 }
cb825acd883a first commit
sugi
parents:
diff changeset
98 MessagePackMessage mpm = targetClass
cb825acd883a first commit
sugi
parents:
diff changeset
99 .getAnnotation(MessagePackMessage.class);
cb825acd883a first commit
sugi
parents:
diff changeset
100 if (mpm == null) {
cb825acd883a first commit
sugi
parents:
diff changeset
101 return FieldOption.DEFAULT;
cb825acd883a first commit
sugi
parents:
diff changeset
102 }
cb825acd883a first commit
sugi
parents:
diff changeset
103 // TODO #MN
cb825acd883a first commit
sugi
parents:
diff changeset
104 return m.value();
cb825acd883a first commit
sugi
parents:
diff changeset
105 }
cb825acd883a first commit
sugi
parents:
diff changeset
106
cb825acd883a first commit
sugi
parents:
diff changeset
107 private FieldEntry[] toFieldEntries(final Class<?> targetClass, final FieldList flist) {
cb825acd883a first commit
sugi
parents:
diff changeset
108 List<FieldList.Entry> src = flist.getList();
cb825acd883a first commit
sugi
parents:
diff changeset
109 FieldEntry[] entries = new FieldEntry[src.size()];
cb825acd883a first commit
sugi
parents:
diff changeset
110 for (int i = 0; i < src.size(); i++) {
cb825acd883a first commit
sugi
parents:
diff changeset
111 FieldList.Entry s = src.get(i);
cb825acd883a first commit
sugi
parents:
diff changeset
112 if (s.isAvailable()) {
cb825acd883a first commit
sugi
parents:
diff changeset
113 try {
cb825acd883a first commit
sugi
parents:
diff changeset
114 entries[i] = new DefaultFieldEntry(targetClass.getDeclaredField(s.getName()), s.getOption());
cb825acd883a first commit
sugi
parents:
diff changeset
115 } catch (SecurityException e) {
cb825acd883a first commit
sugi
parents:
diff changeset
116 throw new TemplateBuildException(e);
cb825acd883a first commit
sugi
parents:
diff changeset
117 } catch (NoSuchFieldException e) {
cb825acd883a first commit
sugi
parents:
diff changeset
118 throw new TemplateBuildException(e);
cb825acd883a first commit
sugi
parents:
diff changeset
119 }
cb825acd883a first commit
sugi
parents:
diff changeset
120 } else {
cb825acd883a first commit
sugi
parents:
diff changeset
121 entries[i] = new DefaultFieldEntry();
cb825acd883a first commit
sugi
parents:
diff changeset
122 }
cb825acd883a first commit
sugi
parents:
diff changeset
123 }
cb825acd883a first commit
sugi
parents:
diff changeset
124 return entries;
cb825acd883a first commit
sugi
parents:
diff changeset
125 }
cb825acd883a first commit
sugi
parents:
diff changeset
126
cb825acd883a first commit
sugi
parents:
diff changeset
127 protected FieldEntry[] toFieldEntries(final Class<?> targetClass, final FieldOption from) {
cb825acd883a first commit
sugi
parents:
diff changeset
128 Field[] fields = getFields(targetClass);
cb825acd883a first commit
sugi
parents:
diff changeset
129
cb825acd883a first commit
sugi
parents:
diff changeset
130 /*
cb825acd883a first commit
sugi
parents:
diff changeset
131 * index:
cb825acd883a first commit
sugi
parents:
diff changeset
132 *
cb825acd883a first commit
sugi
parents:
diff changeset
133 * @Index(0)
cb825acd883a first commit
sugi
parents:
diff changeset
134 * int field_a; // 0
cb825acd883a first commit
sugi
parents:
diff changeset
135 * int field_b; // 1
cb825acd883a first commit
sugi
parents:
diff changeset
136 * @Index(3)
cb825acd883a first commit
sugi
parents:
diff changeset
137 * int field_c; // 3
cb825acd883a first commit
sugi
parents:
diff changeset
138 * int field_d; // 4
cb825acd883a first commit
sugi
parents:
diff changeset
139 * @Index(2)
cb825acd883a first commit
sugi
parents:
diff changeset
140 * int field_e; // 2
cb825acd883a first commit
sugi
parents:
diff changeset
141 * int field_f; // 5
cb825acd883a first commit
sugi
parents:
diff changeset
142 */
cb825acd883a first commit
sugi
parents:
diff changeset
143 List<FieldEntry> indexed = new ArrayList<FieldEntry>();
cb825acd883a first commit
sugi
parents:
diff changeset
144 int maxIndex = -1;
cb825acd883a first commit
sugi
parents:
diff changeset
145 for (Field f : fields) {
cb825acd883a first commit
sugi
parents:
diff changeset
146 FieldOption opt = getFieldOption(f, from);
cb825acd883a first commit
sugi
parents:
diff changeset
147 if (opt == FieldOption.IGNORE) {
cb825acd883a first commit
sugi
parents:
diff changeset
148 // skip
cb825acd883a first commit
sugi
parents:
diff changeset
149 continue;
cb825acd883a first commit
sugi
parents:
diff changeset
150 }
cb825acd883a first commit
sugi
parents:
diff changeset
151
cb825acd883a first commit
sugi
parents:
diff changeset
152 int index = getFieldIndex(f, maxIndex);
cb825acd883a first commit
sugi
parents:
diff changeset
153 if (indexed.size() > index && indexed.get(index) != null) {
cb825acd883a first commit
sugi
parents:
diff changeset
154 throw new TemplateBuildException("duplicated index: " + index);
cb825acd883a first commit
sugi
parents:
diff changeset
155 }
cb825acd883a first commit
sugi
parents:
diff changeset
156 if (index < 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
157 throw new TemplateBuildException("invalid index: " + index);
cb825acd883a first commit
sugi
parents:
diff changeset
158 }
cb825acd883a first commit
sugi
parents:
diff changeset
159
cb825acd883a first commit
sugi
parents:
diff changeset
160 while (indexed.size() <= index) {
cb825acd883a first commit
sugi
parents:
diff changeset
161 indexed.add(null);
cb825acd883a first commit
sugi
parents:
diff changeset
162 }
cb825acd883a first commit
sugi
parents:
diff changeset
163 indexed.set(index, new DefaultFieldEntry(f, opt));
cb825acd883a first commit
sugi
parents:
diff changeset
164
cb825acd883a first commit
sugi
parents:
diff changeset
165 if (maxIndex < index) {
cb825acd883a first commit
sugi
parents:
diff changeset
166 maxIndex = index;
cb825acd883a first commit
sugi
parents:
diff changeset
167 }
cb825acd883a first commit
sugi
parents:
diff changeset
168 }
cb825acd883a first commit
sugi
parents:
diff changeset
169
cb825acd883a first commit
sugi
parents:
diff changeset
170 FieldEntry[] entries = new FieldEntry[maxIndex + 1];
cb825acd883a first commit
sugi
parents:
diff changeset
171 for (int i = 0; i < indexed.size(); i++) {
cb825acd883a first commit
sugi
parents:
diff changeset
172 FieldEntry e = indexed.get(i);
cb825acd883a first commit
sugi
parents:
diff changeset
173 if (e == null) {
cb825acd883a first commit
sugi
parents:
diff changeset
174 entries[i] = new DefaultFieldEntry();
cb825acd883a first commit
sugi
parents:
diff changeset
175 } else {
cb825acd883a first commit
sugi
parents:
diff changeset
176 entries[i] = e;
cb825acd883a first commit
sugi
parents:
diff changeset
177 }
cb825acd883a first commit
sugi
parents:
diff changeset
178 }
cb825acd883a first commit
sugi
parents:
diff changeset
179 return entries;
cb825acd883a first commit
sugi
parents:
diff changeset
180 }
cb825acd883a first commit
sugi
parents:
diff changeset
181
cb825acd883a first commit
sugi
parents:
diff changeset
182 private Field[] getFields(Class<?> targetClass) {
cb825acd883a first commit
sugi
parents:
diff changeset
183 // order: [fields of super class, ..., fields of this class]
cb825acd883a first commit
sugi
parents:
diff changeset
184 List<Field[]> succ = new ArrayList<Field[]>();
cb825acd883a first commit
sugi
parents:
diff changeset
185 int total = 0;
cb825acd883a first commit
sugi
parents:
diff changeset
186 for (Class<?> c = targetClass; c != Object.class; c = c.getSuperclass()) {
cb825acd883a first commit
sugi
parents:
diff changeset
187 Field[] fields = c.getDeclaredFields();
cb825acd883a first commit
sugi
parents:
diff changeset
188 total += fields.length;
cb825acd883a first commit
sugi
parents:
diff changeset
189 succ.add(fields);
cb825acd883a first commit
sugi
parents:
diff changeset
190 }
cb825acd883a first commit
sugi
parents:
diff changeset
191 Field[] result = new Field[total];
cb825acd883a first commit
sugi
parents:
diff changeset
192 int off = 0;
cb825acd883a first commit
sugi
parents:
diff changeset
193 for (int i = succ.size() - 1; i >= 0; i--) {
cb825acd883a first commit
sugi
parents:
diff changeset
194 Field[] fields = succ.get(i);
cb825acd883a first commit
sugi
parents:
diff changeset
195 System.arraycopy(fields, 0, result, off, fields.length);
cb825acd883a first commit
sugi
parents:
diff changeset
196 off += fields.length;
cb825acd883a first commit
sugi
parents:
diff changeset
197 }
cb825acd883a first commit
sugi
parents:
diff changeset
198 return result;
cb825acd883a first commit
sugi
parents:
diff changeset
199 }
cb825acd883a first commit
sugi
parents:
diff changeset
200
cb825acd883a first commit
sugi
parents:
diff changeset
201 private FieldOption getFieldOption(Field field, FieldOption from) {
cb825acd883a first commit
sugi
parents:
diff changeset
202 int mod = field.getModifiers();
cb825acd883a first commit
sugi
parents:
diff changeset
203 // default mode:
cb825acd883a first commit
sugi
parents:
diff changeset
204 // transient, static, final : Ignore
cb825acd883a first commit
sugi
parents:
diff changeset
205 // primitive type : NotNullable
cb825acd883a first commit
sugi
parents:
diff changeset
206 // reference type : Ignore
cb825acd883a first commit
sugi
parents:
diff changeset
207 if (Modifier.isStatic(mod) || Modifier.isFinal(mod)
cb825acd883a first commit
sugi
parents:
diff changeset
208 || Modifier.isTransient(mod)) {
cb825acd883a first commit
sugi
parents:
diff changeset
209 return FieldOption.IGNORE;
cb825acd883a first commit
sugi
parents:
diff changeset
210 }
cb825acd883a first commit
sugi
parents:
diff changeset
211
cb825acd883a first commit
sugi
parents:
diff changeset
212 if (isAnnotated(field, Ignore.class)) {
cb825acd883a first commit
sugi
parents:
diff changeset
213 return FieldOption.IGNORE;
cb825acd883a first commit
sugi
parents:
diff changeset
214 } else if (isAnnotated(field, Optional.class)) {
cb825acd883a first commit
sugi
parents:
diff changeset
215 return FieldOption.OPTIONAL;
cb825acd883a first commit
sugi
parents:
diff changeset
216 } else if (isAnnotated(field, NotNullable.class)) {
cb825acd883a first commit
sugi
parents:
diff changeset
217 return FieldOption.NOTNULLABLE;
cb825acd883a first commit
sugi
parents:
diff changeset
218 }
cb825acd883a first commit
sugi
parents:
diff changeset
219
cb825acd883a first commit
sugi
parents:
diff changeset
220 if (from != FieldOption.DEFAULT) {
cb825acd883a first commit
sugi
parents:
diff changeset
221 return from;
cb825acd883a first commit
sugi
parents:
diff changeset
222 }
cb825acd883a first commit
sugi
parents:
diff changeset
223
cb825acd883a first commit
sugi
parents:
diff changeset
224 if (field.getType().isPrimitive()) {
cb825acd883a first commit
sugi
parents:
diff changeset
225 return FieldOption.NOTNULLABLE;
cb825acd883a first commit
sugi
parents:
diff changeset
226 } else {
cb825acd883a first commit
sugi
parents:
diff changeset
227 return FieldOption.OPTIONAL;
cb825acd883a first commit
sugi
parents:
diff changeset
228 }
cb825acd883a first commit
sugi
parents:
diff changeset
229 }
cb825acd883a first commit
sugi
parents:
diff changeset
230
cb825acd883a first commit
sugi
parents:
diff changeset
231 private int getFieldIndex(final Field field, int maxIndex) {
cb825acd883a first commit
sugi
parents:
diff changeset
232 Index a = field.getAnnotation(Index.class);
cb825acd883a first commit
sugi
parents:
diff changeset
233 if (a == null) {
cb825acd883a first commit
sugi
parents:
diff changeset
234 return maxIndex + 1;
cb825acd883a first commit
sugi
parents:
diff changeset
235 } else {
cb825acd883a first commit
sugi
parents:
diff changeset
236 return a.value();
cb825acd883a first commit
sugi
parents:
diff changeset
237 }
cb825acd883a first commit
sugi
parents:
diff changeset
238 }
cb825acd883a first commit
sugi
parents:
diff changeset
239
cb825acd883a first commit
sugi
parents:
diff changeset
240 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
241 public void writeTemplate(Type targetType, String directoryName) {
cb825acd883a first commit
sugi
parents:
diff changeset
242 throw new UnsupportedOperationException(targetType.toString());
cb825acd883a first commit
sugi
parents:
diff changeset
243 }
cb825acd883a first commit
sugi
parents:
diff changeset
244
cb825acd883a first commit
sugi
parents:
diff changeset
245 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
246 public <T> Template<T> loadTemplate(Type targetType) {
cb825acd883a first commit
sugi
parents:
diff changeset
247 return null;
cb825acd883a first commit
sugi
parents:
diff changeset
248 }
cb825acd883a first commit
sugi
parents:
diff changeset
249
cb825acd883a first commit
sugi
parents:
diff changeset
250 public static boolean isAnnotated(Class<?> targetClass,
cb825acd883a first commit
sugi
parents:
diff changeset
251 Class<? extends Annotation> with) {
cb825acd883a first commit
sugi
parents:
diff changeset
252 return targetClass.getAnnotation(with) != null;
cb825acd883a first commit
sugi
parents:
diff changeset
253 }
cb825acd883a first commit
sugi
parents:
diff changeset
254
cb825acd883a first commit
sugi
parents:
diff changeset
255 public static boolean isAnnotated(AccessibleObject accessibleObject, Class<? extends Annotation> with) {
cb825acd883a first commit
sugi
parents:
diff changeset
256 return accessibleObject.getAnnotation(with) != null;
cb825acd883a first commit
sugi
parents:
diff changeset
257 }
cb825acd883a first commit
sugi
parents:
diff changeset
258
cb825acd883a first commit
sugi
parents:
diff changeset
259 public static boolean matchAtClassTemplateBuilder(Class<?> targetClass, boolean hasAnnotation) {
cb825acd883a first commit
sugi
parents:
diff changeset
260 if (hasAnnotation) {
cb825acd883a first commit
sugi
parents:
diff changeset
261 return AbstractTemplateBuilder.isAnnotated(targetClass, Message.class)
cb825acd883a first commit
sugi
parents:
diff changeset
262 || AbstractTemplateBuilder.isAnnotated(targetClass, MessagePackMessage.class);
cb825acd883a first commit
sugi
parents:
diff changeset
263 } else {
cb825acd883a first commit
sugi
parents:
diff changeset
264 return !targetClass.isEnum() && !targetClass.isInterface();
cb825acd883a first commit
sugi
parents:
diff changeset
265 }
cb825acd883a first commit
sugi
parents:
diff changeset
266 }
cb825acd883a first commit
sugi
parents:
diff changeset
267
cb825acd883a first commit
sugi
parents:
diff changeset
268 public static boolean matchAtBeansClassTemplateBuilder(Type targetType, boolean hasAnnotation) {
cb825acd883a first commit
sugi
parents:
diff changeset
269 Class<?> targetClass = (Class<?>) targetType;
cb825acd883a first commit
sugi
parents:
diff changeset
270 if (hasAnnotation) {
cb825acd883a first commit
sugi
parents:
diff changeset
271 return AbstractTemplateBuilder.isAnnotated((Class<?>) targetType, Beans.class)
cb825acd883a first commit
sugi
parents:
diff changeset
272 || AbstractTemplateBuilder.isAnnotated((Class<?>) targetType, MessagePackBeans.class);
cb825acd883a first commit
sugi
parents:
diff changeset
273 } else {
cb825acd883a first commit
sugi
parents:
diff changeset
274 return !targetClass.isEnum() || !targetClass.isInterface();
cb825acd883a first commit
sugi
parents:
diff changeset
275 }
cb825acd883a first commit
sugi
parents:
diff changeset
276 }
cb825acd883a first commit
sugi
parents:
diff changeset
277
cb825acd883a first commit
sugi
parents:
diff changeset
278 public static boolean matchAtArrayTemplateBuilder(Class<?> targetClass, boolean hasAnnotation) {
cb825acd883a first commit
sugi
parents:
diff changeset
279 if (((Type) targetClass) instanceof GenericArrayType) {
cb825acd883a first commit
sugi
parents:
diff changeset
280 return true;
cb825acd883a first commit
sugi
parents:
diff changeset
281 }
cb825acd883a first commit
sugi
parents:
diff changeset
282 return targetClass.isArray();
cb825acd883a first commit
sugi
parents:
diff changeset
283 }
cb825acd883a first commit
sugi
parents:
diff changeset
284
cb825acd883a first commit
sugi
parents:
diff changeset
285 public static boolean matchAtOrdinalEnumTemplateBuilder(Class<?> targetClass, boolean hasAnnotation) {
cb825acd883a first commit
sugi
parents:
diff changeset
286 if (hasAnnotation) {
cb825acd883a first commit
sugi
parents:
diff changeset
287 return AbstractTemplateBuilder.isAnnotated(targetClass, OrdinalEnum.class)
cb825acd883a first commit
sugi
parents:
diff changeset
288 || AbstractTemplateBuilder.isAnnotated(targetClass, MessagePackOrdinalEnum.class);
cb825acd883a first commit
sugi
parents:
diff changeset
289 } else {
cb825acd883a first commit
sugi
parents:
diff changeset
290 return targetClass.isEnum();
cb825acd883a first commit
sugi
parents:
diff changeset
291 }
cb825acd883a first commit
sugi
parents:
diff changeset
292 }
cb825acd883a first commit
sugi
parents:
diff changeset
293 }