svn commit: r571938 - in /xml/xindice/trunk/java/src/org/apache/xindice/core: data/Entry.java data/Key.java data/Value.java filer/HashFiler.java filer/Paged.java

[email protected]
Newsgroups gmane.text.xml.xindice.devel
Message-ID <[email protected]>
Author: vgritsenko
Date: Sun Sep  2 03:14:13 2007
New Revision: 571938

URL: http://svn.apache.org/viewvc?rev=571938&view=rev
Log:
cleanup key - remove code duplication with value.
make value completely immutable (barring byte array passed into constructor).

Modified:
    xml/xindice/trunk/java/src/org/apache/xindice/core/data/Entry.java
    xml/xindice/trunk/java/src/org/apache/xindice/core/data/Key.java
    xml/xindice/trunk/java/src/org/apache/xindice/core/data/Value.java
    xml/xindice/trunk/java/src/org/apache/xindice/core/filer/HashFiler.java
    xml/xindice/trunk/java/src/org/apache/xindice/core/filer/Paged.java

Modified: xml/xindice/trunk/java/src/org/apache/xindice/core/data/Entry.java
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/data/Entry.java?rev=571938&r1=571937&r2=571938&view=diff
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/data/Entry.java (original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/data/Entry.java Sun Sep  2 03:14:13 2007
@@ -24,6 +24,7 @@
 
 import java.util.Map;
 import java.util.HashMap;
+import java.util.Collections;
 
 /**
  * Entry is a high-level representation of a database record, that includes
@@ -33,12 +34,12 @@
  */
 public class Entry {
 
-    public static final byte UNKNOWN = 0;
+    public static final byte UNKNOWN  = 0;
     public static final byte DOCUMENT = 1;
-    public static final byte BINARY = 2;
-    public static final byte OBJECT = 3;
+    public static final byte BINARY   = 2;
+    public static final byte OBJECT   = 3;
 
-    public static final String CREATED = "created";
+    public static final String CREATED  = "created";
     public static final String MODIFIED = "modified";
 
     private final Key key;
@@ -46,6 +47,7 @@
     private final Map meta;
     private final byte type;
 
+
     public Entry(Key key, Document value, Map meta) {
         this.key = key;
         this.value = value;
@@ -74,16 +76,16 @@
         type = UNKNOWN;
     }
 
-    public byte getEntryType() {
-        return type;
+    public Key getKey() {
+        return key;
     }
 
     public Object getValue() {
         return value;
     }
 
-    public Key getKey() {
-        return key;
+    public Map getMeta() {
+        return Collections.unmodifiableMap(meta);
     }
 
     public long getCreationTime() {
@@ -96,9 +98,13 @@
         return date != null ? date.longValue() : 0;
     }
 
+    public byte getEntryType() {
+        return type;
+    }
+
     public static Map createMetaMap(Record record) {
         Map entryMeta = new HashMap();
-        entryMeta.put(Entry.CREATED, record.getMetaData(Record.CREATED));
+        entryMeta.put(Entry.CREATED,  record.getMetaData(Record.CREATED));
         entryMeta.put(Entry.MODIFIED, record.getMetaData(Record.MODIFIED));
         return entryMeta;
     }

Modified: xml/xindice/trunk/java/src/org/apache/xindice/core/data/Key.java
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/data/Key.java?rev=571938&r1=571937&r2=571938&view=diff
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/data/Key.java (original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/data/Key.java Sun Sep  2 03:14:13 2007
@@ -19,7 +19,6 @@
 
 package org.apache.xindice.core.data;
 
-
 /**
  * Key extends Value by providing a hash value for the Key.
  *
@@ -27,9 +26,6 @@
  */
 public final class Key extends Value {
 
-    private int hash;
-
-
     public Key(Value value) {
         super(value);
     }
@@ -47,36 +43,15 @@
     }
 
     public int getHash() {
-        // modeled after String.hashCode()
-        if (hash == 0) {
-            int tempHash = 0;
-            for(int i = 0 ; i < len; i++) {
-                tempHash = 31 * tempHash + data[pos + i];
-            }
-            this.hash = Math.abs(tempHash);
-        }
-        return hash;
+        return super.hashCode();
     }
 
     public boolean equals(Value value) {
+        //noinspection SimplifiableIfStatement
         if (value instanceof Key) {
-            Key key = (Key) value;
-            return getHash() == key.getHash() && compareTo(key) == 0;
+            return hashCode() == value.hashCode() && compareTo(value) == 0;
         }
 
-        return super.equals(value);
-    }
-
-    public int hashCode() {
-        return getHash();
-    }
-
-    public boolean equals(Object obj) {
-        if (obj instanceof Value) {
-            return equals((Value) obj);
-        }
-
-        return super.equals(obj);
+        return false;
     }
 }
-

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?rev=571938&r1=571937&r2=571938&view=diff
==============================================================================
--- 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 Sep  2 03:14:13 2007
@@ -29,18 +29,26 @@
 
 /**
  * Value is the primary base class for all data storing objects.
- * The content window of Value objects are immutable, but the
- * underlying byte array is not.
+ * The content window of value objects are immutable, but the
+ * underlying byte array which was used for constructing the value might be not.
  *
  * @version $Revision$, $Date$
  */
 public class Value implements Comparable {
 
-    protected byte[] data;
-    protected int pos;
-    protected int len;
+    private byte[] data;
+    private int pos;
+    private int len;
     private int hash;
 
+    /**
+     * Usually there is no need to create a copy of the value, since it is
+     * an immutable object. This constructor is mainly used to create
+     * key objects.
+     *
+     * @param value the value object which data will be used to construct this
+     *        value. 
+     */
     public Value(Value value) {
         this.data = value.data;
         this.pos = value.pos;
@@ -57,6 +65,7 @@
         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;
@@ -82,32 +91,23 @@
     }
 
     /**
-     * getData retrieves the data being stored by the Value as a byte array.
+     * getData retrieves a <strong>copy</copy> of the data which is being stored
+     * by this value as a byte array.
+     *
+     * <p>Data copying is performed in order to ensure immutability of the Value.
+     * Avoid using this method if possible.
      *
-     * @return The Data
+     * @return The data
      */
     public final byte[] getData() {
-        if (len != data.length) {
-            byte[] b = new byte[len];
-            System.arraycopy(data, pos, b, 0, len);
-            return b;
-        } else {
-            return data;
-        }
+        byte[] b = new byte[len];
+        System.arraycopy(data, pos, b, 0, len);
+        return b;
     }
 
-    /**
-     * 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);
-    }
+    //
+    // Data extraction
+    //
 
     /**
      * Returns the byte at the specified index.
@@ -124,23 +124,60 @@
         return data[pos + index];
     }
 
-    public final boolean startsWith(Value value) {
-        if (len < value.len) {
-            return false;
-        }
+    /**
+     * Returns the short value at the specified index.
+     *
+     * @param index short index
+     * @return the short at the specified index.
+     * @throws ArrayIndexOutOfBoundsException if index is negative number or
+     *         is not less that the length of the data array
+     */
+    public final short shortAt(int index) {
+        return (short) ((data[index += pos] << 8) | data[index + 1]);
+    }
 
-        byte[] ddata = value.data;
-        int dpos = value.pos;
+    /**
+     * Returns the int value at the specified index.
+     *
+     * @param index int index
+     * @return the int at the specified index.
+     * @throws ArrayIndexOutOfBoundsException if index is negative number or
+     *         is not less that the length of the data array
+     */
+    public final int intAt(int index) {
+        return (short) ((data[index += pos] << 24) | (data[index + 1] << 16) | (data[index + 2] << 8) | data[index + 3]);
+    }
 
-        for (int i = 0; i < value.len; i++) {
-            if (data[i + pos] != ddata[i + dpos]) {
-                return false;
-            }
-        }
+    /**
+     * Get a 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 valueAt(int start, int len) {
+        return new Value(data, pos + start, len);
+    }
 
-        return true;
+    /**
+     * Get a key that is part of this value object.
+     *
+     * @param start beginning index
+     * @param len length of the new key
+     * @return Key object
+     * @throws ArrayIndexOutOfBoundsException if start index is either negative
+     *         or isn't less then length of original Value
+     */
+    public final Key keyAt(int start, int len) {
+        return new Key(data, pos + start, len);
     }
 
+    //
+    // I/O
+    //
+
     /**
      * Return an InputStream for the value.
      *
@@ -154,6 +191,7 @@
      * Stream the content of the value into an OutputStream.
      *
      * @param out the OutputStream
+     * @throws IOException if write failed
      */
     public final void streamTo(OutputStream out) throws IOException {
         out.write(data, pos, len);
@@ -181,6 +219,27 @@
         System.arraycopy(data, pos, tdata, tpos, len);
     }
 
+    //
+    // Comparisons
+    //
+
+    public final boolean startsWith(Value value) {
+        if (len < value.len) {
+            return false;
+        }
+
+        byte[] ddata = value.data;
+        int dpos = value.pos;
+
+        for (int i = 0; i < value.len; i++) {
+            if (data[i + pos] != ddata[i + dpos]) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
     public final int compareTo(Value value) {
         byte[] ddata = value.data;
         int dpos = value.pos;
@@ -211,9 +270,26 @@
         if (obj instanceof Value) {
             return compareTo((Value) obj);
         }
+
         return compareTo(new Value(obj.toString()));
     }
 
+    //
+    // Object
+    //
+
+    public int hashCode() {
+        // modeled after String.hashCode()
+        if (hash == 0) {
+            int tempHash = 0;
+            for (int i = 0; i < len; i++) {
+                tempHash = 31 * tempHash + data[pos + i];
+            }
+            this.hash = Math.abs(tempHash);
+        }
+        return hash;
+    }
+
     public boolean equals(Value value) {
         return len == value.len && compareTo(value) == 0;
     }
@@ -222,22 +298,12 @@
         if (this == obj) {
             return true;
         }
+
         if (obj instanceof Value) {
             return equals((Value) obj);
         }
-        return obj != null && equals(new Value(obj.toString()));
-    }
 
-    public int hashCode() {
-        // modeled after String.hashCode()
-        if(hash == 0) {
-            int tempHash = 0;
-            for(int i = 0 ; i < len; i++) {
-                tempHash = 31 * tempHash + data[pos + i];
-            }
-            this.hash = Math.abs(tempHash);
-        }
-        return hash;
+        return obj != null && equals(new Value(obj.toString()));
     }
 
     public final String toString() {

Modified: xml/xindice/trunk/java/src/org/apache/xindice/core/filer/HashFiler.java
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/filer/HashFiler.java?rev=571938&r1=571937&r2=571938&view=diff
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/filer/HashFiler.java (original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/filer/HashFiler.java Sun Sep  2 03:14:13 2007
@@ -104,7 +104,7 @@
     }
 
     private Page seekRecordPage(Key key) throws IOException {
-        int hash = key.getHash();
+        int hash = key.hashCode();
         long pageNum = hash % fileHeader.getPageCount();
         Page p = getPage(pageNum);
         synchronized (p) {
@@ -154,7 +154,7 @@
 
     private Page seekInsertionPage(Key key) throws IOException {
         // Calculate hash and retrieve chain head page
-        int hash = key.getHash();
+        int hash = key.hashCode();
         Page p = getPage(hash % fileHeader.getPageCount());
 
         // Synchronize by chain head page
@@ -269,7 +269,7 @@
         }
         checkOpened();
         try {
-            int hash = key.getHash();
+            int hash = key.hashCode();
             long pageNum = hash % fileHeader.getPageCount();
 
             Page page = getPage(pageNum);

Modified: xml/xindice/trunk/java/src/org/apache/xindice/core/filer/Paged.java
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/filer/Paged.java?rev=571938&r1=571937&r2=571938&view=diff
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/filer/Paged.java (original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/filer/Paged.java Sun Sep  2 03:14:13 2007
@@ -1168,7 +1168,7 @@
             // setKey WIPES OUT the Page data
             setRecordLen(0);
             dataLen = 0;
-            keyHash = key.getHash();
+            keyHash = key.hashCode();
             keyLen = (short) key.getLength();
             dirty = true;
         }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.