|
|
@@ -0,0 +1,392 @@
|
|
|
+package kr.co.zumo.app.network;
|
|
|
+
|
|
|
+import android.os.Handler;
|
|
|
+import android.os.Looper;
|
|
|
+import android.support.annotation.NonNull;
|
|
|
+import android.support.annotation.Nullable;
|
|
|
+import android.util.Log;
|
|
|
+
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
+import com.softforum.xecure.XecureSmart;
|
|
|
+import com.softforum.xecure.util.XUtil;
|
|
|
+
|
|
|
+import java.io.IOException;
|
|
|
+import java.net.CookieHandler;
|
|
|
+import java.net.CookieManager;
|
|
|
+import java.net.URLEncoder;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
+
|
|
|
+import kr.co.zumo.app.BuildConfig;
|
|
|
+import kr.co.zumo.app.Zlog;
|
|
|
+import kr.co.zumo.app.ZumoApplication;
|
|
|
+import kr.co.zumo.app.ZumoSharedPreference;
|
|
|
+import kr.co.zumo.app.data.jackson.BaseData;
|
|
|
+import okhttp3.Call;
|
|
|
+import okhttp3.Callback;
|
|
|
+import okhttp3.Headers;
|
|
|
+import okhttp3.MediaType;
|
|
|
+import okhttp3.OkHttpClient;
|
|
|
+import okhttp3.Request;
|
|
|
+import okhttp3.RequestBody;
|
|
|
+import okhttp3.Response;
|
|
|
+
|
|
|
+public class NetworkClient<T> {
|
|
|
+ final int connectTimeout;
|
|
|
+ final int readTimeout;
|
|
|
+ final int writeTimeout;
|
|
|
+
|
|
|
+ private final String API_VERSION = "?api_ver=2.4";
|
|
|
+
|
|
|
+ private final String logFilter = "&logFilter=";
|
|
|
+ private final String logType = "&logType=";
|
|
|
+ private final String logUserNo = "&encryption_user_no=";
|
|
|
+ private final String logContentsNo = "&contents_no=";
|
|
|
+ private final String logArea = "&area=";
|
|
|
+ private final String logCompanion = "&companion=";
|
|
|
+ private final String logActivity = "&activity=";
|
|
|
+ private final String logAreaNo = "&area_no=";
|
|
|
+
|
|
|
+ private final String mXecurePath = "/off";
|
|
|
+ private final String mXecureMethodGet = "GET";
|
|
|
+
|
|
|
+ public enum REST {
|
|
|
+ GET, POST, DELETE, PUT
|
|
|
+ }
|
|
|
+
|
|
|
+ OkHttpClient client;
|
|
|
+
|
|
|
+ public NetworkClient() {
|
|
|
+ this(new Builder());
|
|
|
+
|
|
|
+ initOkHttpClient();
|
|
|
+ }
|
|
|
+
|
|
|
+ NetworkClient(Builder builder) {
|
|
|
+ this.connectTimeout = builder.connectTimeout;
|
|
|
+ this.readTimeout = builder.readTimeout;
|
|
|
+ this.writeTimeout = builder.writeTimeout;
|
|
|
+
|
|
|
+ initOkHttpClient();
|
|
|
+ }
|
|
|
+
|
|
|
+ private void initOkHttpClient() {
|
|
|
+ client = new OkHttpClient.Builder()
|
|
|
+ .connectTimeout(connectTimeout, TimeUnit.MILLISECONDS)
|
|
|
+ .readTimeout(readTimeout, TimeUnit.MILLISECONDS)
|
|
|
+ .writeTimeout(writeTimeout, TimeUnit.MILLISECONDS)
|
|
|
+ .build();
|
|
|
+ }
|
|
|
+
|
|
|
+ private String insertDefaultInformation(String url, Map<String, String> header) {
|
|
|
+ String encryptionUserNo = ZumoSharedPreference.getInstance().getString(ZumoApplication.getGlobalApplicationContext(), ZumoSharedPreference.ENCRYPTION_USER_NO);
|
|
|
+
|
|
|
+ encryptionUserNo = "null";
|
|
|
+
|
|
|
+ url += API_VERSION + logFilter + encryptionUserNo;
|
|
|
+
|
|
|
+ url += getLog(header);
|
|
|
+
|
|
|
+ return url;
|
|
|
+ }
|
|
|
+
|
|
|
+ private String getLog(Map<String, String> header) {
|
|
|
+ String log = "";
|
|
|
+
|
|
|
+ if (header != null) {
|
|
|
+ for (String key : header.keySet()) {
|
|
|
+ String value = "";
|
|
|
+ if (header.get(key) instanceof String) {
|
|
|
+ value = header.get(key);
|
|
|
+ }
|
|
|
+
|
|
|
+ log += "&" + key + "=" + URLEncoder.encode(value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return log;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void request(@NonNull REST rest, @NonNull final String url, @NonNull final Class<T> object, @Nullable final NetworkCallback callback) {
|
|
|
+ request(rest, url, null, null, object, callback);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void request(@NonNull REST rest, @NonNull final String url, @Nullable HashMap<String, Object> map, @NonNull final Class<T> object, @Nullable final NetworkCallback callback) {
|
|
|
+ request(rest, url, null, map, object, callback);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param rest GET, POST, DELETE, PUT
|
|
|
+ * @param url request URL
|
|
|
+ * @param header headers
|
|
|
+ * @param map parameters
|
|
|
+ * @param object return class
|
|
|
+ * @param callback callback
|
|
|
+ */
|
|
|
+ public void request(@NonNull REST rest, @NonNull String url, @NonNull Map<String, String> header,
|
|
|
+ @Nullable Map<String, Object> map, @NonNull final Class<T> object, @Nullable final NetworkCallback callback) {
|
|
|
+
|
|
|
+ if (BuildConfig.DEBUG)
|
|
|
+ Zlog.i(getClass().getSimpleName(), "request:" + rest.name() + ", url: " + url
|
|
|
+ + (header != null ? ", header: " + header.toString() : "")
|
|
|
+ + (map != null ? ", param: " + map.toString() : ""));
|
|
|
+
|
|
|
+ url = insertDefaultInformation(url, header);
|
|
|
+
|
|
|
+ Request request = null;
|
|
|
+ Headers headers = null;
|
|
|
+ if (header != null) headers = Headers.of(header);
|
|
|
+
|
|
|
+ String param = "";
|
|
|
+ if (rest == REST.GET) {
|
|
|
+ if (map != null) {
|
|
|
+ for (String key : map.keySet()) {
|
|
|
+ Object value;
|
|
|
+ value = map.get(key);
|
|
|
+
|
|
|
+ if(value instanceof String) {
|
|
|
+ if (param.length() == 0)
|
|
|
+ param += "?" + key + "=" + URLEncoder.encode((String)value);
|
|
|
+ else
|
|
|
+ param += "&" + key + "=" + URLEncoder.encode((String)value);
|
|
|
+ } else {
|
|
|
+ if (param.length() == 0)
|
|
|
+ param += "?" + key + "=" + value;
|
|
|
+ else
|
|
|
+ param += "&" + key + "=" + value;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //TODO: test
|
|
|
+ //TODO: enc param
|
|
|
+ JsonMaker encJsonMaker = new JsonMaker();
|
|
|
+ String encParam = XecureSmart.getInstance().BlockEncEx(NetworkConfig.XECURE_URL, mXecurePath, param, mXecureMethodGet, "");
|
|
|
+ encJsonMaker.addParam("etzJsonData", encParam);
|
|
|
+ param = encJsonMaker.toString();
|
|
|
+
|
|
|
+ request = get(url, headers, param);
|
|
|
+ } else if (rest == REST.POST) {
|
|
|
+ if (map != null) {
|
|
|
+ JsonMaker jsonMaker = new JsonMaker();
|
|
|
+ for (String key : map.keySet()) {
|
|
|
+ if (map.get(key) instanceof String) {
|
|
|
+ String value = (String) map.get(key);
|
|
|
+ jsonMaker.addParam(key, value);
|
|
|
+ } else if (map.get(key) instanceof List) {
|
|
|
+ List<String> list = (List<String>) map.get(key);
|
|
|
+ jsonMaker.addParam(key, list);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ param = jsonMaker.toString();
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ //TODO: test
|
|
|
+ //TODO: enc param
|
|
|
+ JsonMaker encJsonMaker = new JsonMaker();
|
|
|
+ String encParam = XecureSmart.getInstance().BlockEncEx(NetworkConfig.XECURE_URL, mXecurePath, param, mXecureMethodGet, "");
|
|
|
+ encJsonMaker.addParam("etzJsonData", encParam);
|
|
|
+ param = encJsonMaker.toString();
|
|
|
+ }
|
|
|
+ request = post(url, headers, param);
|
|
|
+ } else if (rest == REST.DELETE) {
|
|
|
+ if (map != null) {
|
|
|
+ JsonMaker jsonMaker = new JsonMaker();
|
|
|
+ for (String key : map.keySet()) {
|
|
|
+ if (map.get(key) instanceof String) {
|
|
|
+ String value = (String) map.get(key);
|
|
|
+ jsonMaker.addParam(key, value);
|
|
|
+ } else if (map.get(key) instanceof List) {
|
|
|
+ List<String> list = (List<String>) map.get(key);
|
|
|
+ jsonMaker.addParam(key, list);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ param = jsonMaker.toString();
|
|
|
+ }
|
|
|
+ request = delete(url, headers, param);
|
|
|
+ } else if (rest == REST.PUT) {
|
|
|
+ if (map != null) {
|
|
|
+ JsonMaker jsonMaker = new JsonMaker();
|
|
|
+ for (String key : map.keySet()) {
|
|
|
+ if (map.get(key) instanceof String) {
|
|
|
+ String value = (String) map.get(key);
|
|
|
+ jsonMaker.addParam(key, value);
|
|
|
+ } else if (map.get(key) instanceof List) {
|
|
|
+ List<String> list = (List<String>) map.get(key);
|
|
|
+ jsonMaker.addParam(key, list);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ param = jsonMaker.toString();
|
|
|
+ }
|
|
|
+ request = put(url, headers, param);
|
|
|
+ }
|
|
|
+ if (request != null) {
|
|
|
+ call(request, object, callback);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ throw new RuntimeException("############################################################\n" +
|
|
|
+ "There is no type that matches the type!! make sure your using types correctly\n" +
|
|
|
+ "############################################################");
|
|
|
+ }
|
|
|
+
|
|
|
+ public Request get(@NonNull final String url, @Nullable String param) {
|
|
|
+ return get(url, null, param);
|
|
|
+ }
|
|
|
+
|
|
|
+ public Request get(@NonNull final String url, @NonNull Headers headers, @Nullable String param) {
|
|
|
+ Request request = null;
|
|
|
+ if (param == null) {
|
|
|
+ if (headers != null)
|
|
|
+ request = new Request.Builder().url(url).headers(headers).get().build();
|
|
|
+ else
|
|
|
+ request = new Request.Builder().url(url).get().build();
|
|
|
+ } else {
|
|
|
+ if (headers != null)
|
|
|
+ request = new Request.Builder().url(url + param).headers(headers).get().build();
|
|
|
+ else
|
|
|
+ request = new Request.Builder().url(url + param).get().build();
|
|
|
+ }
|
|
|
+
|
|
|
+ return request;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Request post(@NonNull final String url, @NonNull String param) {
|
|
|
+ return post(url, null, param);
|
|
|
+ }
|
|
|
+
|
|
|
+ public Request post(@NonNull final String url, @NonNull Headers headers, @NonNull String param) {
|
|
|
+ Request request = null;
|
|
|
+ if (headers != null)
|
|
|
+ request = new Request.Builder().url(url).headers(headers).post(RequestBody.create(MediaType.parse("application/json"), param)).build();
|
|
|
+ else
|
|
|
+ request = new Request.Builder().url(url).post(RequestBody.create(MediaType.parse("application/json"), param)).build();
|
|
|
+ return request;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Request delete(@NonNull final String url, @NonNull String param) {
|
|
|
+ return delete(url, null, param);
|
|
|
+ }
|
|
|
+
|
|
|
+ public Request delete(@NonNull final String url, @NonNull Headers headers, @NonNull String param) {
|
|
|
+ Request request = null;
|
|
|
+ if (headers != null)
|
|
|
+ request = new Request.Builder().url(url).headers(headers).delete(RequestBody.create(MediaType.parse("application/json"), param)).build();
|
|
|
+ else
|
|
|
+ request = new Request.Builder().url(url).delete(RequestBody.create(MediaType.parse("application/json"), param)).build();
|
|
|
+ return request;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Request put(@NonNull final String url, @NonNull String param) {
|
|
|
+ return put(url, null, param);
|
|
|
+ }
|
|
|
+
|
|
|
+ public Request put(@NonNull final String url, @NonNull Headers headers, @NonNull String param) {
|
|
|
+ Request request = null;
|
|
|
+ if (headers != null)
|
|
|
+ request = new Request.Builder().url(url).headers(headers).put(RequestBody.create(MediaType.parse("application/json"), param)).build();
|
|
|
+ else
|
|
|
+ request = new Request.Builder().url(url).put(RequestBody.create(MediaType.parse("application/json"), param)).build();
|
|
|
+ return request;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void call(@NonNull Request request, @NonNull final Class<T> object, @Nullable final NetworkCallback callback) {
|
|
|
+ callback.onPreExecute();
|
|
|
+ client.newCall(request).enqueue(new Callback() {
|
|
|
+ @Override
|
|
|
+ public void onFailure(Call call, IOException e) {
|
|
|
+ callback.onError(-101, e.getMessage());
|
|
|
+ callback.onPostExecute();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onResponse(final Call call, final Response response) throws IOException {
|
|
|
+ if (response.code() == 200) {
|
|
|
+ try {
|
|
|
+ //jackson
|
|
|
+ ObjectMapper mapper = new ObjectMapper();
|
|
|
+ String result = response.body().string();
|
|
|
+ final BaseData data = (BaseData) mapper.readValue(result, object);
|
|
|
+ runOnUiThread(new Runnable() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ if(data.getSp_rtn() < 0) {
|
|
|
+ callback.onError(data.getSp_rtn(), data.getRtn_message());
|
|
|
+ } else {
|
|
|
+ callback.onSuccess(data);
|
|
|
+ }
|
|
|
+ callback.onPostExecute();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ callback.onError(response.code(), e.getMessage());
|
|
|
+ callback.onPostExecute();
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ callback.onError(response.code(), response.message());
|
|
|
+ callback.onPostExecute();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ private void runOnUiThread(Runnable task) {
|
|
|
+ new Handler(Looper.getMainLooper()).post(task);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**************************************************
|
|
|
+ * PromptNetworkClient Builder
|
|
|
+ **************************************************/
|
|
|
+ public static final class Builder {
|
|
|
+ int connectTimeout;
|
|
|
+ int readTimeout;
|
|
|
+ int writeTimeout;
|
|
|
+
|
|
|
+ public Builder() {
|
|
|
+ connectTimeout = 10_000;
|
|
|
+ readTimeout = 10_000;
|
|
|
+ writeTimeout = 10_000;
|
|
|
+ }
|
|
|
+
|
|
|
+ Builder(NetworkClient client) {
|
|
|
+ this.connectTimeout = client.connectTimeout;
|
|
|
+ this.readTimeout = client.readTimeout;
|
|
|
+ this.writeTimeout = client.writeTimeout;
|
|
|
+ }
|
|
|
+
|
|
|
+ public NetworkClient.Builder connectTimeout(long timeout, TimeUnit unit) {
|
|
|
+ connectTimeout = checkDuration("timeout", timeout, unit);
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ public NetworkClient.Builder readTimeout(long timeout, TimeUnit unit) {
|
|
|
+ readTimeout = checkDuration("timeout", timeout, unit);
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ public NetworkClient.Builder writeTimeout(long timeout, TimeUnit unit) {
|
|
|
+ writeTimeout = checkDuration("timeout", timeout, unit);
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static int checkDuration(String name, long duration, TimeUnit unit) {
|
|
|
+ if (duration < 0) throw new IllegalArgumentException(name + " < 0");
|
|
|
+ if (unit == null) throw new NullPointerException("unit == null");
|
|
|
+ long millis = unit.toMillis(duration);
|
|
|
+ if (millis > Integer.MAX_VALUE)
|
|
|
+ throw new IllegalArgumentException(name + " too large.");
|
|
|
+ if (millis == 0 && duration > 0)
|
|
|
+ throw new IllegalArgumentException(name + " too small.");
|
|
|
+ return (int) millis;
|
|
|
+ }
|
|
|
+
|
|
|
+ public NetworkClient build() {
|
|
|
+ return new NetworkClient(this);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|