package by.istin.android.xcore.source.impl.http;
import android.net.http.AndroidHttpClient;
import org.apache.http.client.HttpClient;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;
import java.util.Set;
import by.istin.android.xcore.utils.IOUtils;
/**
* Created by Uladzimir_Klyshevich on 6/2/2014.
*/
public class InputStreamHttpClientHelper {
private String mUserAgent;
private Object mLock = new Object();
private Set<InputStream> mStreams = new HashSet<InputStream>();
private boolean isAndroidHttpClient = false;
public InputStreamHttpClientHelper(String userAgent) {
this.mUserAgent = userAgent;
}
/* Apache client. */
private HttpClient mClient;
public HttpClient getClient() {
synchronized (mLock) {
if (mClient == null) {
mClient = createHttpClient();
}
if (mClient instanceof AndroidHttpClient) {
isAndroidHttpClient = true;
}
return mClient;
}
}
public HttpClient createHttpClient() {
return AndroidHttpClient.newInstance(mUserAgent);
}
public InputStream getInputStream(InputStream pInputStream, HttpClient client) {
if (!isAndroidHttpClient) {
return pInputStream;
}
synchronized (mLock) {
InputStreamWrapper inputStreamWrapper = new InputStreamWrapper(pInputStream);
mStreams.add(inputStreamWrapper);
return inputStreamWrapper;
}
}
private class InputStreamWrapper extends InputStream {
private final InputStream mInputStream;
private InputStreamWrapper(InputStream mInputStream) {
this.mInputStream = mInputStream;
}
@Override
public int read() throws IOException {
return mInputStream.read();
}
@Override
public int available() throws IOException {
return mInputStream.available();
}
@Override
public void close() throws IOException {
synchronized (mLock) {
try {
mInputStream.close();
super.close();
} finally {
mStreams.remove(this);
if (mStreams.isEmpty()) {
((AndroidHttpClient) mClient).close();
mClient = null;
}
}
}
}
@Override
public void mark(int readlimit) {
mInputStream.mark(readlimit);
}
@Override
public boolean markSupported() {
return mInputStream.markSupported();
}
@Override
public int read(byte[] buffer) throws IOException {
return mInputStream.read(buffer);
}
@Override
public int read(byte[] buffer, int byteOffset, int byteCount) throws IOException {
return mInputStream.read(buffer, byteOffset, byteCount);
}
@Override
public synchronized void reset() throws IOException {
mInputStream.reset();
}
@Override
public long skip(long byteCount) throws IOException {
return mInputStream.skip(byteCount);
}
@Override
public boolean equals(Object o) {
return mInputStream.equals(o);
}
@Override
public int hashCode() {
return mInputStream.hashCode();
}
@Override
public String toString() {
return mInputStream.toString();
}
}
}