Index: jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/Spi2davRepositoryServiceFactory.java =================================================================== --- jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/Spi2davRepositoryServiceFactory.java (revision 1179240) +++ jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/Spi2davRepositoryServiceFactory.java (working copy) @@ -20,6 +20,9 @@ import javax.jcr.RepositoryException; +import org.apache.commons.httpclient.HttpConnectionManager; +import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; +import org.apache.commons.httpclient.params.HttpConnectionManagerParams; import org.apache.jackrabbit.spi.IdFactory; import org.apache.jackrabbit.spi.ItemInfoCache; import org.apache.jackrabbit.spi.NameFactory; @@ -84,6 +87,18 @@ */ public static final String PARAM_MAX_CONNECTIONS = "org.apache.jackrabbit.spi2dav.MaxConnections"; + /** + * Optional configuration parameter. It's value defines the + * connectionTimeout value on the HttpClient configuration and must be an int greater than zero. + */ + public static final String PARAM_CONNECTION_TIMEOUT = "org.apache.jackrabbit.spi2dav.ConnectionTimeout"; + + /** + * Optional configuration parameter. It's value defines the + * soTimeOut value on the HttpClient configuration and must be an int greater than zero. + */ + public static final String PARAM_SO_TIMEOUT = "org.apache.jackrabbit.spi2dav.SoTimeOut"; + public RepositoryService createRepositoryService(Map parameters) throws RepositoryException { if (parameters == null) { throw new RepositoryException("Parameter " + PARAM_REPOSITORY_URI + " missing"); @@ -140,7 +155,7 @@ } // max connections config - int maximumHttpConnections = 0; + int maximumHttpConnections = RepositoryServiceImpl.MAX_CONNECTIONS_DEFAULT; param = parameters.get(PARAM_MAX_CONNECTIONS); if (param != null) { try { @@ -149,11 +164,31 @@ // using default } } - - if (maximumHttpConnections > 0) { - return new RepositoryServiceImpl(uri, idFactory, nameFactory, pathFactory, vFactory, itemInfoCacheSize, maximumHttpConnections); - } else { - return new RepositoryServiceImpl(uri, idFactory, nameFactory, pathFactory, vFactory, itemInfoCacheSize); + + // connection timeout + int connectionTimeOut = RepositoryServiceImpl.CONNECTION_TIMEOUT_DEFAULT; + param = parameters.get(PARAM_CONNECTION_TIMEOUT); + if (param != null) { + try { + connectionTimeOut = Integer.parseInt(param.toString()); + } catch ( NumberFormatException e ) { + // using default + } } + + // socket timeout + int soTimeout = RepositoryServiceImpl.SOCKET_TIMEOUT_DEFAULT; + param = parameters.get(PARAM_SO_TIMEOUT); + if (param != null) { + try { + soTimeout = Integer.parseInt(param.toString()); + } catch ( NumberFormatException e ) { + // using default + } + } + + return new RepositoryServiceImpl(uri, idFactory, nameFactory, pathFactory, vFactory, itemInfoCacheSize, + maximumHttpConnections, connectionTimeOut, soTimeout); + } } Index: jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java =================================================================== --- jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java (revision 1188038) +++ jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java (working copy) @@ -223,6 +223,16 @@ */ public static final int MAX_CONNECTIONS_DEFAULT = 20; + /** + * Default value for the connection timeout (5s) + */ + public static final int CONNECTION_TIMEOUT_DEFAULT = 5000; + + /** + * Default value for the socket timeout (60 seconds) + */ + public static final int SOCKET_TIMEOUT_DEFAULT = 60000; + private final IdFactory idFactory; private final NameFactory nameFactory; private final PathFactory pathFactory; @@ -279,7 +289,7 @@ public RepositoryServiceImpl(String uri, IdFactory idFactory, NameFactory nameFactory, PathFactory pathFactory, QValueFactory qValueFactory, int itemInfoCacheSize) throws RepositoryException { - this(uri, idFactory, nameFactory, pathFactory, qValueFactory, itemInfoCacheSize, MAX_CONNECTIONS_DEFAULT); + this(uri, idFactory, nameFactory, pathFactory, qValueFactory, itemInfoCacheSize, MAX_CONNECTIONS_DEFAULT, CONNECTION_TIMEOUT_DEFAULT, SOCKET_TIMEOUT_DEFAULT); } /** @@ -299,7 +309,7 @@ public RepositoryServiceImpl(String uri, IdFactory idFactory, NameFactory nameFactory, PathFactory pathFactory, QValueFactory qValueFactory, int itemInfoCacheSize, - int maximumHttpConnections ) throws RepositoryException { + int maximumHttpConnections, int connectionTimeOut, int soTimeout) throws RepositoryException { if (uri == null || "".equals(uri)) { throw new RepositoryException("Invalid repository uri '" + uri + "'."); } @@ -334,6 +344,12 @@ HttpConnectionManagerParams connectionParams = connectionManager.getParams(); connectionParams.setDefaultMaxConnectionsPerHost(maximumHttpConnections); } + if (connectionTimeOut > 0) { + connectionManager.getParams().setConnectionTimeout(connectionTimeOut); + } + if (soTimeout > 0) { + connectionManager.getParams().setSoTimeout(soTimeout); + } // This configuration of the clients cache assumes that the level of // concurrency on this map will be equal to the default number of maximum