Skip to content

Commit f4da134

Browse files
committed
refactored TemplateBuilderChain and AbstractTemplateBuilder classes
1 parent d0455bc commit f4da134

File tree

4 files changed

+47
-81
lines changed

4 files changed

+47
-81
lines changed

src/main/java/org/msgpack/template/builder/AbstractTemplateBuilder.java

Lines changed: 3 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121
import java.lang.reflect.AccessibleObject;
2222
import java.lang.reflect.Field;
2323
import java.lang.reflect.GenericArrayType;
24-
import java.lang.reflect.InvocationTargetException;
25-
import java.lang.reflect.Method;
2624
import java.lang.reflect.Modifier;
2725
import java.lang.reflect.Type;
2826
import java.util.ArrayList;
@@ -43,26 +41,8 @@
4341
import org.msgpack.template.Template;
4442
import org.msgpack.template.TemplateRegistry;
4543
import org.msgpack.template.builder.TemplateBuildException;
46-
import org.msgpack.util.android.DalvikVmChecker;
4744

4845
public abstract class AbstractTemplateBuilder implements TemplateBuilder {
49-
50-
private static final Method javassistModifierIsAbstractMethod;
51-
static {
52-
Method method = null;
53-
try {
54-
if (!DalvikVmChecker.isDalvikVm()) {
55-
Class<?> clazz = Class.forName("javassist.Modifier");
56-
method = clazz.getMethod("isAbstract", int.class);
57-
}
58-
} catch (ClassNotFoundException e) {
59-
// DalvikVM
60-
} catch (NoSuchMethodException e) {
61-
// TODO: should output any message ?
62-
} finally {
63-
javassistModifierIsAbstractMethod = method;
64-
}
65-
}
6646

6747
protected TemplateRegistry registry;
6848

@@ -92,19 +72,10 @@ public <T> Template<T> buildTemplate(final Class<T> targetClass, final FieldList
9272
protected abstract <T> Template<T> buildTemplate(Class<T> targetClass, FieldEntry[] entries);
9373

9474
protected void checkClassValidation(final Class<?> targetClass) {
95-
if (javassistModifierIsAbstractMethod != null) {
96-
try {
97-
if ((Boolean) javassistModifierIsAbstractMethod.invoke(null, targetClass.getModifiers())) {
98-
throw new TemplateBuildException(
99-
"Cannot build template for abstract class: " + targetClass.getName());
100-
}
101-
} catch (IllegalAccessException e) {
102-
new TemplateBuildException(e);
103-
} catch (InvocationTargetException e) {
104-
new TemplateBuildException(e);
105-
}
75+
if (Modifier.isAbstract(targetClass.getModifiers())) {
76+
throw new TemplateBuildException(
77+
"Cannot build template for abstract class: " + targetClass.getName());
10678
}
107-
10879
if (targetClass.isInterface()) {
10980
throw new TemplateBuildException(
11081
"Cannot build template for interface: " + targetClass.getName());

src/main/java/org/msgpack/template/builder/ReflectionBeansTemplateBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public Object read(Unpacker unpacker, Object to, boolean required) throws IOExce
6969
}
7070

7171
public ReflectionBeansTemplateBuilder(TemplateRegistry registry) {
72-
super(registry);
72+
super(registry, null);
7373
}
7474

7575
@Override

src/main/java/org/msgpack/template/builder/ReflectionTemplateBuilder.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,10 @@ public T read(Unpacker unpacker, T to, boolean required)
155155
}
156156

157157
public ReflectionTemplateBuilder(TemplateRegistry registry) {
158+
this(registry, null);
159+
}
160+
161+
public ReflectionTemplateBuilder(TemplateRegistry registry, ClassLoader cl) {
158162
super(registry);
159163
}
160164

src/main/java/org/msgpack/template/builder/TemplateBuilderChain.java

Lines changed: 39 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -27,28 +27,14 @@
2727
import org.msgpack.util.android.DalvikVmChecker;
2828

2929
public class TemplateBuilderChain {
30+
private static final String JAVASSIST_TEMPLATE_BUILDER_CLASS_NAME =
31+
"org.msgpack.template.builder.JavassistTemplateBuilder";
32+
private static final String REFLECTION_TEMPLATE_BUILDER_CLASS_NAME =
33+
"org.msgpack.template.builder.ReflectionTemplateBuilder";
3034

3135
private static boolean enableDynamicCodeGeneration() {
3236
return !DalvikVmChecker.isDalvikVm();
3337
}
34-
35-
private static final Constructor<?> javassistTemplateBuilderConstructor;
36-
static {
37-
Constructor<?> constructor = null;
38-
try {
39-
if (!DalvikVmChecker.isDalvikVm()) {
40-
Class<?> clazz = Class.forName("org.msgpack.template.builder.JavassistTemplateBuilder");
41-
constructor = clazz.getConstructor(TemplateRegistry.class, ClassLoader.class);
42-
}
43-
} catch (ClassNotFoundException e) {
44-
// DalvikVM
45-
} catch (NoSuchMethodException e) {
46-
// TODO: should output any message ?
47-
}
48-
finally {
49-
javassistTemplateBuilderConstructor = constructor;
50-
}
51-
}
5238

5339
protected List<TemplateBuilder> templateBuilders;
5440

@@ -71,40 +57,45 @@ protected void reset(final TemplateRegistry registry, final ClassLoader cl) {
7157
// FIXME
7258
// Javassist{,Beans}TemplateBuilder should be created with reflection for android.
7359

74-
TemplateBuilder javassistTemplateBuilder = null;
75-
if (javassistTemplateBuilderConstructor != null) {
76-
try {
77-
javassistTemplateBuilder = (TemplateBuilder) javassistTemplateBuilderConstructor.newInstance(registry, cl);
78-
} catch (InstantiationException e) {
79-
new IllegalStateException(e);
80-
} catch (IllegalAccessException e) {
81-
new IllegalStateException(e);
82-
} catch (InvocationTargetException e) {
83-
new IllegalStateException(e);
84-
}
60+
String forceBuilderClassName = null;
61+
if (enableDynamicCodeGeneration()) { // use dynamic code generation
62+
forceBuilderClassName = JAVASSIST_TEMPLATE_BUILDER_CLASS_NAME;
63+
} else {
64+
forceBuilderClassName = REFLECTION_TEMPLATE_BUILDER_CLASS_NAME;
8565
}
8666

87-
// builder
88-
TemplateBuilder builder;
67+
// create builder chain
68+
forceBuilder = createForceTemplateBuilder(forceBuilderClassName, registry, cl);
69+
TemplateBuilder builder = forceBuilder;
8970
templateBuilders.add(new ArrayTemplateBuilder(registry));
9071
templateBuilders.add(new OrdinalEnumTemplateBuilder(registry));
91-
if (enableDynamicCodeGeneration() && javassistTemplateBuilder != null) { // use dynamic code generation
92-
// forceBuilder
93-
forceBuilder = javassistTemplateBuilder;
94-
95-
builder = forceBuilder;
96-
templateBuilders.add(builder);
97-
// FIXME #MN next version
98-
// templateBuilders.add(new
99-
// JavassistBeansTemplateBuilder(registry));
100-
templateBuilders.add(new ReflectionBeansTemplateBuilder(registry));
101-
} else { // use reflection
102-
// forceBuilder
103-
forceBuilder = new ReflectionTemplateBuilder(registry);
104-
builder = forceBuilder;
105-
templateBuilders.add(builder);
106-
templateBuilders.add(new ReflectionBeansTemplateBuilder(registry));
107-
}
72+
templateBuilders.add(builder);
73+
templateBuilders.add(new ReflectionBeansTemplateBuilder(registry));
74+
}
75+
76+
private static TemplateBuilder createForceTemplateBuilder(String className,
77+
TemplateRegistry registry, ClassLoader cl) {
78+
try {
79+
Class<?> c = (Class<?>) Class.forName(className); // TODO
80+
Constructor<?> cons = c.getConstructor(TemplateRegistry.class,
81+
ClassLoader.class);
82+
return (TemplateBuilder) cons.newInstance(registry, cl);
83+
} catch (ClassNotFoundException e) {
84+
e.printStackTrace(); // TODO
85+
} catch (SecurityException e) {
86+
e.printStackTrace(); // TODO
87+
} catch (NoSuchMethodException e) {
88+
e.printStackTrace(); // TODO
89+
} catch (IllegalArgumentException e) {
90+
e.printStackTrace(); // TODO
91+
} catch (InstantiationException e) {
92+
e.printStackTrace(); // TODO
93+
} catch (IllegalAccessException e) {
94+
e.printStackTrace(); // TODO
95+
} catch (InvocationTargetException e) {
96+
e.printStackTrace(); // TODO
97+
}
98+
return null; // TODO
10899
}
109100

110101
public TemplateBuilder getForceBuilder() {

0 commit comments

Comments
 (0)