Index: jackrabbit-jcr-server/pom.xml =================================================================== --- jackrabbit-jcr-server/pom.xml (revision 1913113) +++ jackrabbit-jcr-server/pom.xml (working copy) @@ -170,13 +170,6 @@ derby.stream.error.file target/derby.log - - known.issues - - - org.apache.jackrabbit.webdav.server.RFC4918IfHeaderTest#testPutIfEtag - - Index: jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/SimpleWebdavServlet.java =================================================================== --- jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/SimpleWebdavServlet.java (revision 1913113) +++ jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/SimpleWebdavServlet.java (working copy) @@ -214,7 +214,7 @@ } } - return !resource.exists() || request.matchesIfHeader(resource); + return request.matchesIfHeader(resource); } /** Index: jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/WebdavRequestImpl.java =================================================================== --- jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/WebdavRequestImpl.java (revision 1913113) +++ jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/WebdavRequestImpl.java (working copy) @@ -61,6 +61,7 @@ import org.apache.jackrabbit.webdav.header.OverwriteHeader; import org.apache.jackrabbit.webdav.header.PollTimeoutHeader; import org.apache.jackrabbit.webdav.header.TimeoutHeader; +import org.apache.jackrabbit.webdav.lock.ActiveLock; import org.apache.jackrabbit.webdav.lock.LockInfo; import org.apache.jackrabbit.webdav.lock.Scope; import org.apache.jackrabbit.webdav.lock.Type; @@ -619,19 +620,22 @@ * @see org.apache.jackrabbit.webdav.lock.ActiveLock#getToken() */ public boolean matchesIfHeader(DavResource resource) { - // no ifheader, no resource or no write lock on resource + // no ifheader // >> preconditions ok so far - if (!ifHeader.hasValue() || resource == null || !resource.hasLock(Type.WRITE, Scope.EXCLUSIVE)) { + if (!ifHeader.hasValue() || resource == null) { return true; } - boolean isMatching = false; - String lockToken = resource.getLock(Type.WRITE, Scope.EXCLUSIVE).getToken(); - if (lockToken != null) { - isMatching = matchesIfHeader(resource.getHref(), lockToken, getStrongETag(resource)); - } // else: lockToken is null >> the if-header will not match. - - return isMatching; + ActiveLock[] locks = resource.getLocks(); + if (!resource.exists() || locks.length == 0) { + return matchesIfHeader(resource.getHref(), null, getStrongETag(resource)); + } + for (ActiveLock lock : locks) { + if (matchesIfHeader(resource.getHref(), lock.getToken(), getStrongETag(resource))) { + return true; + } + } + return false; } /** @@ -650,11 +654,13 @@ * @return strong etag or empty string. */ private String getStrongETag(DavResource resource) { - DavProperty prop = resource.getProperty(DavPropertyName.GETETAG); - if (prop != null && prop.getValue() != null) { - String etag = prop.getValue().toString(); - if (isStrongETag(etag)) { - return etag; + if (resource.exists()) { + DavProperty prop = resource.getProperty(DavPropertyName.GETETAG); + if (prop != null && prop.getValue() != null) { + String etag = prop.getValue().toString(); + if (isStrongETag(etag)) { + return etag; + } } } // no strong etag available Index: jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/header/IfHeader.java =================================================================== --- jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/header/IfHeader.java (revision 1913113) +++ jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/header/IfHeader.java (working copy) @@ -662,7 +662,7 @@ */ @Override public boolean match(String token, String etag) { - return super.match(token); + return token == null || super.match(token); } /**