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

svn commit: r1513054 - in /jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr: SessionContext.java SessionImpl.java

Author: jukka
Date: Mon Aug 12 07:05:04 2013
New Revision: 1513054

URL: http://svn.apache.org/r1513054
Log:
OAK-953: Allow sub-classing of SessionImpl

Add factory methods for creating the session and workspace instances in SessionContext
Simplify lock manager access in SessionImpl

Modified:
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionContext.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionContext.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionContext.java?rev=1513054&r1=1513053&r2=1513054&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionContext.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionContext.java Mon Aug 12 07:05:04 2013
@@ -81,12 +81,15 @@ public class SessionContext implements N
 
     private final RepositoryImpl repository;
     private final Whiteboard whiteboard;
+    private final Map<String, Object> attributes;
     private final SessionDelegate delegate;
+
     private final SessionNamespaces namespaces;
     private final NamePathMapper namePathMapper;
     private final ValueFactory valueFactory;
-    private final SessionImpl session;
-    private final WorkspaceImpl workspace;
+
+    private SessionImpl session = null;
+    private WorkspaceImpl workspace = null;
 
     private AccessControlManager accessControlManager;
     private PermissionProvider permissionProvider;
@@ -100,7 +103,9 @@ public class SessionContext implements N
             Map<String, Object> attributes, @Nonnull final SessionDelegate delegate) {
         this.repository = checkNotNull(repository);
         this.whiteboard = checkNotNull(whiteboard);
+        this.attributes = attributes;
         this.delegate = checkNotNull(delegate);
+
         this.namespaces = new SessionNamespaces(this);
         LocalNameMapper nameMapper = new LocalNameMapper() {
             @Override
@@ -117,19 +122,48 @@ public class SessionContext implements N
                 nameMapper, delegate.getIdManager());
         this.valueFactory = new ValueFactoryImpl(
                 delegate.getRoot().getBlobFactory(), namePathMapper);
+    }
 
-        this.session = new SessionImpl(this, attributes);
-        this.workspace = new WorkspaceImpl(this);
+    public final Map<String, Object> getAttributes() {
+        return attributes;
     }
 
-    public Session getSession() {
+    public final synchronized SessionImpl getSession() {
+        if (session == null) {
+            session = createSession();
+        }
         return session;
     }
 
-    public Workspace getWorkspace() {
+    public final synchronized WorkspaceImpl getWorkspace() {
+        if (workspace == null) {
+            workspace = createWorkspace();
+        }
         return workspace;
     }
 
+    /**
+     * Factory method for creating the {@link Session} instance for this
+     * context. Called by {@link #getSession()} when first accessed. Can be
+     * overridden by subclasses to customize the session implementation.
+     *
+     * @return session instance
+     */
+    protected SessionImpl createSession() {
+        return new SessionImpl(this);
+    }
+
+    /**
+     * Factory method for creating the {@link Workspace} instance for this
+     * context. Called by {@link #getWorkspace()} when first accessed. Can be
+     * overridden by subclasses to customize the workspace implementation.
+     *
+     * @return session instance
+     */
+    protected WorkspaceImpl createWorkspace() {
+        return new WorkspaceImpl(this);
+    }
+
     public LockManager getLockManager() {
         return workspace.getLockManager();
     }

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java?rev=1513054&r1=1513053&r2=1513054&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java Mon Aug 12 07:05:04 2013
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.oak.jcr;
 
+import static com.google.common.collect.Sets.newTreeSet;
 import static org.apache.jackrabbit.oak.commons.PathUtils.getParentPath;
 
 import java.io.IOException;
@@ -23,7 +24,6 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.security.AccessControlException;
 import java.util.Collections;
-import java.util.Map;
 import java.util.Set;
 
 import javax.annotation.CheckForNull;
@@ -42,12 +42,10 @@ import javax.jcr.Session;
 import javax.jcr.UnsupportedRepositoryOperationException;
 import javax.jcr.ValueFactory;
 import javax.jcr.Workspace;
-import javax.jcr.lock.LockManager;
 import javax.jcr.nodetype.ConstraintViolationException;
 import javax.jcr.retention.RetentionManager;
 import javax.jcr.security.AccessControlManager;
 
-import com.google.common.collect.Sets;
 import org.apache.jackrabbit.api.JackrabbitSession;
 import org.apache.jackrabbit.api.security.principal.PrincipalManager;
 import org.apache.jackrabbit.api.security.user.UserManager;
@@ -80,12 +78,10 @@ public class SessionImpl implements Jack
 
     private final SessionContext sessionContext;
     private final SessionDelegate sd;
-    private final Map<String, Object> attributes;
 
-    SessionImpl(SessionContext sessionContext, Map<String, Object> attributes) {
+    SessionImpl(SessionContext sessionContext) {
         this.sessionContext = sessionContext;
         this.sd = sessionContext.getSessionDelegate();
-        this.attributes = attributes;
     }
 
     static void checkIndexOnName(SessionContext sessionContext, String path) throws RepositoryException {
@@ -228,7 +224,7 @@ public class SessionImpl implements Jack
 
     @Override
     public String[] getAttributeNames() {
-        Set<String> names = Sets.newHashSet(attributes.keySet());
+        Set<String> names = newTreeSet(sessionContext.getAttributes().keySet());
         Collections.addAll(names, sd.getAuthInfo().getAttributeNames());
         return names.toArray(new String[names.size()]);
     }
@@ -236,11 +232,13 @@ public class SessionImpl implements Jack
     @Override
     public Object getAttribute(String name) {
         Object attribute = sd.getAuthInfo().getAttribute(name);
-        return attribute == null ? attributes.get(name) : attribute;
+        if (attribute == null) {
+            attribute = sessionContext.getAttributes().get(name);
+        }
+        return attribute;
     }
 
-    @Override
-    @Nonnull
+    @Override @Nonnull
     public Workspace getWorkspace() {
         return sessionContext.getWorkspace();
     }
@@ -536,46 +534,31 @@ public class SessionImpl implements Jack
         }
     }
 
-    @Nonnull
-    private LockManager getLockManager() {
-        return sessionContext.getLockManager();
-    }
-
-    /**
-     * @see javax.jcr.Session#addLockToken(String)
-     */
     @Override
     public void addLockToken(String lt) {
         try {
-            getLockManager().addLockToken(lt);
+            getWorkspace().getLockManager().addLockToken(lt);
         } catch (RepositoryException e) {
-            log.warn("Unable to add lock token '{}' to this session: {}", lt, e.getMessage());
+            log.warn("Unable to add lock token " + lt + " to session", e);
         }
     }
 
-    /**
-     * @see javax.jcr.Session#getLockTokens()
-     */
-    @Override
-    @Nonnull
+    @Override @Nonnull
     public String[] getLockTokens() {
         try {
-            return getLockManager().getLockTokens();
+            return getWorkspace().getLockManager().getLockTokens();
         } catch (RepositoryException e) {
-            log.warn("Unable to retrieve lock tokens for this session: {}", e.getMessage());
+            log.warn("Unable to retrieve lock tokens from session", e);
             return new String[0];
         }
     }
 
-    /**
-     * @see javax.jcr.Session#removeLockToken(String)
-     */
     @Override
     public void removeLockToken(String lt) {
         try {
-            getLockManager().addLockToken(lt);
+            getWorkspace().getLockManager().removeLockToken(lt);
         } catch (RepositoryException e) {
-            log.warn("Unable to add lock token '{}' to this session: {}", lt, e.getMessage());
+            log.warn("Unable to remove lock token " + lt + " from session", e);
         }
     }