You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2010/08/10 12:05:17 UTC

svn commit: r983909 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query: QueryImpl.java lucene/NodeIteratorImpl.java lucene/QueryResultImpl.java

Author: jukka
Date: Tue Aug 10 10:05:16 2010
New Revision: 983909

URL: http://svn.apache.org/viewvc?rev=983909&view=rev
Log:
JCR-890: concurrent read-only access to a session

Turn Query.execute() and related methods into SessionOperations

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NodeIteratorImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/QueryResultImpl.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryImpl.java?rev=983909&r1=983908&r2=983909&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryImpl.java Tue Aug 10 10:05:16 2010
@@ -36,11 +36,10 @@ import javax.jcr.query.QueryResult;
 import javax.jcr.version.VersionException;
 
 import org.apache.jackrabbit.core.session.SessionContext;
+import org.apache.jackrabbit.core.session.SessionOperation;
 import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.spi.Path;
 import org.apache.jackrabbit.spi.commons.conversion.NameException;
-import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
-import org.apache.jackrabbit.spi.commons.conversion.NameResolver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -126,7 +125,13 @@ public class QueryImpl extends AbstractQ
     public QueryResult execute() throws RepositoryException {
         checkInitialized();
         long time = System.currentTimeMillis();
-        QueryResult result = query.execute(offset, limit);
+        QueryResult result = sessionContext.getSessionState().perform(
+                new SessionOperation<QueryResult>() {
+                    public QueryResult perform(SessionContext context)
+                            throws RepositoryException {
+                        return query.execute(offset, limit);
+                    }
+                });
         if (log.isDebugEnabled()) {
             time = System.currentTimeMillis() - time;
             NumberFormat format = NumberFormat.getNumberInstance();

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NodeIteratorImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NodeIteratorImpl.java?rev=983909&r1=983908&r2=983909&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NodeIteratorImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/NodeIteratorImpl.java Tue Aug 10 10:05:16 2010
@@ -18,6 +18,8 @@ package org.apache.jackrabbit.core.query
 
 import org.apache.jackrabbit.core.ItemManager;
 import org.apache.jackrabbit.core.NodeImpl;
+import org.apache.jackrabbit.core.session.SessionContext;
+import org.apache.jackrabbit.core.session.SessionOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -36,15 +38,17 @@ class NodeIteratorImpl implements NodeIt
     /** Logger instance for this class */
     private static final Logger log = LoggerFactory.getLogger(NodeIteratorImpl.class);
 
+    /**
+     * Component context of the current session
+     */
+    protected final SessionContext sessionContext;
+
     /** The node ids of the nodes in the result set with their score value */
     protected final ScoreNodeIterator scoreNodes;
 
-    /** The index for the default selector withing {@link #scoreNodes} */
+    /** The index for the default selector within {@link #scoreNodes} */
     private final int selectorIndex;
 
-    /** ItemManager to turn UUIDs into Node instances */
-    protected final ItemManager itemMgr;
-
     /** Number of invalid nodes */
     protected int invalid = 0;
 
@@ -59,16 +63,15 @@ class NodeIteratorImpl implements NodeIt
     /**
      * Creates a new <code>NodeIteratorImpl</code> instance.
      *
-     * @param itemMgr       the <code>ItemManager</code> to turn UUIDs into
-     *                      <code>Node</code> instances.
+     * @param sessionContext component context of the current session
      * @param scoreNodes    iterator over score nodes.
      * @param selectorIndex the index for the default selector within
      *                      <code>scoreNodes</code>.
      */
-    NodeIteratorImpl(ItemManager itemMgr,
-                     ScoreNodeIterator scoreNodes,
-                     int selectorIndex) {
-        this.itemMgr = itemMgr;
+    NodeIteratorImpl(
+            SessionContext sessionContext, ScoreNodeIterator scoreNodes,
+            int selectorIndex) {
+        this.sessionContext = sessionContext;
         this.scoreNodes = scoreNodes;
         this.selectorIndex = selectorIndex;
     }
@@ -175,19 +178,35 @@ class NodeIteratorImpl implements NodeIt
      * method returns, then there are no more valid element in this iterator.
      */
     protected void fetchNext() {
-        // reset
-        next = null;
-        while (next == null && scoreNodes.hasNext()) {
-            ScoreNode[] sn = scoreNodes.nextScoreNodes();
-            try {
-                next = (NodeImpl) itemMgr.getItem(sn[selectorIndex].getNodeId());
-            } catch (RepositoryException e) {
-                log.warn("Exception retrieving Node with UUID: "
-                        + sn[selectorIndex].getNodeId() + ": " + e.toString());
-                // try next
-                invalid++;
+        try {
+            sessionContext.getSessionState().perform(new FetchNext());
+        } catch (RepositoryException e) {
+            log.warn("Failed to fetch next node", e);
+        }
+    }
+
+    private class FetchNext implements SessionOperation<Object> {
+
+        public Object perform(SessionContext context) {
+            next = null; // reset
+
+            ItemManager itemMgr = context.getItemManager();
+            while (next == null && scoreNodes.hasNext()) {
+                ScoreNode[] sn = scoreNodes.nextScoreNodes();
+                try {
+                    next = (NodeImpl) itemMgr.getItem(
+                            sn[selectorIndex].getNodeId());
+                } catch (RepositoryException e) {
+                    log.warn("Failed to retrieve query result node "
+                            + sn[selectorIndex].getNodeId(), e);
+                    // try next
+                    invalid++;
+                }
             }
+
+            return this;
         }
+
     }
 
     protected void initialize() {

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/QueryResultImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/QueryResultImpl.java?rev=983909&r1=983908&r2=983909&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/QueryResultImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/QueryResultImpl.java Tue Aug 10 10:05:16 2010
@@ -31,7 +31,6 @@ import javax.jcr.query.RowIterator;
 
 import org.apache.jackrabbit.core.session.SessionContext;
 import org.apache.jackrabbit.spi.Name;
-import org.apache.jackrabbit.spi.commons.conversion.NameResolver;
 import org.apache.jackrabbit.spi.commons.query.qom.ColumnImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -182,8 +181,7 @@ public abstract class QueryResultImpl im
      * {@inheritDoc}
      */
     public NodeIterator getNodes() throws RepositoryException {
-        return new NodeIteratorImpl(
-                sessionContext.getItemManager(), getScoreNodes(), 0);
+        return new NodeIteratorImpl(sessionContext, getScoreNodes(), 0);
     }
 
     /**