Version 3.1.6: fix Bridge, Serialiser, Progress:
[nikiroo-utils.git] / src / be / nikiroo / utils / serial / SerialUtils.java
index 73f2027abb75480957beb087681495fa75009363..a1105a90d441352d71fa51faf5d56f8294f35318 100644 (file)
@@ -7,6 +7,7 @@ import java.lang.reflect.Array;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
+import java.net.URL;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.UnknownFormatConversionException;
@@ -37,6 +38,7 @@ import be.nikiroo.utils.ImageUtils;
  * <li>Enum (any enum whose name and value is known by the caller)</li>
  * <li>java.awt.image.BufferedImage (as a {@link CustomSerializer})</li>
  * <li>An array of the above (as a {@link CustomSerializer})</li>
+ * <li>URL</li>
  * </ul>
  * 
  * @author niki
@@ -85,7 +87,7 @@ public class SerialUtils {
                        }
 
                        @Override
-                       protected Object fromString(String content) {
+                       protected Object fromString(String content) throws IOException {
                                String[] tab = content.split("\n");
 
                                try {
@@ -98,11 +100,38 @@ public class SerialUtils {
 
                                        return array;
                                } catch (Exception e) {
-                                       throw new UnknownFormatConversionException(e.getMessage());
+                                       if (e instanceof IOException) {
+                                               throw (IOException) e;
+                                       }
+                                       throw new IOException(e.getMessage());
                                }
                        }
                });
 
+               // URL:
+               customTypes.put("java.net.URL", new CustomSerializer() {
+                       @Override
+                       protected String toString(Object value) {
+                               if (value != null) {
+                                       return ((URL) value).toString();
+                               }
+                               return null;
+                       }
+
+                       @Override
+                       protected Object fromString(String content) throws IOException {
+                               if (content != null) {
+                                       return new URL(content);
+                               }
+                               return null;
+                       }
+
+                       @Override
+                       protected String getType() {
+                               return "java.net.URL";
+                       }
+               });
+
                // Images (this is currently the only supported image type by default)
                customTypes.put("java.awt.image.BufferedImage", new CustomSerializer() {
                        @Override
@@ -326,24 +355,23 @@ public class SerialUtils {
         * 
         * @return the object (can be NULL for NULL encoded values)
         * 
-        * @throws UnknownFormatConversionException
+        * @throws IOException
         *             if the content cannot be converted
         */
-       static Object decode(String encodedValue) {
-               String cut = "";
-               if (encodedValue.length() > 1) {
-                       cut = encodedValue.substring(0, encodedValue.length() - 1);
-               }
-
+       static Object decode(String encodedValue) throws IOException {
                try {
+                       String cut = "";
+                       if (encodedValue.length() > 1) {
+                               cut = encodedValue.substring(0, encodedValue.length() - 1);
+                       }
+
                        if (CustomSerializer.isCustom(encodedValue)) {
                                // custom:TYPE_NAME:"content is String-encoded"
                                String type = CustomSerializer.typeOf(encodedValue);
                                if (customTypes.containsKey(type)) {
                                        return customTypes.get(type).decode(encodedValue);
                                }
-                               throw new UnknownFormatConversionException(
-                                               "Unknown custom type: " + type);
+                               throw new IOException("Unknown custom type: " + type);
                        } else if (encodedValue.equals("NULL")
                                        || encodedValue.equals("null")) {
                                return null;
@@ -371,10 +399,10 @@ public class SerialUtils {
                                return Integer.parseInt(encodedValue);
                        }
                } catch (Exception e) {
-                       if (e instanceof UnknownFormatConversionException) {
-                               throw (UnknownFormatConversionException) e;
+                       if (e instanceof IOException) {
+                               throw (IOException) e;
                        }
-                       throw new UnknownFormatConversionException(e.getMessage());
+                       throw new IOException(e.getMessage());
                }
        }