Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ public static RootCapable readRootFromJSONString(String jsonString) {
@Deprecated
public static ObjectNode writeDocument(Document document) {
ModelWriter writer = ModelWriterFactory.createModelWriter(document.root().modelType());
return writer.writeRoot((RootCapable) document);
return (ObjectNode) writer.writeRoot((RootCapable) document);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ private void createUnionReadRootMethod(SpecificationVersion specVersion,
body.addContext("readMethodName", readMethodName);
body.addContext("modelType", modelType);

body.append("return (RootCapable) this.${readMethodName}(json, ModelType.${modelType});");
body.append("return this.${readMethodName}(json, ModelType.${modelType});");
readRootMethodSource.setBody(body.toString());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ private void createUnionWriteRootMethod(SpecificationVersion specVersion,

MethodSource<JavaClassSource> writeRootMethodSource = classSource.addMethod()
.setName("writeRoot")
.setReturnType(ObjectNode.class.getName())
.setReturnType(JsonNode.class.getName())
.setPublic();
writeRootMethodSource.addParameter(rootCapableSource.getName(), "node");
writeRootMethodSource.addAnnotation(Override.class);
Expand All @@ -156,13 +156,7 @@ private void createUnionWriteRootMethod(SpecificationVersion specVersion,
body.addContext("writeMethodName", writeMethodName);
body.addContext("unionType", jt.toJavaTypeString());

body.appendBlock("""
JsonNode result = this.${writeMethodName}((${unionType}) node);
if (result != null && JsonUtil.isObjectNode(result)) {
return (ObjectNode) result;
}
return null;
""");
body.append("return this.${writeMethodName}((${unionType}) node);");
writeRootMethodSource.setBody(body.toString());
}

Expand All @@ -173,9 +167,11 @@ private void createWriteRootMethod(SpecificationVersion specVersion,
classSource.addImport(rootNodeInterfaceSource);
classSource.addImport(ObjectNode.class);

classSource.addImport(JsonNode.class);

MethodSource<JavaClassSource> writeRootMethodSource = classSource.addMethod()
.setName("writeRoot")
.setReturnType(ObjectNode.class.getName())
.setReturnType(JsonNode.class.getName())
.setPublic();
writeRootMethodSource.addParameter(rootNodeInterfaceSource.getName(), "node");
writeRootMethodSource.addAnnotation(Override.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public void writeTo(JavaSource<?> target) {
body.addContext("fieldName", fieldName);

if (needsDetach) {
((JavaClassSource) target).addImport(ctx.getNodeInterfaceFQN());
((JavaClassSource) target).addImport(ctx.getAnyInterfaceFQN());
}

body.ifElse(needsDetach, () -> {
Expand All @@ -62,8 +62,8 @@ public void writeTo(JavaSource<?> target) {
body.addContext("valuesExpr", valuesExpr);
return """
if (this.${fieldName} != null) {
for (Object item : ${valuesExpr}) {
if (item != null) ((Node) item).detach();
for (Any item : ${valuesExpr}) {
if (item != null) item.detach();
}
this.${fieldName}.clear();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,10 @@ public String getNodeInterfaceFQN() {
return rootNamespace + ".Node";
}

public String getAnyInterfaceFQN() {
return rootNamespace + ".Any";
}

public String getDataModelUtilFQCN() {
return rootNamespace + ".util.DataModelUtil";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,10 +121,7 @@ private void writeAddItem(JavaSource<?> javaEntity, String mappedNodeType, boole
addParentTrackingImports(javaEntity);
body.appendBlock("""
if (item != null) {
((NodeImpl) item)._setParent(this);
((NodeImpl) item)._setParentPropertyName(null);
((NodeImpl) item)._setParentPropertyType(ParentPropertyType.map);
((NodeImpl) item)._setMapPropertyName(name);
DataModelUtil.setParentMap(item, this, null, ParentPropertyType.map, name);
}
""");
}
Expand All @@ -147,10 +144,7 @@ private void writeInsertItem(JavaSource<?> javaEntity, String mappedNodeType, bo
addParentTrackingImports(javaEntity);
body.appendBlock("""
if (item != null) {
((NodeImpl) item)._setParent(this);
((NodeImpl) item)._setParentPropertyName(null);
((NodeImpl) item)._setParentPropertyType(ParentPropertyType.map);
((NodeImpl) item)._setMapPropertyName(name);
DataModelUtil.setParentMap(item, this, null, ParentPropertyType.map, name);
}
""");
}
Expand Down Expand Up @@ -178,8 +172,9 @@ private void writeClearItems(JavaSource<?> javaEntity, boolean entityProperty) {
method.setReturnTypeVoid();
BodyBuilder body = new BodyBuilder();
if (entityProperty) {
body.append("for (Object item : this._items.values()) {");
body.append(" if (item != null) ((Node) item).detach();");
javaEntity.addImport(ctx.getAnyInterfaceFQN());
body.append("for (Any item : this._items.values()) {");
body.append(" if (item != null) item.detach();");
body.append("}");
}
body.append("this._items.clear();");
Expand All @@ -189,8 +184,8 @@ private void writeClearItems(JavaSource<?> javaEntity, boolean entityProperty) {
private void addParentTrackingImports(JavaSource<?> javaEntity) {
JavaEnumSource parentPropertyTypeSource = ctx.getJavaIndex().lookupEnum(ctx.getParentPropertyTypeEnumFQN());
javaEntity.addImport(parentPropertyTypeSource);
JavaClassSource nodeImplSource = ctx.getJavaIndex().lookupClass(ctx.getNodeEntityClassFQN());
javaEntity.addImport(nodeImplSource);
JavaClassSource dataModelUtilSource = ctx.getJavaIndex().lookupClass(ctx.getDataModelUtilFQCN());
javaEntity.addImport(dataModelUtilSource);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,11 @@
public class ParentAttachmentBlock extends CodeBlock {

public enum ParentPropertyKind {
STANDARD, ARRAY, MAP
STANDARD("standard"), ARRAY("array"), MAP("map");

private final String value;
ParentPropertyKind(String value) { this.value = value; }
public String value() { return value; }
}

private final Type valueType;
Expand Down Expand Up @@ -64,17 +68,12 @@ private void appendEntityAttachment(BodyBuilder body) {
body.ifElse(kind == ParentPropertyKind.MAP,
() -> """
if (value != null) {
((NodeImpl) value)._setParent(this);
((NodeImpl) value)._setParentPropertyName(${quotedName});
((NodeImpl) value)._setParentPropertyType(ParentPropertyType.${parentPropertyType});
((NodeImpl) value)._setMapPropertyName(name);
DataModelUtil.setParentMap(value, this, ${quotedName}, ParentPropertyType.${parentPropertyType}, name);
}
""",
() -> """
if (value != null) {
((NodeImpl) value)._setParent(this);
((NodeImpl) value)._setParentPropertyName(${quotedName});
((NodeImpl) value)._setParentPropertyType(ParentPropertyType.${parentPropertyType});
DataModelUtil.setParent(value, this, ${quotedName}, ParentPropertyType.${parentPropertyType});
}
""");
}
Expand All @@ -87,40 +86,27 @@ private void appendUnionStandardAttachment(BodyBuilder body) {
body.appendBlock("""
if (value != null) {
if (value.isEntity()) {
((NodeImpl) value)._setParent(this);
((NodeImpl) value)._setParentPropertyName("${propertyName}");
((NodeImpl) value)._setParentPropertyType(ParentPropertyType.standard);
DataModelUtil.setParent(value, this, "${propertyName}", ParentPropertyType.standard);
} else if (value.isEntityList()) {
((UnionValueImpl<?>) value)._setParent(this);
((UnionValueImpl<?>) value)._setParentPropertyName("${propertyName}");
((UnionValueImpl<?>) value)._setParentPropertyType(ParentPropertyType.standard);
DataModelUtil.setParent(value, this, "${propertyName}", ParentPropertyType.standard);
List<?> entityList = (List<?>) ((UnionValue<?>) value).getValue();
for (Object entity : entityList) {
if (entity != null) {
((NodeImpl) entity)._setParent(this);
((NodeImpl) entity)._setParentPropertyName("${propertyName}");
((NodeImpl) entity)._setParentPropertyType(ParentPropertyType.array);
DataModelUtil.setParent(entity, this, "${propertyName}", ParentPropertyType.array);
}
}
} else if (value.isEntityMap()) {
((UnionValueImpl<?>) value)._setParent(this);
((UnionValueImpl<?>) value)._setParentPropertyName("${propertyName}");
((UnionValueImpl<?>) value)._setParentPropertyType(ParentPropertyType.standard);
DataModelUtil.setParent(value, this, "${propertyName}", ParentPropertyType.standard);
Map<String, ?> entityMap = (Map<String, ?>) ((UnionValue<?>) value).getValue();
Collection<String> keys = entityMap.keySet();
for (String key : keys) {
NodeImpl entity = (NodeImpl) entityMap.get(key);
Object entity = entityMap.get(key);
if (entity != null) {
entity._setParent(this);
entity._setParentPropertyName("${propertyName}");
entity._setParentPropertyType(ParentPropertyType.map);
entity._setMapPropertyName(key);
DataModelUtil.setParentMap(entity, this, "${propertyName}", ParentPropertyType.map, key);
}
}
} else {
((UnionValueImpl<?>) value)._setParent(this);
((UnionValueImpl<?>) value)._setParentPropertyName("${propertyName}");
((UnionValueImpl<?>) value)._setParentPropertyType(ParentPropertyType.standard);
DataModelUtil.setParent(value, this, "${propertyName}", ParentPropertyType.standard);
}
}
""");
Expand All @@ -138,30 +124,12 @@ private void appendUnionCollectionAttachment(BodyBuilder body) {
body.ifElse(kind == ParentPropertyKind.MAP,
() -> """
if (value != null) {
if (value.isEntity()) {
((NodeImpl) value)._setParent(this);
((NodeImpl) value)._setParentPropertyName("${propertyName}");
((NodeImpl) value)._setParentPropertyType(ParentPropertyType.${parentPropertyType});
((NodeImpl) value)._setMapPropertyName(name);
} else {
((UnionValueImpl<?>) value)._setParent(this);
((UnionValueImpl<?>) value)._setParentPropertyName("${propertyName}");
((UnionValueImpl<?>) value)._setParentPropertyType(ParentPropertyType.${parentPropertyType});
((UnionValueImpl<?>) value)._setMapPropertyName(name);
}
DataModelUtil.setParentMap(value, this, "${propertyName}", ParentPropertyType.${parentPropertyType}, name);
}
""",
() -> """
if (value != null) {
if (value.isEntity()) {
((NodeImpl) value)._setParent(this);
((NodeImpl) value)._setParentPropertyName("${propertyName}");
((NodeImpl) value)._setParentPropertyType(ParentPropertyType.${parentPropertyType});
} else {
((UnionValueImpl<?>) value)._setParent(this);
((UnionValueImpl<?>) value)._setParentPropertyName("${propertyName}");
((UnionValueImpl<?>) value)._setParentPropertyType(ParentPropertyType.${parentPropertyType});
}
DataModelUtil.setParent(value, this, "${propertyName}", ParentPropertyType.${parentPropertyType});
}
""");
}
Expand All @@ -171,17 +139,15 @@ public void addImportsTo(JavaSource<?> source) {
if (valueType.isEntityType()) {
JavaEnumSource parentPropertyTypeSource = ctx.getJavaIndex().lookupEnum(ctx.getParentPropertyTypeEnumFQN());
source.addImport(parentPropertyTypeSource);
JavaClassSource nodeImplSource = ctx.getJavaIndex().lookupClass(ctx.getNodeEntityClassFQN());
source.addImport(nodeImplSource);
JavaClassSource dataModelUtilSource = ctx.getJavaIndex().lookupClass(ctx.getDataModelUtilFQCN());
source.addImport(dataModelUtilSource);
} else if (valueType.isUnionType()) {
JavaEnumSource parentPropertyTypeSource = ctx.getJavaIndex().lookupEnum(ctx.getParentPropertyTypeEnumFQN());
source.addImport(parentPropertyTypeSource);
JavaClassSource nodeImplSource = ctx.getJavaIndex().lookupClass(ctx.getNodeEntityClassFQN());
source.addImport(nodeImplSource);
JavaClassSource dataModelUtilSource = ctx.getJavaIndex().lookupClass(ctx.getDataModelUtilFQCN());
source.addImport(dataModelUtilSource);
JavaInterfaceSource unionValueSource = ctx.getJavaIndex().lookupInterface(ctx.getUnionValueInterfaceFQN());
source.addImport(unionValueSource);
JavaClassSource unionValueImplSource = ctx.getJavaIndex().lookupClass(ctx.getUnionTypeFQN("UnionValueImpl"));
source.addImport(unionValueImplSource);

if (kind == ParentPropertyKind.STANDARD) {
source.addImport(Collection.class);
Expand All @@ -192,11 +158,7 @@ public void addImportsTo(JavaSource<?> source) {
}

private String kindToString() {
return switch (kind) {
case STANDARD -> "standard";
case ARRAY -> "array";
case MAP -> "map";
};
return kind.value();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,6 @@ private void writeUnionReaderMethod(JavaClassSource readerClassSource) {
method.addParameter("ModelType", "modelType");

BodyBuilder body = new BodyBuilder();
body.append("if (json == null) return null;");

// Generate dispatch for each variant
boolean first = true;
for (var variantType : unionType.getTypes()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ private void writeUnionWriterMethod(JavaClassSource writerClassSource) {

body.append("if (union.${isMethod}()) {");
body.append(" ArrayNode array = JsonUtil.arrayNode();");
body.append(" for (Object item : (java.util.List<?>) union.${asMethod}()) {");
body.append(" for (Object item : union.${asMethod}()) {");
body.append(" ObjectNode itemNode = JsonUtil.objectNode();");
body.append(" this.${writeMethodName}((${entityType}) item, itemNode);");
body.append(" array.add(itemNode);");
Expand All @@ -173,7 +173,7 @@ private void writeUnionWriterMethod(JavaClassSource writerClassSource) {
body.addContext("addExpr", "array.add(JsonUtil.toJsonNode(item))");
body.append("if (union.${isMethod}()) {");
body.append(" ArrayNode array = JsonUtil.arrayNode();");
body.append(" for (Object item : (java.util.List<?>) union.${asMethod}()) {");
body.append(" for (Object item : union.${asMethod}()) {");
body.append(" ${addExpr};");
body.append(" }");
body.append(" return array;");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package io.apitomy.umg.base.io;

import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.JsonNode;
import io.apitomy.umg.base.RootCapable;

public interface ModelWriter {

public ObjectNode writeRoot(RootCapable node);
public JsonNode writeRoot(RootCapable node);

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package io.apitomy.umg.base.util;

import io.apitomy.umg.base.Node;
import io.apitomy.umg.base.NodeImpl;
import io.apitomy.umg.base.ParentPropertyType;
import io.apitomy.umg.base.union.UnionValueImpl;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -43,4 +48,25 @@ public static <V> List<V> insertListEntry(List<V> list, V value, int atIndex) {
return list;
}

public static void setParent(Object child, Node parent, String propertyName, ParentPropertyType propertyType) {
if (child instanceof NodeImpl) {
((NodeImpl) child)._setParent(parent);
((NodeImpl) child)._setParentPropertyName(propertyName);
((NodeImpl) child)._setParentPropertyType(propertyType);
} else if (child instanceof UnionValueImpl) {
((UnionValueImpl<?>) child)._setParent(parent);
((UnionValueImpl<?>) child)._setParentPropertyName(propertyName);
((UnionValueImpl<?>) child)._setParentPropertyType(propertyType);
}
}

public static void setParentMap(Object child, Node parent, String propertyName, ParentPropertyType propertyType, String mapPropertyName) {
setParent(child, parent, propertyName, propertyType);
if (child instanceof NodeImpl) {
((NodeImpl) child)._setMapPropertyName(mapPropertyName);
} else if (child instanceof UnionValueImpl) {
((UnionValueImpl<?>) child)._setMapPropertyName(mapPropertyName);
}
}

}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package io.test.synthetic.io;

import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.JsonNode;
import io.test.synthetic.RootCapable;

public interface ModelWriter {

public ObjectNode writeRoot(RootCapable node);
public JsonNode writeRoot(RootCapable node);

}
Loading
Loading