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;
}