mirror of
https://github.com/msgpack/msgpack-python.git
synced 2026-02-08 18:59:59 +00:00
java: adds FieldList class
This commit is contained in:
parent
8a7a391166
commit
e9d44b90bc
9 changed files with 323 additions and 218 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 });
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
96
java/src/main/java/org/msgpack/util/codegen/FieldList.java
Normal file
96
java/src/main/java/org/msgpack/util/codegen/FieldList.java
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue