Skip to content

Commit

Permalink
Fixing couple of issues in union type serialization/deserialization.
Browse files Browse the repository at this point in the history
  • Loading branch information
petrochenko-pavel-a committed Oct 18, 2016
1 parent 6c43f02 commit dabf8ce
Show file tree
Hide file tree
Showing 10 changed files with 216 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,15 @@
import org.aml.typesystem.acbuilder.AcElementKind;
import org.aml.typesystem.acbuilder.AcScheme;
import org.aml.typesystem.acbuilder.CompositeAcElement;
import org.aml.typesystem.acbuilder.CompositeAcElement.TypeFamily;

import com.sun.codemodel.JBlock;
import com.sun.codemodel.JClass;
import com.sun.codemodel.JExpr;
import com.sun.codemodel.JExpression;
import com.sun.codemodel.JFormatter;
import com.sun.codemodel.JStatement;
import com.sun.codemodel.JType;

public class GsonAcElementWriter extends GenericAcAdapterWriter{

Expand Down Expand Up @@ -50,7 +54,21 @@ protected void contribute(CompositeAcElement ac,JBlock block,AbstractType target
@Override
public void state(JFormatter f) {
String name = getName(target, writer);
f.p("union.set"+Character.toUpperCase(name.charAt(0))+name.substring(1)+"(gson.fromJson(vl,"+getJavaTypeName(target, writer)+".class));");
if (ac.getFamily()==TypeFamily.ARRAY&&writer.getConfig().containerStrategyCollection){
JType type = writer.getType(target);
if (type.erasure()!=type){
String elementName=((JClass) type).getTypeParameters().get(0).fullName();
String vv="new SimpleParameterizedType("+type.erasure().fullName()+".class,"+elementName+".class)";

f.p("union.set"+Character.toUpperCase(name.charAt(0))+name.substring(1)+"(gson.fromJson(vl, "+vv+"));");
}
else{
f.p("union.set"+Character.toUpperCase(name.charAt(0))+name.substring(1)+"(gson.fromJson(vl,"+getJavaTypeName(target, writer)+".class));");
}
}
else{
f.p("union.set"+Character.toUpperCase(name.charAt(0))+name.substring(1)+"(gson.fromJson(vl,"+getJavaTypeName(target, writer)+".class));");
}
f.nl();
f.p("return union;");
f.nl();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,15 @@
import org.aml.typesystem.acbuilder.AcElementKind;
import org.aml.typesystem.acbuilder.AcScheme;
import org.aml.typesystem.acbuilder.CompositeAcElement;
import org.aml.typesystem.acbuilder.CompositeAcElement.TypeFamily;

import com.sun.codemodel.JBlock;
import com.sun.codemodel.JClass;
import com.sun.codemodel.JExpr;
import com.sun.codemodel.JExpression;
import com.sun.codemodel.JFormatter;
import com.sun.codemodel.JStatement;
import com.sun.codemodel.JType;

public class JacksonDeserializerWriter extends GenericAcAdapterWriter{

Expand Down Expand Up @@ -54,7 +58,18 @@ protected void contribute(CompositeAcElement ac,JBlock block,AbstractType target
@Override
public void state(JFormatter f) {
String name = getName(target, writer);
f.p("union.set"+Character.toUpperCase(name.charAt(0))+name.substring(1)+"(codec.readValue(vl.traverse(), "+getJavaTypeName(target, writer)+".class));");
if (ac.getFamily()==TypeFamily.ARRAY&&writer.getConfig().containerStrategyCollection){
JType type = writer.getType(target);
if (type.erasure()!=type){
String elementName=((JClass) type).getTypeParameters().get(0).fullName();
String vv="com.fasterxml.jackson.databind.type.CollectionType.construct("+type.erasure().fullName()+".class,com.fasterxml.jackson.databind.type.SimpleType.construct("+elementName+".class))";

f.p("union.set"+Character.toUpperCase(name.charAt(0))+name.substring(1)+"(codec.readValue(vl.traverse(), "+vv+"));");
}
}
else{
f.p("union.set"+Character.toUpperCase(name.charAt(0))+name.substring(1)+"(codec.readValue(vl.traverse(), "+getJavaTypeName(target, writer)+".class));");
}
f.nl();
f.p("return union;");
f.nl();
Expand Down
21 changes: 15 additions & 6 deletions org.aml.raml2java/src/main/java/org/aml/raml2java/JavaWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import org.aml.raml2java.JavaGenerationConfig.WrappersStrategy;
import org.aml.typesystem.AbstractType;
import org.aml.typesystem.BuiltIns;
import org.aml.typesystem.IType;
import org.aml.typesystem.ITypeLibrary;
import org.aml.typesystem.TypeOps;
import org.aml.typesystem.beans.IProperty;
Expand Down Expand Up @@ -362,8 +363,9 @@ public JType getType(AbstractType range, boolean allowNotJava, boolean convertCo
if (range.isObject()) {
return mdl._ref(Object.class);
}
return mdl._ref(String.class);
}
if (member != null) {
if (member != null||range.isAnonimous()) {

if (range.isEffectivelyEmptyType()) {

Expand All @@ -385,7 +387,7 @@ public JType getType(AbstractType range, boolean allowNotJava, boolean convertCo
if (range.isString()) {
if (range.isEnumType()) {
if (member != null) {
AbstractType derive = TypeOps.derive(typePropertyName(member), BuiltIns.STRING);
AbstractType derive = TypeOps.derive(typePropertyName(member, range), BuiltIns.STRING);
derive.metaInfo.addAll(range.meta());
JType define = new EnumTypeGenerator(this).define(derive);
defined.put(range, define);
Expand All @@ -396,7 +398,7 @@ public JType getType(AbstractType range, boolean allowNotJava, boolean convertCo

if (range.isUnion()) {
UnionTypeGenerator ug = new UnionTypeGenerator(this);
AbstractType derive = TypeOps.derive(typePropertyName(member),
AbstractType derive = TypeOps.derive(typePropertyName(member, range),
range.superTypes().toArray(new AbstractType[range.superTypes().size()]));
for (TypeInformation t : range.meta()) {
derive.addMeta(t.clone());
Expand All @@ -407,9 +409,9 @@ public JType getType(AbstractType range, boolean allowNotJava, boolean convertCo
}
if (range.isObject()) {
if (!range.directPropertySet().isEmpty() || range.superTypes().size() > 1) {
AbstractType derive = TypeOps.derive(typePropertyName(member),
AbstractType derive = TypeOps.derive(typePropertyName(member, range),
range.superTypes().toArray(new AbstractType[range.superTypes().size()]));
for (TypeInformation t : range.meta()) {
for (TypeInformation t : range.declaredMeta()) {
derive.addMeta(t.clone());
}
return getType(derive, false, false, null);
Expand Down Expand Up @@ -609,6 +611,9 @@ public void error(SAXParseException exception) throws AbortException {
}
}
}
if (range.isArray()){
return toArray(range.componentType(), null, false);
}
return null;
}

Expand Down Expand Up @@ -814,8 +819,12 @@ private URL storeContentToTempFile(String externalSchemaContent) {
}
return json;
}
int count=0;

private String typePropertyName(IProperty member) {
private String typePropertyName(IProperty member, IType range) {
if (member==null){
return "Anonimous"+(count++);
}
return member.getDeclaredAt().name() + member.id();
}

Expand Down
31 changes: 30 additions & 1 deletion org.aml.raml2java/src/main/resources/gsonAdapter.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,40 @@ import com.google.gson.TypeAdapter;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;

import java.lang.reflect.*;
public class {typeName}Adapter extends TypeAdapter<{typeName}>{
static Gson gson=new Gson();
static class SimpleParameterizedType implements java.lang.reflect.ParameterizedType{
final Class<?>raw;
final Type[] arg;
public SimpleParameterizedType(Class<?> raw, Class<?> arg) {
super();
this.raw = raw;
this.arg = new Type[]{arg};
}



@Override
public Type[] getActualTypeArguments() {
return arg;
}

@Override
public Type getRawType() {
return raw;
}

@Override
public Type getOwnerType() {
return null;
}

}

@Override
public void write(JsonWriter out, {typeName} value) throws IOException {
{writeCode}
Expand Down
43 changes: 43 additions & 0 deletions org.aml.raml2java/src/test/java/org/aml/raml2java/BasicTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -1177,5 +1177,48 @@ public void test43() {
TestCase.assertTrue(false);
}
}

@Test
public void test44() {
TopLevelRamlImpl build = new TopLevelRamlModelBuilder().build(BasicTest.class.getResourceAsStream("/t46.raml"),
new ClassPathResourceLoader(), "t46.raml");
JavaWriter wr = new JavaWriter();
wr.getConfig().setJacksonSupport(true);
wr.setDefaultPackageName("org.aml.test");
wr.write(build);
HashMap<String, Class<?>> compileAndTest = compileAndTest(wr.getModel(), "org.aml.test.H");
Class<?> class1 = compileAndTest.get("org.aml.test.H");
try {
Object newInstance = class1.newInstance();
try {
Method m=class1.getMethod("getSalesSummary");

} catch (NoSuchMethodException e) {
TestCase.assertTrue(false);
}
try {
Method m=class1.getMethod("getSaleDetails");
} catch (NoSuchMethodException e) {
TestCase.assertTrue(false);
}
// Object newInstance2 = class1.newInstance();
// TestCase.assertTrue(newInstance instanceof Serializable);
// TestCase.assertTrue(newInstance instanceof Cloneable);
// TestCase.assertTrue(newInstance instanceof Comparable);
// TestCase.assertTrue(newInstance.equals(newInstance2));
// TestCase.assertEquals(newInstance.hashCode(), newInstance2.hashCode());
} catch (SecurityException | InstantiationException | IllegalAccessException e1) {
TestCase.assertTrue(false);
} catch (IllegalArgumentException e) {
TestCase.assertTrue(false);
}
//TestCase.assertTrue(class1.getSuperclass().getSimpleName().equals("Person"));
try {
} catch (SecurityException e) {
TestCase.assertTrue(false);
} catch (IllegalArgumentException e) {
TestCase.assertTrue(false);
}
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.aml.raml2java;

import java.lang.reflect.Type;

public class ParameterizedType implements java.lang.reflect.ParameterizedType{

final Class<?>raw;
final Type[] arg;
public ParameterizedType(Class<?> raw, Class<?> arg) {
super();
this.raw = raw;
this.arg = new Type[]{arg};
}



@Override
public Type[] getActualTypeArguments() {
return arg;
}

@Override
public Type getRawType() {
return raw;
}

@Override
public Type getOwnerType() {
return null;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,11 @@ public void test18() {
public void test19() {
assertValue("t39.raml", "Person", "/s11.json", "/s11.json", null);
}

@Test
public void test46() {
assertValue("t46.raml", "H", "/s46.json", "/s46t.json", null);
}
private Class<?> assertValue(String ramlPath, String className, String jsonPath, String plainJsonPath, String xmlPath) {
Class<?> clazz = compileAndLoadClass(ramlPath, className, true);
Object object = loadObjectGson(clazz, jsonPath);
Expand Down Expand Up @@ -188,8 +193,15 @@ public Object loadObjectJacksonFromString(Class<?> clazz, String value) {
}

static void assertAgainstJSON(Object obj, String jsonPath) {
try{
JSONObject ob = new JSONObject(StreamUtils.toString(SerializationTest.class.getResourceAsStream(jsonPath)));
assertObject(ob, obj);
}
catch (Exception e) {
JSONArray ob = new JSONArray(StreamUtils.toString(SerializationTest.class.getResourceAsStream(jsonPath)));
assertObject(ob, obj);

}
}

private static void assertObject(Object json, Object obj) {
Expand Down
8 changes: 8 additions & 0 deletions org.aml.raml2java/src/test/resources/s46.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[
{
"dateAndTime": "222",
"value": 2,
"machineId": "2323",
"productId": "dede"
}
]
8 changes: 8 additions & 0 deletions org.aml.raml2java/src/test/resources/s46t.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"saleDetails":[{
"dateAndTime": "222",
"value": 2,
"machineId": "2323",
"productId": "dede"
}]
}
33 changes: 33 additions & 0 deletions org.aml.raml2java/src/test/resources/t46.raml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#%RAML 1.0
title: A
types:
Exchange:
type: object
properties:
value: integer
in: integer
out: integer
Sale:
type: object
properties:
machineId: string
trayId: string
dateAndTime: datetime-only
exchange: Exchange
SaleDetail:
type: object
properties:
dateAndTime: datetime-only
value: integer
machineId: string
productId: string
SaleDetails:
type: array
items: SaleDetail
SalesSummary:
type: object
properties:
count: integer
totalValue: integer
sales: SaleDetails
H: SalesSummary | SaleDetails

0 comments on commit dabf8ce

Please sign in to comment.