commit - 63967dcfda324c80dd27848127132b790b4e17b4
commit + 31fb449d2661cc511c292351b75ab623a4736b0e
blob - 5a4955869bb76ae6fb2001027f0da01cdb40a9bf
blob + c592b4c0538d04698f16be3c7f792e4cf706d0f8
--- modules/webdav/pom.xml
+++ modules/webdav/pom.xml
<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
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
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;
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
package com.thinkberg.webdav.lock;
+import com.thinkberg.webdav.Util;
import org.apache.commons.vfs.FileObject;
import org.dom4j.Element;
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
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;
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
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;
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);
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);
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);
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);
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 {
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);
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
<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>