blob: 4a08b8c140825d7b000a36306169902454f34a51 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 IBM, and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
******************************************************************************/
package org.eclipse.ecf.internal.provider.filetransfer.httpclient;
import java.util.Map;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpConnectionManager;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.params.HttpConnectionManagerParams;
import org.eclipse.ecf.core.util.Trace;
import org.eclipse.ecf.filetransfer.IRetrieveFileTransferOptions;
import org.eclipse.ecf.provider.filetransfer.httpclient.HttpClientOptions;
public class ConnectionManagerHelper {
public static final int DEFAULT_CONNECTION_TIMEOUT = HttpClientOptions.RETRIEVE_DEFAULT_CONNECTION_TIMEOUT;
public static final int DEFAULT_READ_TIMEOUT = HttpClientOptions.RETRIEVE_DEFAULT_READ_TIMEOUT;
private MultiThreadedHttpConnectionManager connectionManager;
public ConnectionManagerHelper() {
}
private static int getIntegerProperty(String prop, int intDefault) {
int retVal = intDefault;
String systemProp = System.getProperty(prop);
if (systemProp != null) {
try {
retVal = Integer.parseInt(systemProp);
} catch (NumberFormatException e) {
Trace.trace(Activator.PLUGIN_ID, "Bad value for property '" + prop + "' : " + e + ". Using default value " + intDefault + "."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
}
}
return retVal;
}
private static long getLongProperty(String prop, long longDefault) {
long retVal = longDefault;
String systemProp = System.getProperty(prop);
if (systemProp != null) {
try {
retVal = Long.parseLong(systemProp);
} catch (NumberFormatException e) {
Trace.trace(Activator.PLUGIN_ID, "Bad value for property '" + prop + "' : " + e + ". Using default value " + longDefault + "."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
}
}
return retVal;
}
private static boolean shouldReuseConnectionsOption() {
boolean retVal = ConnectionOptions.REUSE_CONNECTIONS_DEFAULT;
String systemProp = System.getProperty(ConnectionOptions.PROP_REUSE_CONNECTIONS);
if (systemProp != null) {
retVal = Boolean.valueOf(systemProp).booleanValue();
}
return retVal;
}
public static int getConnectTimeout(final Map options) {
int result = DEFAULT_CONNECTION_TIMEOUT;
Map localOptions = options;
if (localOptions != null) {
// See if the connect timeout option is present, if so set
Object o = localOptions.get(IRetrieveFileTransferOptions.CONNECT_TIMEOUT);
if (o != null) {
if (o instanceof Integer) {
result = ((Integer) o).intValue();
} else if (o instanceof String) {
result = new Integer(((String) o)).intValue();
}
return result;
}
o = localOptions.get("org.eclipse.ecf.provider.filetransfer.httpclient.retrieve.connectTimeout"); //$NON-NLS-1$
if (o != null) {
if (o instanceof Integer) {
result = ((Integer) o).intValue();
} else if (o instanceof String) {
result = new Integer(((String) o)).intValue();
}
}
}
return result;
}
public static int getSocketReadTimeout(Map options) {
int result = DEFAULT_READ_TIMEOUT;
Map localOptions = options;
if (localOptions != null) {
// See if the connect timeout option is present, if so set
Object o = localOptions.get(IRetrieveFileTransferOptions.READ_TIMEOUT);
if (o != null) {
if (o instanceof Integer) {
result = ((Integer) o).intValue();
} else if (o instanceof String) {
result = new Integer(((String) o)).intValue();
}
return result;
}
o = localOptions.get("org.eclipse.ecf.provider.filetransfer.httpclient.retrieve.readTimeout"); //$NON-NLS-1$
if (o != null) {
if (o instanceof Integer) {
result = ((Integer) o).intValue();
} else if (o instanceof String) {
result = new Integer(((String) o)).intValue();
}
}
}
return result;
}
public synchronized void initConnectionManager(HttpClient httpClient, Map options) {
if (!shouldReuseConnectionsOption()) {
Trace.trace(Activator.PLUGIN_ID, "Connections are not reused. To reuse connections set system property '" + ConnectionOptions.PROP_REUSE_CONNECTIONS + "' to true."); //$NON-NLS-1$ //$NON-NLS-2$
initParameters(httpClient, new MultiThreadedHttpConnectionManager(), false, options);
return;
}
if (connectionManager == null) {
connectionManager = new MultiThreadedHttpConnectionManager();
Trace.trace(Activator.PLUGIN_ID, "Created shared connection manager."); //$NON-NLS-1$
} else {
Trace.trace(Activator.PLUGIN_ID, "Reusing shared connection manager."); //$NON-NLS-1$
}
initParameters(httpClient, connectionManager, true, options);
}
private static void initParameters(HttpClient httpClient, HttpConnectionManager cm, boolean cmIsShared, Map options) {
if (cmIsShared) {
long closeIdlePeriod = getLongProperty(ConnectionOptions.PROP_POOL_CLOSE_IDLE_PERIOD, ConnectionOptions.POOL_CLOSE_IDLE_PERIOD_DEFAULT);
if (closeIdlePeriod > 0) {
Trace.trace(Activator.PLUGIN_ID, "Closing connections which were idle at least " + closeIdlePeriod + " milliseconds."); //$NON-NLS-1$ //$NON-NLS-2$
cm.closeIdleConnections(closeIdlePeriod);
}
}
// HttpClient parameters can be traced independently
httpClient.setHttpConnectionManager(cm);
int readTimeout = getSocketReadTimeout(options);
cm.getParams().setSoTimeout(readTimeout);
int connectTimeout = getConnectTimeout(options);
cm.getParams().setConnectionTimeout(connectTimeout);
if (cmIsShared) {
HttpConnectionManagerParams cmParams = cm.getParams();
int maxHostConnections = getIntegerProperty(ConnectionOptions.PROP_MAX_CONNECTIONS_PER_HOST, ConnectionOptions.MAX_CONNECTIONS_PER_HOST_DEFAULT);
int maxTotalConnections = getIntegerProperty(ConnectionOptions.PROP_MAX_TOTAL_CONNECTIONS, ConnectionOptions.MAX_TOTAL_CONNECTIONS_DEFAULT);
cmParams.setDefaultMaxConnectionsPerHost(maxHostConnections);
cmParams.setMaxTotalConnections(maxTotalConnections);
long connectionManagerTimeout = getLongProperty(ConnectionOptions.PROP_POOL_CONNECTION_TIMEOUT, ConnectionOptions.POOL_CONNECTION_TIMEOUT_DEFAULT);
httpClient.getParams().setConnectionManagerTimeout(connectionManagerTimeout);
}
}
public synchronized void shutdown() {
if (connectionManager != null) {
connectionManager.shutdown();
connectionManager = null;
}
}
}