annotate src/main/java/org/msgpack/template/builder/BeansBuildContext.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.reflect.Constructor;
cb825acd883a first commit
sugi
parents:
diff changeset
21 import java.lang.reflect.InvocationTargetException;
cb825acd883a first commit
sugi
parents:
diff changeset
22
cb825acd883a first commit
sugi
parents:
diff changeset
23 import org.msgpack.*;
cb825acd883a first commit
sugi
parents:
diff changeset
24 import org.msgpack.template.*;
cb825acd883a first commit
sugi
parents:
diff changeset
25
cb825acd883a first commit
sugi
parents:
diff changeset
26 import javassist.CannotCompileException;
cb825acd883a first commit
sugi
parents:
diff changeset
27 import javassist.CtClass;
cb825acd883a first commit
sugi
parents:
diff changeset
28 import javassist.CtConstructor;
cb825acd883a first commit
sugi
parents:
diff changeset
29 import javassist.CtNewConstructor;
cb825acd883a first commit
sugi
parents:
diff changeset
30 import javassist.NotFoundException;
cb825acd883a first commit
sugi
parents:
diff changeset
31
cb825acd883a first commit
sugi
parents:
diff changeset
32 @SuppressWarnings("rawtypes")
cb825acd883a first commit
sugi
parents:
diff changeset
33 public class BeansBuildContext extends BuildContext<BeansFieldEntry> {
cb825acd883a first commit
sugi
parents:
diff changeset
34 protected BeansFieldEntry[] entries;
cb825acd883a first commit
sugi
parents:
diff changeset
35
cb825acd883a first commit
sugi
parents:
diff changeset
36 protected Class<?> origClass;
cb825acd883a first commit
sugi
parents:
diff changeset
37
cb825acd883a first commit
sugi
parents:
diff changeset
38 protected String origName;
cb825acd883a first commit
sugi
parents:
diff changeset
39
cb825acd883a first commit
sugi
parents:
diff changeset
40 protected Template<?>[] templates;
cb825acd883a first commit
sugi
parents:
diff changeset
41
cb825acd883a first commit
sugi
parents:
diff changeset
42 public BeansBuildContext(JavassistTemplateBuilder director) {
cb825acd883a first commit
sugi
parents:
diff changeset
43 super(director);
cb825acd883a first commit
sugi
parents:
diff changeset
44 }
cb825acd883a first commit
sugi
parents:
diff changeset
45
cb825acd883a first commit
sugi
parents:
diff changeset
46 public Template buildTemplate(Class<?> targetClass,
cb825acd883a first commit
sugi
parents:
diff changeset
47 BeansFieldEntry[] entries, Template[] templates) {
cb825acd883a first commit
sugi
parents:
diff changeset
48 this.entries = entries;
cb825acd883a first commit
sugi
parents:
diff changeset
49 this.templates = templates;
cb825acd883a first commit
sugi
parents:
diff changeset
50 this.origClass = targetClass;
cb825acd883a first commit
sugi
parents:
diff changeset
51 this.origName = origClass.getName();
cb825acd883a first commit
sugi
parents:
diff changeset
52 return build(origName);
cb825acd883a first commit
sugi
parents:
diff changeset
53 }
cb825acd883a first commit
sugi
parents:
diff changeset
54
cb825acd883a first commit
sugi
parents:
diff changeset
55 protected void setSuperClass() throws CannotCompileException, NotFoundException {
cb825acd883a first commit
sugi
parents:
diff changeset
56 tmplCtClass.setSuperclass(director.getCtClass(
cb825acd883a first commit
sugi
parents:
diff changeset
57 JavassistTemplateBuilder.JavassistTemplate.class.getName()));
cb825acd883a first commit
sugi
parents:
diff changeset
58 }
cb825acd883a first commit
sugi
parents:
diff changeset
59
cb825acd883a first commit
sugi
parents:
diff changeset
60 protected void buildConstructor() throws CannotCompileException,
cb825acd883a first commit
sugi
parents:
diff changeset
61 NotFoundException {
cb825acd883a first commit
sugi
parents:
diff changeset
62 // Constructor(Class targetClass, Template[] templates)
cb825acd883a first commit
sugi
parents:
diff changeset
63 CtConstructor newCtCons = CtNewConstructor.make(
cb825acd883a first commit
sugi
parents:
diff changeset
64 new CtClass[] {
cb825acd883a first commit
sugi
parents:
diff changeset
65 director.getCtClass(Class.class.getName()),
cb825acd883a first commit
sugi
parents:
diff changeset
66 director.getCtClass(Template.class.getName() + "[]")
cb825acd883a first commit
sugi
parents:
diff changeset
67 }, new CtClass[0], tmplCtClass);
cb825acd883a first commit
sugi
parents:
diff changeset
68 tmplCtClass.addConstructor(newCtCons);
cb825acd883a first commit
sugi
parents:
diff changeset
69 }
cb825acd883a first commit
sugi
parents:
diff changeset
70
cb825acd883a first commit
sugi
parents:
diff changeset
71 protected Template buildInstance(Class<?> c) throws NoSuchMethodException,
cb825acd883a first commit
sugi
parents:
diff changeset
72 InstantiationException, IllegalAccessException, InvocationTargetException {
cb825acd883a first commit
sugi
parents:
diff changeset
73 Constructor<?> cons = c.getConstructor(new Class[] { Class.class, Template[].class });
cb825acd883a first commit
sugi
parents:
diff changeset
74 Object tmpl = cons.newInstance(new Object[] { origClass, templates });
cb825acd883a first commit
sugi
parents:
diff changeset
75 return (Template) tmpl;
cb825acd883a first commit
sugi
parents:
diff changeset
76 }
cb825acd883a first commit
sugi
parents:
diff changeset
77
cb825acd883a first commit
sugi
parents:
diff changeset
78 protected void buildMethodInit() {
cb825acd883a first commit
sugi
parents:
diff changeset
79 }
cb825acd883a first commit
sugi
parents:
diff changeset
80
cb825acd883a first commit
sugi
parents:
diff changeset
81 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
82 protected String buildWriteMethodBody() {
cb825acd883a first commit
sugi
parents:
diff changeset
83 resetStringBuilder();
cb825acd883a first commit
sugi
parents:
diff changeset
84 buildString("{");
cb825acd883a first commit
sugi
parents:
diff changeset
85
cb825acd883a first commit
sugi
parents:
diff changeset
86 buildString("if($2 == null) {");
cb825acd883a first commit
sugi
parents:
diff changeset
87 buildString(" if($3) {");
cb825acd883a first commit
sugi
parents:
diff changeset
88 buildString(" throw new %s(\"Attempted to write null\");", MessageTypeException.class.getName());
cb825acd883a first commit
sugi
parents:
diff changeset
89 buildString(" }");
cb825acd883a first commit
sugi
parents:
diff changeset
90 buildString(" $1.writeNil();");
cb825acd883a first commit
sugi
parents:
diff changeset
91 buildString(" return;");
cb825acd883a first commit
sugi
parents:
diff changeset
92 buildString("}");
cb825acd883a first commit
sugi
parents:
diff changeset
93
cb825acd883a first commit
sugi
parents:
diff changeset
94 buildString("%s _$$_t = (%s)$2;", origName, origName);
cb825acd883a first commit
sugi
parents:
diff changeset
95 buildString("$1.writeArrayBegin(%d);", entries.length);
cb825acd883a first commit
sugi
parents:
diff changeset
96
cb825acd883a first commit
sugi
parents:
diff changeset
97 for (int i = 0; i < entries.length; i++) {
cb825acd883a first commit
sugi
parents:
diff changeset
98 BeansFieldEntry e = entries[i];
cb825acd883a first commit
sugi
parents:
diff changeset
99 if (!e.isAvailable()) {
cb825acd883a first commit
sugi
parents:
diff changeset
100 buildString("$1.writeNil();");
cb825acd883a first commit
sugi
parents:
diff changeset
101 continue;
cb825acd883a first commit
sugi
parents:
diff changeset
102 }
cb825acd883a first commit
sugi
parents:
diff changeset
103 Class<?> type = e.getType();
cb825acd883a first commit
sugi
parents:
diff changeset
104 if (type.isPrimitive()) {
cb825acd883a first commit
sugi
parents:
diff changeset
105 buildString("$1.%s(_$$_t.%s());", primitiveWriteName(type), e.getGetterName());
cb825acd883a first commit
sugi
parents:
diff changeset
106 } else {
cb825acd883a first commit
sugi
parents:
diff changeset
107 buildString("if(_$$_t.%s() == null) {", e.getGetterName());
cb825acd883a first commit
sugi
parents:
diff changeset
108 if (e.isNotNullable()) {
cb825acd883a first commit
sugi
parents:
diff changeset
109 buildString("throw new %s();", MessageTypeException.class.getName());
cb825acd883a first commit
sugi
parents:
diff changeset
110 } else {
cb825acd883a first commit
sugi
parents:
diff changeset
111 buildString("$1.writeNil();");
cb825acd883a first commit
sugi
parents:
diff changeset
112 }
cb825acd883a first commit
sugi
parents:
diff changeset
113 buildString("} else {");
cb825acd883a first commit
sugi
parents:
diff changeset
114 buildString(" this.templates[%d].write($1, _$$_t.%s());", i, e.getGetterName());
cb825acd883a first commit
sugi
parents:
diff changeset
115 buildString("}");
cb825acd883a first commit
sugi
parents:
diff changeset
116 }
cb825acd883a first commit
sugi
parents:
diff changeset
117 }
cb825acd883a first commit
sugi
parents:
diff changeset
118
cb825acd883a first commit
sugi
parents:
diff changeset
119 buildString("$1.writeArrayEnd();");
cb825acd883a first commit
sugi
parents:
diff changeset
120 buildString("}");
cb825acd883a first commit
sugi
parents:
diff changeset
121 return getBuiltString();
cb825acd883a first commit
sugi
parents:
diff changeset
122 }
cb825acd883a first commit
sugi
parents:
diff changeset
123
cb825acd883a first commit
sugi
parents:
diff changeset
124 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
125 protected String buildReadMethodBody() {
cb825acd883a first commit
sugi
parents:
diff changeset
126 resetStringBuilder();
cb825acd883a first commit
sugi
parents:
diff changeset
127 buildString("{ ");
cb825acd883a first commit
sugi
parents:
diff changeset
128
cb825acd883a first commit
sugi
parents:
diff changeset
129 buildString("if(!$3 && $1.trySkipNil()) {");
cb825acd883a first commit
sugi
parents:
diff changeset
130 buildString(" return null;");
cb825acd883a first commit
sugi
parents:
diff changeset
131 buildString("}");
cb825acd883a first commit
sugi
parents:
diff changeset
132
cb825acd883a first commit
sugi
parents:
diff changeset
133 buildString("%s _$$_t;", origName);
cb825acd883a first commit
sugi
parents:
diff changeset
134 buildString("if($2 == null) {");
cb825acd883a first commit
sugi
parents:
diff changeset
135 buildString(" _$$_t = new %s();", origName);
cb825acd883a first commit
sugi
parents:
diff changeset
136 buildString("} else {");
cb825acd883a first commit
sugi
parents:
diff changeset
137 buildString(" _$$_t = (%s)$2;", origName);
cb825acd883a first commit
sugi
parents:
diff changeset
138 buildString("}");
cb825acd883a first commit
sugi
parents:
diff changeset
139
cb825acd883a first commit
sugi
parents:
diff changeset
140 buildString("$1.readArrayBegin();");
cb825acd883a first commit
sugi
parents:
diff changeset
141
cb825acd883a first commit
sugi
parents:
diff changeset
142 for (int i = 0; i < entries.length; i++) {
cb825acd883a first commit
sugi
parents:
diff changeset
143 BeansFieldEntry e = entries[i];
cb825acd883a first commit
sugi
parents:
diff changeset
144
cb825acd883a first commit
sugi
parents:
diff changeset
145 if (!e.isAvailable()) {
cb825acd883a first commit
sugi
parents:
diff changeset
146 buildString("$1.skip();"); // TODO #MN
cb825acd883a first commit
sugi
parents:
diff changeset
147 continue;
cb825acd883a first commit
sugi
parents:
diff changeset
148 }
cb825acd883a first commit
sugi
parents:
diff changeset
149
cb825acd883a first commit
sugi
parents:
diff changeset
150 if (e.isOptional()) {
cb825acd883a first commit
sugi
parents:
diff changeset
151 buildString("if($1.trySkipNil()) {");
cb825acd883a first commit
sugi
parents:
diff changeset
152 buildString("_$$_t.%s(null);", e.getSetterName());
cb825acd883a first commit
sugi
parents:
diff changeset
153 buildString("} else {");
cb825acd883a first commit
sugi
parents:
diff changeset
154 }
cb825acd883a first commit
sugi
parents:
diff changeset
155
cb825acd883a first commit
sugi
parents:
diff changeset
156 Class<?> type = e.getType();
cb825acd883a first commit
sugi
parents:
diff changeset
157 if (type.isPrimitive()) {
cb825acd883a first commit
sugi
parents:
diff changeset
158 buildString("_$$_t.%s( $1.%s() );", e.getSetterName(), primitiveReadName(type));
cb825acd883a first commit
sugi
parents:
diff changeset
159 } else {
cb825acd883a first commit
sugi
parents:
diff changeset
160 buildString(
cb825acd883a first commit
sugi
parents:
diff changeset
161 "_$$_t.%s( (%s)this.templates[%d].read($1, _$$_t.%s()) );",
cb825acd883a first commit
sugi
parents:
diff changeset
162 e.getSetterName(), e.getJavaTypeName(), i, e.getGetterName());
cb825acd883a first commit
sugi
parents:
diff changeset
163 }
cb825acd883a first commit
sugi
parents:
diff changeset
164
cb825acd883a first commit
sugi
parents:
diff changeset
165 if (e.isOptional()) {
cb825acd883a first commit
sugi
parents:
diff changeset
166 buildString("}");
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 buildString("$1.readArrayEnd();");
cb825acd883a first commit
sugi
parents:
diff changeset
171 buildString("return _$$_t;");
cb825acd883a first commit
sugi
parents:
diff changeset
172
cb825acd883a first commit
sugi
parents:
diff changeset
173 buildString("}");
cb825acd883a first commit
sugi
parents:
diff changeset
174
cb825acd883a first commit
sugi
parents:
diff changeset
175 return getBuiltString();
cb825acd883a first commit
sugi
parents:
diff changeset
176 }
cb825acd883a first commit
sugi
parents:
diff changeset
177
cb825acd883a first commit
sugi
parents:
diff changeset
178 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
179 public void writeTemplate(Class<?> targetClass, BeansFieldEntry[] entries,
cb825acd883a first commit
sugi
parents:
diff changeset
180 Template[] templates, String directoryName) {
cb825acd883a first commit
sugi
parents:
diff changeset
181 throw new UnsupportedOperationException(targetClass.getName());
cb825acd883a first commit
sugi
parents:
diff changeset
182 }
cb825acd883a first commit
sugi
parents:
diff changeset
183
cb825acd883a first commit
sugi
parents:
diff changeset
184 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
185 public Template loadTemplate(Class<?> targetClass,
cb825acd883a first commit
sugi
parents:
diff changeset
186 BeansFieldEntry[] entries, Template[] templates) {
cb825acd883a first commit
sugi
parents:
diff changeset
187 return null;
cb825acd883a first commit
sugi
parents:
diff changeset
188 }
cb825acd883a first commit
sugi
parents:
diff changeset
189 }