fix namespace from master merge
[nikiroo-utils.git] / src / be / nikiroo / utils / serial / SerialUtils.java
index 0dc4a35e30dc3ee08fe11bfb8cec46d2b2d5cee8..204d1d95a0ab22418a74fd540368fa183c38c460 100644 (file)
@@ -1,5 +1,6 @@
 package be.nikiroo.utils.serial;
 
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.NotSerializableException;
@@ -18,8 +19,8 @@ import java.util.UnknownFormatConversionException;
 
 import be.nikiroo.utils.IOUtils;
 import be.nikiroo.utils.Image;
-import be.nikiroo.utils.NextableInputStream;
-import be.nikiroo.utils.NextableInputStreamStep;
+import be.nikiroo.utils.streams.NextableInputStream;
+import be.nikiroo.utils.streams.NextableInputStreamStep;
 import be.nikiroo.utils.StringUtils;
 
 /**
@@ -68,21 +69,24 @@ public class SerialUtils {
                                type = type.substring(0, type.length() - 2); // remove the []
 
                                write(out, type);
-                               write(out, "\n");
+                               write(out, "\r");
                                try {
                                        for (int i = 0; true; i++) {
                                                Object item = Array.get(value, i);
                                                // encode it normally if direct value
                                                if (!SerialUtils.encode(out, item)) {
                                                        try {
-                                                               // TODO: use ZIP: if not?
-                                                               new Exporter(out).append(item);
+                                                               // TODO: bad escaping?
+                                                               write(out, "B64:");
+                                                               OutputStream bout = StringUtils.base64(out,
+                                                                               false, false);
+                                                               new Exporter(bout).append(item);
                                                        } catch (NotSerializableException e) {
                                                                throw new UnknownFormatConversionException(e
                                                                                .getMessage());
                                                        }
                                                }
-                                               write(out, "\n");
+                                               write(out, "\r");
                                        }
                                } catch (ArrayIndexOutOfBoundsException e) {
                                        // Done.
@@ -92,7 +96,7 @@ public class SerialUtils {
                        @Override
                        protected Object fromStream(InputStream in) throws IOException {
                                NextableInputStream stream = new NextableInputStream(in,
-                                               new NextableInputStreamStep('\n'));
+                                               new NextableInputStreamStep('\r'));
 
                                try {
                                        List<Object> list = new ArrayList<Object>();
@@ -127,7 +131,6 @@ public class SerialUtils {
 
                // URL:
                customTypes.put("java.net.URL", new CustomSerializer() {
-
                        @Override
                        protected void toStream(OutputStream out, Object value)
                                        throws IOException {
@@ -246,7 +249,7 @@ public class SerialUtils {
                                        ctor = clazz.getDeclaredConstructor(classes
                                                        .toArray(new Class[] {}));
                                } catch (NoSuchMethodException nsme) {
-                                       // TODO: it seems e do not always need a parameter for each
+                                       // TODO: it seems we do not always need a parameter for each
                                        // level, so we currently try "ALL" levels or "FIRST" level
                                        // only -> we should check the actual rule and use it
                                        ctor = clazz.getDeclaredConstructor(classes.get(0));
@@ -469,7 +472,14 @@ public class SerialUtils {
                                // custom:TYPE_NAME:"content is String-encoded"
                                String type = CustomSerializer.typeOf(encodedValue);
                                if (customTypes.containsKey(type)) {
-                                       return customTypes.get(type).decode(encodedValue);
+                                       // TODO: we should start with a stream
+                                       InputStream streamEncodedValue = new ByteArrayInputStream(
+                                                       encodedValue.getBytes("UTF-8"));
+                                       try {
+                                               return customTypes.get(type).decode(streamEncodedValue);
+                                       } finally {
+                                               streamEncodedValue.close();
+                                       }
                                }
                                throw new IOException("Unknown custom type: " + type);
                        } else if (encodedValue.equals("NULL")
@@ -606,7 +616,7 @@ public class SerialUtils {
        static void encodeString(OutputStream out, InputStream raw)
                        throws IOException {
                out.write('\"');
-               byte buffer[] = new byte[4069];
+               byte buffer[] = new byte[4096];
                for (int len = 0; (len = raw.read(buffer)) > 0;) {
                        for (int i = 0; i < len; i++) {
                                // TODO: not 100% correct, look up howto for UTF-8