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