You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2019/12/13 09:28:45 UTC

[plc4x] branch feature/knxnet-ip-3 created (now 70ce8d5)

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

cdutz pushed a change to branch feature/knxnet-ip-3
in repository https://gitbox.apache.org/repos/asf/plc4x.git.


      at 70ce8d5  Merge branch 'develop' of https://gitbox.apache.org/repos/asf/plc4x into feature/knxnet-ip-3

This branch includes the following new commits:

     new 70ce8d5  Merge branch 'develop' of https://gitbox.apache.org/repos/asf/plc4x into feature/knxnet-ip-3

The 1 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.



[plc4x] 01/01: Merge branch 'develop' of https://gitbox.apache.org/repos/asf/plc4x into feature/knxnet-ip-3

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

cdutz pushed a commit to branch feature/knxnet-ip-3
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 70ce8d5c9a51743d2f29ff7a6f5aa69b07445f38
Merge: 1cf8c1c 9db632c
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Fri Dec 13 10:18:48 2019 +0100

    Merge branch 'develop' of https://gitbox.apache.org/repos/asf/plc4x into feature/knxnet-ip-3
    
     Conflicts:
    	build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
    	build-utils/language-java/src/main/resources/templates/java/io-template.ftlh
    	build-utils/language-java/src/main/resources/templates/java/pojo-template.ftlh
    	build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java

 Jenkinsfile                                        |    9 +-
 RELEASE_NOTES                                      |    2 +-
 .../freemarker/FreemarkerLanguageOutput.java       |   83 +-
 .../plc4x/language/java/JavaLanguageOutput.java    |    5 +
 .../language/java/JavaLanguageTemplateHelper.java  |   21 +-
 .../templates/java/enum-package-info-template.ftlh |   39 +
 .../main/resources/templates/java/io-template.ftlh |   11 +-
 .../resources/templates/java/pojo-template.ftlh    |    3 +-
 build-utils/protocol-base-mspec/pom.xml            |   37 +
 .../plugins/codegenerator/language/mspec/MSpec.g4  |   12 +-
 .../mspec/expression/ExpressionStringListener.java |   32 +-
 .../mspec/expression/ExpressionStringParser.java   |   14 +-
 .../definitions/DefaultComplexTypeDefinition.java  |    8 +-
 .../DefaultDiscriminatedComplexTypeDefinition.java |    2 +-
 .../definitions/DefaultEnumTypeDefinition.java     |    2 +-
 .../mspec/parser/MessageFormatListener.java        |   86 +-
 .../language/mspec/parser/MessageFormatParser.java |   17 +-
 .../expression/ExpressionStringParserTest.java     |  177 ++++
 .../mspec/parser/MessageFormatParserTest.java      |   43 +
 .../src/test/resources/mspec.example               |  359 +++++++
 .../org/apache/plc4x/java/abeth/AbEthDriver.java   |    8 +-
 .../java/abeth/connection/AbEthPlcConnection.java  |   16 +-
 .../apache/plc4x/java/abeth/model/AbEthField.java  |    7 +-
 .../java/abeth/protocol/Plc4xAbEthProtocol.java    |    8 +-
 plc4j/examples/hello-world-plc4x/pom.xml           |    7 +
 plc4j/integrations/apache-kafka/README.md          |    2 +-
 .../apache-kafka/config/plc4x-source.properties    |   48 +-
 plc4j/integrations/logstash-plugin/README.md       |    2 +-
 .../src/gem/lib/logstash-input-plc4x_jars.rb       |    2 +-
 .../java/org/apache/plc4x/karaf/FeatureIT.java     |    2 +-
 .../karaf-features/s7/src/main/feature/feature.xml |    2 +-
 .../java/isoontcp/protocol/IsoOnTcpProtocol.java   |   10 +
 pom.xml                                            |    2 +-
 .../amsads}/pom.xml                                |   42 +-
 .../plc4x/protocol/amsads/AMSADSProtocol.java      |   46 +
 ...e.plc4x.plugins.codegenerator.protocol.Protocol |   38 +
 .../main/resources/protocols/amsads/amsads.mspec   |  359 +++++++
 protocols/pom.xml                                  |    1 +
 sandbox/plc4net/api/pom.xml                        |    2 +-
 sandbox/plc4net/plc4net.driver/pom.xml             |    2 +-
 sandbox/pom.xml                                    |    1 +
 .../README.adoc                                    |    6 +-
 sandbox/test-java-amsads-driver/pom.xml            |  180 ++++
 .../apache/plc4x/java/amsads/AMSADSPlcDriver.java  |  121 +++
 .../connection/AdsAbstractPlcConnection.java       |  230 +++++
 .../amsads/connection/AdsConnectionFactory.java    |   57 ++
 .../amsads/connection/AdsSerialPlcConnection.java  |   67 ++
 .../amsads/connection/AdsTcpPlcConnection.java     |  372 +++++++
 .../plc4x/java/amsads/model/AdsDataType.java       |  577 +++++++++++
 .../apache/plc4x/java/amsads/model/AdsField.java   |   26 +
 .../java/amsads/model/AdsPlcFieldHandler.java      | 1015 ++++++++++++++++++++
 .../java/amsads/model/AdsSubscriptionHandle.java   |   84 ++
 .../plc4x/java/amsads/model/DirectAdsField.java    |  141 +++
 .../plc4x/java/amsads/model/SymbolicAdsField.java  |  105 ++
 .../plc4x/java/amsads/model/package-info.java      |   22 +
 .../java/amsads/protocol/Ads2PayloadProtocol.java  |   92 ++
 .../amsads/protocol/Payload2SerialProtocol.java    |  121 +++
 .../java/amsads/protocol/Payload2TcpProtocol.java  |   93 ++
 .../java/amsads/protocol/Plc4x2AdsProtocol.java    |  325 +++++++
 .../amsads/protocol/exception/AdsException.java    |   56 ++
 .../exception/AdsProtocolOverflowException.java    |   32 +
 .../java/amsads/protocol/util/DigestUtil.java      |   46 +
 .../amsads/protocol/util/LittleEndianDecoder.java  |  357 +++++++
 .../amsads/protocol/util/LittleEndianEncoder.java  |  285 ++++++
 .../protocol/util/SingleMessageRateLimiter.java    |  124 +++
 .../java/amsads/protocol/util/package-info.java    |   22 +
 .../services/org.apache.plc4x.java.spi.PlcDriver   |   38 +
 .../plc4x/java/amsads/AMSADSPlcDriverTest.java     |   42 +
 .../protocol/amsads/BenchmarkGeneratedDf1.java     |   80 ++
 .../plc4x/protocol/amsads/BenchmarkManualDf1.java  |  239 +++++
 .../org/apache/plc4x/protocol/amsads/Df1Test.java  |   30 +
 .../apache/plc4x/protocol/amsads/EndToEndTest.java |   56 ++
 .../org/apache/plc4x/protocol/amsads/IOTest.java   |   97 ++
 .../src/test/resources/testsuite/Df1Testsuite.xml  |  101 ++
 sandbox/test-java-df1-driver/README.adoc           |    2 +-
 src/main/script/prerequisiteCheck.groovy           |   17 +
 src/site/asciidoc/developers/code-gen/index.adoc   |   14 +-
 src/site/asciidoc/developers/release.adoc          |    2 +-
 src/site/asciidoc/developers/vm.adoc               |   14 +-
 src/site/asciidoc/protocols/ab-eth/index.adoc      |    2 +-
 src/site/asciidoc/protocols/features.adoc          |    8 +
 src/site/asciidoc/users/download.adoc              |    4 +-
 src/site/resources/css/site.css                    |    2 -
 src/site/site.xml                                  |    3 +-
 tools/boost/pom.xml                                |    3 +-
 85 files changed, 6641 insertions(+), 238 deletions(-)

diff --cc build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
index 9e67df1,6227d80..2804d4b
--- a/build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
+++ b/build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
@@@ -259,62 -237,74 +259,81 @@@ public class JavaLanguageTemplateHelpe
      public String getWriteBufferReadMethodCall(SimpleTypeReference simpleTypeReference, String fieldName) {
          switch (simpleTypeReference.getBaseType()) {
              case BIT: {
 -                return "writeBit((boolean) " + fieldName + ")";
 +                return "io.writeBit((boolean) " + fieldName + ")";
              }
              case UINT: {
 -                if (simpleTypeReference.getSize() <= 4) {
 -                    return "writeUnsignedByte(" + simpleTypeReference.getSize() + ", ((Number) " + fieldName + ").byteValue())";
 +                IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference;
 +                if (integerTypeReference.getSizeInBits() <= 4) {
 +                    return "io.writeUnsignedByte(" + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").byteValue())";
                  }
 -                if (simpleTypeReference.getSize() <= 8) {
 -                    return "writeUnsignedShort(" + simpleTypeReference.getSize() + ", ((Number) " + fieldName + ").shortValue())";
 +                if (integerTypeReference.getSizeInBits() <= 8) {
 +                    return "io.writeUnsignedShort(" + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").shortValue())";
                  }
 -                if (simpleTypeReference.getSize() <= 16) {
 -                    return "writeUnsignedInt(" + simpleTypeReference.getSize() + ", ((Number) " + fieldName + ").intValue())";
 +                if (integerTypeReference.getSizeInBits() <= 16) {
 +                    return "io.writeUnsignedInt(" + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").intValue())";
                  }
 -                if (simpleTypeReference.getSize() <= 32) {
 -                    return "writeUnsignedLong(" + simpleTypeReference.getSize() + ", ((Number) " + fieldName + ").longValue())";
 +                if (integerTypeReference.getSizeInBits() <= 32) {
 +                    return "io.writeUnsignedLong(" + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").longValue())";
                  }
-                 return "io.writeUnsignedBigInteger(" + integerTypeReference.getSizeInBits() + ", BigInteger.valueOf( " + fieldName + "))";
 -                return "writeUnsignedBigInteger(" + simpleTypeReference.getSize() + ", (BigInteger) " + fieldName + ")";
++                return "io.writeUnsignedBigInteger(" + integerTypeReference.getSizeInBits() + ", (BigInteger) " + fieldName + ")";
              }
              case INT: {
 -                if (simpleTypeReference.getSize() <= 8) {
 -                    return "writeByte(" + simpleTypeReference.getSize() + ", ((Number) " + fieldName + ").byteValue())";
 +                IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference;
 +                if (integerTypeReference.getSizeInBits() <= 8) {
 +                    return "io.writeByte(" + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").byteValue())";
                  }
 -                if (simpleTypeReference.getSize() <= 16) {
 -                    return "writeShort(" + simpleTypeReference.getSize() + ", ((Number) " + fieldName + ").shortValue())";
 +                if (integerTypeReference.getSizeInBits() <= 16) {
 +                    return "io.writeShort(" + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").shortValue())";
                  }
 -                if (simpleTypeReference.getSize() <= 32) {
 -                    return "writeInt(" + simpleTypeReference.getSize() + ", ((Number) " + fieldName + ").intValue())";
 +                if (integerTypeReference.getSizeInBits() <= 32) {
 +                    return "io.writeInt(" + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").intValue())";
                  }
 -                if (simpleTypeReference.getSize() <= 64) {
 -                    return "writeLong(" + simpleTypeReference.getSize() + ", ((Number) " + fieldName + ").longValue())";
 +                if (integerTypeReference.getSizeInBits() <= 64) {
 +                    return "io.writeLong(" + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").longValue())";
                  }
 -                return "writeBigInteger(" + simpleTypeReference.getSize() + ", (BigInteger) " + fieldName + ")";
 +                return "io.writeBigInteger(" + integerTypeReference.getSizeInBits() + ", BigInteger.valueOf( " + fieldName + "))";
              }
 -            case FLOAT: {
 -                if (simpleTypeReference.getSize() <= 32) {
 -                    return "writeFloat(" + simpleTypeReference.getSize() + ", (float) " + fieldName + ")";
 -                }
 -                if (simpleTypeReference.getSize() <= 64) {
 -                    return "writeDouble(" + simpleTypeReference.getSize() + ", (double) " + fieldName + ")";
 -                }
 -                return "writeBigDecimal(" + simpleTypeReference.getSize() + ", (BigDecimal) " + fieldName + ")";
 +            case FLOAT:
 +            case UFLOAT: {
 +                FloatTypeReference floatTypeReference = (FloatTypeReference) simpleTypeReference;
 +                StringBuilder sb = new StringBuilder();
 +                if(simpleTypeReference.getBaseType() == SimpleTypeReference.SimpleBaseType.FLOAT) {
 +                    sb.append("\n        boolean negative = value < 0;");
 +                    sb.append("\n        io.writeBit(negative);");
 +                }
 +                sb.append("\n        final int exponent = Math.getExponent(value);");
 +                sb.append("\n        final double mantissa = value / Math.pow(2, exponent);");
 +                sb.append("\n        io.writeInt(").append(floatTypeReference.getExponent()).append(", exponent);");
 +                sb.append("\n        io.writeDouble(").append(floatTypeReference.getMantissa()).append(", mantissa)");
 +                return sb.toString().substring(9);
              }
              case STRING: {
 -                return "writeString(" + simpleTypeReference.getSize() + ", (String) " + fieldName + ")";
 +                IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference;
 +                return "io.writeString(" + integerTypeReference.getSizeInBits() + ", (String) " + fieldName + ")";
              }
          }
          return "Hurz";
      }
  
+     public String getReadMethodName(SimpleTypeReference simpleTypeReference) {
+         String languageTypeName = getLanguageTypeNameForSpecType(simpleTypeReference);
+         languageTypeName = languageTypeName.substring(0, 1).toUpperCase() + languageTypeName.substring(1);
+         if(simpleTypeReference.getBaseType().equals(SimpleTypeReference.SimpleBaseType.UINT)) {
+             return "readUnsigned" + languageTypeName;
+         } else {
+             return "read" + languageTypeName;
 -
+         }
+     }
+ 
+     public String getReservedValue(ReservedField reservedField) {
+         final String languageTypeName = getLanguageTypeName(reservedField.getType(), true);
+         if("BigInteger".equals(languageTypeName)) {
+             return "BigInteger.valueOf(" + reservedField.getReferenceValue() + ")";
+         } else {
+             return "(" + languageTypeName + ") " + reservedField.getReferenceValue();
+         }
+     }
+ 
      public Collection<ComplexTypeReference> getComplexTypes(ComplexTypeDefinition complexTypeDefinition) {
          Map<String, ComplexTypeReference> types = new HashMap<>();
          for (Field field : complexTypeDefinition.getFields()) {
diff --cc build-utils/language-java/src/main/resources/templates/java/io-template.ftlh
index cf7b880,c8d0783..aa26563
--- a/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh
+++ b/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh
@@@ -70,10 -69,13 +70,13 @@@ public class ${typeName}IO 
          <#-- If this is a count array, we can directly initialize an array with the given size -->
          <#if helper.isCountArray(field)>
          // Count array
-         int _${field.name}Count = ${helper.toDeserializationExpression(field.loopExpression, type.parserArguments)?no_esc};
+         if(${helper.toDeserializationExpression(field.loopExpression, type.parserArguments)?no_esc} > Integer.MAX_VALUE) {
+             throw new ParseException("Array count of " + (${helper.toDeserializationExpression(field.loopExpression, type.parserArguments)?no_esc}) + " exceeds the maximum allowed count of " + Integer.MAX_VALUE);
+         }
+         int _${field.name}Count = (int) ${helper.toDeserializationExpression(field.loopExpression, type.parserArguments)?no_esc};
          ${helper.getLanguageTypeNameForField(field)}[] ${field.name} = new ${helper.getLanguageTypeNameForField(field)}[_${field.name}Count];
          for(int i = 0; i < _${field.name}Count; i++) {
 -            ${field.name}[i] = <#if helper.isSimpleType(field.type)>io.${helper.getReadBufferReadMethodCall(field.type)}<#else>${field.type.name}IO.parse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getArgumentType(field.type, parserArgument?index)}) (${helper.toDeserializationExpression(parserArgument, type.parserArguments)?no_esc})<#sep>, </#sep></#list></#if>)</#if>;
 +            ${field.name}[i] = <#if helper.isSimpleType(field.type)>${helper.getReadBufferReadMethodCall(field.type)?no_esc}<#else>${field.type.name}IO.parse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getArgumentType(field.type, parserArgument?index)}) (${helper.toDeserializationExpression(parserArgument, type.parserArguments)?no_esc})<#sep>, </#sep></#list></#if>)</#if>;
          }
          <#-- In all other cases do we have to work with a list, that is later converted to an array -->
          <#else>
@@@ -237,8 -239,8 +240,8 @@@
  
          // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
          {
 -            ${helper.getLanguageTypeNameForField(field)} reserved = io.${helper.getReadBufferReadMethodCall(field.type)};
 +            ${helper.getLanguageTypeNameForField(field)} reserved = ${helper.getReadBufferReadMethodCall(field.type)?no_esc};
-             if(reserved != ${field.referenceValue}) {
+             if(reserved != ${helper.getReservedValue(field)}) {
                  LOGGER.info("Expected constant value " + ${field.referenceValue} + " but got " + reserved + " for reserved field.");
              }
          }
@@@ -360,7 -362,7 +363,7 @@@
      <#case "reserved">
  
          // Reserved Field
-         ${helper.getWriteBufferReadMethodCall(field.type, field.referenceValue)?no_esc};
 -        io.${helper.getWriteBufferReadMethodCall(field.type, helper.getReservedValue(field))};
++        ${helper.getWriteBufferReadMethodCall(field.type, helper.getReservedValue(field))?no_esc};
          <#break>
      <#case "simple">
  
diff --cc build-utils/language-java/src/main/resources/templates/java/pojo-template.ftlh
index 9e746be,f2c5c74..6699a5f
--- a/build-utils/language-java/src/main/resources/templates/java/pojo-template.ftlh
+++ b/build-utils/language-java/src/main/resources/templates/java/pojo-template.ftlh
@@@ -38,14 -38,12 +38,15 @@@ ${helper.packageName(protocolName, lang
  
  package ${helper.packageName(protocolName, languageName, outputFlavor)};
  
- <#if helper.getEnumTypes(type)?has_content>import ${helper.packageName(protocolName, languageName, outputFlavor)}.types.*;</#if>
+ import ${helper.packageName(protocolName, languageName, outputFlavor)}.types.*;
  
  import com.fasterxml.jackson.annotation.*;
 +import org.apache.commons.lang3.builder.ToStringBuilder;
 +import org.apache.commons.lang3.builder.ToStringStyle;
  import org.apache.plc4x.java.utils.Message;
  
 +import java.util.Objects;
+ import java.math.BigInteger;
  
  <#if type.abstract>@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "className")</#if>
  public<#if type.abstract> abstract</#if> class ${typeName}<#if type.parentType??> extends ${type.parentType.name}</#if> implements Message {
diff --cc build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
index 03270ea,57214a5..7ae5f5a
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
+++ b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
@@@ -385,8 -390,15 +393,8 @@@ public class MessageFormatListener exte
      }
  
      private TypeReference getTypeReference(MSpecParser.TypeReferenceContext ctx) {
-         if(ctx.simpleTypeReference != null) {
-             return getSimpleTypeReference(ctx.simpleTypeReference);
+         if (ctx.simpleTypeReference != null) {
 -            SimpleTypeReference.SimpleBaseType simpleBaseType = SimpleTypeReference.SimpleBaseType.valueOf(
 -                ctx.simpleTypeReference.base.getText().toUpperCase());
 -            if (ctx.simpleTypeReference.size != null) {
 -                int size = Integer.parseInt(ctx.simpleTypeReference.size.getText());
 -                return new DefaultSimpleTypeReference(simpleBaseType, size);
 -            } else {
 -                return new DefaultSimpleTypeReference(simpleBaseType, 1);
 -            }
++            return getSimpleTypeReference (ctx.simpleTypeReference);
          } else {
              return new DefaultComplexTypeReference(ctx.complexTypeReference.getText());
          }
@@@ -395,20 -407,11 +403,20 @@@
      private SimpleTypeReference getSimpleTypeReference(MSpecParser.DataTypeContext ctx) {
          SimpleTypeReference.SimpleBaseType simpleBaseType =
              SimpleTypeReference.SimpleBaseType.valueOf(ctx.base.getText().toUpperCase());
 +        // If a size it specified its a simple integer length based type.
-         if(ctx.size != null) {
+         if (ctx.size != null) {
              int size = Integer.parseInt(ctx.size.getText());
 -            return new DefaultSimpleTypeReference(simpleBaseType, size);
 -        } else {
 -            return new DefaultSimpleTypeReference(simpleBaseType, 1);
 +            return new DefaultIntegerTypeReference(simpleBaseType, size);
 +        }
 +        // If exponent and mantissa are present, it's a floating point representation.
 +        else if((ctx.exponent != null) && (ctx.mantissa != null)) {
 +            int exponent = Integer.parseInt(ctx.exponent.getText());
 +            int mantissa = Integer.parseInt(ctx.mantissa.getText());
 +            return new DefaultFloatTypeReference(simpleBaseType, exponent, mantissa);
 +        }
 +        // In all other cases (bit) it's just assume it's length it 1.
 +        else {
 +            return new DefaultIntegerTypeReference(simpleBaseType, 1);
          }
      }
  
diff --cc sandbox/pom.xml
index 10311f9,3173d2e..1d59822
--- a/sandbox/pom.xml
+++ b/sandbox/pom.xml
@@@ -37,21 -37,14 +37,22 @@@
    <modules>
      <module>code-gen</module>
      <module>plc-simulator</module>
 -    <module>streampipes-connectors</module>
  
+     <module>test-java-amsads-driver</module>
      <module>test-java-bacnetip-driver</module>
 +
 +    <module>test-java-df1-driver</module>
 +
      <module>test-java-knxnetip-driver</module>
 +    <module>test-java-knxnetip-driver-passive</module>
 +    <module>test-java-knxnetip-shared</module>
 +
      <module>test-java-s7-driver</module>
 -    <module>test-java-passive-s7-driver</module>
 -    <module>test-java-df1-driver</module>
 +    <module>test-java-s7-driver-passive</module>
 +
 +    <module>test-streampipes-plc4x-adapters</module>
 +    <module>test-streampipes-plc4x-processors</module>
 +    <module>test-streampipes-plc4x-shared</module>
    </modules>
  
    <profiles>