All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jrodeo.bson.generator.MarshallerGenerator Maven / Gradle / Ivy

Go to download

A tool to create Java marshallers to and from bson. Currently used in a data access layer serialize Json to Bson for MongoDB storage.

There is a newer version: 0.9.15
Show newest version
package com.jrodeo.bson.generator;

import com.fasterxml.jackson.annotation.*;
import com.jrodeo.bson.annotation.BsonIgnore;
import org.apache.commons.lang3.ClassUtils;
import org.bson.types.ObjectId;

import java.io.File;
import java.io.FileWriter;
import java.lang.annotation.Annotation;
import java.lang.reflect.*;
import java.math.BigDecimal;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.*;

/**
 * The MarshallerGenerator can be used by calling the main()
 * method with two system properties set. -Doutput.dir=[path/to/output/directory]
 * -Dclass.names=[comma separated list of top level classes to build marshallers for]
 * and an optional 3rd jar file list containing those classes-Djar.files=[comma separated
 * list of jar files to add to classpath].  It is easy to use during your maven build
 * with something like:
 * 
 *      {@code
 *        
 *           org.codehaus.mojo
 *           exec-maven-plugin
 *           1.4.0
 *           
 *              true
 *              true
 *
 *              
 *                 com.jrodeo
 *                 bson-marshaller
 *              
 *              com.jrodeo.bson.generator.MarshallerGenerator
 *              
 *                 
 *                    output.dir
 *                    ${project.build.directory}/generated-sources/annotations
 *                 
 *                 
 *                    class.names
 *                    com.example.MyBean,com.example.Bean2
 *                 
 *              
 *          
 *          
 *             
 *                create-marshallers
 *                generate-sources
 *                
 *                   java
 *                
 *            
 *         
 *         
 *            
 *               com.jrodeo
 *               bson-marshaller
 *               ${jrodeo.marshaller.version}
 *            
 *         
 *     
 *     }
 *     
*

* If you have downloaded the project from github * jrodeo-bson * you may build this project all at once with maven and a running mongod on default port, use *

 *            {@code
 *            mvn clean install test-compile failsafe:integration-test}
 *     
*

* See the tests and test resources for how to configure runtimes with Spring. * First mvn clean install will run the MarshallerGeneratorTest that builds some * Marshallers * . Next, the IT can be run with mvn test-compile failsafe:integration-test. * The Spring config mongo-example-context.xml sets up the Marshallers, wires * up a MongoClient and then sets up the MongoDB codecs. *

* If you do not have the project, you may find the test sources with the following dependency *

 *     {@code
 *     
 *         com.jrodeo
 *         bson-marshaller
 *         0.9
 *         test-sources
 *     
 *     }
 * 
*/ public class MarshallerGenerator { static String outputPath = "path.to.output"; public static void setOutputPath(String outputPath) { MarshallerGenerator.outputPath = outputPath; } String beanPackage; String factoryName; public String getBeanPackage() { return beanPackage; } public void setBeanPackage(String beanPackage) { this.beanPackage = beanPackage; } public String getFactoryName() { return factoryName; } public void setFactoryName(String factoryName) { this.factoryName = factoryName; } public void buildCodec(Class clazz) throws Exception { String packageToDirs = beanPackage.replace(".", File.separator) + File.separator; if (!outputPath.endsWith(File.separator)) { outputPath += File.separator; } File outputDir = new File(outputPath + packageToDirs); outputDir.mkdirs(); String s; s = "package " + beanPackage + ";\n"; s += "\n"; s += "import com.jrodeo.bson.marshallers.*;\n"; s += "import java.util.*;\n"; s += "import org.bson.*;\n"; s += "import org.bson.codecs.*;\n"; s += "\n"; s += "public class " + clazz.getSimpleName() + "Codec implements Codec<" + clazz.getSimpleName() + "> {\n"; s += "\n"; s += "Marshaller<" + clazz.getSimpleName() + "> marshaller = MarshallerRegistry.getInstance().lookupMarshaller(" + clazz.getName() + ".class);\n"; s += "\n"; s += "@Override\n"; s += "public " + clazz.getSimpleName() + " decode(BsonReader reader, DecoderContext decoderContext) {\n"; s += " try {\n"; s += " return marshaller.read(reader);\n"; s += " } catch(Exception e) {\n"; s += " throw new RuntimeException(e);\n"; s += " }\n"; s += "}\n"; s += "\n"; s += "@Override\n"; s += "public void encode(BsonWriter writer, " + clazz.getSimpleName() + " value, EncoderContext encoderContext) {\n"; s += " marshaller.write(writer, value);\n"; s += "}\n"; s += "\n"; s += "@Override\n"; s += "public Class<" + clazz.getSimpleName() + "> getEncoderClass() {\n"; s += " return " + clazz.getSimpleName() + ".class;\n"; s += "}\n"; s += "\n"; s += "}\n"; // System.out.println(s); String fullPath = outputPath + packageToDirs + clazz.getSimpleName() + "Codec.java"; FileWriter fileWriter = new FileWriter(fullPath); fileWriter.write(s); fileWriter.close(); } public void buildMarshallerFactory(List classes) throws Exception { String packageToDirs = beanPackage.replace(".", File.separator) + File.separator; if (!outputPath.endsWith(File.separator)) { outputPath += File.separator; } File outputDir = new File(outputPath + packageToDirs); outputDir.mkdirs(); String s; s = "package " + beanPackage + ";\n"; s += "\n"; s += "import com.jrodeo.bson.marshallers.*;\n"; s += "import java.util.*;\n"; s += "import org.bson.*;\n"; s += "import org.bson.codecs.*;\n"; s += "\n"; s += "public class " + factoryName + "MarshallerFactory extends AbstractMarshallerFactory {\n"; s += "\n"; s += "public " + factoryName + "MarshallerFactory() {\n"; s += " super();\n"; for (Class clazz : classes) { String classname = clazz.getName(); String marshaller = classname + "Marshaller"; s += " registerMarshaller(new " + marshaller + "());\n"; } s += "}\n"; s += "\n"; s += "}\n"; // System.out.println(s); String fullPath = outputPath + packageToDirs + factoryName + "MarshallerFactory.java"; FileWriter fileWriter = new FileWriter(fullPath); fileWriter.write(s); fileWriter.close(); } public boolean buildMarshaller(Class clazz, List fieldInfos) throws Exception { /* if(Modifier.isAbstract(clazz.getModifiers())) { return false; } */ if (isAList(clazz) || clazz.isArray()) { return false; } if (isAMap(clazz)) { return false; } if (ClassUtils.isPrimitiveOrWrapper(clazz)) { return false; } if (clazz.equals(String.class)) { return false; } if (clazz.equals(Date.class)) { return false; } if (clazz.equals(BigDecimal.class)) { return false; } String packageToDirs = beanPackage.replace(".", File.separator) + File.separator; if (!outputPath.endsWith(File.separator)) { outputPath += File.separator; } File outputDir = new File(outputPath + packageToDirs); outputDir.mkdirs(); String s; variableNameCnt = 0; s = "package " + beanPackage + ";\n"; s += "\n"; s += "import com.jrodeo.bson.marshallers.*;\n"; s += "import java.util.*;\n"; s += "import org.bson.*;\n"; s += "\n"; s += "public class " + clazz.getSimpleName() + "Marshaller implements com.jrodeo.bson.marshallers.Marshaller<" + clazz.getName() + "> {\n"; s += "\n"; s += "MarshallerRegistry registry;"; s += "\n"; s += "public void setRegistry(MarshallerRegistry registry) {\n"; s += " this.registry = registry;\n"; s += "}\n"; s += "\n"; s += "public Class getForClass() {\n"; s += " return " + clazz.getName() + ".class;\n"; s += "}\n"; SubTypeInfo subTypeInfo = mapOfSubTypeInfo.get(clazz); s += "public String subTypeName() {\n"; if (subTypeInfo != null) { s += "return \"" + subTypeInfo.name + "\";\n"; } else { s += "return null;\n"; } s += "}\n"; s += "\n"; s += "public Class getSuperType() {\n"; if (subTypeInfo != null) { s += "return " + subTypeInfo.parentClass.getName() + ".class;\n"; } else { s += "return null;\n"; } s += "}\n"; s += "\n"; s += "public void write(BsonWriter writer, " + clazz.getName() + " obj) {\n"; if (clazz.isEnum()) { s += " writer.writeString(obj.name());\n"; } else { s += "writer.writeStartDocument();\n"; if (subTypeInfo != null) { s += "writer.writeString(\"" + subTypeInfo.fieldName + "\", \"" + subTypeInfo.name + "\");\n"; } else if (hasSubTypesMap.get(clazz) != null && !Modifier.isAbstract(clazz.getModifiers())) { String fieldName = hasSubTypesMap.get(clazz); String classTypeName = getClassTypeName(clazz); s += "writer.writeString(\"" + fieldName + "\", \"" + classTypeName + "\");\n"; } FieldInfo idFieldInfo = getIdFieldInfo(fieldInfos); if (idFieldInfo != null) { s += idFieldInfo.getMarshallCode("obj"); } for (FieldInfo fieldInfo : fieldInfos) { if (fieldInfo == idFieldInfo) { continue; } s += fieldInfo.getMarshallCode("obj"); } s += "writer.writeEndDocument();\n"; } s += "}\n"; s += "\n"; s += "public " + clazz.getName() + " read(BsonReader reader) {\n"; FieldInfo skipIdFieldInfo = null; if (clazz.isEnum()) { s += " return " + clazz.getName() + ".valueOf(reader.readString());\n"; } else { if (subTypeInfo == null) { s += "reader.readStartDocument();\n"; } if (hasSubTypesMap.get(clazz) != null) { skipIdFieldInfo = getIdFieldInfo(fieldInfos); String _idFieldValue = ""; if(skipIdFieldInfo!=null) { s += "String _idFieldName = reader.readName();\n"; CodeBlock codeBlock = skipIdFieldInfo.getUnmarshallerCode(null); s += codeBlock.s; _idFieldValue = codeBlock.v; } s += "String _typeFieldName = reader.readName();\n"; s += "String _typeFieldTypeName = reader.readString();\n"; s += clazz.getName() + " obj;\n"; s += "boolean doBody=true;\n"; boolean isAbstract = Modifier.isAbstract(clazz.getModifiers()); String hashForParent = getClassTypeName(clazz); if (!isAbstract) { s += "if(_typeFieldTypeName.equals(\"" + hashForParent + "\")) {\n"; s += " obj = new " + clazz.getName() + "();\n"; s += "} else {\n"; } s += " obj = (" + clazz.getName() + ") registry.lookupMarshaller(" + clazz.getName() + ".class, _typeFieldTypeName).read(reader);\n"; s += " doBody = false;\n"; if (!isAbstract) { s += "}\n"; } if(skipIdFieldInfo!=null) { s += "obj." + skipIdFieldInfo.setter.getName() + "(" + _idFieldValue + ");\n"; } } else { s += clazz.getName() + " obj=new " + clazz.getName() + "();\n"; } if (subTypeInfo != null) { skipIdFieldInfo = getIdFieldInfo(fieldInfos); } if (hasSubTypesMap.get(clazz) != null) { s += "if(doBody) {\n"; } s += "while(reader.readBsonType() != BsonType.END_OF_DOCUMENT) {\n"; s += " String fieldName = reader.readName();\n"; s += " Setter setter = setterMap.get(fieldName);\n"; s += " if(setter!=null) {\n"; s += " setter.evaluate(reader, obj, registry);\n"; s += " } else {\n"; s += " reader.skipValue();\n"; s += " }\n"; s += "}\n"; if (hasSubTypesMap.get(clazz) != null) { s += "}\n"; } if (subTypeInfo == null) { s += "reader.readEndDocument();\n"; } s += "return obj;\n"; s += "}\n"; s += "interface Setter {\n"; s += " public void evaluate(BsonReader reader, " + clazz.getName() + " obj, MarshallerRegistry registry)\n" + " ;\n"; s += "}\n"; s += "static final HashMap setterMap = new HashMap<>(199);\n"; s += "static {\n"; s += "Setter setter;\n"; for (FieldInfo fieldInfo : fieldInfos) { if (fieldInfo == skipIdFieldInfo) { continue; } CodeBlock codeBlock = fieldInfo.getUnmarshallerCode("obj"); s += " setter = new Setter() {\n"; s += " public void evaluate(BsonReader reader, " + clazz.getName() + " obj, MarshallerRegistry registry)\n" + " {\n"; s += " " + codeBlock.s; s += " }\n"; s += " };\n"; s += " setterMap.put(\""+fieldInfo.jsonFieldName + "\",setter);\n"; } } s += "}\n"; s += "}\n"; // close class // System.out.println(s); String fullPath = outputPath + packageToDirs + clazz.getSimpleName() + "Marshaller.java"; FileWriter fileWriter = new FileWriter(fullPath); fileWriter.write(s); fileWriter.close(); return true; } Map> mapOfFieldInfos = new HashMap<>(); public Map> getMapOfFieldInfos() { return mapOfFieldInfos; } boolean haveClass(Class clazz) { if (mapOfFieldInfos.containsKey(clazz)) { return true; } if (ClassUtils.isPrimitiveOrWrapper(clazz)) { return true; } if (clazz.isArray()) { return true; } if (clazz.equals(String.class)) { return true; } if (clazz.equals(UUID.class)) { return true; } if (clazz.equals(ObjectId.class)) { return true; } if (clazz.equals(Date.class)) { return true; } return false; } Map mapOfSubTypeInfo = new HashMap<>(); public Map getMapOfSubTypeInfo() { return mapOfSubTypeInfo; } class SubTypeInfo { Class clazz; String fieldName; String name; Class parentClass; } FieldInfo getIdFieldInfo(List fieldInfos) { for (FieldInfo fieldInfo : fieldInfos) { if (fieldInfo.fieldName.equals("_id") || fieldInfo.field.getName().equals("_id") || fieldInfo.jsonFieldName.equals("_id")) { return fieldInfo; } } return null; } String getClassTypeName(Class clazz) { String typeName; Annotation a = clazz.getAnnotation(JsonTypeName.class); if(a!=null) { typeName = ((JsonTypeName) a).value(); } else { typeName = clazz.getSimpleName(); } return typeName; } Map hasSubTypesMap = new HashMap<>(); void checkSubTypeInfoForClass(Class clazz) throws Exception { String fieldName = null; boolean hasSubTypes = false; Annotation[] ca = clazz.getDeclaredAnnotations(); for (Annotation a : ca) { if (getTypeName(a.annotationType()) .equals("com.fasterxml.jackson.annotation.JsonTypeInfo")) { fieldName = ((JsonTypeInfo) a).property(); } } for (Annotation a : ca) { if (getTypeName(a.annotationType()) .equals("com.fasterxml.jackson.annotation.JsonSubTypes")) { JsonSubTypes jst = (JsonSubTypes) a; hasSubTypes = true; for (JsonSubTypes.Type subType : jst.value()) { SubTypeInfo subTypeInfo = new SubTypeInfo(); subTypeInfo.clazz = subType.value(); subTypeInfo.parentClass = clazz; subTypeInfo.fieldName = fieldName; subTypeInfo.name = subType.name(); mapOfSubTypeInfo.put(subTypeInfo.clazz, subTypeInfo); } } } hasSubTypesMap.put(clazz, fieldName); } public Map> getFieldInfosForClasses(Class clazz, List fieldInfos) throws Exception { if (haveClass(clazz)) { return mapOfFieldInfos; } checkSubTypeInfoForClass(clazz); List classes = new ArrayList<>(); classes.add(clazz); Class p = clazz.getSuperclass(); while (p != null) { classes.add(p); p = p.getSuperclass(); } List methodInfos = new ArrayList<>(); for (Class c : classes) { Field[] cf = c.getDeclaredFields(); Method[] ma = c.getDeclaredMethods(); for (Field f : cf) { Annotation[] fa = f.getDeclaredAnnotations(); boolean bsonIgnore = false; for(Annotation a: fa) { if(a.annotationType().equals("com.jrodeo.bson.annotation.BsonIgnore")) { bsonIgnore = ((BsonIgnore) a).value(); break; } } if(bsonIgnore) { continue; } for (Annotation a : fa) { if (getTypeName(a.annotationType()) .equals("com.fasterxml.jackson.annotation.JsonProperty")) { JsonProperty jsonProperty = (JsonProperty) a; FieldInfo fieldInfo = getFieldInfo(f, fieldInfos); if (fieldInfo == null) { fieldInfo = new FieldInfo(); fieldInfo.field = f; fieldInfos.add(fieldInfo); } fieldInfo.type = f.getType(); fieldInfo.fieldName = f.getName(); fieldInfo.jsonFieldName = jsonProperty.value(); fieldInfo.parentClassName = clazz.getSimpleName(); fieldInfo.jsonProperty = jsonProperty; } else if (getTypeName(a.annotationType()) .equals("com.fasterxml.jackson.annotation.JsonInclude")) { JsonInclude jsonInclude = (JsonInclude) a; FieldInfo fieldInfo = getFieldInfo(f, fieldInfos); if (fieldInfo == null) { fieldInfo = new FieldInfo(); fieldInfo.field = f; fieldInfos.add(fieldInfo); } fieldInfo.jsonInclude = jsonInclude; } } } for (Method m : ma) { MethodInfo methodInfo = new MethodInfo(); methodInfo.method = m; Annotation[] as = m.getDeclaredAnnotations(); for (Annotation a : as) { if (getTypeName(a.annotationType()) .equals("com.fasterxml.jackson.annotation.JsonProperty")) { methodInfo.jsonProperty = (JsonProperty) a; } } methodInfos.add(methodInfo); } } for (FieldInfo fieldInfo : fieldInfos) { findGetterSetter(fieldInfo, methodInfos); findCollectionTypes(fieldInfo); } mapOfFieldInfos.put(clazz, fieldInfos); for (FieldInfo fieldInfo : fieldInfos) { getFieldInfosForClasses(fieldInfo.type, new ArrayList()); } return mapOfFieldInfos; } FieldInfo getFieldInfo(Field f, List fieldInfos) { for (FieldInfo fieldInfo : fieldInfos) { if (fieldInfo.field.equals(f)) { return fieldInfo; } } return null; } void findCollectionTypes(FieldInfo fieldInfo) throws Exception { Type signatureType = fieldInfo.field.getGenericType(); if (fieldInfo.type.isArray()) { if ("[I)".equals(signatureType)) { // int[]; } else if ("[Z)".equals(signatureType)) { // boolean[] } else if ("[B)".equals(signatureType)) { // byte[] } else if ("[C)".equals(signatureType)) { // char[] } else if ("[S)".equals(signatureType)) { // short[] } else if ("[J)".equals(signatureType)) { // long[] } else if ("[F)".equals(signatureType)) { // float[] } else if ("[D)".equals(signatureType)) { // double[] } } if (signatureType instanceof ParameterizedType) { ParameterizedType parameterizedType = (ParameterizedType) signatureType; fieldInfo.parametrizedTypeArguments = parameterizedType .getActualTypeArguments(); for (Type t : fieldInfo.parametrizedTypeArguments) { if (t instanceof Class) { getFieldInfosForClasses((Class) t, new ArrayList()); } } // same as fieldInfo.type Type rawType = // parameterizedType.getRawType(); } lookupInstanceTypes(fieldInfo); } void lookupInstanceTypes(FieldInfo fieldInfo) { Class type = fieldInfo.type; String instanceCreation = instanceTypeMap.get(type.getName()); fieldInfo.instanceCreator = instanceCreation; } Map instanceTypeMap = new HashMap<>(); /* * Map classToWriterMap = new HashMap<>(); * * static { instanceTypeMap.put("java.util.List", "new ArrayList<>()"); * instanceTypeMap.put("java.util.Map", "new HashMap<>()"); * classToWriterMap.put(String.class, "writer.writeString(#value);"); * * } */ void findGetterSetter(FieldInfo fieldInfo, List methodInfos) { for (MethodInfo methodInfo : methodInfos) { if (methodInfo.jsonProperty != null && fieldInfo.jsonProperty.value().equalsIgnoreCase( methodInfo.jsonProperty.value())) { // first look for get/set by jsonProperty or override if (methodInfo.method.getName().startsWith("get")) { fieldInfo.getter = methodInfo.method; } else if (methodInfo.method.getName().startsWith("set")) { fieldInfo.setter = methodInfo.method; } } else { // check the other methods without annotations if (fieldInfo.getter == null) { if (methodInfo.method.getName().startsWith("get")) { String valueName = methodInfo.method.getName() .substring(3); if (fieldNameEquals(fieldInfo.fieldName, valueName)) { fieldInfo.getter = methodInfo.method; } } } if (fieldInfo.setter == null) { if (methodInfo.method.getName().startsWith("set")) { String valueName = methodInfo.method.getName() .substring(3); if (fieldNameEquals(fieldInfo.fieldName, valueName)) { fieldInfo.setter = methodInfo.method; } } } } } if (fieldInfo.getter == null) { System.out.println("Field: " + fieldInfo.fieldName + " is missing a getter."); } if (fieldInfo.setter == null) { System.out.print("Field:" + fieldInfo.fieldName + " is missing a setter."); } } int variableNameCnt = 0; public class FieldInfo { Class type; Field field; Type[] parametrizedTypeArguments; JsonProperty jsonProperty; JsonInclude jsonInclude; JsonSubTypes jsonSubTypes; String fieldName; String jsonFieldName; String parentClassName; String annotationName; String required; String defaultValue; Method setter; Method getter; String instanceCreator; public String toString() { return "field:" + fieldName + "\n" + "parentClass: " + parentClassName + "\n" + "type: " + type + "\n" + "instanceCreator: " + instanceCreator + "\n" + "getter: " + getter + " setter: " + setter + "\n"; } String createVariableName(String v) { return v + variableNameCnt++; } String getMarshallCode(String context) throws Exception { String s = ""; boolean canSkipIfNull = type.isPrimitive() || (jsonInclude != null && jsonInclude.value().equals( JsonInclude.Include.NON_NULL)); if (type.isArray()) { Type signatureType = field.getGenericType(); if ("int[]".equals(getTypeName(signatureType))) { // int[]; String v = createVariableName("v"); s += "int[] " + v + " = " + context + "." + getter.getName() + "();\n"; if (!canSkipIfNull) { s += "if(" + v + "==null) {\n"; s += " throw new RuntimeException(\"Field " + fieldName + " of class " + parentClassName + " cannot be null.\");\n"; s += "} else if(" + v + ".length!=0) {\n"; } else { s += "if(" + v + "!=null) {\n"; } s += " writer.writeStartArray(\"" + jsonFieldName + "\");\n"; s += " for(int i=0;i<" + v + ".length;i++) {\n"; s += " writer.writeInt32(" + v + "[i]);\n"; s += " }\n"; s += " writer.writeEndArray();\n"; s += "}\n"; } else if ("boolean[]".equals(getTypeName(signatureType))) { // boolean[] String v = createVariableName("v"); s += "boolean[] " + v + " = " + context + "." + getter.getName() + "();\n"; if (!canSkipIfNull) { s += "if(" + v + "==null) {\n"; s += " throw new RuntimeException(\"Field " + fieldName + " of class " + parentClassName + " cannot be null.\");\n"; s += "} else if(" + v + ".length!=0) {\n"; } else { s += "if(" + v + "!=null) {\n"; } s += " writer.writeStartArray(\"" + jsonFieldName + "\");\n"; s += " for(int i=0;i<" + v + ".length;i++) {\n"; s += " writer.writeBoolean(" + v + "[i]);\n"; s += " }\n"; s += " writer.writeEndArray();\n"; s += "}\n"; } else if ("java.lang.String[]".equals(getTypeName(signatureType))) { // String[] String v = createVariableName("v"); s += "String[] " + v + " = " + context + "." + getter.getName() + "();\n"; if (!canSkipIfNull) { s += "if(" + v + "==null) {\n"; s += " throw new RuntimeException(\"Field " + fieldName + " of class " + parentClassName + " cannot be null.\");\n"; s += "} else {\n"; } else { s += "if(" + v + "!=null) {\n"; } s += " writer.writeStartArray(\"" + jsonFieldName + "\");\n"; s += " for(int i=0;i<" + v + ".length;i++) {\n"; s += " writer.writeString(" + v + "[i]);\n"; s += " }\n"; s += " writer.writeEndArray();\n"; s += "}\n"; } else if ("byte[]".equals(getTypeName(signatureType))) { // byte[] String v = createVariableName("v"); s += "byte[] " + v + " = " + context + "." + getter.getName() + "();\n"; if (!canSkipIfNull) { s += "if(" + v + "==null) {\n"; s += " throw new RuntimeException(\"Field " + fieldName + " of class " + parentClassName + " cannot be null.\");\n"; s += "} else {\n"; } else { s += "if(" + v + "!=null) {\n"; } s += " " + writeBinaryData("BsonBinarySubType.BINARY", jsonFieldName, v); s += " }\n"; } else if ("char[]".equals(getTypeName(signatureType))) { // char[] String v = createVariableName("v"); s += "char[] " + v + " = " + context + "." + getter.getName() + "();\n"; if (!canSkipIfNull) { s += "if(" + v + "==null) {\n"; s += " throw new RuntimeException(\"Field " + fieldName + " of class " + parentClassName + " cannot be null.\");\n"; s += "} else {\n"; } else { s += "if(" + v + "!=null) {\n"; } String sv = createVariableName("s"); s += " String " + sv + " = String.valueOf(" + v + ");\n"; s += " writer.writeString(" + sv + ");\n"; s += "}\n"; } else if ("short[]".equals(getTypeName(signatureType))) { // short[] String v = createVariableName("v"); s += "short[] " + v + " = " + context + "." + getter.getName() + "();\n"; if (!canSkipIfNull) { s += "if(" + v + "==null) {\n"; s += " throw new RuntimeException(\"Field " + fieldName + " of class " + parentClassName + " cannot be null.\");\n"; s += "} else {\n"; } else { s += "if(" + v + "!=null) {\n"; } s += " writer.writeStartArray(\"" + jsonFieldName + "\");\n"; s += " for(int i=0;i<" + v + ".length;i++) {\n"; s += " writer.writeInt32(" + v + "[i]);\n"; s += " }\n"; s += " writer.writeEndArray();\n"; s += "}\n"; } else if ("long[]".equals(getTypeName(signatureType))) { // long[] String v = createVariableName("v"); s += "long[] " + v + " = " + context + "." + getter.getName() + "();\n"; if (!canSkipIfNull) { s += "if(" + v + "==null) {\n"; s += " throw new RuntimeException(\"Field " + fieldName + " of class " + parentClassName + " cannot be null.\");\n"; s += "} else {\n"; } else { s += "if(" + v + "!=null) {\n"; } s += " writer.writeStartArray(\"" + jsonFieldName + "\");\n"; s += " for(int i=0;i<" + v + ".length;i++) {\n"; s += " writer.writeInt64(" + v + "[i]);\n"; s += " }\n"; s += " writer.writeEndArray();\n"; s += "}\n"; } else if ("float[]".equals(getTypeName(signatureType))) { // float[] String v = createVariableName("v"); s += "float[] " + v + " = " + context + "." + getter.getName() + "();\n"; if (!canSkipIfNull) { s += "if(" + v + "==null) {\n"; s += " throw new RuntimeException(\"Field " + fieldName + " of class " + parentClassName + " cannot be null.\");\n"; s += "} else {\n"; } else { s += "if(" + v + "!=null) {\n"; } s += " writer.writeStartArray(\"" + jsonFieldName + "\");\n"; s += " for(int i=0;i<" + v + ".length;i++) {\n"; s += " writer.writeDouble(" + v + "[i]);\n"; s += " }\n"; s += " writer.writeEndArray();\n"; s += "}\n"; } else if ("double[]".equals(getTypeName(signatureType))) { // double[] String v = createVariableName("v"); s += "double[] " + v + " = " + context + "." + getter.getName() + "();\n"; if (!canSkipIfNull) { s += "if(" + v + "==null) {\n"; s += " throw new RuntimeException(\"Field " + fieldName + " of class " + parentClassName + " cannot be null.\");\n"; s += "} else {\n"; } else { s += "if(" + v + "!=null) {\n"; } s += " writer.writeStartArray(\"" + jsonFieldName + "\");\n"; s += " for(int i=0;i<" + v + ".length;i++) {\n"; s += " writer.writeDouble(" + v + "[i]);\n"; s += " }\n"; s += " writer.writeEndArray();\n"; s += "}\n"; } else { // complex array String v = createVariableName("v"); s += getTypeName(getter.getReturnType()) + " " + v + " = " + context + "." + getter.getName() + "();\n"; if (!canSkipIfNull) { s += "if(" + v + "==null) {\n"; s += " throw new RuntimeException(\"Field " + fieldName + " of class " + parentClassName + " cannot be null.\");\n"; s += "} else {\n"; } else { s += "if(" + v + "!=null) {\n"; } s += " writer.writeStartArray(\"" + jsonFieldName + "\");\n"; String element = getElement(getTypeName(getter.getReturnType())); Boolean hasSubTypes = hasSubTypesMap.get(Class.forName(element)) != null; if (hasSubTypes == null) { hasSubTypes = false; } if (!hasSubTypes) { s += " Marshaller marshaller = registry.lookupMarshaller(" + v + "[0]);\n"; } s += " for(int i=0;i<" + v + ".length;i++) {\n"; if (hasSubTypes) { s += " Marshaller marshaller = registry.lookupMarshaller(" + v + "[i]);\n"; } s += " marshaller.write(writer, " + v + "[i]);\n"; s += " }\n"; s += " writer.writeEndArray();\n"; s += "}\n"; } } else if (isPrimitive(type)) { String v = createVariableName("v"); s += field.getType().getName() + " " + v + "=" + context + "." + getter.getName() + "();\n"; boolean close = false; if (!canSkipIfNull) { close = true; s += "if(" + v + "==null) {\n"; s += " throw new RuntimeException(\"Field " + fieldName + " of class " + parentClassName + " cannot be null.\");\n"; s += "} else {\n"; } else { if (!type.isPrimitive()) { close = true; s += "if(" + v + "!=null) {\n"; } } s += writeName(jsonFieldName); s += getPrimitiveWriter(type, v); if (close) { s += "}\n"; } } else if (parametrizedTypeArguments != null) { // List, Map, or something if (isAMap(type)) { String v = createVariableName("v"); String v2 = createVariableName("x"); String keyWriterString = getPrimitiveWriter((Class) parametrizedTypeArguments[0], v2); if (keyWriterString == null) { keyWriterString = "Marshaller kmarshaller = registry.lookupMarshaller(" + v2 + ");\n"; keyWriterString += "kmarshaller.write(writer, " + v2 + ");\n"; } String u2 = createVariableName("z"); String valueWriterString = getPrimitiveWriter((Class) parametrizedTypeArguments[1], u2); if (valueWriterString == null) { valueWriterString = "Marshaller vmarshaller = registry.lookupMarshaller(" + u2 + ");\n"; valueWriterString += " vmarshaller.write(writer, " + u2 + ");\n"; } s += "Map<" + getTypeName(parametrizedTypeArguments[0]) + "," + getTypeName(parametrizedTypeArguments[1]) + "> " + v + "=" + context + "." + getter.getName() + "();\n"; if (!canSkipIfNull) { s += "if(" + v + "==null) {\n"; s += "throw new RuntimeException(\"Field " + fieldName + " of calss " + parentClassName + " cannot be null.\");\n"; s += "} else {\n"; } else { s += "if(" + v + "!=null) {\n"; } s += " writer.writeStartArray(\"" + jsonFieldName + "\");\n"; s += " for(" + getTypeName(parametrizedTypeArguments[0]) + " " + v2 + ":" + v + ".keySet()) {\n"; s += " " + getTypeName(parametrizedTypeArguments[1]) + " " + u2 + "=" + v + ".get(" + v2 + ");\n"; s += " " + keyWriterString; s += " " + valueWriterString; s += " }\n"; s += " writer.writeEndArray();\n"; s += "}\n"; } else if (isAList(type)) { String v = createVariableName("v"); String v2 = createVariableName("x"); String writerString = getPrimitiveWriter( (Class) parametrizedTypeArguments[0], v2); if (writerString == null) { writerString = "Marshaller marshaller = registry.lookupMarshaller(" + v2 + ");\n"; writerString += "marshaller.write(writer, " + v2 + ");\n"; } s += "List<" + getTypeName(parametrizedTypeArguments[0]) + "> " + v + "=" + context + "." + getter.getName() + "();\n"; if (!canSkipIfNull) { s += "if(" + v + "==null) {\n"; s += " throw new RuntimeException(\"Field " + fieldName + " of class " + parentClassName + " cannot be null.\");\n"; s += "} else {\n"; } else { s += "if(" + v + "!=null) {\n"; } String b = createVariableName("b"); String c = createVariableName("c"); if (parametrizedTypeArguments[0] == Byte.class) { s += "byte[] " + v2 + " = new byte[" + v + ".size()];\n"; s += "int " + c + " = 0;\n"; s += "for(Byte " + b + " : " + v + ") {\n"; s += " " + v2 + "[" + c + "++] = " + b + ";\n"; s += "}\n"; s += writeBinaryData("BsonBinarySubType.BINARY", jsonFieldName, v2); } else { s += " writer.writeStartArray(\"" + jsonFieldName + "\");\n"; s += " for(" + getTypeName(parametrizedTypeArguments[0]) + " " + v2 + " : " + v + ") {\n"; s += " " + writerString; s += " }\n"; s += " writer.writeEndArray();\n"; } s += "}\n"; } } else { // complex type String v = createVariableName("v"); s += field.getType().getName() + " " + v + "=" + context + "." + getter.getName() + "();\n"; if (!canSkipIfNull) { s += "if(" + v + "==null) {\n"; s += " throw new RuntimeException(\"Field " + fieldName + " of class " + parentClassName + " cannot be null.\");\n"; s += "} else {\n"; } else { s += "if(" + v + "!=null) {\n"; } s += "writer.writeName(\"" + jsonFieldName + "\");\n"; s += "Marshaller marshaller = registry.lookupMarshaller(" + v + ");\n"; s += "marshaller.write(writer, " + v + ");\n"; s += "}\n"; } return s; } CodeBlock getUnmarshallerCode(String context) throws Exception { String s = ""; String v = ""; if (type.isArray()) { Type signatureType = field.getGenericType(); if ("int[]".equals(getTypeName(signatureType))) { // int[]; s += "reader.readStartArray();\n"; v = createVariableName("v"); String x = createVariableName("x"); s += "List " + v + " = new ArrayList<>();\n"; s += "while(reader.readBsonType() != BsonType.END_OF_DOCUMENT) {\n"; s += " " + v + ".add(reader.readInt32());\n"; s += "}\n"; s += "int[] " + x + " = new int[" + v + ".size()];\n"; s += "int cnt=0;\n"; s += "for(Integer i:" + v + ") {\n"; s += " " + x + "[cnt++]=i;\n"; s += "}\n"; if (context != null) { s += context + "." + setter.getName() + "(" + x + ");\n"; } v = x; s += "reader.readEndArray();\n"; } else if ("java.lang.String[]".equals(getTypeName(signatureType))) { // String[] s += "reader.readStartArray();\n"; v = createVariableName("v"); String x = createVariableName("x"); s += "List " + v + " = new ArrayList<>();\n"; s += "while(reader.readBsonType() != BsonType.END_OF_DOCUMENT) {\n"; s += " " + v + ".add(reader.readString());\n"; s += "}\n"; s += "String[] " + x + " = new String[" + v + ".size()];\n"; s += "int cnt=0;\n"; s += "for(String i:" + v + ") {\n"; s += " " + x + "[cnt++]=i;\n"; s += "}\n"; if (context != null) { s += context + "." + setter.getName() + "(" + x + ");\n"; } v = x; s += "reader.readEndArray();\n"; } else if ("boolean[]".equals(getTypeName(signatureType))) { // boolean[] s += "reader.readStartArray();\n"; v = createVariableName("v"); String x = createVariableName("x"); s += "List " + v + " = new ArrayList<>();\n"; s += "while(reader.readBsonType() != BsonType.END_OF_DOCUMENT) {\n"; s += " " + v + ".add(reader.readBoolean());\n"; s += "}\n"; s += "boolean[] " + x + " = new boolean[" + v + ".size()];\n"; s += "int cnt=0;\n"; s += "for(Boolean i:" + v + ") {\n"; s += " " + x + "[cnt++]=i;\n"; s += "}\n"; if (context != null) { s += context + "." + setter.getName() + "(" + x + ");\n"; } v = x; s += "reader.readEndArray();\n"; } else if ("byte[]".equals(getTypeName(signatureType))) { // byte[] v = createVariableName("v"); s += "BsonBinary binary = reader.readBinaryData();\n"; if (context != null) { s += context + "." + setter.getName() + "(binary.getData());\n"; } } else if ("char[]".equals(getTypeName(signatureType))) { // char[] v = createVariableName("v"); String x = createVariableName("s"); s += "String " + x + " = reader.readString();\n"; s += "char[] " + v + " = " + x + ".toCharArray();\n"; if (context != null) { s += context + "." + setter.getName() + "(" + v + ");\n"; } } else if ("short[]".equals(getTypeName(signatureType))) { // short[] s += "reader.readStartArray();\n"; v = createVariableName("v"); String x = createVariableName("x"); s += "List " + v + " = new ArrayList<>();\n"; s += "while(reader.readBsonType() != BsonType.END_OF_DOCUMENT) {\n"; s += " if(reader.getCurrentBsonType()!=BsonType.INT32) break;\n"; s += " " + v + ".add(reader.readInt32());\n"; s += "}\n"; s += "short[] " + x + " = new short[" + v + ".size()];\n"; s += "int cnt=0;\n"; s += "for(Integer i:" + v + ") {\n"; s += " " + x + "[cnt++]=i.shortValue();\n"; s += "}\n"; if (context != null) { s += context + "." + setter.getName() + "(" + x + ");\n"; } v = x; s += "reader.readEndArray();\n"; } else if ("long[]".equals(getTypeName(signatureType))) { // long[] s += "reader.readStartArray();\n"; v = createVariableName("v"); String x = createVariableName("x"); s += "List " + v + " = new ArrayList<>();\n"; s += "while(reader.readBsonType() != BsonType.END_OF_DOCUMENT) {\n"; s += " if(reader.getCurrentBsonType()!=BsonType.INT64) break;\n"; s += " " + v + ".add(reader.readInt64());\n"; s += "}\n"; s += "long[] " + x + " = new long[" + v + ".size()];\n"; s += "int cnt=0;\n"; s += "for(Long i:" + v + ") {\n"; s += " " + x + "[cnt++]=i;\n"; s += "}\n"; if (context != null) { s += context + "." + setter.getName() + "(" + x + ");\n"; } v = x; s += "reader.readEndArray();\n"; } else if ("float[]".equals(getTypeName(signatureType))) { // float[] s += "reader.readStartArray();\n"; v = createVariableName("v"); String x = createVariableName("x"); s += "List " + v + " = new ArrayList<>();\n"; s += "while(reader.readBsonType() != BsonType.END_OF_DOCUMENT) {\n"; s += " if(reader.getCurrentBsonType()!=BsonType.DOUBLE) break;\n"; s += " " + v + ".add(reader.readDouble());\n"; s += "}\n"; s += "float[] " + x + " = new float[" + v + ".size()];\n"; s += "int cnt=0;\n"; s += "for(Double i:" + v + ") {\n"; s += " " + x + "[cnt++]=i.floatValue();\n"; s += "}\n"; if (context != null) { s += context + "." + setter.getName() + "(" + x + ");\n"; } v = x; s += "reader.readEndArray();\n"; } else if ("double[]".equals(getTypeName(signatureType))) { // double[] s += "reader.readStartArray();\n"; v = createVariableName("v"); String x = createVariableName("x"); s += "List " + v + " = new ArrayList<>();\n"; s += "while(reader.readBsonType() != BsonType.END_OF_DOCUMENT) {\n"; s += " if(reader.getCurrentBsonType()!=BsonType.DOUBLE) break;\n"; s += " " + v + ".add(reader.readDouble());\n"; s += "}\n"; s += "double[] " + x + " = new double[" + v + ".size()];\n"; s += "int cnt=0;\n"; s += "for(Double i:" + v + ") {\n"; s += " " + x + "[cnt++]=i;\n"; s += "}\n"; if (context != null) { s += context + "." + setter.getName() + "(" + x + ");\n"; } v = x; s += "reader.readEndArray();\n"; } else { // complex array s += "reader.readStartArray();\n"; v = createVariableName("v"); String element = getElement(getTypeName(getter.getReturnType())); SubTypeInfo sti = mapOfSubTypeInfo.get(Class.forName(element)); String marshallerType; if (sti != null) { marshallerType = getTypeName(sti.parentClass); } else { marshallerType = element; } String marshaller = createVariableName("m"); s += "Marshaller " + marshaller + " = registry.lookupMarshaller(" + marshallerType + ".class);\n"; s += "List<" + element + "> " + v + " = new ArrayList<>();\n"; s += "while(reader.readBsonType() != BsonType.END_OF_DOCUMENT) {\n"; s += element + " e = (" + element + ") " + marshaller + ".read(reader);\n"; s += v + ".add(e);\n"; s += "}\n"; String x = createVariableName("x"); s += element + "[] " + x + " = new " + element + "[" + v + ".size()];\n"; s += v + ".toArray(" + x + ");\n"; if (context != null) { s += context + "." + setter.getName() + "(" + x + ");\n"; } s += "reader.readEndArray();\n"; v = x; } } else if (isPrimitive(type)) { v = createVariableName("v"); s += field.getType().getName() + " " + getPrimitiveReader(type, v); if (context != null) { s += context + "." + setter.getName() + "(" + v + ");\n"; } } else if (parametrizedTypeArguments != null) { if (isAMap(type)) { v = createVariableName("mv"); String keyV = createVariableName("v"); String valueV = createVariableName("x"); String keyReaderString = getPrimitiveReader((Class) parametrizedTypeArguments[0], keyV); String valueReaderString = getPrimitiveReader((Class) parametrizedTypeArguments[1], valueV); s += "reader.readStartArray();\n"; String keyElement = getTypeName(parametrizedTypeArguments[0]); SubTypeInfo sti = mapOfSubTypeInfo.get(Class.forName(keyElement)); String keyMarshallerType; if (sti != null) { keyMarshallerType = getTypeName(sti.parentClass); } else { keyMarshallerType = keyElement; } String valueElement = getTypeName(parametrizedTypeArguments[1]); SubTypeInfo sti2 = mapOfSubTypeInfo.get(Class.forName(valueElement)); String valueMarshallerType; if (sti2 != null) { valueMarshallerType = getTypeName(sti2.parentClass); } else { valueMarshallerType = valueElement; } if (keyReaderString != null) { keyReaderString = keyElement + " " + keyReaderString; } else { s += "Marshaller m = registry.lookupMarshaller(" + keyMarshallerType + ".class);\n"; keyReaderString = keyElement + " " + keyV + " = (" + keyElement + ") m.read(reader);\n"; } if (valueReaderString != null) { valueReaderString = valueElement + " " + valueReaderString; } else { s += "Marshaller m2 = registry.lookupMarshaller(" + valueMarshallerType + ".class);\n"; valueReaderString = valueElement + " " + valueV + " = (" + valueElement + ") m2.read(reader);\n"; } s += "Map<" + keyElement + "," + valueElement + "> " + v + "=new HashMap<>();\n"; s += "while(reader.readBsonType() != BsonType.END_OF_DOCUMENT) {\n"; s += keyReaderString; s += valueReaderString; s += v + ".put(" + keyV + "," + valueV + ");\n"; s += "}\n"; if (context != null) { s += context + "." + setter.getName() + "(" + v + ");\n"; } s += "reader.readEndArray();\n"; } else if (isAList(type)) { if (parametrizedTypeArguments[0] == Byte.class) { // byte[] v = createVariableName("v"); String b = createVariableName("b"); String b2 = createVariableName("x"); s += "BsonBinary binary = reader.readBinaryData();\n"; s += "List " + v + " = new ArrayList<>();\n"; s += "byte[] " + b + " = binary.getData();\n"; s += "for(byte " + b2 + " : " + b + ") {\n"; s += " " + v + ".add(" + b2 + ");\n"; s += "}\n"; if (context != null) { s += context + "." + setter.getName() + "(" + v + ");\n"; } } else { s += "reader.readStartArray();\n"; v = createVariableName("v"); String readerString = getPrimitiveReader( (Class) parametrizedTypeArguments[0], "e"); String element = getTypeName(parametrizedTypeArguments[0]); SubTypeInfo sti = mapOfSubTypeInfo.get(Class.forName(element)); String marshallerType; if (sti != null) { marshallerType = getTypeName(sti.parentClass); } else { marshallerType = element; } if (readerString != null) { readerString = element + " " + readerString; } else { s += "Marshaller m = registry.lookupMarshaller(" + marshallerType + ".class);\n"; readerString = element + " e = (" + element + ") m.read(reader);\n"; } s += "List<" + element + "> " + v + "=new ArrayList<>();\n"; s += "while(reader.readBsonType() != BsonType.END_OF_DOCUMENT) {\n"; s += readerString; s += v + ".add(e);\n"; s += "}\n"; if (context != null) { s += context + "." + setter.getName() + "(" + v + ");\n"; } s += "reader.readEndArray();\n"; } } } else { v = createVariableName("v"); String m = "registry.lookupMarshaller(" + field.getType().getName() + ".class).read(reader);\n"; s += field.getType().getName() + " " + v + "= (" + field.getType().getName() + ") " + m; if (context != null) { s += context + "." + setter.getName() + "(" + v + ");\n"; } } CodeBlock codeBlock = new CodeBlock(); codeBlock.s = s; codeBlock.v = v; return codeBlock; } String getElement(String array) { return array.replace("[]", ""); } } class CodeBlock { String s; String v; } boolean isPrimitive(Class clazz) { return ClassUtils.isPrimitiveOrWrapper(clazz) || clazz.equals(String.class); } String getPrimitiveWriter(Class clazz, String v) { if (clazz.equals(String.class)) { return writeString(v); } else if (clazz.equals(Long.class) || clazz.equals(long.class)) { return writeInt64(v); } else if (clazz.equals(Integer.class) || clazz.equals(int.class)) { return writeInt32(v); } else if (clazz.equals(Boolean.class) || clazz.equals(boolean.class)) { return writeBoolean(v); } else if (clazz.equals(Double.class) || clazz.equals(double.class)) { return writeDouble(v); } else if (clazz.equals(Float.class) || clazz.equals(float.class)) { return writeFloat(v); } else if (clazz.equals(Short.class) || clazz.equals(short.class)) { return writeShort(v); } return null; } String getPrimitiveReader(Class clazz, String v) { if (clazz.equals(String.class)) { return readString(v); } else if (clazz.equals(Long.class) || clazz.equals(long.class)) { return readInt64(v); } else if (clazz.equals(Integer.class) || clazz.equals(int.class)) { return readInt32(v); } else if (clazz.equals(Boolean.class) || clazz.equals(boolean.class)) { return readBoolean(v); } else if (clazz.equals(Double.class) || clazz.equals(double.class)) { return readDouble(v); } else if (clazz.equals(Float.class) || clazz.equals(float.class)) { return readFloat(v); } else if (clazz.equals(Short.class) || clazz.equals(short.class)) { return readShort(v); } return null; } boolean isAList(Class type) { List> interfaces = ClassUtils.getAllInterfaces(type); if (type.isInterface()) { interfaces.add(type); } return interfaces.contains(List.class); } boolean isAMap(Class type) { List> interfaces = ClassUtils.getAllInterfaces(type); if (type.isInterface()) { interfaces.add(type); } return interfaces.contains(Map.class); } class MethodInfo { Method method; JsonProperty jsonProperty; } boolean fieldNameEquals(String fieldName, String value) { fieldName = fieldName.replaceAll("[^A-Za-z0-9]", ""); value = value.replaceAll("[^A-Za-z0-9]", ""); return fieldName.equalsIgnoreCase(value); } String writeBinaryData(String type, String value) { String a = "BsonBinary binary = new BsonBinary(" + type + "," + value + ");\n"; String b = "writer.writeBinaryData(binary);\n"; return a + b; } String writeBinaryData(String type, String name, String value) { String a = "BsonBinary binary = new BsonBinary(" + type + "," + value + ");\n"; String b = "writer.writeBinaryData(\"" + name + "\",binary);\n"; return a + b; } String writeBoolean(String value) { return "writer.writeBoolean(" + value + ");\n"; } String writeBoolean(String name, String value) { return "writer.writeBoolean(\"" + name + "\"," + value + ");\n"; } String writeDateTime(String value) { return "writer.writeDateTime(" + value + ");\n"; } String writeDateTime(String name, String value) { return "writer.writeDateTime(\"" + name + "\"," + value + ");\n"; } String writeEndArray() { return "writer.writeEndArray();\n"; } String writeEndDocument() { return "writer.writeEndDocument();\n"; } String writeInt32(String value) { return "writer.writeInt32(" + value + ");\n"; } String writeInt32(String name, String value) { return "writer.writeInt32(\"" + name + "\"," + value + ");\n"; } String writeInt64(String value) { return "writer.writeInt64(" + value + ");\n"; } String writeInt64(String name, String value) { return "writer.writeInt64(\"" + name + "\"," + value + ");\n"; } String writeDouble(String value) { return "writer.writeDouble(" + value + ");\n"; } String writeDouble(String name, String value) { return "writer.writeDouble(\"" + name + "\"," + value + ");\n"; } String writeFloat(String value) { return "writer.writeDouble(" + value + ");\n"; } String writeShort(String value) { return "writer.writeInt32(" + value + ");\n;"; } String writeName(String name) { return "writer.writeName(\"" + name + "\");\n"; } String writeStartArray() { return "writer.writeStartArray();\n"; } String writeStartArray(String name) { return "writer.writeStartArray(\"" + name + "\");\n"; } String writeStartDocument() { return "writer.writeStartDocument();\n"; } String writeStartDocument(String name) { return "writer.writeStartDocument(\"" + name + "\");\n"; } String writeString(String value) { return "writer.writeString(" + value + ");\n"; } String writeString(String name, String value) { return "writer.writeString(\"" + name + "\"," + value + ");\n"; } String readBinaryData(String v) { return v + "=reader.readBinaryData();\n"; } String readBoolean(String v) { return v + "=reader.readBoolean();\n"; } String readDateTime(String v) { return v + "=reader.readDateTime();\n"; } String readInt32(String v) { return v + "=reader.readInt32();\n"; } String readInt64(String v) { return v + "=reader.readInt64();\n"; } String readDouble(String v) { return v + "=reader.readDouble();\n"; } String readFloat(String v) { return v + "=(float) reader.readDouble();\n"; } String readShort(String v) { return v + "=(short) reader.readInt32();\n"; } String readString(String v) { return v + "=reader.readString();\n"; } /** * Copied from java 1.8 impl for 1.7 compatibility * * @param t * @return type name */ String getTypeName(Type t) { Class type = (Class) t; if (type.isArray()) { try { Class cl = type; int dimensions = 0; while (cl.isArray()) { dimensions++; cl = cl.getComponentType(); } StringBuilder sb = new StringBuilder(); sb.append(cl.getName()); for (int i = 0; i < dimensions; i++) { sb.append("[]"); } return sb.toString(); } catch (Throwable e) { /*FALLTHRU*/ } } return type.getName(); } private static final Class[] parameters = new Class[]{URL.class}; static void addURLToClasspath(URL url) throws Exception { URLClassLoader sysLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); Class sysClass = URLClassLoader.class; Method method = sysClass.getDeclaredMethod("addURL", parameters); method.setAccessible(true); method.invoke(sysLoader, new Object[]{url}); } public static void main(String... argv) throws Exception { String od = System.getProperty("output.dir"); String classes = System.getProperty("class.names"); String jarFiles = System.getProperty("jar.files", "false"); if (!jarFiles.equals("false")) { StringTokenizer jarFilenames = new StringTokenizer(jarFiles); while (jarFilenames.hasMoreElements()) { addURLToClasspath(new File(jarFilenames.nextToken()).toURI().toURL()); } } StringTokenizer stringTokenizer = new StringTokenizer(classes, ","); MarshallerGenerator.outputPath = od; Map classesForFactory = new HashMap<>(); while (stringTokenizer.hasMoreElements()) { String classname = stringTokenizer.nextToken(); Class clazz = Class.forName(classname); Package p = clazz.getPackage(); String beanPackage = p.getName(); MarshallerGenerator generator = new MarshallerGenerator(); generator.beanPackage = beanPackage; generator.factoryName = clazz.getSimpleName(); List fieldInfos = new ArrayList<>(); generator.getFieldInfosForClasses(clazz, fieldInfos); for (Class clazz2 : generator.mapOfFieldInfos.keySet()) { List fis = generator.mapOfFieldInfos .get(clazz2); if (generator.buildMarshaller(clazz2, fis)) { classesForFactory.put(clazz2, clazz2); } } for (Class clazz2 : generator.mapOfSubTypeInfo.keySet()) { generator.getFieldInfosForClasses(clazz2, new ArrayList()); } for (Class clazz2 : generator.mapOfSubTypeInfo.keySet()) { List fis = generator.mapOfFieldInfos .get(clazz2); if (generator.buildMarshaller(clazz2, fis)) { classesForFactory.put(clazz2, clazz2); } } for (Class clazz2 : generator.mapOfFieldInfos.keySet()) { List fis = generator.mapOfFieldInfos.get(clazz2); if (generator.buildMarshaller(clazz2, fis)) { classesForFactory.put(clazz2, clazz2); } } generator.buildCodec(clazz); List classListForFactory = new ArrayList<>(); for (Class key : classesForFactory.keySet()) { classListForFactory.add(key); } generator.buildMarshallerFactory(classListForFactory); } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy