You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2022/02/23 10:39:37 UTC

[plc4x] branch feature/cleaned-up-type-references updated (8afd22e -> 9ac5c0c)

This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a change to branch feature/cleaned-up-type-references
in repository https://gitbox.apache.org/repos/asf/plc4x.git.


    from 8afd22e  feat(codegen): Started clening up the type references
     add 3e72b95  build(deps): bump asciidoctorj from 2.5.1 to 2.5.3 (#322)
     add 7599dba  chore(plc4c): fixed jumping const fields
     new 8d36f18  Merge branch 'develop' into feature/cleaned-up-type-references
     new 9ac5c0c  refactor(codegen): cleanup type definitions

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../plc4x/language/c/CLanguageTemplateHelper.java  | 11 ++++---
 .../resources/templates/c/pojo-template.c.ftlh     |  4 ++-
 .../resources/templates/c/pojo-template.h.ftlh     |  4 ++-
 .../language/mspec/LazyTypeDefinitionConsumer.java |  3 +-
 .../definitions/DefaultComplexTypeDefinition.java  | 36 +++++++++++++++++-----
 .../DefaultDiscriminatedComplexTypeDefinition.java | 14 +++++----
 .../model/definitions/DefaultTypeDefinition.java   | 23 +++-----------
 .../mspec/parser/MessageFormatListener.java        | 28 ++++++-----------
 .../s7/include/s7_data_alarm_message.h             |  2 +-
 .../s7/include/s7_payload_user_data_item.h         |  8 ++---
 .../s7/src/s7_data_alarm_message.c                 |  8 ++---
 .../s7/src/s7_payload_user_data_item.c             | 28 ++++++++---------
 .../opcua/src/test/resources/log4j.properties      |  2 +-
 pom.xml                                            |  2 +-
 14 files changed, 91 insertions(+), 82 deletions(-)

[plc4x] 02/02: refactor(codegen): cleanup type definitions

Posted by sr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch feature/cleaned-up-type-references
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 9ac5c0cef6b685d607846c1088ec2c4267714c24
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Wed Feb 23 11:37:13 2022 +0100

    refactor(codegen): cleanup type definitions
---
 .../language/mspec/LazyTypeDefinitionConsumer.java |  3 +-
 .../definitions/DefaultComplexTypeDefinition.java  | 36 +++++++++++++++++-----
 .../DefaultDiscriminatedComplexTypeDefinition.java | 14 +++++----
 .../model/definitions/DefaultTypeDefinition.java   | 23 +++-----------
 .../mspec/parser/MessageFormatListener.java        | 28 ++++++-----------
 .../opcua/src/test/resources/log4j.properties      |  2 +-
 6 files changed, 55 insertions(+), 51 deletions(-)

diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/LazyTypeDefinitionConsumer.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/LazyTypeDefinitionConsumer.java
index 8945ccf..eb41858 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/LazyTypeDefinitionConsumer.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/LazyTypeDefinitionConsumer.java
@@ -19,11 +19,12 @@
 package org.apache.plc4x.plugins.codegenerator.language.mspec;
 
 import org.apache.plc4x.plugins.codegenerator.types.definitions.ComplexTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.TypeDefinition;
 
 import java.util.function.Consumer;
 
 public interface LazyTypeDefinitionConsumer {
 
-    void setOrScheduleTypeDefinitionConsumer(String typeRefName, Consumer<ComplexTypeDefinition> setComplexTypeDefinition);
+    void setOrScheduleTypeDefinitionConsumer(String typeRefName, Consumer<TypeDefinition> setTypeDefinition);
 
 }
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultComplexTypeDefinition.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultComplexTypeDefinition.java
index 231b178..bc878dd 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultComplexTypeDefinition.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultComplexTypeDefinition.java
@@ -30,6 +30,7 @@ public class DefaultComplexTypeDefinition extends DefaultTypeDefinition implemen
 
     private final boolean isAbstract;
     private final List<Field> fields;
+    protected ComplexTypeDefinition parentType;
 
     public DefaultComplexTypeDefinition(String name, Map<String, Term> attributes, List<Argument> parserArguments, boolean isAbstract, List<Field> fields) {
         super(name, attributes, parserArguments);
@@ -37,6 +38,30 @@ public class DefaultComplexTypeDefinition extends DefaultTypeDefinition implemen
         this.fields = Objects.requireNonNull(fields);
     }
 
+    public Optional<ComplexTypeDefinition> getParentType() {
+        return Optional.ofNullable(parentType);
+    }
+
+    public void setParentType(ComplexTypeDefinition parentType) {
+        this.parentType = parentType;
+    }
+
+    public Optional<List<Argument>> getAllParserArguments() {
+        List<Argument> allArguments = new ArrayList<>();
+        getParentType()
+            .map(ComplexTypeDefinition::getParserArguments)
+            .map(arguments -> arguments.orElse(Collections.emptyList()))
+            .map(allArguments::addAll);
+        if (parserArguments != null) {
+            allArguments.addAll(parserArguments);
+        }
+        if (allArguments.isEmpty()) {
+            return Optional.empty();
+        }
+        return Optional.of(allArguments);
+    }
+
+
     public boolean isAbstract() {
         return isAbstract;
     }
@@ -104,19 +129,16 @@ public class DefaultComplexTypeDefinition extends DefaultTypeDefinition implemen
     @Override
     public List<PropertyField> getAllPropertyFields() {
         List<PropertyField> fields = new LinkedList<>();
-        if (getParentType() != null) {
-            fields.addAll(((ComplexTypeDefinition) getParentType()).getAllPropertyFields());
-        }
+        getParentType()
+            .map(ComplexTypeDefinition::getAllPropertyFields)
+            .map(fields::addAll);
         fields.addAll(getPropertyFields());
         return fields;
     }
 
     @Override
     public List<PropertyField> getParentPropertyFields() {
-        if (getParentType() == null) {
-            return Collections.emptyList();
-        }
-        return ((ComplexTypeDefinition) getParentType()).getAllPropertyFields();
+        return getParentType().map(ComplexTypeDefinition::getAllPropertyFields).orElse(Collections.emptyList());
     }
 
     @Override
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java
index 8ee2dda..7a9bacd 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java
@@ -27,6 +27,7 @@ import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 
 public class DefaultDiscriminatedComplexTypeDefinition extends DefaultComplexTypeDefinition implements DiscriminatedComplexTypeDefinition {
 
@@ -37,14 +38,15 @@ public class DefaultDiscriminatedComplexTypeDefinition extends DefaultComplexTyp
         this.discriminatorValueTerms = Objects.requireNonNull(discriminatorValueTerms);
     }
 
-    public DiscriminatorField getDiscriminatorField() {
+    public Optional<DiscriminatorField> getDiscriminatorField() {
         // For a discriminated type, the discriminator is always defined in the parent type,
         // which is always a DefaultComplexTypeDefinition instance.
-        return ((DefaultComplexTypeDefinition) getParentType()).getFields().stream()
-            .filter(field -> field instanceof DiscriminatorField)
-            .map(field -> (DiscriminatorField) field)
-            .findFirst()
-            .orElse(null);
+        return getParentType()
+            .flatMap(parentType -> parentType.getFields().stream()
+                .filter(field -> field instanceof DiscriminatorField)
+                .map(DiscriminatorField.class::cast)
+                .findFirst()
+            );
     }
 
     public List<Term> getDiscriminatorValueTerms() {
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultTypeDefinition.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultTypeDefinition.java
index 3da1c70..89145fd 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultTypeDefinition.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultTypeDefinition.java
@@ -20,7 +20,6 @@ package org.apache.plc4x.plugins.codegenerator.language.mspec.model.definitions;
 
 
 import org.apache.plc4x.plugins.codegenerator.types.definitions.Argument;
-import org.apache.plc4x.plugins.codegenerator.types.definitions.TypeDefinition;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.*;
@@ -30,13 +29,11 @@ public abstract class DefaultTypeDefinition {
     protected final String name;
     private final Map<String, Term> attributes;
     protected final List<Argument> parserArguments;
-    protected TypeDefinition parentType;
 
     public DefaultTypeDefinition(String name, Map<String, Term> attributes, List<Argument> parserArguments) {
         this.name = Objects.requireNonNull(name);
         this.attributes = attributes;
         this.parserArguments = parserArguments;
-        this.parentType = null;
     }
 
     public String getName() {
@@ -56,31 +53,21 @@ public abstract class DefaultTypeDefinition {
 
     public Optional<List<Argument>> getAllParserArguments() {
         List<Argument> allArguments = new ArrayList<>();
-        if (getParentType() != null) {
-            final TypeDefinition parentType = getParentType();
-            allArguments.addAll(parentType.getParserArguments().orElse(Collections.emptyList()));
-        }
         if (parserArguments != null) {
             allArguments.addAll(parserArguments);
         }
+        if (allArguments.isEmpty()) {
+            return Optional.empty();
+        }
         return Optional.of(allArguments);
     }
 
-    public TypeDefinition getParentType() {
-        return parentType;
-    }
-
-    public void setParentType(TypeDefinition parentType) {
-        this.parentType = parentType;
-    }
-
     @Override
     public String toString() {
         return "DefaultTypeDefinition{" +
             "name='" + name + '\'' +
             ", attributes=" + attributes +
             ", parserArguments=" + parserArguments +
-            ", parentType=" + parentType +
             '}';
     }
 
@@ -89,11 +76,11 @@ public abstract class DefaultTypeDefinition {
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
         DefaultTypeDefinition that = (DefaultTypeDefinition) o;
-        return name.equals(that.name) && Objects.equals(attributes, that.attributes) && Objects.equals(parserArguments, that.parserArguments) && Objects.equals(parentType, that.parentType);
+        return name.equals(that.name) && Objects.equals(attributes, that.attributes) && Objects.equals(parserArguments, that.parserArguments);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(name, attributes, parserArguments, parentType);
+        return Objects.hash(name, attributes, parserArguments);
     }
 }
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
index 3f81f25..01dae27 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
@@ -58,7 +58,7 @@ public class MessageFormatListener extends MSpecBaseListener implements LazyType
 
     protected Map<String, TypeDefinition> types;
 
-    protected Map<String, List<Consumer<ComplexTypeDefinition>>> typeDefinitionConsumers = new HashMap<>();
+    protected Map<String, List<Consumer<TypeDefinition>>> typeDefinitionConsumers = new HashMap<>();
 
     private Stack<Map<String, Term>> batchSetAttributes = new Stack<>();
 
@@ -127,14 +127,6 @@ public class MessageFormatListener extends MSpecBaseListener implements LazyType
             DefaultDataIoTypeDefinition type = new DefaultDataIoTypeDefinition(typeName, attributes, parserArguments, switchField);
             dispatchType(typeName, type);
 
-            // Set the parent type for all sub-types.
-            if (switchField != null) {
-                for (DiscriminatedComplexTypeDefinition subtype : switchField.getCases()) {
-                    if (subtype instanceof DefaultDiscriminatedComplexTypeDefinition) {
-                        ((DefaultDiscriminatedComplexTypeDefinition) subtype).setParentType(type);
-                    }
-                }
-            }
             parserContexts.pop();
         } else { // Handle all other types.
             // If the type has sub-types it's an abstract type.
@@ -236,7 +228,7 @@ public class MessageFormatListener extends MSpecBaseListener implements LazyType
     public void enterEnumField(MSpecParser.EnumFieldContext ctx) {
         String typeRefName = ctx.type.complexTypeReference.getText();
         DefaultComplexTypeReference type = new DefaultComplexTypeReference(typeRefName, null);
-        setOrScheduleTypeDefinitionConsumer(typeRefName, type::setComplexTypeDefinition);
+        setOrScheduleTypeDefinitionConsumer(typeRefName, type::setTypeDefinition);
         String name = getIdString(ctx.name);
         String fieldName = null;
         if (ctx.fieldName != null) {
@@ -542,7 +534,7 @@ public class MessageFormatListener extends MSpecBaseListener implements LazyType
         } else {
             String typeRefName = ctx.complexTypeReference.getText();
             DefaultComplexTypeReference type = new DefaultComplexTypeReference(typeRefName, getParams(ctx.params));
-            setOrScheduleTypeDefinitionConsumer(typeRefName, type::setComplexTypeDefinition);
+            setOrScheduleTypeDefinitionConsumer(typeRefName, type::setTypeDefinition);
             return type;
         }
     }
@@ -664,11 +656,11 @@ public class MessageFormatListener extends MSpecBaseListener implements LazyType
 
     public void dispatchType(String typeName, TypeDefinition type) {
         LOGGER.debug("dispatching {}:{}", typeName, type);
-        List<Consumer<ComplexTypeDefinition>> waitingConsumers = typeDefinitionConsumers.getOrDefault(typeName, new LinkedList<>());
+        List<Consumer<TypeDefinition>> waitingConsumers = typeDefinitionConsumers.getOrDefault(typeName, new LinkedList<>());
         LOGGER.debug("{} waiting for {}", waitingConsumers.size(), typeName);
-        Iterator<Consumer<ComplexTypeDefinition>> consumerIterator = waitingConsumers.iterator();
+        Iterator<Consumer<TypeDefinition>> consumerIterator = waitingConsumers.iterator();
         while (consumerIterator.hasNext()) {
-            Consumer<ComplexTypeDefinition> setter = consumerIterator.next();
+            Consumer<TypeDefinition> setter = consumerIterator.next();
             LOGGER.debug("setting {} for {}", typeName, setter);
             setter.accept(type);
             consumerIterator.remove();
@@ -678,20 +670,20 @@ public class MessageFormatListener extends MSpecBaseListener implements LazyType
     }
 
     @Override
-    public void setOrScheduleTypeDefinitionConsumer(String typeRefName, Consumer<ComplexTypeDefinition> setComplexTypeDefinition) {
+    public void setOrScheduleTypeDefinitionConsumer(String typeRefName, Consumer<TypeDefinition> setTypeDefinition) {
         LOGGER.debug("set or schedule {}", typeRefName);
         TypeDefinition typeDefinition = types.get(typeRefName);
         if (typeDefinition != null) {
-            LOGGER.debug("{} present so setting for {}", typeRefName, setComplexTypeDefinition);
+            LOGGER.debug("{} present so setting for {}", typeRefName, setTypeDefinition);
             // TODO: This should actually only be a complex-type, right?
-            setComplexTypeDefinition.accept((ComplexTypeDefinition) typeDefinition);
+            setTypeDefinition.accept((ComplexTypeDefinition) typeDefinition);
         } else {
             // put up order
             if (LOGGER.isDebugEnabled()) {
                 LOGGER.debug("{} already waiting for {}", typeDefinitionConsumers.getOrDefault(typeRefName, new LinkedList<>()).size(), typeRefName);
             }
             typeDefinitionConsumers.putIfAbsent(typeRefName, new LinkedList<>());
-            typeDefinitionConsumers.get(typeRefName).add(setComplexTypeDefinition);
+            typeDefinitionConsumers.get(typeRefName).add(setTypeDefinition);
         }
     }
 
diff --git a/plc4j/drivers/opcua/src/test/resources/log4j.properties b/plc4j/drivers/opcua/src/test/resources/log4j.properties
index 593679f..39bd8cb 100644
--- a/plc4j/drivers/opcua/src/test/resources/log4j.properties
+++ b/plc4j/drivers/opcua/src/test/resources/log4j.properties
@@ -20,5 +20,5 @@ appender.out.type=Console
 appender.out.name=out
 appender.out.layout.type=PatternLayout
 appender.out.layout.pattern=[%30.30t] %-30.30c{1} %-5p %m%n
-rootLogger.level=TRACE
+rootLogger.level=ERROR
 rootLogger.appenderRef.out.ref=out

[plc4x] 01/02: Merge branch 'develop' into feature/cleaned-up-type-references

Posted by sr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch feature/cleaned-up-type-references
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 8d36f18be57356c0b3549de4d8c85d90a360b546
Merge: 8afd22e 7599dba
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Wed Feb 23 11:11:10 2022 +0100

    Merge branch 'develop' into feature/cleaned-up-type-references

 .../plc4x/language/c/CLanguageTemplateHelper.java  | 11 +++++----
 .../resources/templates/c/pojo-template.c.ftlh     |  4 +++-
 .../resources/templates/c/pojo-template.h.ftlh     |  4 +++-
 .../s7/include/s7_data_alarm_message.h             |  2 +-
 .../s7/include/s7_payload_user_data_item.h         |  8 +++----
 .../s7/src/s7_data_alarm_message.c                 |  8 +++----
 .../s7/src/s7_payload_user_data_item.c             | 28 +++++++++++-----------
 pom.xml                                            |  2 +-
 8 files changed, 36 insertions(+), 31 deletions(-)