You are viewing a plain text version of this content. The canonical link for it is here.
Posted to slide-dev@jakarta.apache.org by pn...@apache.org on 2005/03/04 19:14:32 UTC
cvs commit: jakarta-slide/proposals/wvcm/src/org/apache/wvcm/store/webdav ControllableFolderWebdavAccessor.java ControllableResourceWebdavAccessor.java FolderWebdavAccessor.java PrincipalWebdavAccessor.java PrivilegeWebdavAccessor.java ResourceWebdavAccessor.java WebdavAccessor.java WorkspaceWebdavAccessor.java
pnever 2005/03/04 10:14:32
Modified: proposals/wvcm/src/org/apache/wvcm/store/webdav
ControllableFolderWebdavAccessor.java
ControllableResourceWebdavAccessor.java
FolderWebdavAccessor.java
PrincipalWebdavAccessor.java
PrivilegeWebdavAccessor.java
ResourceWebdavAccessor.java WebdavAccessor.java
WorkspaceWebdavAccessor.java
Log:
Merged RetryHandler from WVCM_1_0_BRANCH
Revision Changes Path
1.6 +5 -5 jakarta-slide/proposals/wvcm/src/org/apache/wvcm/store/webdav/ControllableFolderWebdavAccessor.java
Index: ControllableFolderWebdavAccessor.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/wvcm/src/org/apache/wvcm/store/webdav/ControllableFolderWebdavAccessor.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ControllableFolderWebdavAccessor.java 30 Jul 2004 06:52:28 -0000 1.5
+++ ControllableFolderWebdavAccessor.java 4 Mar 2005 18:14:31 -0000 1.6
@@ -107,7 +107,7 @@
addLockTokens(method);
try {
- client().executeMethod( method );
+ method = (MkcolMethod)retryHandler().executeMethod( method );
int sc = method.getStatusCode();
String st = method.getStatusText();
switch( sc ) {
1.16 +11 -11 jakarta-slide/proposals/wvcm/src/org/apache/wvcm/store/webdav/ControllableResourceWebdavAccessor.java
Index: ControllableResourceWebdavAccessor.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/wvcm/src/org/apache/wvcm/store/webdav/ControllableResourceWebdavAccessor.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- ControllableResourceWebdavAccessor.java 30 Jul 2004 06:52:28 -0000 1.15
+++ ControllableResourceWebdavAccessor.java 4 Mar 2005 18:14:31 -0000 1.16
@@ -126,7 +126,7 @@
addLockTokens(method);
try {
- client().executeMethod( method );
+ method = (PutMethod)retryHandler().executeMethod( method );
int sc = method.getStatusCode();
String st = method.getStatusText();
switch( sc ) {
@@ -183,7 +183,7 @@
addLockTokens(method);
try {
- client().executeMethod( method );
+ method = (CheckoutMethod)retryHandler(req.reqBodyAsString()).executeMethod( method );
int sc = method.getStatusCode();
String st = method.getStatusText();
switch( sc ) {
@@ -239,7 +239,7 @@
addLockTokens(method);
try {
- client().executeMethod( method );
+ method = (CheckinMethod)retryHandler(req.reqBodyAsString()).executeMethod( method );
int sc = method.getStatusCode();
String st = method.getStatusText();
switch( sc ) {
@@ -285,7 +285,7 @@
addLockTokens(method);
try {
- client().executeMethod( method );
+ method = (UncheckoutMethod)retryHandler().executeMethod( method );
int sc = method.getStatusCode();
String st = method.getStatusText();
switch( sc ) {
@@ -332,7 +332,7 @@
addLockTokens(method);
try {
- client().executeMethod( method );
+ method = (VersionControlMethod)retryHandler().executeMethod( method );
int sc = method.getStatusCode();
String st = method.getStatusText();
switch( sc ) {
@@ -387,7 +387,7 @@
addLockTokens(method);
try {
- client().executeMethod( method );
+ method = (UpdateMethod)retryHandler(req.reqBodyAsString()).executeMethod( method );
int sc = method.getStatusCode();
String st = method.getStatusText();
switch( sc ) {
@@ -444,7 +444,7 @@
addLockTokens(method);
try {
- client().executeMethod( method );
+ method = (VersionControlMethod)retryHandler(req.reqBodyAsString()).executeMethod( method );
int sc = method.getStatusCode();
String st = method.getStatusText();
switch( sc ) {
1.17 +7 -7 jakarta-slide/proposals/wvcm/src/org/apache/wvcm/store/webdav/FolderWebdavAccessor.java
Index: FolderWebdavAccessor.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/wvcm/src/org/apache/wvcm/store/webdav/FolderWebdavAccessor.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- FolderWebdavAccessor.java 8 Sep 2004 12:27:40 -0000 1.16
+++ FolderWebdavAccessor.java 4 Mar 2005 18:14:31 -0000 1.17
@@ -188,7 +188,7 @@
addLockTokens(method);
try {
- client().executeMethod( method );
+ method = (BindMethod)retryHandler(req.reqBodyAsString()).executeMethod( method );
int sc = method.getStatusCode();
String st = method.getStatusText();
switch( sc ) {
@@ -251,7 +251,7 @@
addLockTokens(method);
try {
- client().executeMethod( method );
+ method = (UnbindMethod)retryHandler(req.reqBodyAsString()).executeMethod( method );
int sc = method.getStatusCode();
String st = method.getStatusText();
switch( sc ) {
@@ -316,7 +316,7 @@
method.addRequestHeader( "Overwrite", (overwrite ? "T" : "F") );
try {
- client().executeMethod( method );
+ method = (RebindMethod)retryHandler(req.reqBodyAsString()).executeMethod( method );
int sc = method.getStatusCode();
String st = method.getStatusText();
switch( sc ) {
1.4 +5 -5 jakarta-slide/proposals/wvcm/src/org/apache/wvcm/store/webdav/PrincipalWebdavAccessor.java
Index: PrincipalWebdavAccessor.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/wvcm/src/org/apache/wvcm/store/webdav/PrincipalWebdavAccessor.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- PrincipalWebdavAccessor.java 30 Jul 2004 06:52:28 -0000 1.3
+++ PrincipalWebdavAccessor.java 4 Mar 2005 18:14:31 -0000 1.4
@@ -106,7 +106,7 @@
method.addRequestHeader( "Content-Length", "0" );
try {
- client().executeMethod( method );
+ method = (MkcolMethod)retryHandler().executeMethod( method );
int sc = method.getStatusCode();
String st = method.getStatusText();
switch( sc ) {
1.4 +5 -5 jakarta-slide/proposals/wvcm/src/org/apache/wvcm/store/webdav/PrivilegeWebdavAccessor.java
Index: PrivilegeWebdavAccessor.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/wvcm/src/org/apache/wvcm/store/webdav/PrivilegeWebdavAccessor.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- PrivilegeWebdavAccessor.java 30 Jul 2004 06:52:28 -0000 1.3
+++ PrivilegeWebdavAccessor.java 4 Mar 2005 18:14:31 -0000 1.4
@@ -106,7 +106,7 @@
method.addRequestHeader( "Content-Length", "0" );
try {
- client().executeMethod( method );
+ method = (MkcolMethod)retryHandler().executeMethod( method );
int sc = method.getStatusCode();
String st = method.getStatusText();
switch( sc ) {
1.18 +126 -13 jakarta-slide/proposals/wvcm/src/org/apache/wvcm/store/webdav/ResourceWebdavAccessor.java
Index: ResourceWebdavAccessor.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/wvcm/src/org/apache/wvcm/store/webdav/ResourceWebdavAccessor.java,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- ResourceWebdavAccessor.java 8 Sep 2004 12:27:40 -0000 1.17
+++ ResourceWebdavAccessor.java 4 Mar 2005 18:14:31 -0000 1.18
@@ -66,8 +66,10 @@
import org.apache.wvcm.store.webdav.request.*;
import org.apache.wvcm.store.webdav.response.*;
+import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -81,6 +83,8 @@
import javax.wvcm.SearchToken;
import javax.wvcm.WvcmException;
import javax.wvcm.WvcmException.ReasonCode;
+import org.apache.commons.httpclient.Header;
+import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.EntityEnclosingMethod;
@@ -136,6 +140,18 @@
return getHttpClient( providerImpl, hostname, port );
}
+ protected RetryHandler retryHandler(InputStream content) {
+ return new RetryHandler(content);
+ }
+
+ protected RetryHandler retryHandler(String content) {
+ return new RetryHandler(content);
+ }
+
+ protected RetryHandler retryHandler() {
+ return retryHandler((String)null);
+ }
+
/**
* Return a new resource proxy at the location of the associated resource containing
* the wanted properties. The exact resource type of the resulting resource proxy
@@ -332,7 +348,7 @@
addLockTokens(method);
try {
- client().executeMethod( method );
+ method = (PutMethod)retryHandler(content).executeMethod( method );
int sc = method.getStatusCode();
String st = method.getStatusText();
switch( sc ) {
@@ -384,7 +400,7 @@
addLockTokens(method);
try {
- client().executeMethod( method );
+ method = (ProppatchMethod)retryHandler(req.reqBodyAsString()).executeMethod( method );
int sc = method.getStatusCode();
String st = method.getStatusText();
switch( sc ) {
@@ -455,7 +471,7 @@
addLockTokens(method);
try {
- client().executeMethod( method );
+ method = (DeleteMethod)retryHandler().executeMethod( method );
int sc = method.getStatusCode();
String st = method.getStatusText();
switch( sc ) {
@@ -541,7 +557,7 @@
addLockTokens(method);
try {
- client().executeMethod( method );
+ method = (MoveMethod)retryHandler().executeMethod( method );
int sc = method.getStatusCode();
String st = method.getStatusText();
switch( sc ) {
@@ -592,7 +608,7 @@
addLockTokens(method);
try {
- client().executeMethod( method );
+ method = (CopyMethod)retryHandler().executeMethod( method );
int sc = method.getStatusCode();
String st = method.getStatusText();
switch( sc ) {
@@ -796,7 +812,7 @@
addLockTokens(method);
try {
- client().executeMethod( method );
+ method = (LabelMethod)retryHandler(req.reqBodyAsString()).executeMethod( method );
int sc = method.getStatusCode();
String st = method.getStatusText();
switch( sc ) {
@@ -908,7 +924,7 @@
addLockTokens(method);
try {
- client().executeMethod( method );
+ method = (AclMethod)retryHandler(req.reqBodyAsString()).executeMethod( method );
int sc = method.getStatusCode();
String st = method.getStatusText();
switch( sc ) {
@@ -990,7 +1006,7 @@
method.addRequestHeader( "Depth", "0" );
try {
- client().executeMethod( method );
+ method = (LockMethod)retryHandler(req.reqBodyAsString()).executeMethod( method );
int sc = method.getStatusCode();
String st = method.getStatusText();
switch( sc ) {
@@ -1037,7 +1053,7 @@
method.addRequestHeader( "Lock-Token", "<"+((LockTokenImpl)lockToken).getLockId()+">" );
try {
- client().executeMethod( method );
+ method = (UnlockMethod)retryHandler().executeMethod( method );
int sc = method.getStatusCode();
String st = method.getStatusText();
switch( sc ) {
@@ -1067,6 +1083,103 @@
method.releaseConnection();
}
}
+
+ protected class RetryHandler {
+ private int retryMax = 5;
+ private long retryTimeout = 5000;
+ private long retrySleep = 500;
+ private InputStream content;
+ private String contentAsStr;
+
+ private int tries = 0;
+ private int rc = -1;
+ private long start = System.currentTimeMillis();
+
+ public RetryHandler(InputStream content) {
+ this.content = content;
+ init();
+ }
+
+ public RetryHandler(String content) {
+ this.contentAsStr = content;
+ init();
+ }
+
+ private void init() {
+ try { this.retryMax = Integer.parseInt( (String)providerImpl.initParameter("retryMax") ); }
+ catch (NumberFormatException e) {}
+ try { this.retryTimeout = Integer.parseInt( (String)providerImpl.initParameter("retryTimeout") ); }
+ catch (NumberFormatException e) {}
+ try { this.retrySleep = Integer.parseInt( (String)providerImpl.initParameter("retrySleep") ); }
+ catch (NumberFormatException e) {}
+ }
+
+ public boolean canRetry() {
+ return (System.currentTimeMillis() - start) < retryTimeout &&
+ tries < retryMax &&
+ (rc == -1 || rc == HttpStatus.SC_CONFLICT);
+ }
+
+ public HttpMethod executeMethod(HttpMethod method) throws IOException, HttpException {
+ while (canRetry()) {
+ if (rc > 0) {
+ try {
+ Thread.currentThread().sleep(retrySleep);
+ } catch (InterruptedException e) {}
+
+ // recycle method
+ Header[] headers = method.getRequestHeaders();
+ String resourcePath = method.getPath();
+ Class mclass = method.getClass();
+ Constructor mc = null;
+ HttpMethod newMethod = null;
+ try {
+ mc = mclass.getConstructor(new Class[]{String.class});
+ newMethod = (HttpMethod)mc.newInstance(new Object[]{resourcePath});
+ for (int i = 0; i < headers.length; i++) {
+ newMethod.setRequestHeader(headers[i]);
+ }
+ if (newMethod instanceof EntityEnclosingMethod) {
+ if (content != null) {
+ content.reset();
+ ((EntityEnclosingMethod)newMethod).setRequestBody(content);
+ }
+ else if (contentAsStr != null) {
+ ((EntityEnclosingMethod)newMethod).setRequestBody(contentAsStr);
+ }
+ }
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ //System.out.println("["+Thread.currentThread().getName()+"] RETRY FAILED tries="+tries+", max tries="+maxtries+", elapsed="+(System.currentTimeMillis() - start)+", timeout="+timeout);
+ return method;
+ }
+ method.releaseConnection();
+ method = newMethod;
+ }
+ rc = client().executeMethod(method);
+ //System.out.println("["+Thread.currentThread().getName()+"] rc="+rc);
+ tries++;
+ }
+ if (tries > 1) {
+ if (rc != HttpStatus.SC_CONFLICT) {
+ //System.out.println("["+Thread.currentThread().getName()+"] RETRY SUCCESSFUL tries="+tries+", max tries="+retryMax+", elapsed="+(System.currentTimeMillis() - start)+", timeout="+retryTimeout);
+ }
+ else {
+ System.out.println("["+Thread.currentThread().getName()+"] RETRY FAILED tries="+tries+", max tries="+retryMax+", elapsed="+(System.currentTimeMillis() - start)+", timeout="+retryTimeout);
+ }
+ }
+ else {
+ if (rc != HttpStatus.SC_CONFLICT) {
+ //System.out.println("["+Thread.currentThread().getName()+"] FIRST TRY OK");
+ }
+ else {
+ System.out.println("["+Thread.currentThread().getName()+"] FIRST TRY FAILED tries="+tries+", max tries="+retryMax+", elapsed="+(System.currentTimeMillis() - start)+", timeout="+retryTimeout);
+ }
+ }
+ return method;
+ }
+ }
}
1.15 +43 -51 jakarta-slide/proposals/wvcm/src/org/apache/wvcm/store/webdav/WebdavAccessor.java
Index: WebdavAccessor.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/wvcm/src/org/apache/wvcm/store/webdav/WebdavAccessor.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- WebdavAccessor.java 30 Jul 2004 06:52:28 -0000 1.14
+++ WebdavAccessor.java 4 Mar 2005 18:14:31 -0000 1.15
@@ -62,13 +62,10 @@
*/
package org.apache.wvcm.store.webdav;
+import java.util.*;
+import org.apache.commons.httpclient.*;
+
import java.io.IOException;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Map;
import javax.wvcm.PropertyNameList;
import javax.wvcm.PropertyNameList.PropertyName;
import javax.wvcm.Provider;
@@ -76,12 +73,6 @@
import javax.wvcm.ProviderFactory.Callback.Authentication;
import javax.wvcm.WvcmException;
import javax.wvcm.WvcmException.ReasonCode;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpException;
-import org.apache.commons.httpclient.HttpMethod;
-import org.apache.commons.httpclient.HttpState;
-import org.apache.commons.httpclient.HttpStatus;
-import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.webdav.methods.OptionsMethod;
import org.apache.wvcm.ProviderImpl;
import org.apache.wvcm.store.Accessor;
@@ -96,30 +87,31 @@
* @version $Revision$
*/
public class WebdavAccessor implements Accessor {
-
+
+ // provider -> HttpClientWrapper
private static Map httpclients = Collections.synchronizedMap( new HashMap() );
-
+
protected ProviderImpl providerImpl;
-
+
private String hostname = null;
private int port = 0;
private String defaultContext = null;
private Hashtable headers = null;
-
+
// caches
private String defaultContextPath = null;
-
+
static {
// do preemptive authentication
System.setProperty( "httpclient.authentication.preemptive", "true" );
}
-
+
/**
* Dummy constructor
*/
public WebdavAccessor() {
}
-
+
/**
* Constructor.
*/
@@ -136,7 +128,7 @@
}
initialize( hostname, port );
}
-
+
/**
* Return a list of {@link Folder} objects that identify folders
* on the server that contain workspaces for the Provider of this accessor.
@@ -147,14 +139,14 @@
public List serverWorkspaceFolderList(PropertyNameList wantedPropertyList) throws WvcmException {
PropertyName[] wsfollist = {PropertyName.WORKSPACE_FOLDER_LIST};
OptionsRequest req = new OptionsRequest( new PropertyNameList(wsfollist) );
-
+
// TODO: prio=h, effort=0.5, descr=(switch to live property workspace-collection-set when implemeneted in server)
-
+
String resourcepath = defaultContextPath();
OptionsMethod method = new OptionsMethod( resourcepath );
method.setRequestBody( req.reqBodyAsString() );
method.addRequestHeader( "Content-Type", "text/xml; charset=\"utf-8\"" );
-
+
try {
client().executeMethod( method );
int sc = method.getStatusCode();
@@ -176,20 +168,20 @@
throw new WvcmException(
"Read failed", resourcepath, ReasonCode.READ_FAILED, new Exception[]{e});
}
-
+
}
-
+
// -------------------------------------------------------------------------
// Non-interface methods
// -------------------------------------------------------------------------
-
+
protected void initialize( String hostname, int port ) throws IllegalStateException {
this.hostname = hostname;
this.port = port;
this.defaultContext = (String)providerImpl.initParameter( "context" );
this.headers = (Hashtable)providerImpl.initParameter( "headers" );
}
-
+
/**
* Get the HttpClient of this accessor.
*
@@ -198,7 +190,7 @@
protected HttpClientWrapper client() {
return getHttpClient( providerImpl, hostname, port );
}
-
+
/**
* HttpClient factory.
*/
@@ -206,7 +198,7 @@
Host host = new Host( hostname, port );
HttpClientWrapper result = (HttpClientWrapper)httpclients.get( host );
HttpClient httpclient = null;
-
+
if( result == null ) {
httpclient = new HttpClient();
httpclient.getHostConfiguration().setHost( hostname, port, "http" );
@@ -216,11 +208,11 @@
else {
httpclient = result.getClient();
}
-
+
getAuthentication( hostname, result );
return result;
}
-
+
private void getAuthentication(String hostname, HttpClientWrapper httpclientWrapper) {
String username = null;
String password = null;
@@ -231,7 +223,7 @@
Authentication authentication = cb.getAuthentication(realm, new Integer(0));
username = authentication.loginName();
password = authentication.password();
-
+
if( authenticationChanged(hostname, realm, username, password, httpclientWrapper.getClient()) ) {
HttpState state = new HttpState();
state.setCredentials(
@@ -240,7 +232,7 @@
}
}
}
-
+
private boolean authenticationChanged( String hostname, String realm, String username, String password, HttpClient httpclient ) {
boolean sameUsername = false;
boolean samePassword = false;
@@ -248,20 +240,20 @@
UsernamePasswordCredentials currentCredentials = (currentState != null ? (UsernamePasswordCredentials)currentState.getCredentials(realm, hostname) : null);
String currentUsername = (currentCredentials != null ? currentCredentials.getUserName() : null);
String currentPassword = (currentCredentials != null ? currentCredentials.getPassword() : null);
-
+
if( username == null )
sameUsername = (currentUsername == null);
else
sameUsername = username.equals( currentUsername );
-
+
if( password == null )
samePassword = (currentPassword == null);
else
samePassword = password.equals( currentPassword );
-
+
return !(sameUsername && samePassword);
}
-
+
/**
* Get context path
*
@@ -276,7 +268,7 @@
}
return defaultContextPath;
}
-
+
/**
* Host class
*/
@@ -284,21 +276,21 @@
String host;
int port;
String thread;
-
+
Host( String host, int port ) {
this.host = host;
this.port = port;
this.thread = Thread.currentThread().getName();
}
-
+
public int hashCode() {
return port;
}
-
+
public boolean equals( Object o ) {
if( !(o instanceof Host) )
return false;
-
+
Host a = (Host)o;
if( host != null && !host.equals(a.host) || host == null && a.host != null )
return false;
@@ -309,15 +301,15 @@
return true;
}
}
-
+
/**
* Wrapper for HttpClient
*/
protected static class HttpClientWrapper {
-
+
private HttpClient client;
private Provider provider;
-
+
/**
* Constructor
*
@@ -327,7 +319,7 @@
this.client = client;
this.provider = provider;
}
-
+
public int executeMethod(HttpMethod method) throws IOException, HttpException {
ProviderImpl p = (ProviderImpl)provider;
method.addRequestHeader("User-Agent", "wvcm");
@@ -342,7 +334,7 @@
}
return client.executeMethod(method);
}
-
+
public HttpClient getClient() {
return client;
}
1.16 +5 -5 jakarta-slide/proposals/wvcm/src/org/apache/wvcm/store/webdav/WorkspaceWebdavAccessor.java
Index: WorkspaceWebdavAccessor.java
===================================================================
RCS file: /home/cvs/jakarta-slide/proposals/wvcm/src/org/apache/wvcm/store/webdav/WorkspaceWebdavAccessor.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- WorkspaceWebdavAccessor.java 30 Jul 2004 06:52:28 -0000 1.15
+++ WorkspaceWebdavAccessor.java 4 Mar 2005 18:14:31 -0000 1.16
@@ -105,7 +105,7 @@
method.addRequestHeader( "Content-Length", "0" );
try {
- client().executeMethod( method );
+ method = (MkworkspaceMethod)retryHandler().executeMethod( method );
int sc = method.getStatusCode();
String st = method.getStatusText();
switch( sc ) {
---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org