You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by md...@apache.org on 2011/06/17 17:44:43 UTC

svn commit: r1136915 - in /jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel: RepositoryServiceImpl.java SessionState.java

Author: mduerig
Date: Fri Jun 17 15:44:43 2011
New Revision: 1136915

URL: http://svn.apache.org/viewvc?rev=1136915&view=rev
Log:
spi2microkernel prototype (WIP)
refectored session state into SessionState class

Added:
    jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/SessionState.java
Modified:
    jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/RepositoryServiceImpl.java

Modified: jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/RepositoryServiceImpl.java?rev=1136915&r1=1136914&r2=1136915&view=diff
==============================================================================
--- jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/RepositoryServiceImpl.java (original)
+++ jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/RepositoryServiceImpl.java Fri Jun 17 15:44:43 2011
@@ -59,6 +59,7 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.Callable;
 
 import static javax.jcr.Repository.*;
 import static org.apache.jackrabbit.spi.commons.name.NameConstants.*;
@@ -76,7 +77,7 @@ public class RepositoryServiceImpl exten
     }};
 
     private final MicroKernel microKernel;
-    private final Map<SessionInfo, String> sessions = new HashMap<SessionInfo, String>();
+    private final Map<SessionInfo, SessionState> sessions = new HashMap<SessionInfo, SessionState>();
 
     public RepositoryServiceImpl(MicroKernel microKernel) throws RepositoryException {
         super(DESCRIPTORS, Collections.<String, String>emptyMap(), NodeTypes.getDefaultNodeTypes());
@@ -109,14 +110,14 @@ public class RepositoryServiceImpl exten
     @Override
     protected SessionInfo createSessionInfo(SessionInfo sessionInfo, String workspaceName) throws RepositoryException {
         SessionInfo s = super.createSessionInfo(sessionInfo, workspaceName);
-        initSessionInfo(s);
+        createSessionState(s);
         return s;
     }
 
     @Override
     protected SessionInfo createSessionInfo(Credentials credentials, String workspaceName) throws RepositoryException {
         SessionInfo s = super.createSessionInfo(credentials, workspaceName);
-        initSessionInfo(s);
+        createSessionState(s);
         return s;
     }
 
@@ -126,7 +127,7 @@ public class RepositoryServiceImpl exten
     }
 
     public String[] getWorkspaceNames(SessionInfo sessionInfo) throws RepositoryException {
-        String rev = getRevision(sessionInfo);
+        String rev = sessionState(sessionInfo).getHeadRevision();
 
         // Names of first level nodes correspond to workspace names
         final List<String> workspaces = new ArrayList<String>();
@@ -191,7 +192,7 @@ public class RepositoryServiceImpl exten
             String wspName = sessionInfo.getWorkspaceName();
             Path path = nodeId.getPath();
             String mkPath = Paths.pathToString(wspName, path);
-            String rev = getRevision(sessionInfo);
+            String rev = sessionState(sessionInfo).getHeadRevision();
 
             if (microKernel.nodeExists(mkPath, rev)) {
                 String json = microKernel.getNodes(mkPath, rev);
@@ -211,7 +212,7 @@ public class RepositoryServiceImpl exten
             String wspName = sessionInfo.getWorkspaceName();
             Path path = nodeId.getPath();
             String mkPath = Paths.pathToString(wspName, path);
-            String rev = getRevision(sessionInfo);
+            String rev = sessionState(sessionInfo).getHeadRevision();
 
             NodeInfo info = null;
             if (microKernel.nodeExists(mkPath, rev)) {
@@ -236,7 +237,7 @@ public class RepositoryServiceImpl exten
             String wspName = sessionInfo.getWorkspaceName();
             Path path = propertyId.getPath();
             String mkPath = Paths.pathToString(wspName, path.getAncestor(1));
-            String rev = getRevision(sessionInfo);
+            String rev = sessionState(sessionInfo).getHeadRevision();
 
             PropertyInfo info = null;
             if (microKernel.nodeExists(mkPath, rev)) {
@@ -287,7 +288,7 @@ public class RepositoryServiceImpl exten
 
     @Override
     public void createWorkspace(SessionInfo sessionInfo, String name, String srcWorkspaceName) throws RepositoryException {
-        String rev = getRevision(sessionInfo);
+        String rev = sessionState(sessionInfo).getHeadRevision();
         if (srcWorkspaceName == null) {
             createWorkspace(rev, name, false);
         }
@@ -298,7 +299,7 @@ public class RepositoryServiceImpl exten
 
     @Override
     public void deleteWorkspace(SessionInfo sessionInfo, String name) throws RepositoryException {
-        String rev = getRevision(sessionInfo);
+        String rev = sessionState(sessionInfo).getHeadRevision();
         deleteWorkspace(rev, name);
     }
 
@@ -339,24 +340,20 @@ public class RepositoryServiceImpl exten
         }
     }
 
-    private String getRevision(SessionInfo sessionInfo) throws RepositoryException {
-        String rev = sessions.get(sessionInfo);
+    private SessionState sessionState(SessionInfo sessionInfo) throws RepositoryException {
+        SessionState state = sessions.get(sessionInfo);
 
-        if (rev == null) {
+        if (state == null) {
             throw new RepositoryException("Invalid session");
         }
         else {
-            return rev;
+            return state;
         }
     }
 
-    private void setRevision(SessionInfo sessionInfo, String revisionId) {
-        sessions.put(sessionInfo, revisionId);
-    }
-
-    private void initSessionInfo(SessionInfo sessionInfo) throws RepositoryException {
+    private void createSessionState(SessionInfo sessionInfo) throws RepositoryException {
         try {
-            setRevision(sessionInfo, microKernel.getHeadRevision());
+            sessions.put(sessionInfo, new SessionState(microKernel.getHeadRevision()));
         }
         catch (MicroKernelException e) {
             throw new RepositoryException(e.getMessage(), e);
@@ -483,9 +480,12 @@ public class RepositoryServiceImpl exten
         }
 
         public void commit() throws RepositoryException {
-            String rev = getRevision(sessionInfo);
-            rev = microKernel.commit("/", jsop.toString(), rev);
-            setRevision(sessionInfo, rev);
+            sessionState(sessionInfo).commitWithLock(new Callable<String>() {
+                public String call() throws RepositoryException {
+                    String rev = sessionState(sessionInfo).getHeadRevision();
+                    return microKernel.commit("/", jsop.toString(), rev);
+                }
+            });
         }
 
         private String target(NodeId nodeId) throws RepositoryException {

Added: jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/SessionState.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/SessionState.java?rev=1136915&view=auto
==============================================================================
--- jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/SessionState.java (added)
+++ jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/SessionState.java Fri Jun 17 15:44:43 2011
@@ -0,0 +1,64 @@
+/*
+ * 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.
+ */
+
+package org.apache.jackrabbit.spi2microkernel;
+
+import javax.jcr.RepositoryException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+
+public class SessionState {
+    private final String initialRevision;
+    private final List<String> revisionHistory = new ArrayList<String>();
+
+    public SessionState(String initialRevision) {
+        this.initialRevision = initialRevision;
+    }
+
+    public String getHeadRevision() {
+        return revisionHistory.isEmpty()
+            ? initialRevision
+            : revisionHistory.get(revisionHistory.size() - 1);
+    }
+
+    public void commitWithLock(Callable<String> commit) throws RepositoryException {
+        try {
+            synchronized (this) {
+                revisionHistory.add(commit.call());
+            }
+        }
+        catch (Exception e) {
+            throw new RepositoryException(e.getMessage(), e); 
+        }
+    }
+
+    /**
+     * Snapshot of this sessions state at the time of the call
+     * @return
+     */
+    public SessionState freeze() {
+        SessionState frozen = new SessionState(initialRevision);
+        synchronized (revisionHistory) {
+            frozen.revisionHistory.addAll(revisionHistory);
+        }
+        return frozen;
+    }
+
+}