java: adds FieldList class

This commit is contained in:
frsyuki 2010-11-09 22:11:47 +09:00
parent 8a7a391166
commit e9d44b90bc
9 changed files with 323 additions and 218 deletions

View file

@ -77,7 +77,7 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
}
public Class<?> generateTemplateClass(Class<?> origClass,
List<FieldOption> fieldOpts) {
FieldList fieldList) {
try {
LOG.debug("start generating a template class for "
+ origClass.getName());
@ -91,9 +91,8 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
addClassTypeConstructor(tmplCtClass);
Field[] fields = getDeclaredFields(origClass);
Template[] tmpls = null;
if (fieldOpts != null) {
fields = sortFields(fields, fieldOpts);
tmpls = createTemplates(fieldOpts);
if (fieldList != null) {
tmpls = createTemplates(fields, fieldList);
} else {
tmpls = createTemplates(fields);
}
@ -212,18 +211,19 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
}
}
Field[] sortFields(Field[] fields, List<FieldOption> fieldOpts) {
if (fields.length != fieldOpts.size()) {
Field[] sortFields(Field[] fields, FieldList fieldList) {
List<FieldList.Entry> list = fieldList.getList();
if (fields.length != list.size()) {
throwFieldSortingException(String.format(
"Mismatch: public field num: %d, option num: %d",
new Object[] { fields.length, fieldOpts.size() }));
new Object[] { fields.length, list.size() }));
}
Field[] sorted = new Field[fields.length];
for (int i = 0; i < sorted.length; ++i) {
FieldOption opt = fieldOpts.get(i);
FieldList.Entry e = list.get(i);
Field match = null;
for (Field f : fields) {
if (opt.name.equals(f.getName())) {
if (e.getName().equals(f.getName())) {
match = f;
break;
}
@ -233,16 +233,42 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
} else {
throwFieldSortingException(String.format(
"Mismatch: a %s field option is not declared",
new Object[] { opt.name }));
new Object[] { e.getName() }));
}
}
return sorted;
}
Template[] createTemplates(List<FieldOption> fieldOpts) {
Template[] tmpls = new Template[fieldOpts.size()];
for (int i = 0; i < tmpls.length; ++i) {
tmpls[i] = fieldOpts.get(i).tmpl;
Template[] createTemplates(Field[] fields, FieldList fieldList) {
List<FieldList.Entry> list = fieldList.getList();
//if (fields.length != list.size()) {
// throwFieldSortingException(String.format(
// "Mismatch: public field num: %d, option num: %d",
// new Object[] { fields.length, list.size() }));
//}
Template[] tmpls = new Template[list.size()];
for(int i = 0; i < list.size(); ++i) {
FieldList.Entry e = list.get(i);
Field match = null;
// FIXME if(!e.isAvailable())
for (Field f : fields) {
if (e.getName().equals(f.getName())) {
match = f;
break;
}
}
if (match == null) {
throwFieldSortingException(String.format(
"Mismatch: a %s field option is not declared",
new Object[] { e.getName() }));
}
Template tmpl = createTemplate(match);
if(e.isOptional()) {
tmpl = new OptionalTemplate(tmpl);
} else if(e.isNullable()) {
tmpl = new NullableTemplate(tmpl);
}
tmpls[i] = tmpl;
}
return tmpls;
}

View file

@ -27,7 +27,7 @@ public class DynamicConverter {
}
public static MessageConverter create(Class<?> c,
List<FieldOption> fieldOpts) {
return DynamicTemplate.create(c, fieldOpts);
FieldList fieldList) {
return DynamicTemplate.create(c, fieldList);
}
}

View file

@ -27,7 +27,7 @@ public class DynamicPacker {
return create(c, null);
}
public static MessagePacker create(Class<?> c, List<FieldOption> fieldOpts) {
return DynamicTemplate.create(c, fieldOpts);
public static MessagePacker create(Class<?> c, FieldList fieldList) {
return DynamicTemplate.create(c, fieldList);
}
}

View file

@ -29,10 +29,10 @@ public class DynamicTemplate {
return create(c, null);
}
public static Template create(Class<?> c, List<FieldOption> fieldOpts) {
public static Template create(Class<?> c, FieldList fieldList) {
try {
DynamicCodeGen gen = DynamicCodeGen.getInstance();
Class<?> tmplClass = gen.generateTemplateClass(c, fieldOpts);
Class<?> tmplClass = gen.generateTemplateClass(c, fieldList);
Constructor<?> cons = tmplClass
.getDeclaredConstructor(new Class[] { Class.class });
Object obj = cons.newInstance(new Object[] { c });

View file

@ -26,7 +26,7 @@ public class DynamicUnpacker {
return create(c, null);
}
public static MessageUnpacker create(Class<?> c, List<FieldOption> fieldOpts) {
return DynamicTemplate.create(c, fieldOpts);
public static MessageUnpacker create(Class<?> c, FieldList fieldList) {
return DynamicTemplate.create(c, fieldList);
}
}

View file

@ -0,0 +1,96 @@
//
// MessagePack for Java
//
// Copyright (C) 2009-2010 FURUHASHI Sadayuki
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
package org.msgpack.util.codegen;
import java.util.List;
import java.util.ArrayList;
public class FieldList {
public static class Entry {
public Entry() {
this.name = null;
this.option = null;
}
public Entry(String name, FieldOption option) {
this.name = name;
this.option = option;
}
private String name;
private FieldOption option;
public String getName() {
return name;
}
public FieldOption getOption() {
return option;
}
boolean isAvailable() {
return this.name != null;
}
boolean isRequired() {
return this.option == FieldOption.REQUIRED;
}
boolean isOptional() {
return this.option == FieldOption.OPTIONAL;
}
boolean isNullable() {
return this.option == FieldOption.NULLABLE;
}
}
private ArrayList<Entry> list;
public FieldList() {
list = new ArrayList<Entry>();
}
public void add(final String name) {
add(name, FieldOption.REQUIRED);
}
public void add(final String name, final FieldOption option) {
list.add(new Entry(name, option));
}
public void put(int index, final String name) {
put(index, name, FieldOption.REQUIRED);
}
public void put(int index, final String name, final FieldOption option) {
if(list.size() < index) {
do {
list.add(new Entry());
} while(list.size() < index);
list.add(new Entry(name, option));
} else {
list.set(index, new Entry(name, option));
}
}
List<Entry> getList() {
return list;
}
}

View file

@ -17,26 +17,9 @@
//
package org.msgpack.util.codegen;
import org.msgpack.Template;
public class FieldOption {
private static final String NULL_ERR_MSG = "param is FieldOption is null.";
String name;
Template tmpl;
public FieldOption(final String name, final Template tmpl) {
if (name == null) {
throw new NullPointerException(String.format("%s %s", new Object[] {
"1st", NULL_ERR_MSG }));
}
if (tmpl == null) {
throw new NullPointerException(String.format("%s %s", new Object[] {
"2nd", NULL_ERR_MSG }));
}
this.name = name;
this.tmpl = tmpl;
}
public enum FieldOption {
REQUIRED,
OPTIONAL,
NULLABLE;
}