You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by sy...@apache.org on 2005/08/10 18:51:42 UTC

svn commit: r231282 - in /cocoon/blocks/jcr/trunk/java/org/apache/cocoon/jcr: AbstractRepository.java source/JCRNodeSource.java

Author: sylvain
Date: Wed Aug 10 09:51:35 2005
New Revision: 231282

URL: http://svn.apache.org/viewcvs?rev=231282&view=rev
Log:
Cache JCR session in a request attribute, add construction for extensions

Modified:
    cocoon/blocks/jcr/trunk/java/org/apache/cocoon/jcr/AbstractRepository.java
    cocoon/blocks/jcr/trunk/java/org/apache/cocoon/jcr/source/JCRNodeSource.java

Modified: cocoon/blocks/jcr/trunk/java/org/apache/cocoon/jcr/AbstractRepository.java
URL: http://svn.apache.org/viewcvs/cocoon/blocks/jcr/trunk/java/org/apache/cocoon/jcr/AbstractRepository.java?rev=231282&r1=231281&r2=231282&view=diff
==============================================================================
--- cocoon/blocks/jcr/trunk/java/org/apache/cocoon/jcr/AbstractRepository.java (original)
+++ cocoon/blocks/jcr/trunk/java/org/apache/cocoon/jcr/AbstractRepository.java Wed Aug 10 09:51:35 2005
@@ -32,6 +32,7 @@
 import org.apache.avalon.framework.context.Context;
 import org.apache.avalon.framework.context.ContextException;
 import org.apache.avalon.framework.context.Contextualizable;
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
 import org.apache.avalon.framework.service.ServiceException;
 import org.apache.avalon.framework.service.ServiceManager;
 import org.apache.avalon.framework.service.Serviceable;
@@ -43,6 +44,8 @@
 import org.apache.cocoon.components.ContextHelper;
 import org.apache.cocoon.components.treeprocessor.variables.VariableResolver;
 import org.apache.cocoon.components.treeprocessor.variables.VariableResolverFactory;
+import org.apache.cocoon.environment.ObjectModelHelper;
+import org.apache.cocoon.environment.Request;
 import org.apache.cocoon.sitemap.PatternException;
 
 /**
@@ -77,10 +80,7 @@
  * 
  * @version $Id$
  */
-public class AbstractRepository implements Repository, ThreadSafe, Contextualizable, Serviceable, Configurable, Disposable {
-
-    // TODO: on login(), keep the JCR Session in the Environment Session, this
-    // will improve performances.
+public class AbstractRepository extends AbstractLogEnabled implements Repository, ThreadSafe, Contextualizable, Serviceable, Configurable, Disposable {
 
     protected ServiceManager manager;
 
@@ -94,6 +94,11 @@
     protected VariableResolver loginResolver = null;
 
     protected VariableResolver passwordResolver = null;
+    
+    /**
+     * The request attribute in which the JCR session is stored
+     */
+    public static final String JCR_SESSION_REQUEST_ATTRIBUTE = "jcr-session";
 
     // =============================================================================================
     // Avalon lifecycle
@@ -173,24 +178,70 @@
     }
 
     public Session login() throws LoginException, NoSuchWorkspaceException, RepositoryException {
-        Credentials creds = getCredentials();
-        return creds == null ? delegate.login() : delegate.login(creds);
+        Session session = getCachedSession(null);
+
+        if (session == null) {
+            Credentials creds = getCredentials();
+            session = creds == null ? delegate.login() : delegate.login(creds);
+            cacheSession(session, null);
+        }
+
+        return session;
     }
 
     public Session login(Credentials creds) throws LoginException, NoSuchWorkspaceException, RepositoryException {
-        return delegate.login(creds);
+        Session session = getCachedSession(null);
+
+        if (session == null) {
+            session = delegate.login(creds);
+            cacheSession(session, null);
+        }
+
+        return session;
     }
 
     public Session login(Credentials creds, String workspace) throws LoginException, NoSuchWorkspaceException, RepositoryException {
-        return delegate.login(creds, workspace);
+        Session session = getCachedSession(workspace);
+
+        if (session == null) {
+            session = delegate.login(creds, workspace);
+            cacheSession(session, workspace);
+        }
+
+        return session;
     }
 
     public Session login(String workspace) throws LoginException, NoSuchWorkspaceException, RepositoryException {
-        Credentials creds = getCredentials();
-        return creds == null ? delegate.login(workspace) : delegate.login(creds, workspace);
+        Session session = getCachedSession(workspace);
+
+        if (session == null) {
+            Credentials creds = getCredentials();
+            session = creds == null ? delegate.login(workspace) : delegate.login(creds, workspace);
+            cacheSession(session, workspace);
+        }
+
+        return session;
     }
 
     // =============================================================================================
+    
+    private Session getCachedSession(String workspace) {
+        String attributeName = workspace == null ?
+                JCR_SESSION_REQUEST_ATTRIBUTE : JCR_SESSION_REQUEST_ATTRIBUTE + "/" + workspace;
+        Map objectModel = ContextHelper.getObjectModel(context);
+        Request request = ObjectModelHelper.getRequest(objectModel);
+        Session session = (Session) request.getAttribute(attributeName);
+      
+        return (session != null && session.isLive()) ? session : null;
+    }
+    
+    private void cacheSession(Session session, String workspace) {
+        String attributeName = workspace == null ?
+                JCR_SESSION_REQUEST_ATTRIBUTE : JCR_SESSION_REQUEST_ATTRIBUTE + "/" + workspace;
+        Map objectModel = ContextHelper.getObjectModel(context);
+        Request request = ObjectModelHelper.getRequest(objectModel);
+        request.setAttribute(attributeName, session);
+    }
 
     private Credentials getCredentials() throws LoginException {
         if (this.loginResolver != null) {

Modified: cocoon/blocks/jcr/trunk/java/org/apache/cocoon/jcr/source/JCRNodeSource.java
URL: http://svn.apache.org/viewcvs/cocoon/blocks/jcr/trunk/java/org/apache/cocoon/jcr/source/JCRNodeSource.java?rev=231282&r1=231281&r2=231282&view=diff
==============================================================================
--- cocoon/blocks/jcr/trunk/java/org/apache/cocoon/jcr/source/JCRNodeSource.java (original)
+++ cocoon/blocks/jcr/trunk/java/org/apache/cocoon/jcr/source/JCRNodeSource.java Wed Aug 10 09:51:35 2005
@@ -83,6 +83,18 @@
         }
     }
 
+    public JCRNodeSource(JCRSourceFactory factory, Node node) throws SourceException {
+        this.factory = factory;
+        this.node = node;
+
+        try {
+          this.session = node.getSession();
+          this.path = node.getPath();
+        } catch (RepositoryException e) {
+            throw new SourceException("Cannot get node's informations", e);
+        }
+    }
+
     public JCRNodeSource(JCRNodeSource parent, Node node) throws SourceException {
         this.factory = parent.factory;
         this.session = parent.session;