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/11/09 10:11:57 UTC

svn commit: r472821 - in /jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav: EventBundleImpl.java EventImpl.java EventIteratorImpl.java ExceptionConverter.java IdURICache.java RepositoryServiceImpl.java URIResolverImpl.java

Author: angela
Date: Thu Nov  9 01:11:55 2006
New Revision: 472821

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

- missing escaping of item name when building uri.
- let RS parse the eventdiscovery. don't pass sessioninfo and resolvers
  to the various event related classes.
- removing of id/uri-cache entries must remove the corresponding
  entry in the other cache as well.

Modified:
    jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/EventBundleImpl.java
    jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/EventImpl.java
    jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/EventIteratorImpl.java
    jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/ExceptionConverter.java
    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/EventBundleImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/EventBundleImpl.java?view=diff&rev=472821&r1=472820&r2=472821
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/EventBundleImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/EventBundleImpl.java Thu Nov  9 01:11:55 2006
@@ -18,10 +18,9 @@
 
 import org.apache.jackrabbit.spi.EventBundle;
 import org.apache.jackrabbit.spi.EventIterator;
-import org.apache.jackrabbit.spi.SessionInfo;
-import org.apache.jackrabbit.webdav.xml.DomUtil;
 import org.apache.jackrabbit.webdav.observation.ObservationConstants;
-import org.w3c.dom.Element;
+
+import java.util.Collection;
 
 /**
  * <code>EventBundleImpl</code> implements a bundle of events. The individual
@@ -29,46 +28,35 @@
  */
 class EventBundleImpl implements EventBundle, ObservationConstants {
 
-    static final EventBundle EMPTY = new EventBundleImpl(null, null, null) {
-        public EventIterator getEvents() {
-            return IteratorHelper.EMPTY;
-        }
-    };
-
-    private final Element eventBundleElement;
-
-    private final URIResolver uriResolver;
-
-    private final SessionInfo sessionInfo;
+    static final EventBundle EMPTY = new EventBundleImpl();
 
+    private final Collection events;
     private final boolean isLocal;
 
+    private EventBundleImpl() {
+        events = null;
+        isLocal = false;
+    }
     /**
      * Creates a new event bundle.
      *
-     * @param eventBundleElement
-     * @param uriResolver
-     * @param sessionInfo
+     * @param events
+     * @param isLocal
      */
-    EventBundleImpl(Element eventBundleElement,
-                    URIResolver uriResolver,
-                    SessionInfo sessionInfo) {
-        this.eventBundleElement = eventBundleElement;
-        this.uriResolver = uriResolver;
-        this.sessionInfo = sessionInfo;
-        String value = null;
-        if (eventBundleElement != null) {
-            value = DomUtil.getAttribute(eventBundleElement,
-                        XML_EVENT_IS_LOCAL, NAMESPACE);
-        }
-        this.isLocal = (value != null) ? Boolean.valueOf(value).booleanValue() : false;
+    EventBundleImpl(Collection events, boolean isLocal) {
+        this.events = events;
+        this.isLocal = isLocal;
     }
 
     /**
      * @inheritDoc
      */
     public EventIterator getEvents() {
-        return new EventIteratorImpl(eventBundleElement, uriResolver, sessionInfo);
+        if (events == null || events.isEmpty()) {
+            return IteratorHelper.EMPTY;
+        } else {
+            return new EventIteratorImpl(events);
+        }
     }
 
     /**

Modified: jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/EventImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/EventImpl.java?view=diff&rev=472821&r1=472820&r2=472821
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/EventImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/EventImpl.java Thu Nov  9 01:11:55 2006
@@ -21,21 +21,12 @@
 import org.apache.jackrabbit.name.Path;
 import org.apache.jackrabbit.spi.NodeId;
 import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.spi.SessionInfo;
 import org.apache.jackrabbit.webdav.xml.DomUtil;
 import org.apache.jackrabbit.webdav.observation.ObservationConstants;
-import org.apache.jackrabbit.webdav.observation.EventType;
-import org.apache.jackrabbit.webdav.observation.DefaultEventType;
-import org.apache.jackrabbit.webdav.DavConstants;
-import org.apache.jackrabbit.webdav.DavException;
-import org.apache.jackrabbit.webdav.jcr.observation.SubscriptionImpl;
-import org.apache.jackrabbit.util.Text;
 import org.w3c.dom.Element;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.jcr.RepositoryException;
-
 /**
  * <code>EventImpl</code>...
  */
@@ -43,30 +34,21 @@
 
     private static Logger log = LoggerFactory.getLogger(EventImpl.class);
 
-    private final Element eventElement;
+    private final ItemId eventId;
     private final int type;
+    private final Path eventPath;
+    private final NodeId parentId;
 
-    private final SessionInfo sessionInfo;
-    private final URIResolver uriResolver;
+    private final Element eventElement;
 
-    private final String href;
-    private final Path qPath;
+    public EventImpl(ItemId eventId, Path eventPath, NodeId parentId, int eventType,
+                     Element eventElement) {
+        this.eventId = eventId;
+        this.eventPath = eventPath;
+        this.parentId = parentId;
+        type = getSpiEventType(eventType);
 
-    public EventImpl(Element eventElement, URIResolver uriResolver,
-                     SessionInfo sessionInfo) throws RepositoryException, DavException {
         this.eventElement = eventElement;
-        this.uriResolver = uriResolver;
-        this.sessionInfo = sessionInfo;
-
-        Element typeEl = DomUtil.getChildElement(eventElement, XML_EVENTTYPE, NAMESPACE);
-        EventType[] et = DefaultEventType.createFromXml(typeEl);
-        if (et.length == 0 || et.length > 1) {
-            throw new IllegalArgumentException("Ambigous event type definition: expected one single eventtype.");
-        }
-        type = getSpiEventType(SubscriptionImpl.getJcrEventType(et[0]));
-
-        href = DomUtil.getChildTextTrim(eventElement, DavConstants.XML_HREF, DavConstants.NAMESPACE);
-        qPath = uriResolver.getQPath(href, sessionInfo);
     }
 
     public int getType() {
@@ -74,34 +56,15 @@
     }
 
     public Path getQPath() {
-        return qPath;
+        return eventPath;
     }
 
     public ItemId getItemId() {
-        try {
-            if (type == Event.NODE_ADDED || type == Event.NODE_REMOVED) {
-                return uriResolver.getNodeId(href, sessionInfo);
-            } else {
-                return uriResolver.getPropertyId(href, sessionInfo);
-            }
-        } catch (RepositoryException e) {
-            // should never occur
-            log.error("Internal error, while building id of Event.", e);
-            // TODO: check
-            throw new IllegalStateException();
-        }
+        return eventId;
     }
 
     public NodeId getParentId() {
-        try {
-            String parentHref = Text.getRelativeParent(href, 1, true);
-            return uriResolver.getNodeId(parentHref, sessionInfo);
-        } catch (RepositoryException e) {
-            // should never occur
-            log.error("Internal error, while building parentId of Event.", e);
-            // TODO: check
-            throw new IllegalStateException();
-        }
+        return parentId;
     }
 
     public String getUUID() {

Modified: jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/EventIteratorImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/EventIteratorImpl.java?view=diff&rev=472821&r1=472820&r2=472821
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/EventIteratorImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/EventIteratorImpl.java Thu Nov  9 01:11:55 2006
@@ -15,19 +15,14 @@
 */
 package org.apache.jackrabbit.spi2dav;
 
-import org.apache.jackrabbit.webdav.xml.ElementIterator;
-import org.apache.jackrabbit.webdav.xml.DomUtil;
-import org.apache.jackrabbit.webdav.observation.ObservationConstants;
-import org.apache.jackrabbit.webdav.DavException;
 import org.apache.jackrabbit.spi.EventIterator;
-import org.apache.jackrabbit.spi.SessionInfo;
 import org.apache.jackrabbit.spi.Event;
 import org.slf4j.LoggerFactory;
 import org.slf4j.Logger;
-import org.w3c.dom.Element;
 
-import javax.jcr.RepositoryException;
 import java.util.NoSuchElementException;
+import java.util.Collection;
+import java.util.Iterator;
 
 /**
  * <code>EventIteratorImpl</code>...
@@ -36,18 +31,13 @@
 
     private static Logger log = LoggerFactory.getLogger(EventIteratorImpl.class);
 
-    private final SessionInfo sessionInfo;
-    private final URIResolver uriResolver;
-    private ElementIterator eventElementIterator;
+    private Iterator eventIterator;
 
     private Event next;
     private long pos;
 
-    public EventIteratorImpl(Element eventBundleElement, URIResolver uriResolver, SessionInfo sessionInfo) {
-
-        this.sessionInfo = sessionInfo;
-        this.uriResolver = uriResolver;
-        this.eventElementIterator = DomUtil.getChildren(eventBundleElement, ObservationConstants.XML_EVENT, ObservationConstants.NAMESPACE);
+    public EventIteratorImpl(Collection events) {
+        this.eventIterator = events.iterator();
         retrieveNextEvent();
     }
 
@@ -90,15 +80,11 @@
     //------------------------------------------------------------< private >---
     private void retrieveNextEvent() {
         next = null;
-        if (eventElementIterator != null) {
-            while (next == null && eventElementIterator.hasNext()) {
-                Element evElem = eventElementIterator.nextElement();
-                try {
-                    next = new EventImpl(evElem, uriResolver, sessionInfo);
-                } catch (RepositoryException e) {
-                    log.error("Unexpected error while creating event.", e);
-                } catch (DavException e) {
-                    log.error("Unexpected error while creating event.", e);
+        if (eventIterator != null) {
+            while (next == null && eventIterator.hasNext()) {
+                Object o = eventIterator.next();
+                if (o instanceof Event) {
+                    next = (Event)o;
                 }
             }
         }

Modified: jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/ExceptionConverter.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/ExceptionConverter.java?view=diff&rev=472821&r1=472820&r2=472821
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/ExceptionConverter.java (original)
+++ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/ExceptionConverter.java Thu Nov  9 01:11:55 2006
@@ -26,6 +26,7 @@
 
 import javax.jcr.RepositoryException;
 import javax.jcr.ItemNotFoundException;
+import javax.jcr.InvalidItemStateException;
 import javax.jcr.nodetype.ConstraintViolationException;
 import javax.jcr.lock.LockException;
 import java.lang.reflect.Constructor;
@@ -72,9 +73,11 @@
 
         // make sure an exception is generated
         switch (davExc.getErrorCode()) {
+            // TODO: mapping DAV_error to jcr-exception is ambiguous. to be improved
             case DavServletResponse.SC_NOT_FOUND : return new ItemNotFoundException(msg);
             case DavServletResponse.SC_LOCKED : return new LockException(msg);
             case DavServletResponse.SC_METHOD_NOT_ALLOWED : return new ConstraintViolationException(msg);
+            case DavServletResponse.SC_CONFLICT : return new InvalidItemStateException(msg);
             default: return new RepositoryException(msg);
         }
     }

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=472821&r1=472820&r2=472821
==============================================================================
--- 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 Nov  9 01:11:55 2006
@@ -68,11 +68,17 @@
     public void remove(String uri) {
         String cleanUri = getCleanUri(uri);
         Object itemId = uriToIdCache.remove(cleanUri);
+        if (itemId != null) {
+            idToUriCache.remove(itemId);
+        }
         log.debug("Removed: ItemId = " + itemId + " URI = " + cleanUri);
     }
 
     public void remove(ItemId itemId) {
         Object uri = idToUriCache.remove(itemId);
+        if (uri != null) {
+            uriToIdCache.remove(uri);
+        }
         log.debug("Removed: ItemId = " + itemId + " URI = " + 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=472821&r1=472820&r2=472821
==============================================================================
--- 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 Nov  9 01:11:55 2006
@@ -70,6 +70,7 @@
 import org.apache.jackrabbit.webdav.observation.EventType;
 import org.apache.jackrabbit.webdav.observation.EventDiscovery;
 import org.apache.jackrabbit.webdav.observation.ObservationConstants;
+import org.apache.jackrabbit.webdav.observation.DefaultEventType;
 import org.apache.jackrabbit.webdav.security.SecurityConstants;
 import org.apache.jackrabbit.webdav.security.CurrentUserPrivilegeSetProperty;
 import org.apache.jackrabbit.webdav.security.Privilege;
@@ -97,6 +98,7 @@
 import org.apache.jackrabbit.name.NoPrefixDeclaredException;
 import org.apache.jackrabbit.name.QName;
 import org.apache.jackrabbit.name.NameFormat;
+import org.apache.jackrabbit.name.Path;
 import org.apache.jackrabbit.spi.Batch;
 import org.apache.jackrabbit.spi.RepositoryService;
 import org.apache.jackrabbit.spi.SessionInfo;
@@ -114,6 +116,7 @@
 import org.apache.jackrabbit.spi.IdFactory;
 import org.apache.jackrabbit.spi.LockInfo;
 import org.apache.jackrabbit.spi.EventBundle;
+import org.apache.jackrabbit.spi.Event;
 import org.apache.jackrabbit.util.Text;
 import org.apache.jackrabbit.uuid.UUID;
 import org.apache.jackrabbit.value.ValueFormat;
@@ -239,9 +242,17 @@
         }
     }
 
+    private static void initMethod(DavMethod method, BatchImpl batchImpl, boolean addIfHeader) {
+        initMethod(method, batchImpl.sessionInfo,  addIfHeader);
+
+        // add batchId as separate header
+        CodedUrlHeader ch = new CodedUrlHeader(TransactionConstants.HEADER_TRANSACTIONID, batchImpl.batchId);
+        method.setRequestHeader(ch.getHeaderName(), ch.getHeaderValue());
+    }
+
     private static boolean isSameResource(String requestURI, MultiStatusResponse response) {
         String href = response.getHref();
-        if (href.endsWith("/")) {
+        if (href.endsWith("/") && !requestURI.endsWith("/")) {
             href = href.substring(0, href.length() - 1);
         }
         return requestURI.equals(href);
@@ -309,7 +320,7 @@
         // TODO: build specific subscrUri
         // TODO: check if 'all event' subscription is ok
         String subscrUri = uriResolver.getRootItemUri(sessionInfo.getWorkspaceName());
-        String subscrId = subscribe(subscrUri, S_INFO, null, sessionInfo);
+        String subscrId = subscribe(subscrUri, S_INFO, null, sessionInfo, null);
         try {
             if (isLockMethod(method)) {
                 initMethod(method, sessionInfo, false);
@@ -794,10 +805,7 @@
                 Iterator it = batchImpl.methods();
                 while (it.hasNext()) {
                     DavMethod method = (DavMethod) it.next();
-                    initMethod(method, batchImpl.sessionInfo, true);
-                    // add batchId as separate header
-                    CodedUrlHeader ch = new CodedUrlHeader(TransactionConstants.HEADER_TRANSACTIONID, batchImpl.batchId);
-                    method.setRequestHeader(ch.getHeaderName(), ch.getHeaderValue());
+                    initMethod(method, batchImpl, true);
 
                     client.executeMethod(method);
                     method.checkSuccess();
@@ -883,6 +891,8 @@
         try {
             String uri = getItemUri(nodeId, sessionInfo);
             method = new PropFindMethod(uri, nameSet, DEPTH_0);
+            // TODO: not correct. pass tokens in order avoid new session to be created TOBEFIXED
+            initMethod(method, sessionInfo, true);
 
             getClient(sessionInfo).executeMethod(method);
             method.checkSuccess();
@@ -1162,7 +1172,7 @@
         String subscriptionId = sessionInfoImpl.getSubscriptionId();
         if (subscriptionId == null) {
             SubscriptionInfo subscriptionInfo = new SubscriptionInfo(ALL_EVENTS, true, DavConstants.UNDEFINED_TIMEOUT);
-            subscriptionId = subscribe(rootUri, subscriptionInfo, null, sessionInfo);
+            subscriptionId = subscribe(rootUri, subscriptionInfo, null, sessionInfo, null);
             log.debug("Subscribed on server for session info " + sessionInfo);
             sessionInfoImpl.setSubscriptionId(subscriptionId);
         }
@@ -1170,7 +1180,9 @@
         return poll(rootUri, subscriptionId, sessionInfo);
     }
 
-    private String subscribe(String uri, SubscriptionInfo subscriptionInfo, String subscriptionId, SessionInfo sessionInfo) throws RepositoryException {
+    private String subscribe(String uri, SubscriptionInfo subscriptionInfo,
+                             String subscriptionId, SessionInfo sessionInfo,
+                             String batchId) throws RepositoryException {
         SubscribeMethod method = null;
         try {
             if (subscriptionId != null) {
@@ -1178,6 +1190,13 @@
             } else {
                 method = new SubscribeMethod(uri, subscriptionInfo);
             }
+
+            if (batchId != null) {
+                // add batchId as separate header
+                CodedUrlHeader ch = new CodedUrlHeader(TransactionConstants.HEADER_TRANSACTIONID, batchId);
+                method.setRequestHeader(ch.getHeaderName(), ch.getHeaderValue());
+            }
+
             getClient(sessionInfo).executeMethod(method);
             method.checkSuccess();
             return method.getSubscriptionId();
@@ -1227,7 +1246,11 @@
                         ObservationConstants.NAMESPACE);
                 List bundles = new ArrayList();
                 while (it.hasNext()) {
-                    bundles.add(new EventBundleImpl(it.nextElement(), uriResolver, sessionInfo));
+                    Element bundleElement = it.nextElement();
+                    String value = DomUtil.getAttribute(bundleElement, ObservationConstants.XML_EVENT_IS_LOCAL, NAMESPACE);
+                    boolean isLocal = (value != null) ? Boolean.valueOf(value).booleanValue() : false;
+
+                    bundles.add(new EventBundleImpl(buildEventList(bundleElement, sessionInfo), isLocal));
                 }
                 events = (EventBundle[]) bundles.toArray(new EventBundle[bundles.size()]);
             }
@@ -1243,6 +1266,60 @@
         }
     }
 
+    private List buildEventList(Element bundleElement, SessionInfo sessionInfo) {
+        List events = new ArrayList();
+        ElementIterator eventElementIterator = DomUtil.getChildren(bundleElement, ObservationConstants.XML_EVENT, ObservationConstants.NAMESPACE);
+        while (eventElementIterator.hasNext()) {
+            Element evElem = eventElementIterator.nextElement();
+            Element typeEl = DomUtil.getChildElement(evElem, ObservationConstants.XML_EVENTTYPE, ObservationConstants.NAMESPACE);
+            EventType[] et = DefaultEventType.createFromXml(typeEl);
+            if (et.length == 0 || et.length > 1) {
+                // should not occur.
+                log.error("Ambigous event type definition: expected one single eventtype.");
+                continue;
+            }
+
+            String href = DomUtil.getChildTextTrim(evElem, DavConstants.XML_HREF, DavConstants.NAMESPACE);
+
+            int type;
+            Path eventPath;
+            try {
+                type = SubscriptionImpl.getJcrEventType(et[0]);
+                eventPath = uriResolver.getQPath(href, sessionInfo);
+            } catch (DavException e) {
+                // should not occur
+                log.error("Internal error while building Event", e);
+                continue;
+            } catch (RepositoryException e) {
+                // should not occur
+                log.error("Internal error while building Event", e);
+                continue;
+            }
+
+            ItemId eventId = null;
+            try {
+                if (type == Event.NODE_ADDED || type == Event.NODE_REMOVED) {
+                    eventId = uriResolver.getNodeId(href, sessionInfo);
+                } else {
+                    eventId = uriResolver.getPropertyId(href, sessionInfo);
+                }
+            } catch (RepositoryException e) {
+                log.warn("Unable to build event itemId: ", e);
+            }
+            String parentHref = Text.getRelativeParent(href, 1, true);
+            NodeId parentId = null;
+            try {
+                parentId = uriResolver.getNodeId(parentHref, sessionInfo);
+            } catch (RepositoryException e) {
+                log.warn("Unable to build event parentId: ", e);
+            }
+
+            events.add(new EventImpl(eventId, eventPath, parentId, type, evElem));
+        }
+
+        return events;
+    }
+
     /**
      * @see RepositoryService#getRegisteredNamespaces(SessionInfo)
      */
@@ -1440,7 +1517,7 @@
                 String uri = getItemUri(targetId, sessionInfo);
                 // start special 'lock'
                 LockMethod method = new LockMethod(uri, TransactionConstants.LOCAL, TransactionConstants.TRANSACTION, null, DavConstants.INFINITE_TIMEOUT, true);
-                initMethod(method, sessionInfo, false);
+                initMethod(method, sessionInfo, true);
 
                 HttpClient client = getClient(sessionInfo);
                 client.executeMethod(method);
@@ -1450,7 +1527,7 @@
 
                 // register subscription
                 String subscrUri = (targetId.denotesNode() ? uri : getItemUri(((PropertyId) targetId).getParentId(), sessionInfo));
-                subscriptionId = subscribe(subscrUri, S_INFO, null, sessionInfo);
+                subscriptionId = subscribe(subscrUri, S_INFO, null, sessionInfo, batchId);
                 return client;
             } catch (IOException e) {
                 throw new RepositoryException(e);
@@ -1470,12 +1547,8 @@
                 // make sure the lock initially created is removed again on the
                 // server, asking the server to persist the modifications
                 method = new UnLockMethod(uri, batchId);
-                // todo: check if 'initmethod' would work (ev. conflict with TxId header).
-                String[] locktokens = sessionInfo.getLockTokens();
-                if (locktokens != null && locktokens.length > 0) {
-                    IfHeader ifH = new IfHeader(locktokens);
-                    method.setRequestHeader(ifH.getHeaderName(), ifH.getHeaderValue());
-                }
+                initMethod(method, sessionInfo, true);
+
                 // in contrast to standard UNLOCK, the tx-unlock provides a
                 // request body.
                 method.setRequestBody(new TransactionInfo(commit));

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=472821&r1=472820&r2=472821
==============================================================================
--- 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 Nov  9 01:11:55 2006
@@ -238,6 +238,12 @@
         }
     }
 
+    void clearCacheEntries(ItemId itemId, SessionInfo sessionInfo) {
+        IdURICache cache = getCache(sessionInfo.getWorkspaceName());
+        if (cache.containsItemId(itemId)) {
+            cache.remove(itemId);
+        }
+    }
     //-------------------------------------------------------< URI resolver >---
     /**
      * @inheritDoc
@@ -254,7 +260,7 @@
         try {
             return PathFormat.parse(Text.unescape(jcrPath), nsResolver);
         } catch (MalformedPathException e) {
-            throw new RepositoryException();
+            throw new RepositoryException(e);
         }
     }