|
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"); + } } |
| Free forum by Nabble | Edit this page |
