svn commit: r908708 - in /ofbiz/trunk/framework/base/src/org/ofbiz/base/util: UtilIO.java test/UtilIOTests.java

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r908708 - in /ofbiz/trunk/framework/base/src/org/ofbiz/base/util: UtilIO.java test/UtilIOTests.java

doogie-3
Author: doogie
Date: Wed Feb 10 22:45:29 2010
New Revision: 908708

URL: http://svn.apache.org/viewvc?rev=908708&view=rev
Log:
Wrap the conversion system with some readObject/writeObject calls.

Modified:
    ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilIO.java
    ofbiz/trunk/framework/base/src/org/ofbiz/base/util/test/UtilIOTests.java

Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilIO.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilIO.java?rev=908708&r1=908707&r2=908708&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilIO.java (original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilIO.java Wed Feb 10 22:45:29 2010
@@ -20,18 +20,33 @@
 
 import java.io.BufferedInputStream;
 import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.Reader;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.Serializable;
+import java.io.StringWriter;
 import java.io.Writer;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
 
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.StringUtils;
+
+import org.ofbiz.base.container.ClassLoaderContainer;
+import org.ofbiz.base.conversion.Converter;
+import org.ofbiz.base.conversion.Converters;
+
 public final class UtilIO {
     public static final Charset UTF8 = Charset.forName("UTF-8");
     public static final String module = UtilIO.class.getName();
@@ -251,4 +266,100 @@
         writer.write(value.substring(r));
         writer.close();
     }
+
+    public static Object readObject(File file) throws ClassNotFoundException, IOException {
+        return readObject(new FileInputStream(file));
+    }
+
+    public static Object readObject(InputStream in) throws ClassNotFoundException, IOException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        IOUtils.copy(in, baos);
+        in.close();
+        byte[] bytes = baos.toByteArray();
+        try {
+            char[] buffer = StringUtils.chomp(readString(bytes)).toCharArray();
+            return parseObject(buffer, 0, buffer.length);
+        } catch (Exception e) {
+        }
+        ObjectInputStream oin = new ObjectInputStream(new ByteArrayInputStream(bytes));
+        Serializable value = (Serializable) oin.readObject();
+        oin.close();
+        return value;
+    }
+
+    public static Object readObject(char[] buffer) throws ClassNotFoundException, IOException {
+        return parseObject(buffer, 0, buffer.length);
+    }
+
+    public static Object readObject(char[] buffer, int offset, int length) throws ClassNotFoundException, IOException {
+        return parseObject(buffer, offset, length);
+    }
+
+    private static Object parseObject(char[] buffer, int offset, int length) throws ClassNotFoundException, IOException {
+        try {
+            int i;
+            for (i = offset; i < length && buffer[i] != ':'; i++);
+            if (i > offset && i < length) {
+                String className = new String(buffer, offset, i);
+                Class type = ClassLoaderContainer.getClassLoader().loadClass(className);
+                Converter converter = Converters.getConverter(String.class, type);
+                if (buffer[length - 1] == '\n') {
+                    length--;
+                }
+                return converter.convert(type, new String(buffer, i + 1, length - i - 1));
+            }
+        } catch (Exception e) {
+        }
+        throw new IOException("Can't read (" + new String(buffer, offset, length) + ")");
+    }
+
+    public static void writeObject(File file, Object value) throws IOException {
+        writeObject(new FileOutputStream(file), value);
+    }
+
+    public static void writeObject(OutputStream out, Object value) throws IOException {
+        try {
+            PrintWriter writer = new PrintWriter(new OutputStreamWriter(out, UTF8));
+            if (encodeObject(writer, value)) {
+                writer.println();
+                writer.close();
+                return;
+            }
+        } catch (Exception e) {
+        }
+        ObjectOutputStream oout = new ObjectOutputStream(out);
+        oout.writeObject(value);
+        oout.close();
+        out.close();
+    }
+
+    private static boolean encodeObject(Writer writer, Object value) throws Exception {
+        Converter converter = Converters.getConverter(value.getClass(), String.class);
+        if (converter != null) {
+            Class clz = converter.getSourceClass();
+            String str = (String) converter.convert(value);
+            if (clz != null) {
+                writer.write(clz.getName());
+            } else {
+                writer.write(value.getClass().getName());
+            }
+            writer.write(':');
+            writer.write(str);
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    public static void writeObject(StringBuilder sb, Object value) throws IOException {
+        try {
+            StringWriter writer = new StringWriter();
+            if (encodeObject(writer, value)) {
+                sb.append(writer.toString());
+                return;
+            }
+        } catch (Exception e) {
+        }
+        throw new IOException("Can't write (" + value + ")");
+    }
 }

Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/test/UtilIOTests.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/test/UtilIOTests.java?rev=908708&r1=908707&r2=908708&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/test/UtilIOTests.java (original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/test/UtilIOTests.java Wed Feb 10 22:45:29 2010
@@ -21,8 +21,20 @@
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.lang.management.MemoryType;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.net.InetAddress;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Locale;
+import java.util.TimeZone;
+import java.util.UUID;
 
 import org.ofbiz.base.util.UtilIO;
+import org.ofbiz.base.util.UtilMisc;
 import org.ofbiz.base.test.GenericTestCaseBase;
 
 public class UtilIOTests extends GenericTestCaseBase {
@@ -114,4 +126,44 @@
         UtilIO.writeString(baos, UtilIO.UTF8, toWrite);
         assertEquals("writeString UTF8:" + label, wanted, baos.toByteArray());
     }
+
+    protected void checkBasicReadWriteObject(Object value, String text) throws Exception {
+        byte[] bytes = text.getBytes("UTF-8");
+        assertEquals("read bytes " + value.getClass().getName(), value, UtilIO.readObject(new ByteArrayInputStream(bytes)));
+        assertEquals("read chars " + value.getClass().getName(), value, UtilIO.readObject(text.toCharArray()));
+        assertEquals("read chars offset " + value.getClass().getName(), value, UtilIO.readObject(text.toCharArray(), 0, text.length()));
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        UtilIO.writeObject(baos, value);
+        assertEquals("write stream " + value.getClass().getName(), text, new String(baos.toByteArray(), "UTF-8"));
+        StringBuilder sb = new StringBuilder();
+        UtilIO.writeObject(sb, value);
+        sb.append('\n');
+        assertEquals("write builder " + value.getClass().getName(), text, sb.toString());
+    }
+
+    public void testReadWriteObject() throws Exception {
+        checkBasicReadWriteObject(Boolean.TRUE, "java.lang.Boolean:true\n");
+        checkBasicReadWriteObject(Byte.valueOf("1"), "java.lang.Byte:1\n");
+        checkBasicReadWriteObject(Double.valueOf("1.0"), "java.lang.Double:1.0\n");
+        checkBasicReadWriteObject(Float.valueOf("1.0"), "java.lang.Float:1.0\n");
+        checkBasicReadWriteObject(Integer.valueOf("1"), "java.lang.Integer:1\n");
+        checkBasicReadWriteObject(Long.valueOf("1"), "java.lang.Long:1\n");
+        checkBasicReadWriteObject(Short.valueOf("1"), "java.lang.Short:1\n");
+        checkBasicReadWriteObject(BigDecimal.valueOf(500.5), "java.math.BigDecimal:500.5\n");
+        checkBasicReadWriteObject(BigInteger.valueOf(500), "java.math.BigInteger:500\n");
+        checkBasicReadWriteObject("1", "java.lang.String:1\n");
+        //checkBasicReadWriteObject(Arrays.asList(new Object[] {"a", UtilMisc.toMap("b", Long.valueOf(1))}), "[ \"a\", { \"b\": 1 } ]\n");
+        checkBasicReadWriteObject(MemoryType.HEAP, "java.lang.management.MemoryType:HEAP\n");
+        checkBasicReadWriteObject(MemoryType.NON_HEAP, "java.lang.management.MemoryType:NON_HEAP\n");
+        checkBasicReadWriteObject(UtilIO.UTF8, "java.nio.charset.Charset:UTF-8\n");
+        checkBasicReadWriteObject(InetAddress.getByAddress("localhost", new byte[] {127, 0, 0, 1}), "java.net.InetAddress:localhost\n");
+        //checkBasicReadWriteObject(Pattern.compile("^([a-z]{3}.*?):$"), "java.util.regex.Pattern:^([a-z]{3}.*?):$\n");
+        checkBasicReadWriteObject(Time.valueOf("12:34:56"), "java.sql.Time:12:34:56\n");
+        //checkBasicReadWriteObject(new Timestamp(1234567890), "java.sql.Timestamp:1234567890 00:00:00\n");
+        //checkBasicReadWriteObject(new java.util.Date(1234567890), "java.util.Date:1234567890\n");
+        checkBasicReadWriteObject(UUID.fromString("c3241927-9f77-43e1-be16-bd71d245ef64"), "java.util.UUID:c3241927-9f77-43e1-be16-bd71d245ef64\n");
+        checkBasicReadWriteObject(TimeZone.getTimeZone("America/Chicago"), "java.util.TimeZone:America/Chicago\n");
+        checkBasicReadWriteObject(new SimpleDateFormat("MM/dd/yyyy hh:mm a"), "java.text.SimpleDateFormat:MM/dd/yyyy hh:mm a\n");
+        checkBasicReadWriteObject(new Locale("en", "us"), "java.util.Locale:en_US\n");
+    }
 }