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/12 14:58:47 UTC

svn commit: r594145 - in /xml/xindice/trunk/java/src/org/apache/xindice/core: Collection.java Database.java DocumentCache.java cache/ cache/DocumentCache.java cache/DocumentCacheImpl.java

Author: vgritsenko
Date: Mon Nov 12 05:58:46 2007
New Revision: 594145

URL: http://svn.apache.org/viewvc?rev=594145&view=rev
Log:
Move DocumentCache to the separate package. Introduce interface.

Added:
    xml/xindice/trunk/java/src/org/apache/xindice/core/cache/
    xml/xindice/trunk/java/src/org/apache/xindice/core/cache/DocumentCache.java   (with props)
    xml/xindice/trunk/java/src/org/apache/xindice/core/cache/DocumentCacheImpl.java   (with props)
Removed:
    xml/xindice/trunk/java/src/org/apache/xindice/core/DocumentCache.java
Modified:
    xml/xindice/trunk/java/src/org/apache/xindice/core/Collection.java
    xml/xindice/trunk/java/src/org/apache/xindice/core/Database.java

Modified: xml/xindice/trunk/java/src/org/apache/xindice/core/Collection.java
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/Collection.java?rev=594145&r1=594144&r2=594145&view=diff
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/Collection.java (original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/Collection.java Mon Nov 12 05:58:46 2007
@@ -38,6 +38,7 @@
 import org.apache.xindice.core.meta.inline.InlineMetaService;
 import org.apache.xindice.core.meta.inline.ResourceTypeReader;
 import org.apache.xindice.core.query.QueryEngine;
+import org.apache.xindice.core.cache.DocumentCache;
 import org.apache.xindice.util.Configurable;
 import org.apache.xindice.util.Configuration;
 import org.apache.xindice.util.Named;
@@ -1084,6 +1085,7 @@
 
     public boolean isOpened() {
         // Collection without filer is always open ... for now.
+        //noinspection SimplifiableIfStatement
         if (filer == null) {
             return true;
         }
@@ -1216,10 +1218,9 @@
      * This is the lowest-level method for storing a record into the backing store.
      * It now does update non-inline metadata if the user has configured it.
      *
-     * <br/><br/>
-     * putDocuemnt attempts to perform requested action, and success depends on action
-     * and presense of the key in the collection.
-     * <br/><br/>
+     * <p>putDocument attempts to perform requested action, and success depends on
+     * action and presense of the key in the collection.
+     *
      * @param key Entry key
      * @param document Document to store
      * @param action It can be either ACTION_INSERT, ACTION_UPDATE or ACTION_STORE
@@ -1627,6 +1628,7 @@
      *
      * @param docKey The Document Key
      * @param document The Document
+     * @return True if new document entry was created, false otherwise
      * @throws DBException if operation failed
      */
     public final boolean setDocument(Object docKey, Document document) throws DBException {
@@ -1635,7 +1637,6 @@
         }
 
         boolean res = putDocument(createNewKey(docKey), document, ACTION_STORE);
-
         if (res) {
             updateCollectionMeta();
         }
@@ -1664,7 +1665,6 @@
         }
 
         boolean res = putBinary(createNewKey(docKey), bytes, ACTION_STORE);
-
         if (res) {
             updateCollectionMeta();
         }

Modified: xml/xindice/trunk/java/src/org/apache/xindice/core/Database.java
URL: http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/Database.java?rev=594145&r1=594144&r2=594145&view=diff
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/Database.java (original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/Database.java Mon Nov 12 05:58:46 2007
@@ -21,6 +21,8 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.xindice.core.cache.DocumentCache;
+import org.apache.xindice.core.cache.DocumentCacheImpl;
 import org.apache.xindice.core.query.QueryEngine;
 import org.apache.xindice.server.Xindice;
 import org.apache.xindice.util.Configuration;
@@ -162,7 +164,7 @@
 
     public Database() {
         super();
-        docCache = new DocumentCache();
+        docCache = new DocumentCacheImpl();
         engine = new QueryEngine(this);
         closed = true;
     }

Added: 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=594145&view=auto
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/cache/DocumentCache.java (added)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/cache/DocumentCache.java Mon Nov 12 05:58:46 2007
@@ -0,0 +1,145 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * $Id$
+ */
+
+package org.apache.xindice.core.cache;
+
+import org.apache.xindice.core.Collection;
+import org.apache.xindice.core.data.Entry;
+import org.apache.xindice.core.data.Key;
+
+import java.util.Map;
+
+/**
+ * DocumentCache implements a simple Document caching system for
+ * Collections.
+ *
+ * @version $Revision$, $Date$
+ */
+public interface DocumentCache {
+
+    /**
+     * Obtains document from cache
+     *
+     * @param col document collection
+     * @param key document key
+     * @return document from the cache or null if not present
+     */
+    Entry getDocument(Collection col, Key key);
+
+    /**
+     * Obtains entry metadata from cache.
+     *
+     * @param col document collection
+     * @param key document key
+     * @return document from the cache or null if not present
+     */
+    Entry getDocumentMeta(Collection col, Key key);
+
+    /**
+     * Stores compressed document's bytes in the cache
+     *
+     * @param col document collection
+     * @param key document key
+     * @param bytes compressed document
+     * @param meta document meta attributes map
+     */
+    void putDocument(Collection col, Key key, byte[] bytes, Map meta);
+
+    /**
+     * Stores serialized document's text in the cache
+     *
+     * @param col document collection
+     * @param key document key
+     * @param chars uncompressed document
+     * @param meta document meta attributes map
+     */
+    void putDocument(Collection col, Key key, String chars, Map meta);
+
+    /**
+     * Remove document from the cache
+     *
+     * @param col document collection
+     * @param key document key
+     */
+    void removeDocument(Collection col, Key key);
+
+    /**
+     * Cache key consists of collection and document key
+     */
+    class CacheKey {
+        private final Collection col;
+        private final Key key;
+        private transient int hashCode;
+
+        public CacheKey(Collection col, Key key) {
+            this.col = col;
+            this.key = key;
+        }
+
+        public Collection getCollection() {
+            return col;
+        }
+
+        public Key getKey() {
+            return key;
+        }
+
+        public int hashCode() {
+            if (hashCode == 0) {
+                hashCode = col.getCanonicalDocumentName(key).hashCode();
+            }
+
+            return hashCode;
+        }
+
+        public boolean equals(Object o) {
+            return (o instanceof DocumentCacheImpl.CacheKey) && col == ((DocumentCacheImpl.CacheKey) o).col && key.equals(((DocumentCacheImpl.CacheKey) o).key);
+        }
+
+        public String toString() {
+            return col.getCanonicalDocumentName(key);
+        }
+    }
+
+    /**
+     * Cache value holds document object and meta data
+     */
+    class CacheValue {
+        private Object value;
+        private Map meta;
+
+        public CacheValue(byte[] value, Map meta) {
+            this.value = value;
+            this.meta = meta;
+        }
+
+        public CacheValue(String value, Map meta) {
+            this.value = value;
+            this.meta = meta;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Map getMeta() {
+            return meta;
+        }
+    }
+}

Propchange: xml/xindice/trunk/java/src/org/apache/xindice/core/cache/DocumentCache.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: xml/xindice/trunk/java/src/org/apache/xindice/core/cache/DocumentCache.java
------------------------------------------------------------------------------
    svn:keywords = Id Revision Author Date

Added: 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=594145&view=auto
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/core/cache/DocumentCacheImpl.java (added)
+++ xml/xindice/trunk/java/src/org/apache/xindice/core/cache/DocumentCacheImpl.java Mon Nov 12 05:58:46 2007
@@ -0,0 +1,177 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * $Id$
+ */
+
+package org.apache.xindice.core.cache;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.xindice.core.Collection;
+import org.apache.xindice.core.data.Entry;
+import org.apache.xindice.core.data.Key;
+import org.apache.xindice.xml.NodeSource;
+import org.apache.xindice.xml.SymbolTable;
+import org.apache.xindice.xml.dom.DBDocument;
+import org.apache.xindice.xml.dom.DOMParser;
+import org.apache.xindice.xml.dom.DocumentImpl;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import java.util.Map;
+import java.util.WeakHashMap;
+
+/**
+ * DocumentCache implements a simple Document caching system for
+ * Collections.
+ *
+ * <small>
+ * FIXME: Revisit cache implementation. Most probably, commons collections'
+ *        ReferenceMap should be used instead of WeakHashMap.
+ * </small>
+ *
+ * @version $Revision$, $Date$
+ */
+public class DocumentCacheImpl implements DocumentCache {
+
+    private static final Log log = LogFactory.getLog(DocumentCacheImpl.class);
+
+    private Map table = new WeakHashMap();
+
+    /**
+     * Obtains document from cache
+     *
+     * @param col document collection
+     * @param key document key
+     * @return document from the cache or null if not present
+     */
+    public Entry getDocument(Collection col, Key key) {
+        CacheValue v = (CacheValue) table.get(new CacheKey(col, key));
+
+        if (v == null) {
+            return null;
+
+        } else if (v.getValue() instanceof Document) {
+            return new Entry(key, (Document) v.getValue(), v.getMeta());
+
+        } else 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[]) {
+            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());
+        }
+
+        return null;
+    }
+
+    /**
+     * Obtains entry metadata from cache.
+     *
+     * @param col document collection
+     * @param key document key
+     * @return document from the cache or null if not present
+     */
+    public Entry getDocumentMeta(Collection col, Key key) {
+        DocumentCache.CacheValue v = (DocumentCache.CacheValue) table.get(new DocumentCache.CacheKey(col, key));
+
+        if (v != null) {
+            return new Entry(key, v.getMeta());
+        }
+
+        return null;
+    }
+
+    /**
+     * Stores compressed document's bytes in the cache
+     *
+     * @param col document collection
+     * @param key document key
+     * @param bytes compressed document
+     * @param meta document meta attributes map
+     */
+    public void putDocument(Collection col, Key key, byte[] bytes, Map meta) {
+        DocumentCache.CacheKey ckey = new DocumentCache.CacheKey(col, key);
+        table.put(ckey, new CacheValue(bytes, meta));
+    }
+
+    /**
+     * Stores serialized document's text in the cache
+     *
+     * @param col document collection
+     * @param key document key
+     * @param chars uncompressed document
+     * @param meta document meta attributes map
+     */
+    public void putDocument(Collection col, Key key, String chars, Map meta) {
+        DocumentCache.CacheKey ckey = new DocumentCache.CacheKey(col, key);
+        table.put(ckey, new CacheValue(chars, meta));
+    }
+
+    /**
+     * Remove document from the cache
+     *
+     * @param col document collection
+     * @param key document key
+     */
+    public void removeDocument(Collection col, Key key) {
+        table.remove(new DocumentCache.CacheKey(col, key));
+    }
+
+    /**
+     * Obtains value of the cache control processing instruction in this document
+     * @param doc document to inspect for cache control processing instruction
+     * @return cache control value
+     */
+    public static int getCacheControl(Document doc) {
+        String cache = DBDocument.CACHE;
+        NodeList childNodes = doc.getChildNodes();
+        int size = childNodes.getLength();
+        for (int i = 0; i < size; i++) {
+            Node n = childNodes.item(i);
+            if (n.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE && n.getNodeName().equals(DBDocument.CACHE_CONTROL)) {
+                cache = n.getNodeValue().trim();
+                break;
+            }
+        }
+
+        if (cache != null) {
+            if (cache.equals(DBDocument.CACHE)) {
+                return -1;
+            } else if (cache.equals(DBDocument.NOCACHE)) {
+                return 0;
+            } else {
+                return Integer.parseInt(cache);
+            }
+        }
+
+        return -1;
+    }
+
+}

Propchange: xml/xindice/trunk/java/src/org/apache/xindice/core/cache/DocumentCacheImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: xml/xindice/trunk/java/src/org/apache/xindice/core/cache/DocumentCacheImpl.java
------------------------------------------------------------------------------
    svn:keywords = Id Revision Author Date