You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xindice-dev@xml.apache.org by vg...@apache.org on 2006/11/26 23:44:05 UTC

svn commit: r479437 - in /xml/xindice/trunk: ./ java/src/org/apache/xindice/core/data/ java/src/org/apache/xindice/core/meta/inline/ java/tests/src/org/apache/xindice/core/meta/inline/

Author: vgritsenko
Date: Sun Nov 26 14:44:04 2006
New Revision: 479437

URL: http://svn.apache.org/viewvc?view=rev&rev=479437
Log:
            <action dev="VG" type="update" fixes-bug="41003" due-to="Natalia Shilenkova">
                Change InlineMetaReader.read() method signature to remove
                unnecessary data copying.
            </action>


Modified:
    xml/xindice/trunk/java/src/org/apache/xindice/core/data/Value.java
    xml/xindice/trunk/java/src/org/apache/xindice/core/meta/inline/InlineMetaReader.java
    xml/xindice/trunk/java/src/org/apache/xindice/core/meta/inline/InlineMetaService.java
    xml/xindice/trunk/java/src/org/apache/xindice/core/meta/inline/NullReader.java
    xml/xindice/trunk/java/src/org/apache/xindice/core/meta/inline/ResourceTypeReader.java
    xml/xindice/trunk/java/tests/src/org/apache/xindice/core/meta/inline/ResourceTypeReaderTest.java
    xml/xindice/trunk/status.xml

Modified: xml/xindice/trunk/java/src/org/apache/xindice/core/data/Value.java
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/data/Value.java?view=diff&rev=479437&r1=479436&r2=479437
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/data/Value.java (original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/data/Value.java Sun Nov 26 14:44:04 2006
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *
- * CVS $Id$
+ * $Id$
  */
 
 package org.apache.xindice.core.data;
@@ -31,13 +31,13 @@
  * The content window of Value objects are immutable, but the
  * underlying byte array is not.
  *
- * @version CVS $Revision$, $Date$
+ * @version $Revision$, $Date$
  */
 public class Value implements Comparable {
 
-    protected byte[] data = null;
-    protected int pos = 0;
-    protected int len = -1;
+    protected byte[] data;
+    protected int pos;
+    protected int len;
 
 
     public Value(Value value) {
@@ -48,10 +48,14 @@
 
     public Value(byte[] data) {
         this.data = data;
+        this.pos = 0;
         this.len = data.length;
     }
 
     public Value(byte[] data, int pos, int len) {
+        if (pos >= data.length || pos < 0 || pos + len > data.length) {
+            throw new ArrayIndexOutOfBoundsException("Value cannot be created");
+        }
         this.data = data;
         this.pos = pos;
         this.len = len;
@@ -60,6 +64,7 @@
     public Value(String data) {
         try {
             this.data = data.getBytes("utf-8");
+            this.pos = 0;
             this.len = this.data.length;
         } catch (UnsupportedEncodingException e) {
             throw new XindiceRuntimeException("Java doesn't support UTF-8 encoding", e);
@@ -82,6 +87,34 @@
     }
 
     /**
+     * Returns the byte at the specified index.
+     *
+     * @param index byte index
+     * @return the byte at the specified index.
+     * @throws ArrayIndexOutOfBoundsException if index is negative number or
+     *         is not less that the length of Value data
+     */
+    public final byte byteAt(int index) {
+        if (index < 0 || index >= len) {
+            throw new ArrayIndexOutOfBoundsException(index);
+        }
+        return data[pos + index];
+    }
+
+    /**
+     * Get a new Value that is part of this Value object.
+     *
+     * @param start beginning index
+     * @param len length of the new Value
+     * @return Value object
+     * @throws ArrayIndexOutOfBoundsException if start index is either negative
+     *         or isn't less then length of original Value
+     */
+    public final Value getSubvalue(int start, int len) {
+        return new Value(data, start, len);
+    }
+
+    /**
      * getLength retrieves the length of the data being stored by the Value.
      *
      * @return The Value length
@@ -129,7 +162,7 @@
     }
 
     public boolean equals(Value value) {
-        return len == value.len ? compareTo(value) == 0 : false;
+        return len == value.len && compareTo(value) == 0;
     }
 
     public boolean equals(Object obj) {

Modified: xml/xindice/trunk/java/src/org/apache/xindice/core/meta/inline/InlineMetaReader.java
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/meta/inline/InlineMetaReader.java?view=diff&rev=479437&r1=479436&r2=479437
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/meta/inline/InlineMetaReader.java (original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/meta/inline/InlineMetaReader.java Sun Nov 26 14:44:04 2006
@@ -13,11 +13,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *
- * CVS $Id$
+ * $Id$
  */
 
 package org.apache.xindice.core.meta.inline;
 
+import org.apache.xindice.core.data.Value;
+
 /**
  * The <code>Value</code> associated with a <code>Record</code>
  * can be prefixed by a header containing 'inline' metadata.
@@ -25,7 +27,7 @@
  * this extension is to support binary resources in the same
  * filer where the XML documents live.
  *
- * @version CVS $Revision$, $Date$
+ * @version $Revision$, $Date$
  */
 public interface InlineMetaReader {
 
@@ -40,13 +42,10 @@
      * When a header is read, it generates a <code>Map</code>
      * containing the attributes carried by the header.
      *
-     * @param data array in which the header is embedded
-     * @param offset from the beginning of the data array to the
-     *        beginning of the header.
-     * @param length of the header data
+     * @param data Value object in which the header is embedded
      * @return Map containing the attributes read from the header
      * @throws InlineMetaException if the header data is corrupted or of
      *         the wrong length
      */
-    InlineMetaMap read(byte[] data, int offset, int length) throws InlineMetaException;
+    InlineMetaMap read(Value data) throws InlineMetaException;
 }

Modified: xml/xindice/trunk/java/src/org/apache/xindice/core/meta/inline/InlineMetaService.java
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/meta/inline/InlineMetaService.java?view=diff&rev=479437&r1=479436&r2=479437
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/meta/inline/InlineMetaService.java (original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/meta/inline/InlineMetaService.java Sun Nov 26 14:44:04 2006
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *
- * CVS $Id$
+ * $Id$
  */
 
 package org.apache.xindice.core.meta.inline;
@@ -22,18 +22,17 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.xindice.core.FaultCodes;
 import org.apache.xindice.core.data.Value;
-import org.apache.xindice.core.data.Record;
 
 /**
  * If the documents in a collection have headers, the Collection
  * object holds an instance of this class.  All services the collection
  * needs for working with inline metadata are provided by this class.
  *
- * @version CVS $Revision$, $Date$
+ * @version $Revision$, $Date$
  */
 public class InlineMetaService {
 
-    private static Log log = LogFactory.getLog(InlineMetaService.class);
+    private static final Log log = LogFactory.getLog(InlineMetaService.class);
 
     /**
      * The known readers.  All readers for header versions up to
@@ -119,22 +118,24 @@
      *         the header is corrupted.
      */
     public DatabaseEntry readDatabaseEntry(Value rawValue) throws InlineMetaException {
-        byte[] rawData = rawValue.getData();
         if (log.isDebugEnabled()) {
-            log.debug("readDatabaseEntry: rawData: length=" + rawData.length + " byte 0: " + rawData[0] + " byte 1: " + rawData[1]);
+            log.debug("readDatabaseEntry: rawData: length=" + rawValue.getLength() +
+                      " byte 0: " + rawValue.byteAt(0) + " byte 1: " + rawValue.byteAt(1));
         }
 
         /*
          * Read the header.
          */
 
-        int version = rawData[1];
+        int headerLen = rawValue.byteAt(0);
+        int version = rawValue.byteAt(1);
         if (!haveReaderForVersion(version)) {
             throw new InlineMetaException(FaultCodes.GEN_CRITICAL_ERROR,
                                           "No inline metadata reader available for version " + version);
         }
+
         final InlineMetaReader reader = readerByVersion[version];
-        InlineMetaMap map = reader.read(rawData, 2, rawData[0] - 2);
+        InlineMetaMap map = reader.read(rawValue.getSubvalue(2, headerLen - 2));
         if (log.isDebugEnabled()) {
             log.debug("readDatabaseEntry: map: type=" + map.get("type"));
         }
@@ -143,7 +144,7 @@
          * Exract the data into a Value object.
          */
 
-        Value value = new Value(rawData, rawData[0], rawData.length - rawData[0]);
+        Value value = rawValue.getSubvalue(headerLen, rawValue.getLength() - headerLen);
         // FIXME: May be Record should be used instead? new Record(null, value, map);
         return new DatabaseEntry(map, value);
     }

Modified: xml/xindice/trunk/java/src/org/apache/xindice/core/meta/inline/NullReader.java
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/meta/inline/NullReader.java?view=diff&rev=479437&r1=479436&r2=479437
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/meta/inline/NullReader.java (original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/meta/inline/NullReader.java Sun Nov 26 14:44:04 2006
@@ -13,19 +13,20 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *
- * CVS $Id$
+ * $Id$
  */
 
 package org.apache.xindice.core.meta.inline;
 
 import org.apache.xindice.core.FaultCodes;
+import org.apache.xindice.core.data.Value;
 
 /**
  * Read metadata of length zero.  Handy for comparing performance
  * of the metadata-free database with a database using the metadata
  * machinery but containing no metadata.
  *
- * @version CVS $Revision$, $Date$
+ * @version $Revision$, $Date$
  */
 public class NullReader implements InlineMetaReader {
 
@@ -37,12 +38,12 @@
     }
 
     /**
-     * @see org.apache.xindice.core.meta.inline.InlineMetaReader#read(byte[], int, int)
+     * @see org.apache.xindice.core.meta.inline.InlineMetaReader#read(Value)
      */
-    public InlineMetaMap read(byte[] data, int offset, int length) throws InlineMetaException {
-
-        if (length != 0) {
-            throw new InlineMetaException(FaultCodes.COL_DOCUMENT_MALFORMED, "Expecting header length of 0");
+    public InlineMetaMap read(Value data) throws InlineMetaException {
+        if (data.getLength() != 0) {
+            throw new InlineMetaException(FaultCodes.COL_DOCUMENT_MALFORMED,
+                                          "Expecting header length of 0");
         }
 
         return new NullMap();
@@ -67,7 +68,8 @@
          * @see org.apache.xindice.core.meta.inline.InlineMetaMap#get(String)
          */
         public Object get(String key) throws InlineMetaException {
-            throw new InlineMetaException(FaultCodes.GEN_CRITICAL_ERROR, "NullMap does not accept key '" + key + "'");
+            throw new InlineMetaException(FaultCodes.GEN_CRITICAL_ERROR,
+                                          "NullMap does not accept key '" + key + "'");
         }
 
         /**
@@ -81,8 +83,8 @@
          * @see org.apache.xindice.core.meta.inline.InlineMetaMap#put(String,Object)
          */
         public void put(String key, Object value) throws InlineMetaException {
-            throw new InlineMetaException(FaultCodes.GEN_CRITICAL_ERROR, "NullMap does not accept key '" + key + "'");
+            throw new InlineMetaException(FaultCodes.GEN_CRITICAL_ERROR,
+                                          "NullMap does not accept key '" + key + "'");
         }
     }
-
 }

Modified: xml/xindice/trunk/java/src/org/apache/xindice/core/meta/inline/ResourceTypeReader.java
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/meta/inline/ResourceTypeReader.java?view=diff&rev=479437&r1=479436&r2=479437
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/meta/inline/ResourceTypeReader.java (original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/meta/inline/ResourceTypeReader.java Sun Nov 26 14:44:04 2006
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *
- * CVS $Id$
+ * $Id$
  */
 
 package org.apache.xindice.core.meta.inline;
@@ -21,18 +21,20 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.xindice.core.FaultCodes;
+import org.apache.xindice.core.data.Value;
 
 /**
  *
- * @version CVS $Revision$, $Date$
+ * @version $Revision$, $Date$
  */
 public class ResourceTypeReader implements InlineMetaReader {
 
-    private static Log log = LogFactory.getLog(ResourceTypeReader.class);
+    private static final Log log = LogFactory.getLog(ResourceTypeReader.class);
 
-    public static final Integer XML = new Integer(1);
+    public static final Integer XML    = new Integer(1);
     public static final Integer BINARY = new Integer(2);
 
+
     /**
      * @see org.apache.xindice.core.meta.inline.InlineMetaReader#getVersion()
      */
@@ -41,29 +43,24 @@
     }
 
     /**
-     * @see org.apache.xindice.core.meta.inline.InlineMetaReader#read(byte[], int, int)
+     * @see org.apache.xindice.core.meta.inline.InlineMetaReader#read(Value)
      */
-    public InlineMetaMap read(byte[] data, int offset, int length) throws InlineMetaException {
+    public InlineMetaMap read(Value data) throws InlineMetaException {
         if (log.isDebugEnabled()) {
-            log.debug("ResourceTypeReader.read: data length=" + data.length + " offset=" + offset + " length=" + length);
+            log.debug("ResourceTypeReader.read: data length=" + data.getLength());
         }
 
-        if (length != 1) {
-            throw new InlineMetaException(FaultCodes.COL_DOCUMENT_MALFORMED, "Expecting header length of 1");
+        if (data.getLength() != 1) {
+            throw new InlineMetaException(FaultCodes.COL_DOCUMENT_MALFORMED,
+                                          "Expecting header length of 1");
         }
 
         Integer type;
-        try {
-            type = new Integer(data[offset]);
-        } catch (ArrayIndexOutOfBoundsException e) {
-            throw new InlineMetaException(
-                    FaultCodes.COL_DOCUMENT_MALFORMED,
-                    "Error reading from data (data length " + data.length + ", offset=" + offset + ", header length " + length + ")",
-                    e);
-        }
+        type = new Integer(data.byteAt(0));
 
         if (!XML.equals(type) && !BINARY.equals(type)) {
-            throw new InlineMetaException(FaultCodes.COL_DOCUMENT_MALFORMED, "Unexpected type value: " + type);
+            throw new InlineMetaException(FaultCodes.COL_DOCUMENT_MALFORMED,
+                                          "Unexpected type value: " + type);
         }
 
         ResourceTypeMap resourceTypeMap = new ResourceTypeMap();
@@ -95,7 +92,8 @@
             if ("type".equals(key)) {
                 return type;
             } else {
-                throw new InlineMetaException(FaultCodes.GEN_CRITICAL_ERROR, "ResourceTypeMap does not accept key '" + key + "'");
+                throw new InlineMetaException(FaultCodes.GEN_CRITICAL_ERROR,
+                                              "ResourceTypeMap does not accept key '" + key + "'");
             }
         }
 
@@ -114,10 +112,12 @@
                 if (value instanceof Integer) {
                     type = (Integer) value;
                 } else {
-                    throw new InlineMetaException(FaultCodes.GEN_CRITICAL_ERROR, "ResourceTypeMap key 'type' requires an Integer value");
+                    throw new InlineMetaException(FaultCodes.GEN_CRITICAL_ERROR,
+                                                  "ResourceTypeMap key 'type' requires an Integer value");
                 }
             } else {
-                throw new InlineMetaException(FaultCodes.GEN_CRITICAL_ERROR, "ResourceTypeMap does not accept key '" + key + "'");
+                throw new InlineMetaException(FaultCodes.GEN_CRITICAL_ERROR,
+                                              "ResourceTypeMap does not accept key '" + key + "'");
             }
         }
     }

Modified: xml/xindice/trunk/java/tests/src/org/apache/xindice/core/meta/inline/ResourceTypeReaderTest.java
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/tests/src/org/apache/xindice/core/meta/inline/ResourceTypeReaderTest.java?view=diff&rev=479437&r1=479436&r2=479437
==============================================================================
--- xml/xindice/trunk/java/tests/src/org/apache/xindice/core/meta/inline/ResourceTypeReaderTest.java (original)
+++ xml/xindice/trunk/java/tests/src/org/apache/xindice/core/meta/inline/ResourceTypeReaderTest.java Sun Nov 26 14:44:04 2006
@@ -13,19 +13,18 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *
- * CVS $Id$
+ * $Id$
  */
 
 package org.apache.xindice.core.meta.inline;
 
-import org.apache.xindice.core.meta.inline.InlineMetaException;
-import org.apache.xindice.core.meta.inline.InlineMetaMap;
-import org.apache.xindice.core.meta.inline.ResourceTypeReader;
+import org.apache.xindice.core.data.Value;
 
 import junit.framework.TestCase;
 
 /**
- * @version CVS $Revision$, $Date$
+ *
+ * @version $Revision$, $Date$
  * @author Gary Shea <sh...@gtsdesign.com>
  */
 public class ResourceTypeReaderTest extends TestCase {
@@ -43,14 +42,14 @@
 
         InlineMetaMap map;
 
-        map = reader.read(binaryData, 2, 1);
+        map = reader.read(new Value(binaryData, 2, 1));
         assertEquals(ResourceTypeReader.BINARY, map.get("type"));
 
-        map = reader.read(xmlData, 2, 1);
+        map = reader.read(new Value(xmlData, 2, 1));
         assertEquals(ResourceTypeReader.XML, map.get("type"));
         
         try {
-            reader.read(evilData, 2, 1);
+            reader.read(new Value(evilData, 2, 1));
             fail("failed to throw InlineMetaException on bad type value (3)");
         } catch (InlineMetaException e) {
             // expected exception

Modified: xml/xindice/trunk/status.xml
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/status.xml?view=diff&rev=479437&r1=479436&r2=479437
==============================================================================
--- xml/xindice/trunk/status.xml (original)
+++ xml/xindice/trunk/status.xml Sun Nov 26 14:44:04 2006
@@ -75,6 +75,10 @@
 
     <changes>
         <release version="1.1b5-dev" date="Oct 27 2006">
+            <action dev="VG" type="update" fixes-bug="41003" due-to="Natalia Shilenkova">
+                Change InlineMetaReader.read() method signature to remove
+                unnecessary data copying.
+            </action>
             <action dev="VG" type="update">
                 Update Ant to 1.6.5 version.
             </action>