You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by an...@apache.org on 2006/10/12 19:25:17 UTC

svn commit: r463335 - in /jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav: IdURICache.java RepositoryServiceImpl.java URIResolverImpl.java

Author: angela
Date: Thu Oct 12 10:25:16 2006
New Revision: 463335

URL: http://svn.apache.org/viewvc?view=rev&rev=463335
Log:
work in progress

- MKCOL fails if resource already exists => problem with SNSs
- make sure resource hrefs are always cached without trailing /

Modified:
    jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/IdURICache.java
    jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
    jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java

Modified: jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/IdURICache.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/IdURICache.java?view=diff&rev=463335&r1=463334&r2=463335
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/IdURICache.java (original)
+++ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/IdURICache.java Thu Oct 12 10:25:16 2006
@@ -40,7 +40,7 @@
     }
 
     public ItemId getItemId(String uri) {
-        return (ItemId) uriToIdCache.get(uri);
+        return (ItemId) uriToIdCache.get(getCleanUri(uri));
     }
 
     public String getUri(ItemId itemId) {
@@ -48,7 +48,7 @@
     }
 
     public boolean containsUri(String uri) {
-        return uriToIdCache.containsKey(uri);
+        return uriToIdCache.containsKey(getCleanUri(uri));
     }
 
     public boolean containsItemId(ItemId itemId) {
@@ -59,18 +59,28 @@
         if (!uri.startsWith(workspaceUri)) {
             throw new IllegalArgumentException("Workspace missmatch.");
         }
-        uriToIdCache.put(uri, itemId);
-        idToUriCache.put(itemId, uri);
-        log.debug("Added: ItemId = " + itemId + " URI = " + uri);
+        String cleanUri = getCleanUri(uri);
+        uriToIdCache.put(cleanUri, itemId);
+        idToUriCache.put(itemId, cleanUri);
+        log.debug("Added: ItemId = " + itemId + " URI = " + cleanUri);
     }
 
     public void remove(String uri) {
-        Object itemId = uriToIdCache.remove(uri);
-        log.debug("Removed: ItemId = " + itemId + " URI = " + uri);
+        String cleanUri = getCleanUri(uri);
+        Object itemId = uriToIdCache.remove(cleanUri);
+        log.debug("Removed: ItemId = " + itemId + " URI = " + cleanUri);
     }
 
     public void remove(ItemId itemId) {
         Object uri = idToUriCache.remove(itemId);
         log.debug("Removed: ItemId = " + itemId + " URI = " + uri);
+    }
+
+    private static String getCleanUri(String uri) {
+        if (uri.endsWith("/")) {
+            return uri.substring(0, uri.length() - 1);
+        } else {
+            return uri;
+        }
     }
 }

Modified: jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java?view=diff&rev=463335&r1=463334&r2=463335
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java Thu Oct 12 10:25:16 2006
@@ -189,7 +189,8 @@
     private final NamespaceResolverImpl nsResolver;
     private final URIResolverImpl uriResolver;
 
-    private final HttpClient client;
+    private final HostConfiguration hostConfig;
+    private final HashMap clients = new HashMap();
 
     public RepositoryServiceImpl(String uri, IdFactory idFactory, ValueFactory valueFactory) throws RepositoryException {
         if (uri == null || "".equals(uri)) {
@@ -209,14 +210,9 @@
 
         try {
             URI repositoryUri = new URI((uri.endsWith("/")) ? uri : uri+"/", true);
-            HostConfiguration hostConfig = new HostConfiguration();
+            hostConfig = new HostConfiguration();
             hostConfig.setHost(repositoryUri);
 
-            client = new HttpClient(new MultiThreadedHttpConnectionManager());
-            client.setHostConfiguration(hostConfig);
-            // always send authentication not waiting for 401
-            client.getParams().setAuthenticationPreemptive(true);
-
             nsResolver = new NamespaceResolverImpl();
             uriResolver = new URIResolverImpl(repositoryUri, this, nsResolver, domFactory);
 
@@ -247,11 +243,29 @@
         }
     }
 
+    private static boolean isSameResource(String requestURI, MultiStatusResponse response) {
+        String href = response.getHref();
+        if (href.endsWith("/")) {
+            href = href.substring(0, href.length() - 1);
+        }
+        return requestURI.equals(href);
+    }
+
     private HttpClient getClient(org.apache.commons.httpclient.Credentials credentials) {
-        // NOTE: null credentials only work if 'missing-auth-mapping' param is
-        // set on the server
-        client.getState().setCredentials(AuthScope.ANY, credentials);
-        return client;
+        if (clients.containsKey(credentials)) {
+            return (HttpClient) clients.get(credentials);
+        } else {
+            HttpClient client = new HttpClient(new MultiThreadedHttpConnectionManager());
+            client.setHostConfiguration(hostConfig);
+            // always send authentication not waiting for 401
+            client.getParams().setAuthenticationPreemptive(true);
+            // NOTE: null credentials only work if 'missing-auth-mapping' param is
+            // set on the server
+            client.getState().setCredentials(AuthScope.ANY, credentials);
+
+            clients.put(credentials, client);
+            return client;
+        }
     }
 
     HttpClient getClient(SessionInfo sessionInfo) throws RepositoryException {
@@ -266,7 +280,7 @@
     private String getItemUri(NodeId parentId, QName childName, SessionInfo sessionInfo) throws RepositoryException {
         String parentUri = uriResolver.getItemUri(parentId, sessionInfo.getWorkspaceName(), sessionInfo);
         try {
-            return parentUri + NameFormat.format(childName, nsResolver);
+            return parentUri + "/" + NameFormat.format(childName, nsResolver);
         } catch (NoPrefixDeclaredException e) {
             throw new RepositoryException(e);
         }
@@ -637,8 +651,7 @@
             MultiStatusResponse nodeResponse = null;
             List childResponses = new ArrayList();
             for (int i = 0; i < responses.length; i++) {
-                String respHref = responses[i].getHref();
-                if (uri.equals(respHref)) {
+                if (isSameResource(uri, responses[i])) {
                     nodeResponse = responses[i];
                 } else {
                     childResponses.add(responses[i]);
@@ -1538,29 +1551,31 @@
         public void addNode(NodeId parentId, QName nodeName, QName nodetypeName, String uuid) throws ItemExistsException, PathNotFoundException, VersionException, ConstraintViolationException, NoSuchNodeTypeException, LockException, AccessDeniedException, UnsupportedRepositoryOperationException, RepositoryException {
             checkConsumed();
             try {
-                String uri = getItemUri(parentId, nodeName, sessionInfo);
+                // TODO: TOBEFIXED. WebDAV does not allow MKCOL for existing resource -> problem with SNS
+                // use fake name instead (see also #importXML)
+                QName fakeName = new QName(QName.NS_DEFAULT_URI, UUID.randomUUID().toString());
+                String uri = getItemUri(parentId, fakeName, sessionInfo);
                 MkColMethod method = new MkColMethod(uri);
 
                 // build 'sys-view' for the node to create and append it as request body
-                if (nodetypeName != null || uuid != null) {
-                    Document body = DomUtil.BUILDER_FACTORY.newDocumentBuilder().newDocument();
-                    Element nodeElement = DomUtil.addChildElement(body, NODE_ELEMENT, SV_NAMESPACE);
-                    DomUtil.setAttribute(nodeElement, NAME_ATTRIBUTE, SV_NAMESPACE, Text.getName(uri, true));
-
-                    if (nodetypeName != null) {
-                        Element propElement = DomUtil.addChildElement(nodeElement, PROPERTY_ELEMENT, SV_NAMESPACE);
-                        DomUtil.setAttribute(propElement, NAME_ATTRIBUTE, SV_NAMESPACE, NameFormat.format(QName.JCR_PRIMARYTYPE, nsResolver));
-                        DomUtil.setAttribute(propElement, TYPE_ATTRIBUTE, SV_NAMESPACE, PropertyType.nameFromValue(PropertyType.NAME));
-                        DomUtil.addChildElement(propElement, VALUE_ELEMENT, SV_NAMESPACE, NameFormat.format(nodetypeName, nsResolver));
-                    }
-                    if (uuid != null) {
-                        Element propElement = DomUtil.addChildElement(nodeElement, PROPERTY_ELEMENT, SV_NAMESPACE);
-                        DomUtil.setAttribute(propElement, NAME_ATTRIBUTE, SV_NAMESPACE, NameFormat.format(QName.JCR_UUID, nsResolver));
-                        DomUtil.setAttribute(propElement, TYPE_ATTRIBUTE, SV_NAMESPACE, PropertyType.nameFromValue(PropertyType.STRING));
-                        DomUtil.addChildElement(propElement, VALUE_ELEMENT, SV_NAMESPACE, uuid);
-                    }
-                    method.setRequestBody(body);
+                Document body = DomUtil.BUILDER_FACTORY.newDocumentBuilder().newDocument();
+                Element nodeElement = DomUtil.addChildElement(body, NODE_ELEMENT, SV_NAMESPACE);
+                String nameAttr = NameFormat.format(nodeName, nsResolver);
+                DomUtil.setAttribute(nodeElement, NAME_ATTRIBUTE, SV_NAMESPACE, nameAttr);
+
+                // nodetype must never be null
+                Element propElement = DomUtil.addChildElement(nodeElement, PROPERTY_ELEMENT, SV_NAMESPACE);
+                DomUtil.setAttribute(propElement, NAME_ATTRIBUTE, SV_NAMESPACE, NameFormat.format(QName.JCR_PRIMARYTYPE, nsResolver));
+                DomUtil.setAttribute(propElement, TYPE_ATTRIBUTE, SV_NAMESPACE, PropertyType.nameFromValue(PropertyType.NAME));
+                DomUtil.addChildElement(propElement, VALUE_ELEMENT, SV_NAMESPACE, NameFormat.format(nodetypeName, nsResolver));
+                // optional uuid
+                if (uuid != null) {
+                    propElement = DomUtil.addChildElement(nodeElement, PROPERTY_ELEMENT, SV_NAMESPACE);
+                    DomUtil.setAttribute(propElement, NAME_ATTRIBUTE, SV_NAMESPACE, NameFormat.format(QName.JCR_UUID, nsResolver));
+                    DomUtil.setAttribute(propElement, TYPE_ATTRIBUTE, SV_NAMESPACE, PropertyType.nameFromValue(PropertyType.STRING));
+                    DomUtil.addChildElement(propElement, VALUE_ELEMENT, SV_NAMESPACE, uuid);
                 }
+                method.setRequestBody(body);
 
                 methods.add(method);
             } catch (IOException e) {

Modified: jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java?view=diff&rev=463335&r1=463334&r2=463335
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java Thu Oct 12 10:25:16 2006
@@ -103,7 +103,7 @@
     }
 
     String getRootItemUri(String workspaceName) {
-        return getWorkspaceUri(workspaceName) + Text.escapePath(ItemResourceConstants.ROOT_ITEM_RESOURCEPATH) + "/";
+        return getWorkspaceUri(workspaceName) + Text.escapePath(ItemResourceConstants.ROOT_ITEM_RESOURCEPATH);
     }
 
     String getItemUri(ItemId itemId, String workspaceName,
@@ -162,19 +162,14 @@
             if (path != null && !path.denotesRoot()) {
                 try {
                     String jcrPath = PathFormat.format(path, nsResolver);
-                    if (path.isAbsolute()) {
-                        jcrPath = jcrPath.substring(1);
+                    if (!path.isAbsolute()) {
+                        uriBuffer.append("/");
                     }
                     uriBuffer.append(Text.escapePath(jcrPath));
                 } catch (NoPrefixDeclaredException e) {
                     throw new RepositoryException(e);
                 }
             }
-            // add training / for nodes
-            if (itemId.denotesNode() && uriBuffer.charAt(uriBuffer.length()-1) != '/') {
-                uriBuffer.append('/');
-            }
-
             String itemUri = uriBuffer.toString();
             if (!cache.containsItemId(itemId)) {
                 cache.add(itemUri, itemId);
@@ -283,9 +278,6 @@
                 parentId = null;
             } else {
                 String parentUri = Text.getRelativeParent(uri, 1, true);
-                if (!parentUri.endsWith("/")) {
-                    parentUri += "/";
-                }
                 parentId = getNodeId(parentUri, sessionInfo);
             }