Version 3.1.6: fix Bridge, Serialiser, Progress:
[nikiroo-utils.git] / src / be / nikiroo / utils / serial / CustomSerializer.java
index b6928eec7685b853aff33537cd2844e0bfcc24d8..be89316eae07b74f6a67ccaeb589641ba81f8cea 100644 (file)
@@ -1,41 +1,59 @@
 package be.nikiroo.utils.serial;
 
+import java.io.IOException;
+
 public abstract class CustomSerializer {
 
        protected abstract String toString(Object value);
 
-       protected abstract Object fromString(String content);
+       protected abstract Object fromString(String content) throws IOException;
 
        protected abstract String getType();
 
-       public void encode(StringBuilder builder, Object value) {
+       /**
+        * Encode the object into the given builder if possible (if supported).
+        * 
+        * @param builder
+        *            the builder to append to
+        * @param value
+        *            the object to encode
+        * @return TRUE if success, FALSE if not (the content of the builder won't
+        *         be changed in case of failure)
+        */
+       public boolean encode(StringBuilder builder, Object value) {
+               int prev = builder.length();
                String customString = toString(value);
-               builder.append("custom:").append(getType()).append(":");
-               SerialUtils.encode(builder, customString);
+               builder.append("custom^").append(getType()).append("^");
+               if (!SerialUtils.encode(builder, customString)) {
+                       builder.delete(prev, builder.length());
+                       return false;
+               }
+
+               return true;
        }
 
-       public Object decode(String encodedValue) {
+       public Object decode(String encodedValue) throws IOException {
                return fromString((String) SerialUtils.decode(contentOf(encodedValue)));
        }
 
        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;