X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2Fserial%2FCustomSerializer.java;h=e5539c0fdce8669592a932c819d458b0717c1613;hb=23cf894daa02843da6e6f1b199eaaea29a739f81;hp=b6928eec7685b853aff33537cd2844e0bfcc24d8;hpb=db31c35860081535d6e7ddc83ab4af573bb0522e;p=nikiroo-utils.git diff --git a/src/be/nikiroo/utils/serial/CustomSerializer.java b/src/be/nikiroo/utils/serial/CustomSerializer.java index b6928ee..e5539c0 100644 --- a/src/be/nikiroo/utils/serial/CustomSerializer.java +++ b/src/be/nikiroo/utils/serial/CustomSerializer.java @@ -1,41 +1,115 @@ package be.nikiroo.utils.serial; +import java.io.IOException; +import java.io.InputStream; +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 { - protected abstract String toString(Object value); + protected abstract void toStream(OutputStream out, Object value) + throws IOException; - protected abstract Object fromString(String content); + protected abstract Object fromStream(InputStream in) throws IOException; protected abstract String getType(); - public void encode(StringBuilder builder, Object value) { - String customString = toString(value); - builder.append("custom:").append(getType()).append(":"); - SerialUtils.encode(builder, customString); + /** + * Encode the object into the given {@link OutputStream} if supported. + * + * @param out + * the builder to append to + * @param value + * the object to encode + * + * @throws IOException + * in case of I/O error + */ + 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(String encodedValue) { - return fromString((String) SerialUtils.decode(contentOf(encodedValue))); + public Object decode(InputStream in) throws IOException { + ReplaceInputStream replace = new ReplaceInputStream(in, // + new String[] { "\\\\", "\\n" }, // + new String[] { "\\", "\n" }); + + try { + 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(); + } + } finally { + replace.close(false); + } } public static boolean isCustom(String encodedValue) { - int pos1 = encodedValue.indexOf(':'); - int pos2 = encodedValue.indexOf(':', pos1 + 1); + int pos1 = encodedValue.indexOf('^'); + int pos2 = encodedValue.indexOf('^', pos1 + 1); - return pos1 >= 0 && pos2 >= 0 && encodedValue.startsWith("custom:"); + return pos1 >= 0 && pos2 >= 0 && encodedValue.startsWith("custom^"); } public static String typeOf(String encodedValue) { - int pos1 = encodedValue.indexOf(':'); - int pos2 = encodedValue.indexOf(':', pos1 + 1); + int pos1 = encodedValue.indexOf('^'); + int pos2 = encodedValue.indexOf('^', pos1 + 1); String type = encodedValue.substring(pos1 + 1, pos2); return type; } public static String contentOf(String encodedValue) { - int pos1 = encodedValue.indexOf(':'); - int pos2 = encodedValue.indexOf(':', pos1 + 1); + int pos1 = encodedValue.indexOf('^'); + int pos2 = encodedValue.indexOf('^', pos1 + 1); String encodedContent = encodedValue.substring(pos2 + 1); return encodedContent;