package kidozen.client.internal; import org.apache.http.HttpStatus; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.json.JSONTokener; import kidozen.client.ServiceEvent; import kidozen.client.ServiceEventListener; import kidozen.client.ServiceResponseHandler; /** * Created by christian on 8/14/14. */ public class EAPIEventListener implements ServiceEventListener { private ServiceEventListener mOriginalCaller; public EAPIEventListener(ServiceEventListener originalCaller) { mOriginalCaller = originalCaller; } @Override public void onFinish(ServiceEvent e) { if (mOriginalCaller!=null) { ServiceEvent event = null; if (e.StatusCode >= HttpStatus.SC_BAD_REQUEST) { event = createErrorEvent(e, e.Body); if (mOriginalCaller instanceof ServiceResponseHandler) dispatchServiceResponseListener(event, (ServiceResponseHandler) mOriginalCaller); else mOriginalCaller.onFinish(event); } else { JSONObject response = (JSONObject) e.Response; String body = response.optString("data"); if (body != null) { event = createServiceEvent(e, body); } else { body = response.optString("error"); event = createErrorEvent(e, body); } if (mOriginalCaller instanceof ServiceResponseHandler) dispatchServiceResponseListener(event, (ServiceResponseHandler) mOriginalCaller); else mOriginalCaller.onFinish(event); } } } private ServiceEvent createErrorEvent (ServiceEvent e, String body) { ServiceEvent event = new ServiceEvent(e.Body); if (body.isEmpty() || body==null) { String error = "'data' or 'error' property not found. Please contact service administrator"; event = new ServiceEvent(this, HttpStatus.SC_BAD_REQUEST, null, error, new Exception(error)); } else { try { Object json = new JSONTokener(body).nextValue(); if (json instanceof JSONObject) { //System.out.println("JsonEventListener, Setting a new JSONObject" ); JSONObject theObject = new JSONObject(body); event = new ServiceEvent(this, e.StatusCode, body, theObject); } else if (json instanceof String) { //System.out.println("JsonEventListener, Setting a new String" ); event = new ServiceEvent(this, e.StatusCode, body, body); } } catch (JSONException ex) { event = new ServiceEvent(this, HttpStatus.SC_BAD_REQUEST, null, ex.getMessage(), ex); } } return event; } private ServiceEvent createServiceEvent(ServiceEvent e, String body) { ServiceEvent event = new ServiceEvent(e.Response); try { Object json = new JSONTokener(body).nextValue(); if (json instanceof JSONObject) { //System.out.println("JsonEventListener, doInBackground, Setting a new JSONObject" ); JSONObject theObject = new JSONObject(body); event = new ServiceEvent(this, e.StatusCode, body, theObject); } else if (json instanceof JSONArray) { //System.out.println("JsonEventListener, doInBackground, Setting a new JSONArray" ); JSONArray theObject = new JSONArray(body); event = new ServiceEvent(this, e.StatusCode, body, theObject); } } catch(JSONException ex) { event = new ServiceEvent(this, HttpStatus.SC_BAD_REQUEST, null, ex.getMessage(), ex); } return event; } private void dispatchServiceResponseListener(final ServiceEvent e,final ServiceResponseHandler callback) { if (e.StatusCode >= HttpStatus.SC_MULTIPLE_CHOICES) { callback.onError(e.StatusCode, e.Body); } else { try { Object json = new JSONTokener(e.Body).nextValue(); if (json instanceof JSONObject) { JSONObject theObject = new JSONObject(e.Body); callback.onSuccess(e.StatusCode, theObject); } else if (json instanceof JSONArray) { JSONArray o = (JSONArray) e.Response; callback.onSuccess(e.StatusCode, o); } } catch (JSONException e1) { callback.onError(e.StatusCode, e1.getMessage()); } } } }