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

cdutz pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit dc22f3a0aac9cb7020d8cfbd7196dadb69a9671d
Author: Christofer Dutz <[email protected]>
AuthorDate: Tue Sep 24 09:57:46 2019 +0200

    - Changed the templates for the IO classes to no longer implement the 
MessageIO or MessageInput interfaces
    - The parse and serialize methods now take all arguments as real arguments 
and no longer as var args object array
    - No instances of IO modules are needed as now the parse and serialize 
methods are static (Needed to avoid stack overflows if types embed themselves)
    - Number of minor improvements
---
 .../org/apache/plc4x/java/utils/MessageInput.java  |  2 +-
 .../org/apache/plc4x/java/utils/MessageOutput.java |  2 +-
 .../protocol/test/ProtocolTestsuiteRunner.java     | 33 ++++++++++++++++------
 3 files changed, 27 insertions(+), 10 deletions(-)

diff --git 
a/plc4j/utils/driver-base-java/src/main/java/org/apache/plc4x/java/utils/MessageInput.java
 
b/plc4j/utils/driver-base-java/src/main/java/org/apache/plc4x/java/utils/MessageInput.java
index b83afa0..02ac2c8 100644
--- 
a/plc4j/utils/driver-base-java/src/main/java/org/apache/plc4x/java/utils/MessageInput.java
+++ 
b/plc4j/utils/driver-base-java/src/main/java/org/apache/plc4x/java/utils/MessageInput.java
@@ -20,6 +20,6 @@ package org.apache.plc4x.java.utils;
 
 public interface MessageInput<PARSER_TYPE> {
 
-    PARSER_TYPE parse(ReadBuffer io, Object... args) throws ParseException;
+    PARSER_TYPE parse(ReadBuffer io) throws ParseException;
 
 }
diff --git 
a/plc4j/utils/driver-base-java/src/main/java/org/apache/plc4x/java/utils/MessageOutput.java
 
b/plc4j/utils/driver-base-java/src/main/java/org/apache/plc4x/java/utils/MessageOutput.java
index c76ade2..e15113c 100644
--- 
a/plc4j/utils/driver-base-java/src/main/java/org/apache/plc4x/java/utils/MessageOutput.java
+++ 
b/plc4j/utils/driver-base-java/src/main/java/org/apache/plc4x/java/utils/MessageOutput.java
@@ -20,6 +20,6 @@ package org.apache.plc4x.java.utils;
 
 public interface MessageOutput<SERIALIZER_TYPE> {
 
-    void serialize(WriteBuffer io, SERIALIZER_TYPE value, Object... args) 
throws ParseException;
+    void serialize(WriteBuffer io, SERIALIZER_TYPE value) throws 
ParseException;
 
 }
diff --git 
a/plc4j/utils/protocol-test-utils/src/main/java/org/apache/plc4x/protocol/test/ProtocolTestsuiteRunner.java
 
b/plc4j/utils/protocol-test-utils/src/main/java/org/apache/plc4x/protocol/test/ProtocolTestsuiteRunner.java
index 9e8a3f1..8fbf7f7 100644
--- 
a/plc4j/utils/protocol-test-utils/src/main/java/org/apache/plc4x/protocol/test/ProtocolTestsuiteRunner.java
+++ 
b/plc4j/utils/protocol-test-utils/src/main/java/org/apache/plc4x/protocol/test/ProtocolTestsuiteRunner.java
@@ -39,6 +39,7 @@ import org.xmlunit.diff.Diff;
 
 import java.io.InputStream;
 import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.*;
 
 public class ProtocolTestsuiteRunner {
@@ -139,18 +140,34 @@ public class ProtocolTestsuiteRunner {
 
     private MessageIO getMessageIOForTestcase(Testcase testcase) throws 
ProtocolTestsuiteException {
         String className = 
testcase.getXml().elements().get(0).attributeValue(new QName("className"));
+        String ioRootClassName = className.substring(0, 
className.lastIndexOf('.') + 1) + testcase.getRootType();
         String ioClassName = className.substring(0, className.lastIndexOf('.') 
+ 1) + "io." +
             testcase.getRootType() + "IO";
         try {
+            Class<?> ioRootClass = Class.forName(ioRootClassName);
             Class<?> ioClass = Class.forName(ioClassName);
-            Object inst = ioClass.getDeclaredConstructor().newInstance();
-            if(inst instanceof MessageIO) {
-                return (MessageIO) inst;
-            } else {
-                throw new ProtocolTestsuiteException("Found IO component class 
is not of type MessageIO");
-            }
-        } catch (InstantiationException | InvocationTargetException | 
NoSuchMethodException | IllegalAccessException |
-            ClassNotFoundException e) {
+            final Method parseMethod = ioClass.getMethod("parse", 
ReadBuffer.class);
+            final Method serializeMethod = ioClass.getMethod("serialize", 
WriteBuffer.class, ioRootClass);
+            return new MessageIO() {
+                @Override
+                public Object parse(ReadBuffer io) throws ParseException {
+                    try {
+                        return parseMethod.invoke(null, io);
+                    } catch (IllegalAccessException | 
InvocationTargetException e) {
+                        throw new ParseException("error parsing", e);
+                    }
+                }
+
+                @Override
+                public void serialize(WriteBuffer io, Object value) throws 
ParseException {
+                    try {
+                        serializeMethod.invoke(null, io, value);
+                    } catch (IllegalAccessException | 
InvocationTargetException e) {
+                        throw new ParseException("error serializing", e);
+                    }
+                }
+            };
+        } catch (NoSuchMethodException | ClassNotFoundException e) {
             throw new ProtocolTestsuiteException("Unable to instantiate IO 
component", e);
         }
     }

Reply via email to