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/07/29 16:29:32 UTC
svn commit: r1152237 - in
/jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel:
NodeTypeStore.java RepositoryServiceImpl.java
Spi2MicrokernelRepositoryServiceFactory.java util/Maps.java util/Paths.java
Author: mduerig
Date: Fri Jul 29 14:29:31 2011
New Revision: 1152237
URL: http://svn.apache.org/viewvc?rev=1152237&view=rev
Log:
spi2microkernel (WIP)
- make workspace names configurable
Added:
jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/Maps.java
Modified:
jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/NodeTypeStore.java
jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/RepositoryServiceImpl.java
jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/Spi2MicrokernelRepositoryServiceFactory.java
jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/Paths.java
Modified: jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/NodeTypeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/NodeTypeStore.java?rev=1152237&r1=1152236&r2=1152237&view=diff
==============================================================================
--- jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/NodeTypeStore.java (original)
+++ jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/NodeTypeStore.java Fri Jul 29 14:29:31 2011
@@ -29,7 +29,6 @@ import org.apache.jackrabbit.spi.commons
import org.apache.jackrabbit.spi.commons.nodetype.NodeTypeStorage;
import org.apache.jackrabbit.spi.commons.nodetype.QDefinitionBuilderFactory;
import org.apache.jackrabbit.spi.commons.nodetype.compact.CompactNodeTypeDefWriter;
-import org.apache.jackrabbit.spi2microkernel.util.Paths;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.slf4j.Logger;
@@ -48,33 +47,34 @@ public class NodeTypeStore {
private static final Logger log = LoggerFactory.getLogger(NodeTypeStore.class);
private static final String DEFAULT_NODETYPES = "default-nodetypes.cnd";
private static final String NT_DEFINITION_NAME = "nodeTypeDefinitions";
- private static final String NT_DEFINITION_PATH = '/' + Paths.SYSTEM_WORKSPACE + '/' + NT_DEFINITION_NAME;
private final MicroKernel microKernel;
+ private final String systemWorkspace;
- private NodeTypeStore(MicroKernel microKernel) {
+ private NodeTypeStore(MicroKernel microKernel, String systemWorkspace) {
this.microKernel = microKernel;
+ this.systemWorkspace = systemWorkspace;
}
- public static NodeTypeStore create(MicroKernel microKernel)
+ public static NodeTypeStore create(MicroKernel microKernel, String systemWorkspace)
throws RepositoryException {
- if (readNodeTypes(microKernel) == null) {
+ if (readNodeTypes(microKernel, systemWorkspace) == null) {
try {
String cnd = IOUtils.toString(getDefaultNodeTypes());
- writeNodeTypes(microKernel, cnd);
+ writeNodeTypes(microKernel, cnd, systemWorkspace);
}
catch (IOException e) {
throw new RepositoryException(e);
}
}
- return new NodeTypeStore(microKernel);
+ return new NodeTypeStore(microKernel, systemWorkspace);
}
public void read(NamespaceMapping namespaces, NodeTypeStorage nodeTypeDefinitions) throws RepositoryException {
try {
- Reader nodeTypes = readNodeTypes(microKernel);
+ Reader nodeTypes = readNodeTypes(microKernel, systemWorkspace);
if (nodeTypes == null) {
return;
}
@@ -108,7 +108,7 @@ public class NodeTypeStore {
cndWriter.close();
String cnd = writer.toString();
- writeNodeTypes(microKernel, cnd);
+ writeNodeTypes(microKernel, cnd, systemWorkspace);
}
catch (IOException e) {
throw new RepositoryException("Error persisting node type definitions", e);
@@ -117,7 +117,7 @@ public class NodeTypeStore {
//------------------------------------------< private >---
- private static void writeNodeTypes(MicroKernel microKernel, String cnd) throws RepositoryException {
+ private static void writeNodeTypes(MicroKernel microKernel, String cnd, String systemWorkspace) throws RepositoryException {
try {
StringBuilder sb = new StringBuilder();
JsonBuilder.create(sb)
@@ -126,21 +126,22 @@ public class NodeTypeStore {
String rev = microKernel.getHeadRevision();
StringBuilder jsop = new StringBuilder();
- if (microKernel.nodeExists(NT_DEFINITION_PATH, rev)) {
+ if (microKernel.nodeExists('/' + systemWorkspace + '/' + NT_DEFINITION_NAME, rev)) {
jsop.append("-\"").append(NT_DEFINITION_NAME).append("\"\r");
}
jsop.append("+\"").append(NT_DEFINITION_NAME).append("\":").append(sb);
- microKernel.commit('/' + Paths.SYSTEM_WORKSPACE, jsop.toString(), rev, "register default node types");
+ microKernel.commit('/' + systemWorkspace, jsop.toString(), rev, "register default node types");
}
catch (IOException e) {
throw new RepositoryException("Error persisting node type definitions", e);
}
}
- private static Reader readNodeTypes(MicroKernel microKernel) {
+ private static Reader readNodeTypes(MicroKernel microKernel, String systemWorkspace) {
String rev = microKernel.getHeadRevision();
- if (microKernel.nodeExists(NT_DEFINITION_PATH, rev)) {
- String ntDefinitions = microKernel.getNodes(NT_DEFINITION_PATH, rev);
+ String ntDefinitionPath = '/' + systemWorkspace + '/' + NT_DEFINITION_NAME;
+ if (microKernel.nodeExists(ntDefinitionPath, rev)) {
+ String ntDefinitions = microKernel.getNodes(ntDefinitionPath, rev);
JSONParser jsonParser = new JSONParser();
try {
Object parseResult = jsonParser.parse(ntDefinitions);
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=1152237&r1=1152236&r2=1152237&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 Jul 29 14:29:31 2011
@@ -84,11 +84,14 @@ import static javax.jcr.Repository.*;
import static org.apache.jackrabbit.spi.commons.name.NameConstants.*;
import static org.apache.jackrabbit.spi2microkernel.util.Arrays.contains;
import static org.apache.jackrabbit.spi2microkernel.util.ItemInfos.*;
+import static org.apache.jackrabbit.spi2microkernel.util.Maps.getOrElse;
import static org.apache.jackrabbit.spi2microkernel.util.Predicates.containsElement;
import static org.apache.jackrabbit.spi2microkernel.util.Predicates.exists;
public class RepositoryServiceImpl extends AbstractRepositoryService {
private static final long BINARY_VALUE_INLINE_THRESHOLD = 0x1000;
+ private static final String DEFAULT_DEFAULT_WORKSPACE = "default";
+ private static final String DEFAULT_SYSTEM_WORKSPACE = "system";
static final Logger log = LoggerFactory.getLogger(RepositoryServiceImpl.class);
@@ -117,17 +120,24 @@ public class RepositoryServiceImpl exten
private final MicroKernel microKernel;
private final Map<SessionInfo, SessionState> sessions = new ConcurrentHashMap<SessionInfo, SessionState>();
private final NodeTypeStore nodeTypeStore;
+ private final String defaultWorkspace;
+ private final String systemWorkspace;
- public RepositoryServiceImpl(MicroKernel microKernel) throws RepositoryException {
+ public RepositoryServiceImpl(MicroKernel microKernel, Map<?, ?> parameters) throws RepositoryException {
super(DESCRIPTORS, Collections.<String, String>emptyMap(), new QNodeTypeDefinition[0]);
try {
this.microKernel = microKernel; // fixme who disposes the micro kernel?
- String head = microKernel.getHeadRevision();
- createWorkspace(head, Paths.DEFAULT_WORKSPACE, true);
- createWorkspace(head, Paths.SYSTEM_WORKSPACE, true);
- nodeTypeStore = NodeTypeStore.create(microKernel);
+ defaultWorkspace = getWorkspaceName(parameters,
+ Spi2MicrokernelRepositoryServiceFactory.PARAM_DEFAULT_WORKSPACE, DEFAULT_DEFAULT_WORKSPACE);
+ createWorkspace(microKernel.getHeadRevision(), defaultWorkspace, true);
+
+ systemWorkspace = getWorkspaceName(parameters,
+ Spi2MicrokernelRepositoryServiceFactory.PARAM_SYSTEM_WORKSPACE, DEFAULT_SYSTEM_WORKSPACE);
+ createWorkspace(microKernel.getHeadRevision(), systemWorkspace, true);
+
+ nodeTypeStore = NodeTypeStore.create(microKernel, systemWorkspace);
nodeTypeStore.read(namespaces, nodeTypeDefs);
}
catch (MicroKernelException e) {
@@ -135,6 +145,13 @@ public class RepositoryServiceImpl exten
}
}
+ private static String getWorkspaceName(Map<?, ?> parameters, String key, String defaultName) {
+ Object value = getOrElse(parameters, (Object) key, (Object) defaultName);
+ return value instanceof String
+ ? (String) value
+ : defaultName;
+ }
+
public ItemInfoCache getItemInfoCache(SessionInfo sessionInfo) throws RepositoryException {
return new ItemInfoCacheImpl();
}
@@ -150,7 +167,7 @@ public class RepositoryServiceImpl exten
@Override
protected SessionInfo createSessionInfo(SessionInfo sessionInfo, String workspaceName) throws RepositoryException {
if (workspaceName == null) {
- workspaceName = Paths.DEFAULT_WORKSPACE;
+ workspaceName = defaultWorkspace;
}
SessionInfo s = super.createSessionInfo(sessionInfo, workspaceName);
createSessionState(s);
@@ -163,7 +180,7 @@ public class RepositoryServiceImpl exten
credentials = new GuestCredentials();
}
if (workspaceName == null) {
- workspaceName = Paths.DEFAULT_WORKSPACE;
+ workspaceName = defaultWorkspace;
}
SessionInfo s = super.createSessionInfo(credentials, workspaceName);
@@ -222,9 +239,15 @@ public class RepositoryServiceImpl exten
@Override
protected void checkWorkspace(String workspaceName) throws NoSuchWorkspaceException {
- String wspName = Paths.getWorkspaceName(workspaceName);
+ if (workspaceName == null || "".equals(workspaceName)) {
+ workspaceName = defaultWorkspace;
+ }
+ else if (workspaceName.contains("/")) {
+ throw new NoSuchWorkspaceException(workspaceName);
+ }
+
String head = microKernel.getHeadRevision();
- if (!microKernel.nodeExists('/' + wspName, head)) {
+ if (!microKernel.nodeExists('/' + workspaceName, head)) {
throw new NoSuchWorkspaceException(workspaceName);
}
}
@@ -473,8 +496,7 @@ public class RepositoryServiceImpl exten
private void createWorkspace(String revisionId, String name, boolean ignoreExisting) throws RepositoryException {
try {
- String wspName = Paths.getWorkspaceName(name);
- if (microKernel.nodeExists('/' + wspName, revisionId)) {
+ if (microKernel.nodeExists('/' + name, revisionId)) {
if (ignoreExisting) {
return;
}
@@ -483,7 +505,7 @@ public class RepositoryServiceImpl exten
}
}
- microKernel.commit("/", "+\"" + wspName + "\" : {}" , revisionId, "create workspace");
+ microKernel.commit("/", "+\"" + name + "\" : {}" , revisionId, "create workspace");
}
catch (MicroKernelException e) {
throw new RepositoryException(e.getMessage(), e);
@@ -496,12 +518,11 @@ public class RepositoryServiceImpl exten
private void deleteWorkspace(String revisionId, String name) throws RepositoryException {
try {
- String wspName = Paths.getWorkspaceName(name);
- if (!microKernel.nodeExists('/' + wspName, revisionId)) {
+ if (!microKernel.nodeExists('/' + name, revisionId)) {
throw new NoSuchWorkspaceException("No such workspace: " + name);
}
- microKernel.commit("/", "-\"" + wspName + '\"', revisionId, "delete workspace");
+ microKernel.commit("/", "-\"" + name + '\"', revisionId, "delete workspace");
}
catch (MicroKernelException e) {
throw new RepositoryException(e.getMessage(), e);
Modified: jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/Spi2MicrokernelRepositoryServiceFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/Spi2MicrokernelRepositoryServiceFactory.java?rev=1152237&r1=1152236&r2=1152237&view=diff
==============================================================================
--- jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/Spi2MicrokernelRepositoryServiceFactory.java (original)
+++ jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/Spi2MicrokernelRepositoryServiceFactory.java Fri Jul 29 14:29:31 2011
@@ -27,13 +27,16 @@ import javax.jcr.RepositoryException;
import java.util.Map;
public class Spi2MicrokernelRepositoryServiceFactory implements RepositoryServiceFactory {
- public static final String PARAM_URL = "org.apache.jackrabbit.spi2microkernel.url";
+ private static final String PARAM_BASE_NAME = Spi2MicrokernelRepositoryServiceFactory.class.getName();
+ public static final String PARAM_URL = PARAM_BASE_NAME + ".url";
+ public static final String PARAM_DEFAULT_WORKSPACE = PARAM_BASE_NAME + ".default-workspace";
+ public static final String PARAM_SYSTEM_WORKSPACE = PARAM_BASE_NAME + ".system-workspace";
public RepositoryService createRepositoryService(Map<?, ?> parameters) throws RepositoryException {
Object u = parameters.get(PARAM_URL);
String url = u == null ? null : u.toString();
MicroKernel microKernel = MicroKernelFactory.getInstance(url);
- return new RepositoryServiceImpl(microKernel);
+ return new RepositoryServiceImpl(microKernel, parameters);
}
}
Added: jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/Maps.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/Maps.java?rev=1152237&view=auto
==============================================================================
--- jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/Maps.java (added)
+++ jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/Maps.java Fri Jul 29 14:29:31 2011
@@ -0,0 +1,33 @@
+/*
+ * 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.util;
+
+import java.util.Map;
+
+public class Maps {
+ private Maps() {}
+
+ public static <K, V> V getOrElse(Map<? extends K, ? extends V> map, K key, V defaultValue) {
+ V value = map.get(key);
+ return value == null
+ ? defaultValue
+ : value;
+ }
+}
Modified: jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/Paths.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/Paths.java?rev=1152237&r1=1152236&r2=1152237&view=diff
==============================================================================
--- jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/Paths.java (original)
+++ jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/Paths.java Fri Jul 29 14:29:31 2011
@@ -30,16 +30,12 @@ import org.apache.jackrabbit.spi.PathFac
import org.apache.jackrabbit.spi.commons.name.NameFactoryImpl;
import org.apache.jackrabbit.spi.commons.name.PathFactoryImpl;
-import javax.jcr.NoSuchWorkspaceException;
import javax.jcr.RepositoryException;
import java.util.LinkedList;
import static org.apache.jackrabbit.spi.Name.NS_DEFAULT_URI;
public final class Paths {
- public static final String DEFAULT_WORKSPACE = "default";
- public static final String SYSTEM_WORKSPACE = "system";
-
private static final NameFactory NAME_FACTORY = NameFactoryImpl.getInstance();
private static final PathFactory PATH_FACTORY = PathFactoryImpl.getInstance();
@@ -89,25 +85,17 @@ public final class Paths {
}
public static String pathToString(String wspName, Path absPath) throws RepositoryException {
- String wspPath = '/' + getWorkspaceName(wspName);
+ if (wspName == null || "".equals(wspName) || wspName.contains("/")) {
+ throw new RepositoryException("Invalid workspace name: " + wspName);
+ }
+
+ String wspPath = '/' + wspName;
return absPath.denotesRoot()
? wspPath
: wspPath + translateQPath(absPath);
}
- public static String getWorkspaceName(String name) throws NoSuchWorkspaceException {
- if (name == null || "".equals(name)) {
- return DEFAULT_WORKSPACE;
- }
- else if (name.contains("/")) {
- throw new NoSuchWorkspaceException(name);
- }
- else {
- return name;
- }
- }
-
//------------------------------------------< private >---
private static final BidiMap KNOWN_NAME_SPACES = new DualHashBidiMap() {{