Forráskód Böngészése

#2017-09-07
-초기 업로드

1180371 8 éve
commit
ea5d73ce7c

+ 392 - 0
ZUMO/src/main/java/kr/co/zumo/app/network/NetworkClient.java

@@ -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);
+        }
+    }
+}