You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by jf...@apache.org on 2019/05/05 13:18:34 UTC
[plc4x] 02/02: Added Setters to Pojos, did really awesome stuff.
This is an automated email from the ASF dual-hosted git repository.
jfeinauer pushed a commit to branch feature/code-gen
in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit 579b723000c0d491afd91b449593c31e11e15f45
Author: Julian Feinauer <j....@pragmaticminds.de>
AuthorDate: Sun May 5 15:18:20 2019 +0200
Added Setters to Pojos, did really awesome stuff.
---
.../java/org/apache/plc4x/codegen/DFDLUtil.java | 43 +++++++++++++++++++++-
.../org/apache/plc4x/codegen/ast/EnumFactory.java | 11 +++++-
.../org/apache/plc4x/codegen/ast/PojoFactory.java | 31 +++++++++++++---
.../org/apache/plc4x/codegen/ast/Primitive.java | 1 +
.../org/apache/plc4x/codegen/DFDLUtilTest.java | 2 -
5 files changed, 76 insertions(+), 12 deletions(-)
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/DFDLUtil.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/DFDLUtil.java
index 08331b3..04e0eb1 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/DFDLUtil.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/DFDLUtil.java
@@ -1,5 +1,13 @@
package org.apache.plc4x.codegen;
+import org.apache.plc4x.codegen.ast.ClassDefinition;
+import org.apache.plc4x.codegen.ast.CodeWriter;
+import org.apache.plc4x.codegen.ast.Generator;
+import org.apache.plc4x.codegen.ast.JavaGenerator;
+import org.apache.plc4x.codegen.ast.PojoFactory;
+import org.apache.plc4x.codegen.ast.Primitive;
+import org.apache.plc4x.codegen.ast.PythonGenerator;
+import org.apache.plc4x.codegen.ast.TypeNode;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
@@ -8,6 +16,8 @@ import org.dom4j.QName;
import org.dom4j.io.SAXReader;
import java.io.File;
+import java.sql.SQLOutput;
+import java.util.ArrayList;
import java.util.Iterator;
/**
@@ -17,22 +27,51 @@ public class DFDLUtil {
private static final Namespace xsNamespace = new Namespace("xs", "http://www.w3.org/2001/XMLSchema");
private static final QName complexType = new QName("complexType", xsNamespace);
+ private static final QName sequence = new QName("sequence", xsNamespace);
+ private static final QName ELEMENT = new QName("element", xsNamespace);
public void transform(File dfdlSchemaFile, File outputDir) {
assert outputDir.exists();
assert outputDir.isDirectory();
-
final Document schema = parseDFDLSchema(dfdlSchemaFile);
final Iterator<Element> iterator = getMainTypes(schema);
+ final PojoFactory factory = new PojoFactory();
while (iterator.hasNext()) {
final Element element = iterator.next();
- System.out.println(element);
+ final Iterator<Element> sequenceIterator = element.elementIterator(sequence);
+ final Element sequence = getSequence(sequenceIterator);
+
+ // Now make a POJO with all "elements" as fields
+ final ArrayList<PojoFactory.Field> fields = new ArrayList<>();
+ final Iterator<Element> elementIterator = sequence.elementIterator(ELEMENT);
+ while (elementIterator.hasNext()) {
+ final Element elem = elementIterator.next();
+ fields.add(new PojoFactory.Field(new TypeNode(elem.attributeValue("type")), elem.attributeValue("name")));
+ }
+ final PojoFactory.PojoDescription desc = new PojoFactory.PojoDescription(element.attributeValue("name"), fields);
+ final ClassDefinition classDefinition = factory.create(desc);
+
+ // Now generate the code for that
+ final CodeWriter writer = new CodeWriter(4);
+ final Generator generator = new JavaGenerator(writer);
+ classDefinition.write(generator);
+
+ System.out.println("Class Definition");
+ System.out.println("----------------------------");
+ System.out.println(writer.getCode());
}
}
+ private Element getSequence(Iterator<Element> sequenceIterator) {
+ assert sequenceIterator.hasNext();
+ final Element sequence = sequenceIterator.next();
+ assert sequenceIterator.hasNext() == false;
+ return sequence;
+ }
+
private Document parseDFDLSchema(File schemaFile) {
try {
SAXReader reader = new SAXReader();
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/EnumFactory.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/EnumFactory.java
index b1b422f..40b2494 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/EnumFactory.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/EnumFactory.java
@@ -27,7 +27,7 @@ public class EnumFactory {
// Create the Getters
final List<MethodDefinition> getters = desc.fields.stream()
- .map(field -> getMethodDefinition(field.getName(), field.getType()))
+ .map(field -> getGetterDefinition(field.getName(), field.getType()))
.collect(Collectors.toList());
// Now add all these getters
@@ -59,12 +59,19 @@ public class EnumFactory {
return new ClassDefinition("", desc.getName(), finalFields, Arrays.asList(constructor), methods, null);
}
- static MethodDefinition getMethodDefinition(String name, TypeNode type) {
+ static MethodDefinition getGetterDefinition(String name, TypeNode type) {
String getter = "get" + name.substring(0, 1).toUpperCase() + name.substring(1);
Block body = new Block(new ReturnStatement(new FieldReference(type, name)));
return new MethodDefinition(getter, type, Collections.emptyList(), body);
}
+ static MethodDefinition getSetterDefinition(String name, TypeNode type) {
+ String getter = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
+ final ParameterExpression param = new ParameterExpression(type, name);
+ Block body = new Block(new AssignementExpression(new FieldReference(type, name), param));
+ return new MethodDefinition(getter, type, Collections.singletonList(param), body);
+ }
+
public static class EnumEntry {
private final String name;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PojoFactory.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PojoFactory.java
index 3f01e99..c775a0c 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PojoFactory.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PojoFactory.java
@@ -4,13 +4,17 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
-import java.util.function.Function;
import java.util.stream.Collectors;
-import static org.apache.plc4x.codegen.ast.EnumFactory.getMethodDefinition;
+import static org.apache.plc4x.codegen.ast.EnumFactory.getGetterDefinition;
+import static org.apache.plc4x.codegen.ast.EnumFactory.getSetterDefinition;
public class PojoFactory {
+ private TypeNode BUFFER_TYPE;
+
+ private Method readByte = new Method(BUFFER_TYPE, "readByte", Primitive.BYTE, Collections.emptyList(), Collections.emptyList());
+
public ClassDefinition create(PojoDescription desc) {
// Create all Fields first
final List<FieldDeclaration> fields = desc.fields.stream()
@@ -19,21 +23,36 @@ public class PojoFactory {
// Create the Getters
final List<MethodDefinition> getters = desc.fields.stream()
- .map(field -> getMethodDefinition(field.getName(), field.getType()))
+ .map(field -> getGetterDefinition(field.getName(), field.getType()))
+ .collect(Collectors.toList());
+
+ // Create the Setters
+ final List<MethodDefinition> setters = desc.fields.stream()
+ .map(field -> getSetterDefinition(field.getName(), field.getType()))
.collect(Collectors.toList());
final List<MethodDefinition> methods = new ArrayList<>();
methods.addAll(getters);
+ methods.addAll(setters);
+
// Encode Method
methods.add(new MethodDefinition("encode", Primitive.VOID, Collections.singletonList(
new ParameterExpression(new TypeNode("org.apache.plc4x.api.Buffer"), "buffer")
), new Block()));
// Decode Method
- methods.add(new MethodDefinition(Collections.singleton(Modifier.STATIC), "decode", new TypeNode(desc.getName()), Collections.singletonList(
- new ParameterExpression(new TypeNode("org.apache.plc4x.api.Buffer"), "buffer")
- ), new Block()));
+ BUFFER_TYPE = new TypeNode("org.apache.plc4x.api.Buffer");
+ final ParameterExpression buffer = new ParameterExpression(BUFFER_TYPE, "buffer");
+ final TypeNode clazz = new TypeNode(desc.getName());
+ final ParameterExpression instance = new ParameterExpression(clazz, "instance");
+ methods.add(new MethodDefinition(Collections.singleton(Modifier.STATIC), "decode", clazz, Collections.singletonList(
+ buffer
+ ), new Block(
+ new AssignementExpression(instance, new NewExpression(clazz)),
+ new CallExpression(readByte, buffer),
+ new ReturnStatement(instance)
+ )));
return new ClassDefinition("", desc.getName(), fields, Arrays.asList(new ConstructorDeclaration(Collections.emptyList(), new Block())), methods, null);
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Primitive.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Primitive.java
index fcfeef9..e820859 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Primitive.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Primitive.java
@@ -4,6 +4,7 @@ public class Primitive extends TypeNode {
public static final TypeNode DOUBLE = new Primitive("double");
public static final TypeNode VOID = new Primitive("Void");
+ public static final TypeNode BYTE = new Primitive("byte");
public Primitive(String typeString) {
super(typeString);
diff --git a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/DFDLUtilTest.java b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/DFDLUtilTest.java
index df89b0c..e424681 100644
--- a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/DFDLUtilTest.java
+++ b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/DFDLUtilTest.java
@@ -4,8 +4,6 @@ import org.junit.Test;
import java.io.File;
-import static org.junit.Assert.*;
-
public class DFDLUtilTest {
@Test