/**
* 2012 Foxykeep (http://datadroid.foxykeep.com)
* <p>
* Licensed under the Beerware License : <br />
* As long as you retain this notice you can do whatever you want with this stuff. If we meet some
* day, and you think this stuff is worth it, you can buy me a beer in return
*/
package com.foxykeep.datadroid.network;
import com.foxykeep.datadroid.exception.ConnectionException;
import com.foxykeep.datadroid.internal.network.NetworkConnectionImpl;
import com.foxykeep.datadroid.util.DataDroidLog;
import android.content.Context;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.message.BasicNameValuePair;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* This class gives the user an API to easily call a webservice and return the received response.
*
* @author Foxykeep
*/
public final class NetworkConnection {
private static final String LOG_TAG = NetworkConnection.class.getSimpleName();
public static enum Method {
GET, POST, PUT, DELETE
}
/**
* The result of a webservice call.
* <p>
* Contains the headers and the body of the response as an unparsed <code>String</code>.
*
* @author Foxykeep
*/
public static final class ConnectionResult {
public final Map<String, List<String>> headerMap;
public final String body;
public ConnectionResult(Map<String, List<String>> headerMap, String body) {
this.headerMap = headerMap;
this.body = body;
}
}
private final Context mContext;
private final String mUrl;
private Method mMethod = Method.GET;
private ArrayList<BasicNameValuePair> mParameterList = null;
private HashMap<String, String> mHeaderMap = null;
private boolean mIsGzipEnabled = true;
private String mUserAgent = null;
private String mPostText = null;
private UsernamePasswordCredentials mCredentials = null;
private boolean mIsSslValidationEnabled = true;
/**
* Create a {@link NetworkConnection}.
* <p>
* The Method to use is {@link Method#GET} by default.
*
* @param context The context used by the {@link NetworkConnection}. Used to create the
* User-Agent.
* @param url The URL to call.
*/
public NetworkConnection(Context context, String url) {
if (url == null) {
DataDroidLog.e(LOG_TAG, "NetworkConnection.NetworkConnection - request URL cannot be null.");
throw new NullPointerException("Request URL has not been set.");
}
mContext = context;
mUrl = url;
}
/**
* Set the method to use. Default is {@link Method#GET}.
* <p>
* If set to another value than {@link Method#POST}, the POSTDATA text will be reset as it can
* only be used with a POST request.
*
* @param method The method to use.
* @return The networkConnection.
*/
public NetworkConnection setMethod(Method method) {
mMethod = method;
if (method != Method.POST) {
mPostText = null;
}
return this;
}
/**
* Set the parameters to add to the request. This is meant to be a "key" => "value" Map.
* <p>
* The POSTDATA text will be reset as they cannot be used at the same time.
*
* @see #setPostText(String)
* @see #setParameters(ArrayList)
* @param parameterMap The parameters to add to the request.
* @return The networkConnection.
*/
public NetworkConnection setParameters(HashMap<String, String> parameterMap) {
ArrayList<BasicNameValuePair> parameterList = new ArrayList<BasicNameValuePair>();
for (Map.Entry<String, String> entry : parameterMap.entrySet()) {
parameterList.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
}
return setParameters(parameterList);
}
/**
* Set the parameters to add to the request. This is meant to be a "key" => "value" Map.
* <p>
* The POSTDATA text will be reset as they cannot be used at the same time.
* <p>
* This method allows you to have multiple values for a single key in contrary to the HashMap
* version of the method ({@link #setParameters(HashMap)})
*
* @see #setPostText(String)
* @see #setParameters(HashMap)
* @param parameterList The parameters to add to the request.
* @return The networkConnection.
*/
public NetworkConnection setParameters(ArrayList<BasicNameValuePair> parameterList) {
mParameterList = parameterList;
mPostText = null;
return this;
}
/**
* Set the headers to add to the request.
*
* @param headerMap The headers to add to the request.
* @return The networkConnection.
*/
public NetworkConnection setHeaderList(HashMap<String, String> headerMap) {
mHeaderMap = headerMap;
return this;
}
/**
* Set whether the request will use gzip compression if available on the server. Default is
* true.
*
* @param isGzipEnabled Whether the request will user gzip compression if available on the
* server.
* @return The networkConnection.
*/
public NetworkConnection setGzipEnabled(boolean isGzipEnabled) {
mIsGzipEnabled = isGzipEnabled;
return this;
}
/**
* Set the user agent to set in the request. Otherwise a default Android one will be used.
*
* @param userAgent The user agent.
* @return The networkConnection.
*/
public NetworkConnection setUserAgent(String userAgent) {
mUserAgent = userAgent;
return this;
}
/**
* Set the POSTDATA text that will be added in the request. Also automatically set the
* {@link Method} to {@link Method#POST} to be able to use it.
* <p>
* The parameters will be reset as they cannot be used at the same time.
*
* @see #setParameters(HashMap)
* @param postText The POSTDATA text that will be added in the request.
* @return The networkConnection.
*/
public NetworkConnection setPostText(String postText) {
mPostText = postText;
mMethod = Method.POST;
mParameterList = null;
return this;
}
/**
* Set the credentials to use for authentication.
*
* @param credentials The credentials to use for authentication.
* @return The networkConnection.
*/
public NetworkConnection setCredentials(UsernamePasswordCredentials credentials) {
mCredentials = credentials;
return this;
}
/**
* Set whether the SSL certificates validation are enabled. Default is true.
*
* @param enabled Whether the SSL certificates validation are enabled.
* @return The networkConnection.
*/
public NetworkConnection setSslValidationEnabled(boolean enabled) {
mIsSslValidationEnabled = enabled;
return this;
}
/**
* Execute the webservice call and return the {@link ConnectionResult}.
*
* @return The result of the webservice call.
*/
public ConnectionResult execute() throws ConnectionException {
return NetworkConnectionImpl.execute(mContext, mUrl, mMethod, mParameterList,
mHeaderMap, mIsGzipEnabled, mUserAgent, mPostText, mCredentials,
mIsSslValidationEnabled);
}
}