// Path: comm/src/main/java/br/com/hole19/marvel/comm/model/comm_data/ResponseType.java
// public enum ResponseType {
// 
//     SUCCESS("SUCCESS"), ERROR("ERROR");
// 
//     private String mValue;
// 
//     ResponseType(String value) {
//         this.mValue = value;
//     }
// 
//     @Override
//     public String toString() {
//         if (this.mValue == null) {
//             return "";
//         }
//         return this.mValue;
//     }
// 
// }
// 
// Path: comm/src/main/java/br/com/hole19/marvel/comm/model/comm_data/ResponseWrapper.java
// public class ResponseWrapper implements Serializable {
// 
//     private ResponseType type;
//     private Object payload;
// 
//     public ResponseWrapper() {
//     }
// 
//     public ResponseWrapper(Object payload, ResponseType type) {
//         this.payload = payload;
//         this.type = type;
//     }
// 
//     public Object getPayload() {
//         return payload;
//     }
// 
//     public void setPayload(Object payload) {
//         this.payload = payload;
//     }
// 
//     public ResponseType getType() {
//         return type;
//     }
// 
//     public void setType(ResponseType type) {
//         this.type = type;
//     }
// }
// 
// Path: comm/src/main/java/br/com/hole19/marvel/comm/model/EventCatalog.java
// public enum EventCatalog {
//     // Event 0000: List Characters
//     e0000("e0000"),
//     // Event 0001: List Comic Details
//     e0001("e0001"),
//     // Event 0002: Search character
//     e0002("e0002");
// 
//     private String mValue;
// 
//     EventCatalog(String status) {
//         this.mValue = status;
//     }
// 
//     public static EventCatalog fromString(String value) {
//         if (value != null) {
//             for (EventCatalog b : EventCatalog.values()) {
//                 if (value.equalsIgnoreCase(b.mValue)) {
//                     return b;
//                 }
//             }
//         }
//         return null;
//     }
// 
//     @Override
//     public String toString() {
//         if (this.mValue == null) {
//             return "";
//         }
//         return this.mValue;
//     }
// }
// 
// Path: comm/src/main/java/br/com/hole19/marvel/comm/post_office/NotificationCenter.java
// public class NotificationCenter {
// 
//     public static final String TAG = "NotificationCenter";
// 
//     // Event 0000: Get GCM Token
//     private static Set<TaskExecutor> mSubEvent0000 = new HashSet<>();
//     // Event 0001: List Comic Details
//     private static Set<TaskExecutor> mSubEvent0001 = new HashSet<>();
//     // Event 0002: Search character
//     private static Set<TaskExecutor> mSubEvent0002 = new HashSet<>();
// 
//     public static void notify(EventCatalog event, ResponseWrapper response) {
//         for (TaskExecutor tasker : NotificationCenter.getSubscriberList(event)) {
//             switch (response.getType()) {
//                 case SUCCESS:
//                     tasker.executeOnSuccessTask(response.getPayload());
//                     break;
//                 case ERROR:
//                     tasker.executeOnErrorTask(response.getPayload());
//                     break;
//             }
//         }
//     }
// 
//     public static class RegistrationCenter {
//         public static void registerForEvent(EventCatalog event, TaskExecutor subscriber) {
//             NotificationCenter.getSubscriberList(event).add(subscriber);
//         }
// 
//         public static void unregisterForEvent(EventCatalog event, TaskExecutor subscriber) {
//             NotificationCenter.getSubscriberList(event).remove(subscriber);
//         }
//     }
// 
//     private static Set<TaskExecutor> getSubscriberList(EventCatalog event) {
//         switch (event) {
//             case e0000:
//                 return NotificationCenter.mSubEvent0000;
//             case e0001:
//                 return NotificationCenter.mSubEvent0001;
//             case e0002:
//                 return NotificationCenter.mSubEvent0002;
//         }
//         return null;
//     }
// }


import android.content.Context;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONObject;
import br.com.hole19.marvel.comm.model.comm_data.ResponseType;
import br.com.hole19.marvel.comm.model.comm_data.ResponseWrapper;
import br.com.hole19.marvel.comm.model.EventCatalog;
import br.com.hole19.marvel.comm.post_office.NotificationCenter;
    private JsonObjectRequest mRequest;
    private RequestQueue mRequestQueue;

    public RestTemplate() {
        this.mUrl = "";
    }

    public void execute(Context context) {
        if (mRequestQueue == null) {
            mRequestQueue = Volley.newRequestQueue(context);
        }
        mRequestQueue.add(this.mRequest);
    }


    public void setBody(final EventCatalog event, int httpMethod) {
        this.mRequest = new JsonObjectRequest(
                httpMethod,
                this.mUrl,
                this.mPayload,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        ResponseWrapper responseWrapper = new ResponseWrapper(response, ResponseType.SUCCESS);
                        NotificationCenter.notify(event, responseWrapper);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
// Path: comm/src/main/java/br/com/hole19/marvel/comm/model/comm_data/ResponseType.java
// public enum ResponseType {
// 
//     SUCCESS("SUCCESS"), ERROR("ERROR");
// 
//     private String mValue;
// 
//     ResponseType(String value) {
//         this.mValue = value;
//     }
// 
//     @Override
//     public String toString() {
//         if (this.mValue == null) {
//             return "";
//         }
//         return this.mValue;
//     }
// 
// }
// 
// Path: comm/src/main/java/br/com/hole19/marvel/comm/model/comm_data/ResponseWrapper.java
// public class ResponseWrapper implements Serializable {
// 
//     private ResponseType type;
//     private Object payload;
// 
//     public ResponseWrapper() {
//     }
// 
//     public ResponseWrapper(Object payload, ResponseType type) {
//         this.payload = payload;
//         this.type = type;
//     }
// 
//     public Object getPayload() {
//         return payload;
//     }
// 
//     public void setPayload(Object payload) {
//         this.payload = payload;
//     }
// 
//     public ResponseType getType() {
//         return type;
//     }
// 
//     public void setType(ResponseType type) {
//         this.type = type;
//     }
// }
// 
// Path: comm/src/main/java/br/com/hole19/marvel/comm/model/EventCatalog.java
// public enum EventCatalog {
//     // Event 0000: List Characters
//     e0000("e0000"),
//     // Event 0001: List Comic Details
//     e0001("e0001"),
//     // Event 0002: Search character
//     e0002("e0002");
// 
//     private String mValue;
// 
//     EventCatalog(String status) {
//         this.mValue = status;
//     }
// 
//     public static EventCatalog fromString(String value) {
//         if (value != null) {
//             for (EventCatalog b : EventCatalog.values()) {
//                 if (value.equalsIgnoreCase(b.mValue)) {
//                     return b;
//                 }
//             }
//         }
//         return null;
//     }
// 
//     @Override
//     public String toString() {
//         if (this.mValue == null) {
//             return "";
//         }
//         return this.mValue;
//     }
// }
// 
// Path: comm/src/main/java/br/com/hole19/marvel/comm/post_office/NotificationCenter.java
// public class NotificationCenter {
// 
//     public static final String TAG = "NotificationCenter";
// 
//     // Event 0000: Get GCM Token
//     private static Set<TaskExecutor> mSubEvent0000 = new HashSet<>();
//     // Event 0001: List Comic Details
//     private static Set<TaskExecutor> mSubEvent0001 = new HashSet<>();
//     // Event 0002: Search character
//     private static Set<TaskExecutor> mSubEvent0002 = new HashSet<>();
// 
//     public static void notify(EventCatalog event, ResponseWrapper response) {
//         for (TaskExecutor tasker : NotificationCenter.getSubscriberList(event)) {
//             switch (response.getType()) {
//                 case SUCCESS:
//                     tasker.executeOnSuccessTask(response.getPayload());
//                     break;
//                 case ERROR:
//                     tasker.executeOnErrorTask(response.getPayload());
//                     break;
//             }
//         }
//     }
// 
//     public static class RegistrationCenter {
//         public static void registerForEvent(EventCatalog event, TaskExecutor subscriber) {
//             NotificationCenter.getSubscriberList(event).add(subscriber);
//         }
// 
//         public static void unregisterForEvent(EventCatalog event, TaskExecutor subscriber) {
//             NotificationCenter.getSubscriberList(event).remove(subscriber);
//         }
//     }
// 
//     private static Set<TaskExecutor> getSubscriberList(EventCatalog event) {
//         switch (event) {
//             case e0000:
//                 return NotificationCenter.mSubEvent0000;
//             case e0001:
//                 return NotificationCenter.mSubEvent0001;
//             case e0002:
//                 return NotificationCenter.mSubEvent0002;
//         }
//         return null;
//     }
// }


// Path: comm/src/main/java/br/com/hole19/marvel/comm/util/RestTemplate.java
import android.content.Context;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONObject;
import br.com.hole19.marvel.comm.model.comm_data.ResponseType;
import br.com.hole19.marvel.comm.model.comm_data.ResponseWrapper;
import br.com.hole19.marvel.comm.model.EventCatalog;
import br.com.hole19.marvel.comm.post_office.NotificationCenter;

    private JsonObjectRequest mRequest;
    private RequestQueue mRequestQueue;

    public RestTemplate() {
        this.mUrl = "";
    }

    public void execute(Context context) {
        if (mRequestQueue == null) {
            mRequestQueue = Volley.newRequestQueue(context);
        }
        mRequestQueue.add(this.mRequest);
    }


    public void setBody(final EventCatalog event, int httpMethod) {
        this.mRequest = new JsonObjectRequest(
                httpMethod,
                this.mUrl,
                this.mPayload,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        ResponseWrapper responseWrapper = new ResponseWrapper(response, ResponseType.SUCCESS);
                        NotificationCenter.notify(event, responseWrapper);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        ResponseWrapper response = new ResponseWrapper(error.getMessage(), ResponseType.ERROR);