From 3b4319db57971bce3afd9092a0f9db9809d47ca2 Mon Sep 17 00:00:00 2001 From: Niki Roo Date: Sat, 27 Apr 2019 23:28:10 +0200 Subject: [PATCH] ... --- .../utils/serial/CustomSerializer.java | 97 ++++++++++--------- src/be/nikiroo/utils/serial/Exporter.java | 3 + src/be/nikiroo/utils/serial/Importer.java | 6 +- src/be/nikiroo/utils/serial/SerialUtils.java | 12 ++- .../utils/serial/server/ConnectAction.java | 3 +- .../nikiroo/utils/test_code/SerialTest.java | 1 - 6 files changed, 68 insertions(+), 54 deletions(-) diff --git a/src/be/nikiroo/utils/serial/CustomSerializer.java b/src/be/nikiroo/utils/serial/CustomSerializer.java index 36a6c21..3ac47a8 100644 --- a/src/be/nikiroo/utils/serial/CustomSerializer.java +++ b/src/be/nikiroo/utils/serial/CustomSerializer.java @@ -7,6 +7,8 @@ import java.io.OutputStream; import be.nikiroo.utils.IOUtils; import be.nikiroo.utils.streams.NextableInputStream; import be.nikiroo.utils.streams.NextableInputStreamStep; +import be.nikiroo.utils.streams.ReplaceInputStream; +import be.nikiroo.utils.streams.ReplaceOutputStream; public abstract class CustomSerializer { @@ -25,60 +27,67 @@ public abstract class CustomSerializer { * @param value * the object to encode * - * @return FALSE if the value is not supported, TRUE if the operation was - * successful (if the value is supported by the operation was not - * successful, you will get an {@link IOException}) - * * @throws IOException * in case of I/O error */ - public boolean encode(OutputStream out, Object value) throws IOException { - SerialUtils.write(out, "custom^"); - SerialUtils.write(out, getType()); - SerialUtils.write(out, "^"); - // TODO: manage ENTER - toStream(out, value); - - return true; + public void encode(OutputStream out, Object value) throws IOException { + ReplaceOutputStream replace = new ReplaceOutputStream(out, // + new String[] { "\\", "\n" }, // + new String[] { "\\\\", "\\n" }); + try { + SerialUtils.write(replace, "custom^"); + SerialUtils.write(replace, getType()); + SerialUtils.write(replace, "^"); + toStream(replace, value); + } finally { + replace.close(false); + } } public Object decode(InputStream in) throws IOException { - // TODO: manage ENTER - NextableInputStream stream = new NextableInputStream(in, - new NextableInputStreamStep('^')); + ReplaceInputStream replace = new ReplaceInputStream(in, // + new String[] { "\\\\", "\\n" }, // + new String[] { "\\", "\n" }); try { - if (!stream.next()) { - throw new IOException("Cannot find the first custom^ element"); + NextableInputStream stream = new NextableInputStream( + replace.open(), new NextableInputStreamStep('^')); + try { + if (!stream.next()) { + throw new IOException( + "Cannot find the first custom^ element"); + } + + String custom = IOUtils.readSmallStream(stream); + if (!"custom".equals(custom)) { + throw new IOException( + "Cannot find the first custom^ element, it is: " + + custom + "^"); + } + + if (!stream.next()) { + throw new IOException("Cannot find the second custom^" + + getType() + " element"); + } + + String type = IOUtils.readSmallStream(stream); + if (!getType().equals(type)) { + throw new IOException("Cannot find the second custom^" + + getType() + " element, it is: custom^" + type + + "^"); + } + + if (!stream.nextAll()) { + throw new IOException("Cannot find the third custom^" + + getType() + "^value element"); + } + + return fromStream(stream); + } finally { + stream.close(); } - - String custom = IOUtils.readSmallStream(stream); - if (!"custom".equals(custom)) { - throw new IOException( - "Cannot find the first custom^ element, it is: " - + custom + "^"); - } - - if (!stream.next()) { - throw new IOException("Cannot find the second custom^" - + getType() + " element"); - } - - String type = IOUtils.readSmallStream(stream); - if (!getType().equals(type)) { - throw new IOException("Cannot find the second custom^" - + getType() + " element, it is: custom^" + type + "^"); - } - - if (!stream.nextAll()) { - throw new IOException("Cannot find the third custom^" - + getType() + "^value element"); - } - - // TODO: manage ENTER - return fromStream(stream); } finally { - stream.close(false); + replace.close(false); } } diff --git a/src/be/nikiroo/utils/serial/Exporter.java b/src/be/nikiroo/utils/serial/Exporter.java index 6325484..2470bde 100644 --- a/src/be/nikiroo/utils/serial/Exporter.java +++ b/src/be/nikiroo/utils/serial/Exporter.java @@ -20,6 +20,9 @@ public class Exporter { /** * Create a new {@link Exporter}. + * + * @param out + * export the data to this stream */ public Exporter(OutputStream out) { if (out == null) { diff --git a/src/be/nikiroo/utils/serial/Importer.java b/src/be/nikiroo/utils/serial/Importer.java index ad2d284..eec30b2 100644 --- a/src/be/nikiroo/utils/serial/Importer.java +++ b/src/be/nikiroo/utils/serial/Importer.java @@ -7,9 +7,9 @@ import java.util.HashMap; import java.util.Map; import be.nikiroo.utils.IOUtils; +import be.nikiroo.utils.StringUtils; import be.nikiroo.utils.streams.NextableInputStream; import be.nikiroo.utils.streams.NextableInputStreamStep; -import be.nikiroo.utils.StringUtils; /** * A simple class that can accept the output of {@link Exporter} to recreate @@ -46,7 +46,7 @@ public class Importer { * content, or a number of lines of it (any given line MUST be * complete though) and accumulate it with the already present data. * - * @param data + * @param in * the data to parse * * @return itself so it can be chained @@ -107,7 +107,7 @@ public class Importer { * Read a single (whole) line of serialised data into this {@link Importer} * and accumulate it with the already present data. * - * @param line + * @param in * the line to parse * * @return TRUE if we are just done with one object or sub-object diff --git a/src/be/nikiroo/utils/serial/SerialUtils.java b/src/be/nikiroo/utils/serial/SerialUtils.java index 204d1d9..55d1f84 100644 --- a/src/be/nikiroo/utils/serial/SerialUtils.java +++ b/src/be/nikiroo/utils/serial/SerialUtils.java @@ -19,9 +19,9 @@ import java.util.UnknownFormatConversionException; import be.nikiroo.utils.IOUtils; import be.nikiroo.utils.Image; +import be.nikiroo.utils.StringUtils; import be.nikiroo.utils.streams.NextableInputStream; import be.nikiroo.utils.streams.NextableInputStreamStep; -import be.nikiroo.utils.StringUtils; /** * Small class to help with serialisation. @@ -63,8 +63,9 @@ public class SerialUtils { @Override protected void toStream(OutputStream out, Object value) throws IOException { - // TODO: we use \n to separate, and b64 to un-\n -- but we could - // use \\n ? + + // TODO: we use \n to separate, and b64 to un-\n + // -- but we could use \\n ? String type = value.getClass().getCanonicalName(); type = type.substring(0, type.length() - 2); // remove the [] @@ -403,9 +404,9 @@ public class SerialUtils { } else if (value.getClass().getSimpleName().endsWith("[]")) { // Simple name does support [] suffix and do not return NULL for // inner anonymous classes - return customTypes.get("[]").encode(out, value); + customTypes.get("[]").encode(out, value); } else if (customTypes.containsKey(value.getClass().getCanonicalName())) { - return customTypes.get(value.getClass().getCanonicalName())// + customTypes.get(value.getClass().getCanonicalName())// .encode(out, value); } else if (value instanceof String) { encodeString(out, (String) value); @@ -604,6 +605,7 @@ public class SerialUtils { // aa bb -> "aa\tbb" static void encodeString(OutputStream out, String raw) throws IOException { + // TODO: not. efficient. out.write('\"'); // TODO !! utf-8 required for (char car : raw.toCharArray()) { diff --git a/src/be/nikiroo/utils/serial/server/ConnectAction.java b/src/be/nikiroo/utils/serial/server/ConnectAction.java index 8dbc7aa..c5750bd 100644 --- a/src/be/nikiroo/utils/serial/server/ConnectAction.java +++ b/src/be/nikiroo/utils/serial/server/ConnectAction.java @@ -217,6 +217,7 @@ abstract class ConnectAction { protected Object sendObject(Object data) throws IOException, NoSuchFieldException, NoSuchMethodException, ClassNotFoundException { synchronized (lock) { + new Exporter(out).append(data); if (server) { @@ -268,7 +269,7 @@ abstract class ConnectAction { out.flush(); contentToSend = false; } - + return new Importer().read(in).getValue(); } diff --git a/src/be/nikiroo/utils/test_code/SerialTest.java b/src/be/nikiroo/utils/test_code/SerialTest.java index 1581965..c008dec 100644 --- a/src/be/nikiroo/utils/test_code/SerialTest.java +++ b/src/be/nikiroo/utils/test_code/SerialTest.java @@ -75,7 +75,6 @@ class SerialTest extends TestLauncher { encodeRecodeTest(this, data); } }); - addTest(new TestCase() { @SuppressWarnings("unused") private TestCase me = setName("Anonymous inner class"); -- 2.27.0