package org.archive.util.binsearch.impl.http;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.params.HttpClientParams;
import org.archive.util.binsearch.impl.HTTPSeekableLineReader;
import org.archive.util.binsearch.impl.HTTPSeekableLineReaderFactory;
public class ApacheHttp31SLRFactory extends HTTPSeekableLineReaderFactory {
private final static Logger LOGGER = Logger.getLogger(ApacheHttp31SLRFactory.class.getName());
private MultiThreadedHttpConnectionManager connectionManager = null;
private HostConfiguration hostConfiguration = null;
private HttpClient http = null;
public ApacheHttp31SLRFactory(String uriString) {
this();
}
public ApacheHttp31SLRFactory() {
connectionManager = new MultiThreadedHttpConnectionManager();
hostConfiguration = new HostConfiguration();
HttpClientParams params = new HttpClientParams();
// params.setParameter(HttpClientParams.RETRY_HANDLER, new NoRetryHandler());
http = new HttpClient(params,connectionManager);
http.setHostConfiguration(hostConfiguration);
}
public void close() throws IOException
{
connectionManager.deleteClosedConnections();
}
@Override
public HTTPSeekableLineReader get(String url) throws IOException {
if (LOGGER.isLoggable(Level.FINEST)) {
LOGGER.finest("Connections: " + connectionManager.getConnectionsInPool(hostConfiguration));
}
return new ApacheHttp31SLR(http, url);
}
/* (non-Javadoc)
* @see org.archive.util.binsearch.impl.HTTPSeekableLineReaderFactory#setProxyHostPort(java.lang.String)
*/
@Override
public void setProxyHostPort(String hostPort) {
int colonIdx = hostPort.indexOf(':');
if(colonIdx > 0) {
String host = hostPort.substring(0,colonIdx);
int port = Integer.valueOf(hostPort.substring(colonIdx+1));
// http.getHostConfiguration().setProxy(host, port);
hostConfiguration.setProxy(host, port);
}
}
/* (non-Javadoc)
* @see org.archive.util.binsearch.impl.HTTPSeekableLineReaderFactory#setMaxTotalConnections(int)
*/
@Override
public void setMaxTotalConnections(int maxTotalConnections) {
connectionManager.getParams().
setMaxTotalConnections(maxTotalConnections);
}
/* (non-Javadoc)
* @see org.archive.util.binsearch.impl.HTTPSeekableLineReaderFactory#getMaxTotalConnections()
*/
@Override
public int getMaxTotalConnections() {
return connectionManager.getParams().getMaxTotalConnections();
}
/* (non-Javadoc)
* @see org.archive.util.binsearch.impl.HTTPSeekableLineReaderFactory#setMaxHostConnections(int)
*/
@Override
public void setMaxHostConnections(int maxHostConnections) {
connectionManager.getParams().setDefaultMaxConnectionsPerHost(maxHostConnections);
connectionManager.getParams().setMaxConnectionsPerHost(hostConfiguration, maxHostConnections);
}
/* (non-Javadoc)
* @see org.archive.util.binsearch.impl.HTTPSeekableLineReaderFactory#getMaxHostConnections()
*/
@Override
public int getMaxHostConnections() {
return connectionManager.getParams().
getMaxConnectionsPerHost(hostConfiguration);
}
/* (non-Javadoc)
* @see org.archive.util.binsearch.impl.HTTPSeekableLineReaderFactory#getConnectionTimeoutMS()
*/
@Override
public int getConnectionTimeoutMS() {
return connectionManager.getParams().getConnectionTimeout();
}
/* (non-Javadoc)
* @see org.archive.util.binsearch.impl.HTTPSeekableLineReaderFactory#setConnectionTimeoutMS(int)
*/
@Override
public void setConnectionTimeoutMS(int connectionTimeoutMS) {
connectionManager.getParams().setConnectionTimeout(connectionTimeoutMS);
http.getParams().setConnectionManagerTimeout(connectionTimeoutMS);
}
/* (non-Javadoc)
* @see org.archive.util.binsearch.impl.HTTPSeekableLineReaderFactory#getSocketTimeoutMS()
*/
@Override
public int getSocketTimeoutMS() {
return connectionManager.getParams().getSoTimeout();
}
/* (non-Javadoc)
* @see org.archive.util.binsearch.impl.HTTPSeekableLineReaderFactory#setSocketTimeoutMS(int)
*/
@Override
public void setSocketTimeoutMS(int socketTimeoutMS) {
connectionManager.getParams().setSoTimeout(socketTimeoutMS);
}
/* (non-Javadoc)
* @see org.archive.util.binsearch.impl.HTTPSeekableLineReaderFactory#setStaleChecking(boolean)
*/
@Override
public void setStaleChecking(boolean enabled)
{
connectionManager.getParams().setStaleCheckingEnabled(enabled);
}
/* (non-Javadoc)
* @see org.archive.util.binsearch.impl.HTTPSeekableLineReaderFactory#isStaleChecking()
*/
@Override
public boolean isStaleChecking()
{
return connectionManager.getParams().isStaleCheckingEnabled();
}
// Experimental
/* (non-Javadoc)
* @see org.archive.util.binsearch.impl.HTTPSeekableLineReaderFactory#getModTime()
*/
@Override
public long getModTime()
{
HTTPSeekableLineReader reader = null;
SimpleDateFormat lastModFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz");
try {
reader = get();
String result = reader.getHeaderValue(HTTPSeekableLineReader.LAST_MODIFIED);
Date date = lastModFormat.parse(result);
return date.getTime();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
}
}
}
return 0;
}
}