| package com.doumee.lib_coremodel.http.interceptor.logging; | 
|   | 
| import android.text.TextUtils; | 
|   | 
| import org.json.JSONArray; | 
| import org.json.JSONException; | 
| import org.json.JSONObject; | 
|   | 
| import java.io.IOException; | 
| import java.util.List; | 
|   | 
| import okhttp3.FormBody; | 
| import okhttp3.Request; | 
| import okio.Buffer; | 
|   | 
| /** | 
|  * @author ihsan on 09/02/2017. | 
|  */ | 
|   | 
| class Printer { | 
|   | 
|     private static final int JSON_INDENT = 3; | 
|   | 
|     private static final String LINE_SEPARATOR = System.getProperty("line.separator"); | 
|     private static final String DOUBLE_SEPARATOR = LINE_SEPARATOR + LINE_SEPARATOR; | 
|   | 
|     private static final String[] OMITTED_RESPONSE = {LINE_SEPARATOR, "Omitted response body"}; | 
|     private static final String[] OMITTED_REQUEST = {LINE_SEPARATOR, "Omitted request body"}; | 
|   | 
|     private static final String N = "\n"; | 
|     private static final String T = "\t"; | 
|     private static final String REQUEST_UP_LINE = "┌────── Request ────────────────────────────────────────────────────────────────────────"; | 
|     private static final String END_LINE = "└───────────────────────────────────────────────────────────────────────────────────────"; | 
|     private static final String RESPONSE_UP_LINE = "┌────── Response ───────────────────────────────────────────────────────────────────────"; | 
|     private static final String BODY_TAG = "Body:"; | 
|     private static final String URL_TAG = "URL: "; | 
|     private static final String METHOD_TAG = "Method: @"; | 
|     private static final String HEADERS_TAG = "Headers:"; | 
|     private static final String STATUS_CODE_TAG = "Status Code: "; | 
|     private static final String RECEIVED_TAG = "Received in: "; | 
|     private static final String CORNER_UP = "┌ "; | 
|     private static final String CORNER_BOTTOM = "└ "; | 
|     private static final String CENTER_LINE = "├ "; | 
|     private static final String DEFAULT_LINE = "│ "; | 
|   | 
|     protected Printer() { | 
|         throw new UnsupportedOperationException(); | 
|     } | 
|   | 
|     private static boolean isEmpty(String line) { | 
|         return TextUtils.isEmpty(line) || N.equals(line) || T.equals(line) || TextUtils.isEmpty(line.trim()); | 
|     } | 
|   | 
|     static void printJsonRequest(LoggingInterceptor.Builder builder, Request request) { | 
|         String requestBody = LINE_SEPARATOR + BODY_TAG + LINE_SEPARATOR + bodyToString(request); | 
|         String tag = builder.getTag(true); | 
|         if (builder.getLogger() == null) | 
|             I.log(builder.getType(), tag, REQUEST_UP_LINE); | 
|         logLines(builder.getType(), tag, new String[]{URL_TAG + request.url()}, builder.getLogger(), false); | 
|         logLines(builder.getType(), tag, getRequest(request, builder.getLevel()), builder.getLogger(), true); | 
|         if (request.body() instanceof FormBody) { | 
|             StringBuilder formBody = new StringBuilder(); | 
|             FormBody body = (FormBody) request.body(); | 
|             if (body != null && body.size() != 0) { | 
|                 for (int i = 0; i < body.size(); i++) { | 
|                     formBody.append(body.encodedName(i) + "=" + body.encodedValue(i) + "&"); | 
|                 } | 
|                 formBody.delete(formBody.length() - 1, formBody.length()); | 
|                 logLines(builder.getType(), tag, new String[]{formBody.toString()}, builder.getLogger(), true); | 
|             } | 
|         } | 
|         if (builder.getLevel() == Level.BASIC || builder.getLevel() == Level.BODY) { | 
|             logLines(builder.getType(), tag, requestBody.split(LINE_SEPARATOR), builder.getLogger(), true); | 
|         } | 
|         if (builder.getLogger() == null) | 
|             I.log(builder.getType(), tag, END_LINE); | 
|     } | 
|   | 
|     static void printJsonResponse(LoggingInterceptor.Builder builder, long chainMs, boolean isSuccessful, | 
|                                   int code, String headers, String bodyString, List<String> segments) { | 
|         String responseBody = LINE_SEPARATOR + BODY_TAG + LINE_SEPARATOR + getJsonString(bodyString); | 
|         String tag = builder.getTag(false); | 
|         if (builder.getLogger() == null) | 
|             I.log(builder.getType(), tag, RESPONSE_UP_LINE); | 
|   | 
|         logLines(builder.getType(), tag, getResponse(headers, chainMs, code, isSuccessful, | 
|                 builder.getLevel(), segments), builder.getLogger(), true); | 
|         if (builder.getLevel() == Level.BASIC || builder.getLevel() == Level.BODY) { | 
|             logLines(builder.getType(), tag, responseBody.split(LINE_SEPARATOR), builder.getLogger(), true); | 
|         } | 
|         if (builder.getLogger() == null) | 
|             I.log(builder.getType(), tag, END_LINE); | 
|     } | 
|   | 
|     static void printFileRequest(LoggingInterceptor.Builder builder, Request request) { | 
|         String tag = builder.getTag(true); | 
|         if (builder.getLogger() == null) | 
|             I.log(builder.getType(), tag, REQUEST_UP_LINE); | 
|         logLines(builder.getType(), tag, new String[]{URL_TAG + request.url()}, builder.getLogger(), false); | 
|         logLines(builder.getType(), tag, getRequest(request, builder.getLevel()), builder.getLogger(), true); | 
|         if (request.body() instanceof FormBody) { | 
|             StringBuilder formBody = new StringBuilder(); | 
|             FormBody body = (FormBody) request.body(); | 
|             if (body != null && body.size() != 0) { | 
|                 for (int i = 0; i < body.size(); i++) { | 
|                     formBody.append(body.encodedName(i) + "=" + body.encodedValue(i) + "&"); | 
|                 } | 
|                 formBody.delete(formBody.length() - 1, formBody.length()); | 
|                 logLines(builder.getType(), tag, new String[]{formBody.toString()}, builder.getLogger(), true); | 
|             } | 
|         } | 
|         if (builder.getLevel() == Level.BASIC || builder.getLevel() == Level.BODY) { | 
|             logLines(builder.getType(), tag, OMITTED_REQUEST, builder.getLogger(), true); | 
|         } | 
|         if (builder.getLogger() == null) | 
|             I.log(builder.getType(), tag, END_LINE); | 
|     } | 
|   | 
|     static void printFileResponse(LoggingInterceptor.Builder builder, long chainMs, boolean isSuccessful, | 
|                                   int code, String headers, List<String> segments) { | 
|         String tag = builder.getTag(false); | 
|         if (builder.getLogger() == null) | 
|             I.log(builder.getType(), tag, RESPONSE_UP_LINE); | 
|   | 
|         logLines(builder.getType(), tag, getResponse(headers, chainMs, code, isSuccessful, | 
|                 builder.getLevel(), segments), builder.getLogger(), true); | 
|         logLines(builder.getType(), tag, OMITTED_RESPONSE, builder.getLogger(), true); | 
|         if (builder.getLogger() == null) | 
|             I.log(builder.getType(), tag, END_LINE); | 
|     } | 
|   | 
|     private static String[] getRequest(Request request, Level level) { | 
|         String message; | 
|         String header = request.headers().toString(); | 
|         boolean loggableHeader = level == Level.HEADERS || level == Level.BASIC; | 
|         message = METHOD_TAG + request.method() + DOUBLE_SEPARATOR + | 
|                 (isEmpty(header) ? "" : loggableHeader ? HEADERS_TAG + LINE_SEPARATOR + dotHeaders(header) : ""); | 
|         return message.split(LINE_SEPARATOR); | 
|     } | 
|   | 
|     private static String[] getResponse(String header, long tookMs, int code, boolean isSuccessful, | 
|                                         Level level, List<String> segments) { | 
|         String message; | 
|         boolean loggableHeader = level == Level.HEADERS || level == Level.BASIC; | 
|         String segmentString = slashSegments(segments); | 
|         message = ((!TextUtils.isEmpty(segmentString) ? segmentString + " - " : "") + "is success : " | 
|                 + isSuccessful + " - " + RECEIVED_TAG + tookMs + "ms" + DOUBLE_SEPARATOR + STATUS_CODE_TAG + | 
|                 code + DOUBLE_SEPARATOR + (isEmpty(header) ? "" : loggableHeader ? HEADERS_TAG + LINE_SEPARATOR + | 
|                 dotHeaders(header) : "")); | 
|         return message.split(LINE_SEPARATOR); | 
|     } | 
|   | 
|     private static String slashSegments(List<String> segments) { | 
|         StringBuilder segmentString = new StringBuilder(); | 
|         for (String segment : segments) { | 
|             segmentString.append("/").append(segment); | 
|         } | 
|         return segmentString.toString(); | 
|     } | 
|   | 
|     private static String dotHeaders(String header) { | 
|         String[] headers = header.split(LINE_SEPARATOR); | 
|         StringBuilder builder = new StringBuilder(); | 
|         String tag = "─ "; | 
|         if (headers.length > 1) { | 
|             for (int i = 0; i < headers.length; i++) { | 
|                 if (i == 0) { | 
|                     tag = CORNER_UP; | 
|                 } else if (i == headers.length - 1) { | 
|                     tag = CORNER_BOTTOM; | 
|                 } else { | 
|                     tag = CENTER_LINE; | 
|                 } | 
|                 builder.append(tag).append(headers[i]).append("\n"); | 
|             } | 
|         } else { | 
|             for (String item : headers) { | 
|                 builder.append(tag).append(item).append("\n"); | 
|             } | 
|         } | 
|         return builder.toString(); | 
|     } | 
|   | 
|     private static void logLines(int type, String tag, String[] lines, Logger logger, boolean withLineSize) { | 
|         for (String line : lines) { | 
|             int lineLength = line.length(); | 
|             int MAX_LONG_SIZE = withLineSize ? 110 : lineLength; | 
|             for (int i = 0; i <= lineLength / MAX_LONG_SIZE; i++) { | 
|                 int start = i * MAX_LONG_SIZE; | 
|                 int end = (i + 1) * MAX_LONG_SIZE; | 
|                 end = end > line.length() ? line.length() : end; | 
|                 if (logger == null) { | 
|                     I.log(type, tag, DEFAULT_LINE + line.substring(start, end)); | 
|                 } else { | 
|                     logger.log(type, tag, line.substring(start, end)); | 
|                 } | 
|             } | 
|         } | 
|     } | 
|   | 
|     private static String bodyToString(final Request request) { | 
|         try { | 
|             final Request copy = request.newBuilder().build(); | 
|             final Buffer buffer = new Buffer(); | 
|             if (copy.body() == null) | 
|                 return ""; | 
|             copy.body().writeTo(buffer); | 
|             return getJsonString(buffer.readUtf8()); | 
|         } catch (final IOException e) { | 
|             return "{\"err\": \"" + e.getMessage() + "\"}"; | 
|         } | 
|     } | 
|   | 
|     static String getJsonString(String msg) { | 
|         String message; | 
|         try { | 
|             if (msg.startsWith("{")) { | 
|                 JSONObject jsonObject = new JSONObject(msg); | 
|                 message = jsonObject.toString(JSON_INDENT); | 
|             } else if (msg.startsWith("[")) { | 
|                 JSONArray jsonArray = new JSONArray(msg); | 
|                 message = jsonArray.toString(JSON_INDENT); | 
|             } else { | 
|                 message = msg; | 
|             } | 
|         } catch (JSONException e) { | 
|             message = msg; | 
|         } | 
|         return message; | 
|     } | 
|   | 
| } |