commit 31fb449d2661cc511c292351b75ab623a4736b0e from: leo date: Mon Jan 26 21:35:40 2009 UTC fixed ETag handling commit - 63967dcfda324c80dd27848127132b790b4e17b4 commit + 31fb449d2661cc511c292351b75ab623a4736b0e blob - 5a4955869bb76ae6fb2001027f0da01cdb40a9bf blob + c592b4c0538d04698f16be3c7f792e4cf706d0f8 --- modules/webdav/pom.xml +++ modules/webdav/pom.xml @@ -33,6 +33,22 @@ commons-vfs 1.0 + + commons-httpclient + commons-httpclient + 3.0.1 + + + commons-collections + commons-collections + 3.2.1 + + + commons-codec + commons-codec + 1.3 + + blob - ba1bb8e542feecaca819e506aaa13f7b8be94cfa blob + d4560b1d901937514f89fa9f262cffdfcc483813 --- modules/webdav/src/main/java/com/thinkberg/webdav/GetHandler.java +++ modules/webdav/src/main/java/com/thinkberg/webdav/GetHandler.java @@ -57,7 +57,7 @@ public class GetHandler extends WebdavHandler { void setHeader(HttpServletResponse response, FileContent content) throws FileSystemException { response.setHeader("Last-Modified", Util.getDateString(content.getLastModifiedTime())); response.setHeader("Content-Type", content.getContentInfo().getContentType()); - response.setHeader("ETag", String.format("%x", content.getFile().hashCode())); + response.setHeader("ETag", Util.getETag(content.getFile())); } blob - 3a04b32724c8f5ab5247f0d1cae38cba747cea8a blob + d28e7546716d0496da1e27aa8b30401a7c92259d --- modules/webdav/src/main/java/com/thinkberg/webdav/Util.java +++ modules/webdav/src/main/java/com/thinkberg/webdav/Util.java @@ -16,6 +16,10 @@ package com.thinkberg.webdav; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.vfs.FileObject; +import org.apache.commons.vfs.FileSystemException; + import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -65,4 +69,16 @@ public class Util { return bytesWritten; } + + public static String getETag(FileObject object) { + String fileName = object.getName().getPath(); + String lastModified = ""; + try { + lastModified = String.valueOf(object.getContent().getLastModifiedTime()); + } catch (FileSystemException e) { + // ignore error here + } + + return DigestUtils.shaHex(fileName + lastModified); + } } blob - 21cc82179b26c678e0a701189ad0451c27474c7d blob + e7340ea7dcfb87fe1be23190650ff7eeb0f559a9 --- modules/webdav/src/main/java/com/thinkberg/webdav/lock/Lock.java +++ modules/webdav/src/main/java/com/thinkberg/webdav/lock/Lock.java @@ -16,6 +16,7 @@ package com.thinkberg.webdav.lock; +import com.thinkberg.webdav.Util; import org.apache.commons.vfs.FileObject; import org.dom4j.Element; @@ -49,7 +50,7 @@ public class Lock { this.depth = depth; this.timeout = timeout; - this.token = "opaquelocktoken:" + Integer.toHexString(object.hashCode()); + this.token = "opaquelocktoken:" + Util.getETag(object); } public FileObject getObject() { blob - 6940fa3250eafb941b27dc63fdd39cceff20ea8d blob + cd20dd2a24353ca0cacc7c60aa50b26b193ad1d3 --- modules/webdav/src/main/java/com/thinkberg/webdav/lock/LockManager.java +++ modules/webdav/src/main/java/com/thinkberg/webdav/lock/LockManager.java @@ -16,6 +16,7 @@ package com.thinkberg.webdav.lock; +import com.thinkberg.webdav.Util; import com.thinkberg.webdav.vfs.DepthFileSelector; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -223,7 +224,7 @@ public class LockManager { break; case TOKEN_LEFT_BRACKET: String eTag = condToken.substring(1, condToken.length() - 1); - String resourceETag = String.format("%x", resource.hashCode()); + String resourceETag = Util.getETag(resource); boolean resourceTagMatches = resourceETag.equals(eTag); final boolean matchesEtagResult = negate ? !resourceTagMatches : resourceTagMatches; LOG.debug(String.format(" %smatches-etag(%s) = %b", blob - 9483a4df30a0be93e787b2e9400ce60e5aead2f0 blob + cb359f84671c786cc2099e749c60d1a8dd343ab7 --- modules/webdav/src/test/java/com/thinkberg/webdav/tests/DavLockManagerTest.java +++ modules/webdav/src/test/java/com/thinkberg/webdav/tests/DavLockManagerTest.java @@ -1,6 +1,7 @@ package com.thinkberg.webdav.tests; import com.thinkberg.webdav.DavTestCase; +import com.thinkberg.webdav.Util; import com.thinkberg.webdav.lock.Lock; import com.thinkberg.webdav.lock.LockConflictException; import com.thinkberg.webdav.lock.LockManager; @@ -74,7 +75,7 @@ public class DavLockManagerTest extends DavTestCase { public void testConditionSimpleLockTokenAndETag() throws Exception { Lock aLock = new Lock(aFile, Lock.WRITE, Lock.SHARED, OWNER_STR, 0, 3600); - final String condition = "(<" + aLock.getToken() + "> [" + Integer.toHexString(aFile.hashCode()) + "])"; + final String condition = "(<" + aLock.getToken() + "> [" + Util.getETag(aFile) + "])"; LockManager.getInstance().acquireLock(aLock); assertTrue("condition with existing lock token and correct ETag should not fail", LockManager.getInstance().evaluateCondition(aFile, condition).result); @@ -82,7 +83,7 @@ public class DavLockManagerTest extends DavTestCase { public void testConditionSimpleLockTokenWrongAndETag() throws Exception { Lock aLock = new Lock(aFile, Lock.WRITE, Lock.SHARED, OWNER_STR, 0, 3600); - final String condition = "(<" + aLock.getToken() + "x> [" + Integer.toHexString(aFile.hashCode()) + "])"; + final String condition = "(<" + aLock.getToken() + "x> [" + Util.getETag(aFile) + "])"; LockManager.getInstance().acquireLock(aLock); try { LockManager.getInstance().evaluateCondition(aFile, condition); @@ -94,7 +95,7 @@ public class DavLockManagerTest extends DavTestCase { public void testConditionSimpleLockTokenAndETagWrong() throws Exception { Lock aLock = new Lock(aFile, Lock.WRITE, Lock.SHARED, OWNER_STR, 0, 3600); - final String condition = "(<" + aLock.getToken() + "> [" + Integer.toHexString(aFile.hashCode()) + "x])"; + final String condition = "(<" + aLock.getToken() + "> [" + Util.getETag(aFile) + "x])"; LockManager.getInstance().acquireLock(aLock); assertFalse("condition with existing lock token and incorrect ETag should fail", LockManager.getInstance().evaluateCondition(aFile, condition).result); @@ -102,7 +103,7 @@ public class DavLockManagerTest extends DavTestCase { public void testConditionSimpleLockTokenWrongAndETagWrong() throws Exception { Lock aLock = new Lock(aFile, Lock.WRITE, Lock.SHARED, OWNER_STR, 0, 3600); - final String condition = "(<" + aLock.getToken() + "x> [" + Integer.toHexString(aFile.hashCode()) + "x])"; + final String condition = "(<" + aLock.getToken() + "x> [" + Util.getETag(aFile) + "x])"; LockManager.getInstance().acquireLock(aLock); assertFalse("condition with non-existing lock token and incorrect ETag should fail", LockManager.getInstance().evaluateCondition(aFile, condition).result); @@ -110,7 +111,7 @@ public class DavLockManagerTest extends DavTestCase { public void testConditionSimpleLockTokenWrongAndETagOrSimpleETag() throws Exception { Lock aLock = new Lock(aFile, Lock.WRITE, Lock.SHARED, OWNER_STR, 0, 3600); - final String eTag = Integer.toHexString(aFile.hashCode()); + final String eTag = Util.getETag(aFile); final String condition = "(<" + aLock.getToken() + "x> [" + eTag + "]) ([" + eTag + "])"; LockManager.getInstance().acquireLock(aLock); try { @@ -123,7 +124,7 @@ public class DavLockManagerTest extends DavTestCase { public void testConditionSimpleNegatedLockTokenWrongAndETag() throws Exception { Lock aLock = new Lock(aFile, Lock.WRITE, Lock.SHARED, OWNER_STR, 0, 3600); - final String eTag = Integer.toHexString(aFile.hashCode()); + final String eTag = Util.getETag(aFile); final String condition = "(Not <" + aLock.getToken() + "x> [" + eTag + "])"; assertTrue("condition with negated wrong lock token and correct ETag should not fail on unlocked resource", LockManager.getInstance().evaluateCondition(aFile, condition).result); @@ -140,7 +141,7 @@ public class DavLockManagerTest extends DavTestCase { public void testComplexConditionWithBogusLockToken() throws Exception { Lock aLock = new Lock(aFile, Lock.WRITE, Lock.SHARED, OWNER_STR, 0, 3600); - final String eTag = Integer.toHexString(aFile.hashCode()); + final String eTag = Util.getETag(aFile); final String condition = "(<" + aLock.getToken() + "> [" + eTag + "x]) (Not [" + eTag + "x])"; LockManager.getInstance().acquireLock(aLock); assertFalse("complex condition with bogus eTag should fail", blob - c14c5ba8b42a4c77c7dda6a647481be6ab4f0ce3 blob + 06c1c46a60a4facb13fe413c6195580c5b6a3282 --- pom.xml +++ pom.xml @@ -28,11 +28,11 @@ dom4j 1.6.1 - - jaxen - jaxen - 1.1 - + + + + +