Skip to content
Snippets Groups Projects
Commit 0fe7e928 authored by René Schöne's avatar René Schöne
Browse files

begin with default mappings using templates

- also indirectly work on #55 to include marshalling methods only when needed
parent e130932b
No related branches found
No related tags found
1 merge request!33Resolve "Refactorings/Clean-Up"
This commit is part of merge request !33. Comments created here will be created in the context of that merge request.
......@@ -333,6 +333,10 @@ aspect MustacheRagConnect {
// === MappingDefinition ===
syn boolean MappingDefinition.isUsed() = !effectiveUsedAt().isEmpty();
eq SerializeListMapping.isUsed() = ragconnect().defaultListToBytesMapping().isUsed();
eq SerializeJavaUtilListMapping.isUsed() = ragconnect().defaultJavaUtilListToBytesMapping().isUsed();
eq DeserializeListMapping.isUsed() = program().typeDecls().stream().anyMatch(
typeDecl -> ragconnect().defaultBytesToListMapping(typeDecl.getName()).isUsed());
// === attributes needed for computing above ones ===
syn List<EndpointDefinition> RagConnect.givenEndpointDefinitionList() {
......
......@@ -147,6 +147,17 @@ aspect IntermediateToYAML {
return result;
}
syn Element TemplateDefaultMappingDefinition.toYAML() {
MappingElement result = new MappingElement();
// ragconnect / mapping
result.put("isUsed" , isUsed());
result.put("isSerializeListMapping" , isSerializeListMapping());
result.put("isSerializeJavaUtilListMapping" , isSerializeJavaUtilListMapping());
result.put("isDeserializeListMapping" , isDeserializeListMapping());
return result;
}
syn Element DependencyDefinition.toYAML() {
MappingElement result = new MappingElement();
// dependencyDefinition
......
......@@ -27,6 +27,16 @@ aspect DefaultMappings {
result.setContent(content);
return result;
}
private TemplateDefaultMappingDefinition RagConnect.initTemplateMappingDefinition(
TemplateDefaultMappingDefinition prototype, String id, String type, boolean fromBytes) {
MappingDefinitionType givenType = new JavaMappingDefinitionType().setType(new SimpleJavaTypeUse(type));
MappingDefinitionType bytesType = new JavaArrayMappingDefinitionType().setType(new SimpleJavaTypeUse("byte"));
prototype.setID(id);
prototype.setFromType(fromBytes ? bytesType : givenType);
prototype.setToType(fromBytes ? givenType : bytesType);
return prototype;
}
private DefaultMappingDefinition RagConnect.baseDefaultMappingDefinition(String fromTypeName, String toTypeName, String content) {
return createDefaultMappingDefinition("_Default", fromTypeName, toTypeName, content);
......@@ -81,7 +91,7 @@ aspect DefaultMappings {
"com.fasterxml.jackson.databind.ObjectMapper mapper = new com.fasterxml.jackson.databind.ObjectMapper();\n" +
"com.fasterxml.jackson.core.JsonFactory factory = new com.fasterxml.jackson.core.JsonFactory();\n" +
"com.fasterxml.jackson.core.JsonParser parser = factory.createParser(content);\n" +
configJastAddList() + "<" + typeName + ">" + " result = " + typeName + ".deserializeList((com.fasterxml.jackson.databind.node.ArrayNode)mapper.readTree(parser));\n" +
configJastAddList() + "<" + typeName + ">" + " result = " + typeName + ".deserializeListOf" + typeName + "((com.fasterxml.jackson.databind.node.ArrayNode)mapper.readTree(parser));\n" +
"parser.close();\n" +
"return result;"
);
......@@ -155,6 +165,15 @@ aspect DefaultMappings {
"char", "String", "return String.valueOf(input);");
}
aspect TemplateDefaultMappingDefinitions {
syn nta TemplateDefaultMappingDefinition RagConnect.serializeListMapping() = initTemplateMappingDefinition(
new SerializeListMapping(), "SerializeListMapping", "JastAddList", false);
syn nta TemplateDefaultMappingDefinition RagConnect.serializeJavaUtilListMapping() = initTemplateMappingDefinition(
new SerializeListMapping(), "SerializeJavaUtilListMapping", "java.util.List", false);
syn nta TemplateDefaultMappingDefinition RagConnect.deserializeListMapping(String name) = initTemplateMappingDefinition(
new DeserializeListMapping().setName(name), "DeserializeListMapping", "JastAddList", true);
}
aspect Mappings {
// --- effectiveMappings ---
syn java.util.List<MappingDefinition> EndpointDefinition.effectiveMappings() {
......@@ -390,9 +409,12 @@ aspect Mappings {
result.add(defaultBytesToTreeMapping(typeDecl.getName()));
result.add(defaultTreeToBytesMapping(typeDecl.getName()));
result.add(defaultBytesToListMapping(typeDecl.getName()));
result.add(deserializeListMapping(typeDecl.getName()));
}
result.add(defaultListToBytesMapping());
result.add(defaultJavaUtilListToBytesMapping());
result.add(serializeListMapping());
result.add(serializeJavaUtilListMapping());
// // string conversion
// result.add(defaultStringToBooleanMapping());
// result.add(defaultStringToIntMapping());
......
......@@ -36,6 +36,24 @@ aspect GeneratedNavigation {
syn boolean EndpointTarget.isRelationEndpointTarget() = false;
eq RelationEndpointTarget.isRelationEndpointTarget() = true;
/** Tests if TemplateDefaultMappingDefinition is a SerializeListMapping.
* @return 'true' if this is a SerializeListMapping, otherwise 'false'
*/
syn boolean TemplateDefaultMappingDefinition.isSerializeListMapping() = false;
eq SerializeListMapping.isSerializeListMapping() = true;
/** Tests if TemplateDefaultMappingDefinition is a SerializeJavaUtilListMapping.
* @return 'true' if this is a SerializeJavaUtilListMapping, otherwise 'false'
*/
syn boolean TemplateDefaultMappingDefinition.isSerializeJavaUtilListMapping() = false;
eq SerializeJavaUtilListMapping.isSerializeJavaUtilListMapping() = true;
/** Tests if TemplateDefaultMappingDefinition is a DeserializeListMapping.
* @return 'true' if this is a DeserializeListMapping, otherwise 'false'
*/
syn boolean TemplateDefaultMappingDefinition.isDeserializeListMapping() = false;
eq DeserializeListMapping.isDeserializeListMapping() = true;
/** casts a EndpointTarget into a TokenEndpointTarget if possible.
* @return 'this' cast to a TokenEndpointTarget or 'null'
*/
......@@ -80,6 +98,13 @@ aspect GeneratedNavigation {
}
aspect RagConnectNavigation {
// adapted from generated navigation, was defined only for DefaultMappingDefinition
/** Tests if MappingDefinition is a TemplateDefaultMappingDefinition.
* @return 'true' if this is a TemplateDefaultMappingDefinition, otherwise 'false'
*/
syn boolean MappingDefinition.isTemplateDefaultMappingDefinition() = false;
eq TemplateDefaultMappingDefinition.isTemplateDefaultMappingDefinition() = true;
// --- program ---
eq RagConnect.getChild().program() = getProgram();
......
......@@ -28,6 +28,10 @@ abstract MappingDefinitionType ::= ;
JavaMappingDefinitionType : MappingDefinitionType ::= Type:JavaTypeUse;
JavaArrayMappingDefinitionType : MappingDefinitionType ::= Type:JavaTypeUse;
DefaultMappingDefinition : MappingDefinition;
abstract TemplateDefaultMappingDefinition : DefaultMappingDefinition ;
SerializeListMapping : TemplateDefaultMappingDefinition ;
SerializeJavaUtilListMapping : TemplateDefaultMappingDefinition ;
DeserializeListMapping : TemplateDefaultMappingDefinition ::= <Name> ;
Handler ::= <ClassName> <UniqueName> <InUse:boolean>;
......
{{#isUsed}}
{{#isTemplateDefaultMappingDefinition}}
{{#isSerializeListMapping}}
public void {{configJastAddList}}.serialize(com.fasterxml.jackson.core.JsonGenerator g) throws SerializationException {
try {
g.writeStartArray();
for (T child : this) {
child.serialize(g);
}
g.writeEndArray();
} catch (java.io.IOException e) {
throw new SerializationException("unable to serialize {{configJastAddList}}", e);
}
}
{{/isSerializeListMapping}}
{{#SerializeJavaUtilListMapping}}
protected static <T extends ASTNode> void ASTNode.serializeJavaUtilList(
java.util.List<T> input, com.fasterxml.jackson.core.JsonGenerator g) throws SerializationException {
try {
g.writeStartArray();
for (T child : input) {
child.serialize(g);
}
g.writeEndArray();
} catch (java.io.IOException e) {
throw new SerializationException("unable to serialize list", e);
}
}
{{/SerializeJavaUtilListMapping}}
{{#DeserializeListMapping}}
public static {{configJastAddList}}<{{Name}}> {{Name}}.deserializeListOf{{Name}}(com.fasterxml.jackson.databind.node.ArrayNode node) throws DeserializationException {
{{configJastAddList}}<{{Name}}> result = new {{configJastAddList}}<>();
for (java.util.Iterator<com.fasterxml.jackson.databind.JsonNode> it = node.elements(); it.hasNext();) {
com.fasterxml.jackson.databind.JsonNode element = it.next();
result.add(deserialize(element));
}
return result;
}
{{/DeserializeListMapping}}
{{/isTemplateDefaultMappingDefinition}}
{{^TemplateDefaultMappingDefinition}}
protected {{{toType}}} ASTNode.{{methodName}}({{{fromType}}} {{FromVariableName}}) throws Exception {
{{{Content}}}
}
{{/TemplateDefaultMappingDefinition}}
{{/isUsed}}
......@@ -15,9 +15,7 @@ aspect RagConnect {
}
{{#allMappingDefinitions}}
{{#isUsed}}
{{> mappingDefinition}}
{{/isUsed}}
{{/allMappingDefinitions}}
{{#allDependencyDefinitionList}}
......@@ -65,7 +63,7 @@ aspect RagConnect {
return this;
}
{{> ListAspect}}
{{!{{> ListAspect}}
static void ASTNode.{{logConsoleOut}}(String message, Object... args) {
System.out.println(String.format(message, args));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment