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;