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); } }
