// Path: glin/src/main/java/org/loader/glin/Callback.java
// public abstract class Callback<T> {
// 
//     private Context mContext;
//     private ChanNode mAfterChanNode;
// 
//     public final void attach(Context ctx, ChanNode afterChanNode) {
//         mContext = ctx;
//         mAfterChanNode = afterChanNode;
//     }
// 
//     public final void afterResponse(Result<T> result, RawResult rawResult) {
//         mContext.setRawResult(rawResult);
//         mContext.setResult(result);
// 
//         if (mAfterChanNode != null) {
//             mAfterChanNode.exec(mContext);
//         }
//     }
// 
//     public abstract void onResponse(Result<T> result);
// }
// 
// Path: glin/src/main/java/org/loader/glin/Params.java
// public class Params {
// 
//     public static final String DEFAULT_JSON_KEY = "json";
// 
//     private LinkedHashMap<String, String> mParams;
//     private LinkedHashMap<String, File> mFiles;
// 
//     public Params() {
//         mParams = new LinkedHashMap<>();
//         mFiles = new LinkedHashMap<>();
//     }
// 
//     public Params(String key, Object value) {
//         this();
//         add(key, value);
//     }
// 
//     public Params add(String key, Object value) {
//         if (key == null) { return this;}
//         if (value == null) { mParams.put(key, null);}
//         else if (value instanceof File) { mFiles.put(key, (File) value);}
//         else { mParams.put(key, value.toString());}
//         return this;
//     }
// 
//     public LinkedHashMap<String, String> get() {
//         return mParams;
//     }
// 
//     public String getParams(String key) {
//         return mParams.get(key);
//     }
// 
//     public File getFile(String key) {
//         return mFiles.get(key);
//     }
// 
//     public LinkedHashMap<String, File> files() {
//         return mFiles;
//     }
// 
//     public void remove(String key) {
//         if (mParams.containsKey(key)) { mParams.remove(key);}
//         if (mFiles.containsKey(key)) { mFiles.remove(key);}
//     }
// 
//     public String encode() {
//         String query = null;
//         for (Map.Entry<String, String> entry : mParams.entrySet()) {
//             if (query == null) { query = entry.getKey() + "=" + entry.getValue();}
//             else { query += "&" + entry.getKey() + "=" + entry.getValue();}
//         }
// 
//         return query;
//     }
// 
//     public Iterator<String> iterator() {
//         return mParams.keySet().iterator();
//     }
// 
//     public Iterator<String> fileIterator() {
//         return mFiles.keySet().iterator();
//     }
// 
//     public boolean isEmpty() {
//         return mParams.isEmpty() && mFiles.isEmpty();
//     }
// }
// 
// Path: glin/src/main/java/org/loader/glin/client/IClient.java
// public interface IClient extends IRequest {
// 
//     void cancel(final Object tag);
// 
//     void parserFactory(ParserFactory factory);
// 
//     LinkedHashMap<String, String> headers();
// 
//     void resultInterceptor(IResultInterceptor interceptor);
// 
//     void cacheProvider(ICacheProvider provider);
// 
//     void timeout(long ms);
// }


import org.loader.glin.Callback;
import org.loader.glin.Params;
import org.loader.glin.client.IClient;
package org.loader.glin.call;


/**
 * Created by qibin on 2016/7/13.
 */

public class JsonCall<T> extends Call<T> {

    public JsonCall(IClient client, String url,
                    Params params, Object tag,
                    boolean cache) {
        super(client, url, params, tag, cache);
    }

    @Override
    public void exec(final Callback<T> callback) {
// Path: glin/src/main/java/org/loader/glin/Callback.java
// public abstract class Callback<T> {
// 
//     private Context mContext;
//     private ChanNode mAfterChanNode;
// 
//     public final void attach(Context ctx, ChanNode afterChanNode) {
//         mContext = ctx;
//         mAfterChanNode = afterChanNode;
//     }
// 
//     public final void afterResponse(Result<T> result, RawResult rawResult) {
//         mContext.setRawResult(rawResult);
//         mContext.setResult(result);
// 
//         if (mAfterChanNode != null) {
//             mAfterChanNode.exec(mContext);
//         }
//     }
// 
//     public abstract void onResponse(Result<T> result);
// }
// 
// Path: glin/src/main/java/org/loader/glin/Params.java
// public class Params {
// 
//     public static final String DEFAULT_JSON_KEY = "json";
// 
//     private LinkedHashMap<String, String> mParams;
//     private LinkedHashMap<String, File> mFiles;
// 
//     public Params() {
//         mParams = new LinkedHashMap<>();
//         mFiles = new LinkedHashMap<>();
//     }
// 
//     public Params(String key, Object value) {
//         this();
//         add(key, value);
//     }
// 
//     public Params add(String key, Object value) {
//         if (key == null) { return this;}
//         if (value == null) { mParams.put(key, null);}
//         else if (value instanceof File) { mFiles.put(key, (File) value);}
//         else { mParams.put(key, value.toString());}
//         return this;
//     }
// 
//     public LinkedHashMap<String, String> get() {
//         return mParams;
//     }
// 
//     public String getParams(String key) {
//         return mParams.get(key);
//     }
// 
//     public File getFile(String key) {
//         return mFiles.get(key);
//     }
// 
//     public LinkedHashMap<String, File> files() {
//         return mFiles;
//     }
// 
//     public void remove(String key) {
//         if (mParams.containsKey(key)) { mParams.remove(key);}
//         if (mFiles.containsKey(key)) { mFiles.remove(key);}
//     }
// 
//     public String encode() {
//         String query = null;
//         for (Map.Entry<String, String> entry : mParams.entrySet()) {
//             if (query == null) { query = entry.getKey() + "=" + entry.getValue();}
//             else { query += "&" + entry.getKey() + "=" + entry.getValue();}
//         }
// 
//         return query;
//     }
// 
//     public Iterator<String> iterator() {
//         return mParams.keySet().iterator();
//     }
// 
//     public Iterator<String> fileIterator() {
//         return mFiles.keySet().iterator();
//     }
// 
//     public boolean isEmpty() {
//         return mParams.isEmpty() && mFiles.isEmpty();
//     }
// }
// 
// Path: glin/src/main/java/org/loader/glin/client/IClient.java
// public interface IClient extends IRequest {
// 
//     void cancel(final Object tag);
// 
//     void parserFactory(ParserFactory factory);
// 
//     LinkedHashMap<String, String> headers();
// 
//     void resultInterceptor(IResultInterceptor interceptor);
// 
//     void cacheProvider(ICacheProvider provider);
// 
//     void timeout(long ms);
// }


// Path: glin/src/main/java/org/loader/glin/call/JsonCall.java
import org.loader.glin.Callback;
import org.loader.glin.Params;
import org.loader.glin.client.IClient;

package org.loader.glin.call;


/**
 * Created by qibin on 2016/7/13.
 */

public class JsonCall<T> extends Call<T> {

    public JsonCall(IClient client, String url,
                    Params params, Object tag,
                    boolean cache) {
        super(client, url, params, tag, cache);
    }

    @Override
    public void exec(final Callback<T> callback) {
        String json = mParams.getParams(Params.DEFAULT_JSON_KEY);