/*
* The MIT License (MIT)
*
* Copyright � 2013 Clover Studio Ltd. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package com.cloverstudio.spikademo.couchdb;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.ByteArrayBuffer;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.graphics.Bitmap;
import com.cloverstudio.spikademo.SpikaApp;
import com.cloverstudio.spikademo.management.BitmapManagement;
import com.cloverstudio.spikademo.management.FileManagement;
import com.cloverstudio.spikademo.utils.Const;
import com.cloverstudio.spikademo.utils.Logger;
/**
* ConnectionHandler
*
* Handles basic HTTP connections with server.
*/
public class ConnectionHandler {
private static String TAG = "ConnectionHandler";
public ConnectionHandler() {
}
/**
* Http GET
*
* @param url
* @return
*/
public static JSONObject getJsonObject(String url, String userId) {
JSONObject retVal = null;
try {
InputStream is = httpGetRequest(url, userId);
String result = getString(is);
is.close();
retVal = jObjectFromString(result);
} catch (Exception e) {
Logger.error(TAG + "getJsonObject", e);
return null;
}
return retVal;
}
/**
* Http GET
*
* @param url
* @return
*/
public static String getString(String url, String userId) {
String result = null;
try {
InputStream is = httpGetRequest(url, userId);
result = getString(is);
is.close();
} catch (Exception e) {
Logger.error(TAG + "getJsonObject", e);
return null;
}
return result;
}
/**
* Http GET
*
* @param url
* @return
*/
public static JSONArray getJsonArray(String url, String userId,
String token) {
JSONArray retVal = null;
try {
InputStream is = httpGetRequest(url, userId);
String result = getString(is);
is.close();
retVal = jArrayFromString(result);
} catch (Exception e) {
Logger.error(TAG + "getJsonObject", e);
return null;
}
return retVal;
}
/**
* Http POST
*
* @param create
* @return
*/
public static JSONObject postJsonObject(JSONObject create, String userId,
String token) {
JSONObject retVal = null;
try {
InputStream is = httpPostRequest(CouchDB.getUrl(), create, userId);
String result = getString(is);
is.close();
retVal = jObjectFromString(result);
} catch (Exception e) {
Logger.error(TAG + "postJsonObject", e);
return null;
}
return retVal;
}
/**
* Http Auth POST
*
* @param create
* @return
*/
public static JSONObject postAuth(JSONObject jPost) {
JSONObject retVal = null;
try {
InputStream is = httpPostRequest(CouchDB.getAuthUrl(), jPost, "");
String result = getString(is);
is.close();
retVal = jObjectFromString(result);
} catch (Exception e) {
Logger.error(TAG + "postAuth", e);
return null;
}
return retVal;
}
/**
* Http DELETE
*
* @param create
* @return
*/
public static JSONObject deleteJsonObject(String documentId,
String documentRev, String userId, String token) {
JSONObject retVal = null;
try {
InputStream is = httpDeleteRequest(CouchDB.getUrl() + documentId
+ "?rev=" + documentRev, userId);
String result = getString(is);
is.close();
retVal = jObjectFromString(result);
} catch (Exception e) {
Logger.error(TAG + "postJsonObject", e);
return null;
}
return retVal;
}
/**
* Http PUT
*
* @param create
* @param id
* @return
*/
public static JSONObject putJsonObject(JSONObject create, String id,
String userId, String token) {
JSONObject retVal = null;
try {
InputStream is = httpPutRequest(CouchDB.getUrl() + id, create,
userId);
String result = getString(is);
is.close();
retVal = jObjectFromString(result);
} catch (Exception e) {
e.printStackTrace();
Logger.error(TAG + "putJsonObject", e);
return null;
}
return retVal;
}
/**
* Get a Bitmap object from an URL
*
* @param url
* @return
*/
public static Bitmap getBitmapObject(String url, String userId, String token) {
Bitmap mBitmap = null;
try {
File file = null;
if (FileManagement.FileExists(url)) {
file = FileManagement.GetFile(url);
mBitmap = BitmapManagement.BitmapFromFile(file);
} else {
InputStream is = httpGetRequest(url, userId);
file = FileManagement.CreateFile(url, is);
is.close();
mBitmap = BitmapManagement.BitmapFromFile(file);
}
} catch (Exception e) {
Logger.error(TAG + "getBitmapObject", "Error retrieving picture: ",
e);
}
return mBitmap;
}
/**
* Get a File object from an URL
*
* @param url
* @param path
* @return
*/
public static void getFile(String url, File file, String userId,
String token) {
File mFile = file;
try {
//URL mUrl = new URL(url); // you can write here any link
InputStream is = httpGetRequest(url, userId);
BufferedInputStream bis = new BufferedInputStream(is);
ByteArrayBuffer baf = new ByteArrayBuffer(20000);
int current = 0;
while ((current = bis.read()) != -1) {
baf.append((byte) current);
}
/* Convert the Bytes read to a String. */
FileOutputStream fos = new FileOutputStream(mFile);
fos.write(baf.toByteArray());
fos.flush();
fos.close();
is.close();
} catch (Exception e) {
Logger.error(TAG + "getFile", "Error retrieving file: ", e);
}
}
/**
* Convert a string response to JSON object
*
* @param result
* @return
* @throws JSONException
*/
private static JSONObject jObjectFromString(String result)
throws JSONException {
return new JSONObject(result);
}
/**
* Convert a string response to JSON array
*
* @param result
* @return
* @throws JSONException
*/
private static JSONArray jArrayFromString(String result)
throws JSONException {
return new JSONArray(result);
}
/**
* Get a String from InputStream
*
* @param is
* @return
* @throws IOException
*/
private static String getString(InputStream is) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(is,
"UTF-8"), 8);
StringBuilder builder = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
builder.append(line + "\n");
}
is.close();
return builder.toString();
}
/**
* Forming a GET request
*
* @param url
* @return
* @throws ClientProtocolException
* @throws IOException
*/
public static InputStream httpGetRequest(String url, String userId) throws ClientProtocolException, IOException {
HttpGet httpget = new HttpGet(url);
httpget.getParams().setBooleanParameter(
CoreProtocolPNames.USE_EXPECT_CONTINUE, false);
httpget.setHeader("Content-Type", "application/json");
httpget.setHeader("Encoding", "utf-8");
httpget.setHeader("database", Const.DATABASE);
if(userId != null && userId.length() > 0)
httpget.setHeader("user_id", userId);
else{
String userIdSaved = SpikaApp.getPreferences().getUserId();
if(userIdSaved != null)
httpget.setHeader("user_id", userIdSaved);
}
String token = SpikaApp.getPreferences().getUserToken();
if(token != null && token.length() > 0)
httpget.setHeader("token", token);
Logger.error("httpGetRequest", SpikaApp.getPreferences().getUserToken());
HttpResponse response = HttpSingleton.getInstance().execute(httpget);
HttpEntity entity = response.getEntity();
return entity.getContent();
}
/**
* Forming a POST request
*
* @param url
* @param create
* @return
* @throws ClientProtocolException
* @throws IOException
*/
private static InputStream httpPostRequest(String url, Object create,
String userId) throws ClientProtocolException,
IOException {
HttpPost httppost = new HttpPost(url);
httppost.getParams().setBooleanParameter(
CoreProtocolPNames.USE_EXPECT_CONTINUE, false);
httppost.setHeader("Content-Type", "application/json");
httppost.setHeader("Encoding", "utf-8");
httppost.setHeader("database", Const.DATABASE);
if(userId != null && userId.length() > 0)
httppost.setHeader("user_id", userId);
else{
String userIdSaved = SpikaApp.getPreferences().getUserId();
if(userIdSaved != null)
httppost.setHeader("user_id", userIdSaved);
}
String token = SpikaApp.getPreferences().getUserToken();
if(token != null && token.length() > 0)
httppost.setHeader("token", token);
StringEntity stringEntity = new StringEntity(create.toString(),
HTTP.UTF_8);
httppost.setEntity(stringEntity);
HttpResponse response = HttpSingleton.getInstance().execute(httppost);
HttpEntity entity = response.getEntity();
return entity.getContent();
}
/**
* Forming a PUT request
*
* @param url
* @param create
* @return
* @throws ClientProtocolException
* @throws IOException
*/
private static InputStream httpPutRequest(String url, JSONObject create,
String userId) throws ClientProtocolException,
IOException {
HttpPut httpput = new HttpPut(url);
httpput.getParams().setBooleanParameter(
CoreProtocolPNames.USE_EXPECT_CONTINUE, false);
httpput.setHeader("Content-Type", "application/json");
httpput.setHeader("Encoding", "utf-8");
httpput.setHeader("database", Const.DATABASE);
if(userId != null && userId.length() > 0)
httpput.setHeader("user_id", userId);
else{
String userIdSaved = SpikaApp.getPreferences().getUserId();
if(userIdSaved != null)
httpput.setHeader("user_id", userIdSaved);
}
String token = SpikaApp.getPreferences().getUserToken();
if(token != null && token.length() > 0)
httpput.setHeader("token", token);
StringEntity stringEntity = new StringEntity(create.toString(),
HTTP.UTF_8);
httpput.setEntity(stringEntity);
HttpResponse response = HttpSingleton.getInstance().execute(httpput);
HttpEntity entity = response.getEntity();
return entity.getContent();
}
/**
* Form a DELETE reqest
*
* @param url
* @return
* @throws ClientProtocolException
* @throws IOException
*/
private static InputStream httpDeleteRequest(String url, String userId) throws ClientProtocolException, IOException {
HttpDelete httpdelete = new HttpDelete(url);
httpdelete.getParams().setBooleanParameter(
CoreProtocolPNames.USE_EXPECT_CONTINUE, false);
httpdelete.setHeader("Content-Type", "application/json");
httpdelete.setHeader("Encoding", "utf-8");
httpdelete.setHeader("database", Const.DATABASE);
if(userId != null && userId.length() > 0)
httpdelete.setHeader("user_id", userId);
else{
String userIdSaved = SpikaApp.getPreferences().getUserId();
if(userIdSaved != null)
httpdelete.setHeader("user_id", userIdSaved);
}
String token = SpikaApp.getPreferences().getUserToken();
if(token != null && token.length() > 0)
httpdelete.setHeader("token", token);
HttpResponse response = HttpSingleton.getInstance().execute(httpdelete);
HttpEntity entity = response.getEntity();
return entity.getContent();
}
/**
* HttpClient mini singleton
*/
public static class HttpSingleton {
private static HttpClient sInstance = null;
protected HttpSingleton() {
}
public static HttpClient getInstance() {
if (sInstance == null) {
HttpParams params = new BasicHttpParams();
params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION,
HttpVersion.HTTP_1_1);
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory
.getSocketFactory(), 80));
final SSLSocketFactory sslSocketFactory = SSLSocketFactory
.getSocketFactory();
schemeRegistry.register(new Scheme("https", sslSocketFactory,
443));
ClientConnectionManager cm = new ThreadSafeClientConnManager(
params, schemeRegistry);
sInstance = new DefaultHttpClient(cm, params);
}
return sInstance;
}
}
}