You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2005/02/17 13:05:21 UTC

svn commit: r154150 - incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/obj/ObjectPersistenceManager.java

Author: stefan
Date: Thu Feb 17 04:05:17 2005
New Revision: 154150

URL: http://svn.apache.org/viewcvs?view=rev&rev=154150
Log:
workaround for problem (jdk issue) reported by timur: 
Limit of 65535 bytes per String value?

Modified:
    incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/obj/ObjectPersistenceManager.java

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/obj/ObjectPersistenceManager.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/obj/ObjectPersistenceManager.java?view=diff&r1=154149&r2=154150
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/obj/ObjectPersistenceManager.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/obj/ObjectPersistenceManager.java Thu Feb 17 04:05:17 2005
@@ -42,6 +42,9 @@
 
     private static Logger log = Logger.getLogger(ObjectPersistenceManager.class);
 
+    /** encoding used for serializing String values */
+    private static final String ENCODING = "UTF-8";
+
     /**
      * hexdigits for toString
      */
@@ -281,10 +284,17 @@
                 values[i] = InternalValue.create(blobStore.get(blobId));
                 if (blobVal.isTempFile()) {
                     blobVal.delete();
-                    blobVal = null;
+                    blobVal = null; // gc hint
                 }
             } else {
-                out.writeUTF(val.toString());   // value
+                /**
+                 * because writeUTF(String) has a size limit of 65k,
+                 * we're using write(byte[]) instead
+                 */
+                //out.writeUTF(val.toString());   // value
+                byte[] bytes = val.toString().getBytes(ENCODING);
+                out.writeInt(bytes.length); // lenght of byte[]
+                out.write(bytes);   // byte[]
             }
         }
     }
@@ -318,12 +328,21 @@
         InternalValue[] values = new InternalValue[count];
         for (int i = 0; i < count; i++) {
             InternalValue val;
-            s = in.readUTF();   // value
             if (type == PropertyType.BINARY) {
+                s = in.readUTF();   // value (i.e. blobId)
                 // special handling required for binary value:
                 // the value stores the id of the blob resource in the blob store
                 val = InternalValue.create(blobStore.get(s));
             } else {
+                /**
+                 * because writeUTF(String) has a size limit of 65k,
+                 * Strings are serialized as <length><byte[]>
+                 */
+                //s = in.readUTF();   // value
+                int len = in.readInt(); // lenght of byte[]
+                byte[] bytes = new byte[len];
+                in.read(bytes); // byte[]
+                s = new String(bytes, ENCODING);
                 val = InternalValue.valueOf(s, type);
             }
             values[i] = val;
@@ -394,7 +413,7 @@
         try {
             out = new BufferedOutputStream(internalBlobFile.getOutputStream());
             byte[] buffer = new byte[8192];
-            int read = 0;
+            int read;
             while ((read = in.read(buffer)) > 0) {
                 out.write(buffer, 0, read);
             }