diff --git a/src/main/java/nl/nn/testtool/MessageEncoderImpl.java b/src/main/java/nl/nn/testtool/MessageEncoderImpl.java index 378ac053..66ad795e 100644 --- a/src/main/java/nl/nn/testtool/MessageEncoderImpl.java +++ b/src/main/java/nl/nn/testtool/MessageEncoderImpl.java @@ -1,5 +1,5 @@ /* - Copyright 2021-2023 WeAreFrank! + Copyright 2021-2024 WeAreFrank! Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,6 +26,7 @@ import java.io.StringWriter; import java.io.UnsupportedEncodingException; import java.io.Writer; +import java.lang.invoke.MethodHandles; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.CharacterCodingException; @@ -35,6 +36,8 @@ import java.text.SimpleDateFormat; import java.util.Date; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.w3c.dom.Node; import lombok.SneakyThrows; @@ -48,6 +51,7 @@ * @author Jaco de Groot */ public class MessageEncoderImpl implements MessageEncoder { + private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); public static final String XML_ENCODER = "XMLEncoder"; public static final String UTF8_ENCODER = "UTF-8"; public static final String CHARSET_ENCODER_PREFIX = "CHARSET-"; @@ -69,7 +73,10 @@ public ToStringResult toString(Object message, String charset) { } else if (message instanceof String) { toStringResult = new ToStringResult((String)message, null); } else { - if (message instanceof byte[]) { + if (message instanceof Boolean) { + toStringResult = new ToStringResult(Boolean.toString((Boolean) message), null, Boolean.class.getName()); + } + else if (message instanceof byte[]) { String encoding; if (charset == null) { charset = "UTF-8"; @@ -147,6 +154,20 @@ public T toObject(Checkpoint originalCheckpoint, T messageToStub) { } else { String message = originalCheckpoint.getMessage(); String encoding = originalCheckpoint.getEncoding(); + String messageClassName = originalCheckpoint.getMessageClassName(); + if ( (messageClassName != null) && (messageClassName.equals(Boolean.class.getName())) ) { + try { + Object rawResult = Boolean.valueOf(message); + return (T) rawResult; + } catch(ClassCastException e) { + if (messageToStub == null) { + log.error("Could not parse message [{}] to generic type T", message); + } else { + log.error("Could not parse message [{}] to [{}]", message, messageToStub.getClass().getName()); + } + return null; + } + } if (encoding == null) { if (originalCheckpoint.getStreaming() == null) { return (T)message; diff --git a/src/test/java/nl/nn/testtool/test/junit/TestMessageEncoder.java b/src/test/java/nl/nn/testtool/test/junit/TestMessageEncoder.java index 3c965182..68896c51 100644 --- a/src/test/java/nl/nn/testtool/test/junit/TestMessageEncoder.java +++ b/src/test/java/nl/nn/testtool/test/junit/TestMessageEncoder.java @@ -17,6 +17,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.fail; import java.io.IOException; import java.text.SimpleDateFormat; @@ -24,8 +26,10 @@ import javax.xml.parsers.ParserConfigurationException; +import nl.nn.testtool.MessageEncoder; import org.junit.Rule; import org.junit.Test; +import org.junit.jupiter.api.Assertions; import org.junit.rules.TestName; import org.w3c.dom.Node; import org.xml.sax.SAXException; @@ -46,6 +50,40 @@ public class TestMessageEncoder { @Rule public TestName name = new TestName(); + @Test + public void encode_and_decode_boolean_true() { + MessageEncoder instance = new MessageEncoderImpl(); + MessageEncoder.ToStringResult encoded = instance.toString(true, null); + Assertions.assertEquals("true", encoded.getString()); + Assertions.assertEquals("java.lang.Boolean", encoded.getMessageClassName()); + Checkpoint checkpoint = new Checkpoint(); + checkpoint.setMessage(encoded.getString()); + checkpoint.setEncoding(encoded.getEncoding()); + checkpoint.setMessageClassName(encoded.getMessageClassName()); + Object back = instance.toObject(checkpoint); + if(! (back instanceof Boolean)) { + fail("Expected to get back Boolean"); + } + Assertions.assertTrue((Boolean) back); + } + + @Test + public void encode_decode_boolean_false() { + MessageEncoder instance = new MessageEncoderImpl(); + MessageEncoder.ToStringResult encoded = instance.toString(false, null); + Assertions.assertEquals("false", encoded.getString()); + Assertions.assertEquals("java.lang.Boolean", encoded.getMessageClassName()); + Checkpoint checkpoint = new Checkpoint(); + checkpoint.setMessage(encoded.getString()); + checkpoint.setEncoding(encoded.getEncoding()); + checkpoint.setMessageClassName(encoded.getMessageClassName()); + Object back = instance.toObject(checkpoint); + if(! (back instanceof Boolean)) { + fail("Expected to get back Boolean"); + } + assertFalse((Boolean) back); + } + @Test public void testToString() throws SAXException, IOException, ParserConfigurationException, StorageException { TestTool testTool = new TestTool();