Commit Diff


commit - 63967dcfda324c80dd27848127132b790b4e17b4
commit + 31fb449d2661cc511c292351b75ab623a4736b0e
blob - 5a4955869bb76ae6fb2001027f0da01cdb40a9bf
blob + c592b4c0538d04698f16be3c7f792e4cf706d0f8
--- modules/webdav/pom.xml
+++ modules/webdav/pom.xml
@@ -33,6 +33,22 @@
             <artifactId>commons-vfs</artifactId>
             <version>1.0</version>
         </dependency>
+        <dependency>
+            <groupId>commons-httpclient</groupId>
+            <artifactId>commons-httpclient</artifactId>
+            <version>3.0.1</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-collections</groupId>
+            <artifactId>commons-collections</artifactId>
+            <version>3.2.1</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+            <version>1.3</version>
+        </dependency>
+
     </dependencies>
     <build>
         <resources>
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 <DAV:no-lock> [" + 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 @@
             <artifactId>dom4j</artifactId>
             <version>1.6.1</version>
         </dependency>
-        <dependency>
-            <groupId>jaxen</groupId>
-            <artifactId>jaxen</artifactId>
-            <version>1.1</version>
-        </dependency>
+        <!--<dependency>-->
+        <!--<groupId>jaxen</groupId>-->
+        <!--<artifactId>jaxen</artifactId>-->
+        <!--<version>1.1</version>-->
+        <!--</dependency>-->
     </dependencies>
     <build>
         <resources>