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");
+ }
}