/*
* This file is part of ForsakenSuite.
*
* Copyright © 2012-2014,
* ForsakenNetwork LLC
* <http://www.forsaken.co/>
* ForsakenSuite is licensed under the Forsaken Network License Version 1
*
* ForsakenSuite is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* In addition, 180 days after any changes are published, you can use the
* software, incorporating those changes, under the terms of the MIT license,
* as described in the Forsaken Network License Version 1.
*
* ForsakenSuite is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License,
* the MIT license and the Forsaken Network License Version 1 along with this program.
* If not, see <http://www.gnu.org/licenses/> for the GNU Lesser General Public
* License.
*/
package co.forsaken.api.json;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
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.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.PoolingClientConnectionManager;
import org.apache.http.message.BasicHeader;
import co.forsaken.projectindigo.utils.Callback;
import com.google.gson.Gson;
public class JsonWebCall {
private String _url;
private PoolingClientConnectionManager _connectionManager;
private boolean _log = false;
public JsonWebCall(String url) {
_url = url;
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));
_connectionManager = new PoolingClientConnectionManager(schemeRegistry);
_connectionManager.setMaxTotal(200);
_connectionManager.setDefaultMaxPerRoute(20);
}
public String executeRet(Object arg) {
if (_log) System.out.println("Requested: [" + _url + "]");
try {
canConnect();
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
HttpClient httpClient = new DefaultHttpClient(_connectionManager);
InputStream in = null;
String res = null;
try {
Gson gson = new Gson();
HttpPost request = new HttpPost(_url);
if (arg != null) {
StringEntity params = new StringEntity(gson.toJson(arg));
params.setContentType(new BasicHeader("Content-Type", "application/json"));
request.setEntity(params);
}
HttpResponse response = httpClient.execute(request);
if (response != null) {
in = response.getEntity().getContent();
res = convertStreamToString(in);
}
} catch (Exception ex) {
System.out.println("JSONWebCall.execute() Error: \n" + ex.getMessage());
System.out.println("Result: \n" + res);
StackTraceElement[] arrOfSTE;
int max = (arrOfSTE = ex.getStackTrace()).length;
for (int i = 0; i < max; i++) {
StackTraceElement trace = arrOfSTE[i];
System.out.println(trace);
}
} finally {
httpClient.getConnectionManager().shutdown();
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
if (_log) System.out.println("Returned: [" + _url + "] [" + res + "]");
return res;
}
public String executeGet() {
if (_log) System.out.println("Requested: [" + _url + "]");
try {
canConnect();
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
HttpClient httpClient = new DefaultHttpClient(_connectionManager);
InputStream in = null;
String res = null;
try {
HttpGet request = new HttpGet(_url);
request.setHeader("Content-Type", "application/json");
HttpResponse response = httpClient.execute(request);
if (response != null) {
in = response.getEntity().getContent();
res = convertStreamToString(in);
}
} catch (Exception ex) {
System.out.println("JSONWebCall.execute() Error: \n" + ex.getMessage());
System.out.println("Result: \n" + res);
StackTraceElement[] arrOfSTE;
int max = (arrOfSTE = ex.getStackTrace()).length;
for (int i = 0; i < max; i++) {
StackTraceElement trace = arrOfSTE[i];
System.out.println(trace);
}
} finally {
httpClient.getConnectionManager().shutdown();
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
if (_log) System.out.println("Returned: [" + _url + "] [" + res + "]");
return res;
}
public void execute(Object arg) {
if (_log) System.out.println("Requested: [" + _url + "]");
try {
canConnect();
} catch (Exception ex) {
ex.printStackTrace();
return;
}
HttpClient httpClient = new DefaultHttpClient(_connectionManager);
try {
Gson gson = new Gson();
HttpPost request = new HttpPost(_url);
if (arg != null) {
StringEntity params = new StringEntity(gson.toJson(arg));
params.setContentType(new BasicHeader("Content-Type", "application/json"));
request.setEntity(params);
}
httpClient.execute(request);
} catch (Exception ex) {
System.out.println("JSONWebCall.executeNoRet() Error: \n" + ex.getMessage());
StackTraceElement[] arrOfSTE;
int max = (arrOfSTE = ex.getStackTrace()).length;
for (int i = 0; i < max; i++) {
StackTraceElement trace = arrOfSTE[i];
System.out.println(trace);
}
} finally {
httpClient.getConnectionManager().shutdown();
}
if (_log) System.out.println("Returned: [" + _url + "]");
}
public <T> T execute(Class<T> retType, Object arg) {
if (_log) System.out.println("Requested: [" + _url + "]");
try {
canConnect();
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
HttpClient httpClient = new DefaultHttpClient(_connectionManager);
InputStream in = null;
T returnData = null;
String res = null;
try {
Gson gson = new Gson();
HttpPost request = new HttpPost(_url);
if (arg != null) {
StringEntity params = new StringEntity(gson.toJson(arg));
params.setContentType(new BasicHeader("Content-Type", "application/json"));
request.setEntity(params);
}
HttpResponse response = httpClient.execute(request);
if (response != null) {
in = response.getEntity().getContent();
res = convertStreamToString(in);
returnData = new Gson().fromJson(res, retType);
}
} catch (Exception ex) {
System.out.println("JSONWebCall.execute() Error: \n" + ex.getMessage());
System.out.println("Result: \n" + res);
StackTraceElement[] arrOfSTE;
int max = (arrOfSTE = ex.getStackTrace()).length;
for (int i = 0; i < max; i++) {
StackTraceElement trace = arrOfSTE[i];
System.out.println(trace);
}
} finally {
httpClient.getConnectionManager().shutdown();
if (in != null) {
try {
in.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
if (_log) System.out.println("Returned: [" + _url + "] [" + res + "]");
return returnData;
}
private boolean canConnect() throws Exception {
try {
HttpURLConnection.setFollowRedirects(false);
HttpURLConnection con = (HttpURLConnection) new URL(_url).openConnection();
con.setRequestMethod("HEAD");
con.setConnectTimeout(2000);
if (con.getResponseCode() != HttpURLConnection.HTTP_OK) { throw new Exception("Service " + _url + " unavailable, oh no!"); }
return true;
} catch (java.net.SocketTimeoutException e) {
throw new Exception("Service " + _url + " unavailable, oh no!", e);
} catch (java.io.IOException e) {
throw new Exception("Service " + _url + " unavailable, oh no!", e);
}
}
public <T> T executeGet(Class<T> retType, boolean encapsulate) throws Exception {
if (_log) System.out.println("Requested: [" + _url + "]");
try {
canConnect();
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
HttpClient httpClient = new DefaultHttpClient(_connectionManager);
InputStream in = null;
T returnData = null;
String res = null;
try {
HttpGet request = new HttpGet(_url);
request.setHeader("Content-Type", "application/json");
HttpResponse response = httpClient.execute(request);
if (response != null) {
in = response.getEntity().getContent();
res = convertStreamToString(in);
if (encapsulate) {
res = "{\"data\":" + res + "}";
}
returnData = new Gson().fromJson(res, retType);
}
} catch (Exception ex) {
throw ex;
} finally {
httpClient.getConnectionManager().shutdown();
if (in != null) {
try {
in.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
if (_log) System.out.println("Returned: [" + _url + "] [" + res + "]");
return returnData;
}
public <T> void execute(Class<T> callbackClass, Callback<T> callback) {
execute(callbackClass, callback, null);
}
public <T> void execute(Class<T> callbackClass, Callback<T> callback, Object arg) {
if (_log) System.out.println("Requested: [" + _url + "]");
try {
canConnect();
} catch (Exception ex) {
ex.printStackTrace();
return;
}
HttpClient httpClient = new DefaultHttpClient(_connectionManager);
InputStream in = null;
String res = null;
try {
Gson gson = new Gson();
HttpPost request = new HttpPost(_url);
if (arg != null) {
StringEntity params = new StringEntity(gson.toJson(arg));
params.setContentType(new BasicHeader("Content-Type", "application/json"));
request.setEntity(params);
}
HttpResponse response = httpClient.execute(request);
if (response != null) {
in = response.getEntity().getContent();
res = convertStreamToString(in);
if (_log) System.out.println("Returned: [" + _url + "] [" + res + "]");
callback.run(new Gson().fromJson(res, callbackClass));
}
} catch (Exception ex) {
ex.printStackTrace();
System.out.println("JSONWebCall.execute() Error: \n" + ex.getMessage());
System.out.println("Result: \n" + res);
StackTraceElement[] arrOfSTE;
int max = (arrOfSTE = ex.getStackTrace()).length;
for (int i = 0; i < max; i++) {
StackTraceElement trace = arrOfSTE[i];
System.out.println(trace);
}
} finally {
httpClient.getConnectionManager().shutdown();
if (in != null) {
try {
in.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
protected String convertStreamToString(InputStream is) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
}