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 2007/11/13 15:26:23 UTC

svn commit: r594549 - in /xml/xindice/trunk/java: src/org/apache/xindice/core/cache/DocumentCache.java src/org/apache/xindice/core/cache/DocumentCacheImpl.java tests/src/org/apache/xindice/core/CollectionTest.java

Author: vgritsenko
Date: Tue Nov 13 06:26:23 2007
New Revision: 594549

URL: http://svn.apache.org/viewvc?rev=594549&view=rev
Log:
reintroducing cache entry object, storing entry type and Value object

Modified:
    xml/xindice/trunk/java/src/org/apache/xindice/core/cache/DocumentCache.java
    xml/xindice/trunk/java/src/org/apache/xindice/core/cache/DocumentCacheImpl.java
    xml/xindice/trunk/java/tests/src/org/apache/xindice/core/CollectionTest.java

Modified: xml/xindice/trunk/java/src/org/apache/xindice/core/cache/DocumentCache.java
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/cache/DocumentCache.java?rev=594549&r1=594548&r2=594549&view=diff
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/cache/DocumentCache.java (original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/cache/DocumentCache.java Tue Nov 13 06:26:23 2007
@@ -33,6 +33,17 @@
  */
 public interface DocumentCache {
 
+    // Cache Entry types constants
+
+    /** Entry type for the compressed XML document entry */
+    int COMPRESSED   = 1;
+
+    /** Entry type for the uncompressed XML document entry */
+    int UNCOMPRESSED = 2;
+
+    /** Entry type for the binary entry */
+    int BINARY       = 3;
+
     /**
      * Cache key consists of collection and entry key
      */

Modified: xml/xindice/trunk/java/src/org/apache/xindice/core/cache/DocumentCacheImpl.java
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/cache/DocumentCacheImpl.java?rev=594549&r1=594548&r2=594549&view=diff
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/cache/DocumentCacheImpl.java (original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/cache/DocumentCacheImpl.java Tue Nov 13 06:26:23 2007
@@ -24,6 +24,7 @@
 import org.apache.xindice.core.Collection;
 import org.apache.xindice.core.data.Entry;
 import org.apache.xindice.core.data.Key;
+import org.apache.xindice.core.data.Value;
 import org.apache.xindice.xml.NodeSource;
 import org.apache.xindice.xml.SymbolTable;
 import org.apache.xindice.xml.dom.DBDocument;
@@ -51,73 +52,104 @@
     private static final Log log = LogFactory.getLog(DocumentCacheImpl.class);
 
     /**
-     * CacheKey to Entry mapping
+     * CacheKey to CacheEntry mapping
      */
     private Map table = new WeakHashMap();
 
+    private class CacheEntry {
+        private final int type;
+        private final Key key;
+        private final Value value;
+        private final Map meta;
+
+        public CacheEntry(int type, Key key, Value value, Map meta) {
+            this.type = type;
+            this.key = key;
+            this.value = value;
+            this.meta = meta;
+        }
+
+        public int getType() {
+            return type;
+        }
+
+        public Key getKey() {
+            return key;
+        }
+
+        public Value getValue() {
+            return value;
+        }
+
+        public Map getMeta() {
+            return meta;
+        }
+    }
+
 
     public Entry getEntry(Collection col, Key key) {
-        Entry v = (Entry) table.get(new CacheKey(col, key));
-        if (v == null) {
+        CacheEntry e = (CacheEntry) table.get(new CacheKey(col, key));
+        if (e == null) {
             return null;
         }
 
-        switch (v.getEntryType()) {
-            case Entry.DOCUMENT:
-                if (v.getValue() instanceof String) {
-                    try {
-                        Document doc = DOMParser.toDocument((String) v.getValue());
-                        ((DBDocument) doc).setSource(new NodeSource(col, key));
-                        return new Entry(key, doc, v.getMeta());
-                    } catch (Exception e) {
-                        if (log.isWarnEnabled()) {
-                            log.warn("ignored exception", e);
-                        }
-                    }
-
-                } else if (v.getValue() instanceof byte[]) {
+        switch (e.getType()) {
+            case DocumentCache.COMPRESSED:
+                {
                     SymbolTable s = col.getSymbols();
                     NodeSource ns = new NodeSource(col, key);
-                    Document doc =  new DocumentImpl((byte[]) v.getValue(), s, ns);
-                    return new Entry(key, doc, v.getMeta());
-                } else {
-                    throw new IllegalStateException("Unexpected object: <" + v.getValue() + ">.");
+                    Document doc =  new DocumentImpl(e.getValue().getData(), s, ns);
+                    return new Entry(key, doc, e.getMeta());
+                }
+
+            case DocumentCache.UNCOMPRESSED:
+                try {
+                    Document doc = DOMParser.toDocument(e.getValue());
+                    ((DBDocument) doc).setSource(new NodeSource(col, key));
+                    return new Entry(key, doc, e.getMeta());
+                } catch (Exception ex) {
+                    if (log.isWarnEnabled()) {
+                        log.warn("ignored exception", ex);
+                    }
                 }
+                break;
 
-            case Entry.BINARY:
-                return new Entry(Entry.BINARY, key, v.getValue(), v.getMeta());
+            case DocumentCache.BINARY:
+                return new Entry(Entry.BINARY, key, e.getValue().getData(), e.getMeta());
 
             default:
-                return null;
+                throw new IllegalStateException("Invalid cache entry type: <" + e.getType() + ">");
         }
+
+        return null;
     }
 
     public Entry getEntryMeta(Collection col, Key key) {
-        Entry e = (Entry) table.get(new DocumentCache.CacheKey(col, key));
-        if (e != null) {
-            return new Entry(key, e.getMeta());
+        CacheEntry e = (CacheEntry) table.get(new DocumentCache.CacheKey(col, key));
+        if (e == null) {
+            return null;
         }
-
-        return null;
+        
+        return new Entry(key, e.getMeta());
     }
 
     public void putDocumentEntry(Collection col, Key key, byte[] bytes, Map meta) {
-        DocumentCache.CacheKey ckey = new DocumentCache.CacheKey(col, key);
-        table.put(ckey, new Entry(Entry.DOCUMENT, key, bytes, meta));
+        CacheKey ckey = new CacheKey(col, key);
+        table.put(ckey, new CacheEntry(DocumentCache.COMPRESSED, key, new Value(bytes), meta));
     }
 
     public void putDocumentEntry(Collection col, Key key, String chars, Map meta) {
-        DocumentCache.CacheKey ckey = new DocumentCache.CacheKey(col, key);
-        table.put(ckey, new Entry(Entry.DOCUMENT, key, chars, meta));
+        CacheKey ckey = new CacheKey(col, key);
+        table.put(ckey, new CacheEntry(DocumentCache.UNCOMPRESSED, key, new Value(chars), meta));
     }
 
     public void putBinaryEntry(Collection col, Key key, byte[] bytes, Map meta) {
-        DocumentCache.CacheKey ckey = new DocumentCache.CacheKey(col, key);
-        table.put(ckey, new Entry(Entry.BINARY, key, bytes, meta));
+        CacheKey ckey = new CacheKey(col, key);
+        table.put(ckey, new CacheEntry(DocumentCache.BINARY, key, new Value(bytes), meta));
     }
 
     public void removeEntry(Collection col, Key key) {
-        table.remove(new DocumentCache.CacheKey(col, key));
+        table.remove(new CacheKey(col, key));
     }
 
     /**

Modified: xml/xindice/trunk/java/tests/src/org/apache/xindice/core/CollectionTest.java
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/tests/src/org/apache/xindice/core/CollectionTest.java?rev=594549&r1=594548&r2=594549&view=diff
==============================================================================
--- xml/xindice/trunk/java/tests/src/org/apache/xindice/core/CollectionTest.java (original)
+++ xml/xindice/trunk/java/tests/src/org/apache/xindice/core/CollectionTest.java Tue Nov 13 06:26:23 2007
@@ -23,15 +23,17 @@
 import org.apache.xindice.core.query.XPathQueryResolver;
 import org.apache.xindice.util.Configuration;
 import org.apache.xindice.util.XindiceException;
-import org.apache.xindice.xml.TextWriter;
 import org.apache.xindice.xml.SymbolTable;
-import org.apache.xindice.xml.dom.DOMParser;
+import org.apache.xindice.xml.TextWriter;
 import org.apache.xindice.xml.dom.DOMCompressor;
+import org.apache.xindice.xml.dom.DOMParser;
 import org.apache.xindice.xml.dom.DocumentImpl;
 
 import junit.framework.TestCase;
 import org.w3c.dom.Document;
 
+import java.util.Arrays;
+
 /**
  * Tests Xindice Core API (org.apache.xindice.core.Database,
  * org.apache.xindice.core.Collection)
@@ -222,13 +224,16 @@
         }
     }
 
-// FIXME Define semantics of document cache, and write tests for it
-//    public void testDocumentCache() throws Exception {
-//        Document in = collection.getConfig().getElement().getOwnerDocument();
-//        collection.insertDocument("document", in);
-//
-//        Document out1 = collection.getDocument("document");
-//        Document out2 = collection.getDocument("document");
-//        assertTrue(out1 == out2);
-//    }
+
+    public void testDocumentCache() throws Exception {
+        Document in = collection.getConfig().getElement().getOwnerDocument();
+        collection.insertDocument("document", in);
+
+        DocumentImpl out1 = (DocumentImpl) collection.getDocument("document");
+        DocumentImpl out2 = (DocumentImpl) collection.getDocument("document");
+        assertNotSame(out1, out2);
+        // TODO This is subject to change
+        assertNotSame(out1.getDataBytes(), out2.getDataBytes());
+        assertTrue(Arrays.equals(out1.getDataBytes(), out2.getDataBytes()));
+    }
 }