From c67aa347ce973ff4f213d5e1751fc2ca424aee54 Mon Sep 17 00:00:00 2001 From: Taras Kunyk Date: Wed, 29 Apr 2015 17:28:49 +0300 Subject: [PATCH] 1. Error parsing logic implemented --- .../ls/drupal/AbstractBaseDrupalEntity.java | 31 +++++++++++--- .../main/java/com/ls/drupal/DrupalClient.java | 40 +++++++++---------- .../java/com/ls/http/base/BaseRequest.java | 24 +++++++---- .../java/com/ls/http/base/RequestConfig.java | 7 ++++ .../java/com/ls/http/base/ResponseData.java | 10 +++++ .../com/ls/util/image/DrupalImageView.java | 6 +-- .../com/ls/drupal8demo/ArticleFragment.java | 2 +- .../adapters/CategoryArticlesListAdapter.java | 2 +- 8 files changed, 84 insertions(+), 38 deletions(-) diff --git a/library/src/main/java/com/ls/drupal/AbstractBaseDrupalEntity.java b/library/src/main/java/com/ls/drupal/AbstractBaseDrupalEntity.java index 4552d16..f006b39 100644 --- a/library/src/main/java/com/ls/drupal/AbstractBaseDrupalEntity.java +++ b/library/src/main/java/com/ls/drupal/AbstractBaseDrupalEntity.java @@ -61,7 +61,7 @@ public abstract class AbstractBaseDrupalEntity implements DrupalClient.OnRespons public interface OnEntityRequestListener { void onRequestCompleted(AbstractBaseDrupalEntity entity, Object tag, ResponseData data); - void onRequestFailed(AbstractBaseDrupalEntity entity, Object tag, VolleyError error); + void onRequestFailed(AbstractBaseDrupalEntity entity, Object tag, ResponseData data); void onRequestCanceled(AbstractBaseDrupalEntity entity, Object tag); } @@ -223,15 +223,15 @@ public void onResponseReceived(ResponseData data, Object tag) } @Override - public void onError(VolleyError error, Object tag) + public void onError(ResponseData data, Object tag) { DrupalEntityTag entityTag = (DrupalEntityTag)tag; if(entityTag.listener != null) { - entityTag.listener.onRequestFailed(this,entityTag.requestTag,error); + entityTag.listener.onRequestFailed(this,entityTag.requestTag,data); } - if(VolleyResponseUtils.isNetworkingError(error)) + if(VolleyResponseUtils.isNetworkingError(data.getError())) { ConnectionManager.instance().setConnected(false); } @@ -261,6 +261,16 @@ protected void consumeObject(ResponseData data) AbstractBaseDrupalEntity.consumeObject(consumer, data.getData()); } + /** + * Method is used in order to apply server error response result object to current instance + * You can override this method in order to perform custom cloning. Default implementation does nothing + * @param data + */ + protected void consumeError(ResponseData data) + { + //Just a method stub to be overriden with children. + } + /** * @param method * @param resultClass @@ -272,6 +282,7 @@ protected RequestConfig getRequestConfig(RequestMethod method,Object resultClass RequestConfig config = new RequestConfig(resultClass); config.setRequestFormat(getItemRequestFormat(method)); config.setResponseFormat(getItemResponseFormat(method)); + config.setErrorResponseClassSpecifier(getItemErrorResponseClassSpecifier(method)); return config; } @@ -329,7 +340,7 @@ protected Object getManagedDataClassSpecifyer() } /** - * @param method is instance od {@link com.ls.http.base.BaseRequest.RequestMethod} enum, this method is called for. it can be "GET", "POST", "PUT" ,"PATCH" or "DELETE". + * @param method is instance of {@link com.ls.http.base.BaseRequest.RequestMethod} enum, this method is called for. it can be "GET", "POST", "PUT" ,"PATCH" or "DELETE". * @return the format entity will be serialized to. You can override this method in order to customize return. If null returned - default client format will be performed. */ protected BaseRequest.RequestFormat getItemRequestFormat(RequestMethod method){ @@ -337,13 +348,21 @@ protected BaseRequest.RequestFormat getItemRequestFormat(RequestMethod method){ }; /** - * @param method is instance od {@link com.ls.http.base.BaseRequest.RequestMethod} enum, this method is called for. it can be "GET", "POST", "PUT" ,"PATCH" or "DELETE". + * @param method is instance of {@link com.ls.http.base.BaseRequest.RequestMethod} enum, this method is called for. it can be "GET", "POST", "PUT" ,"PATCH" or "DELETE". * @return the format response entity will be formatted to. You can override this method in order to customize return. If null returned - default client format will be performed. */ protected BaseRequest.ResponseFormat getItemResponseFormat(RequestMethod method){ return null; }; + /** + * @param method is instance of {@link com.ls.http.base.BaseRequest.RequestMethod} enum, this method is called for. it can be "GET", "POST", "PUT" ,"PATCH" or "DELETE". + * @return Class or Type, returned as parsedError field of ResultData object, can be null if you don't need one. + */ + protected Object getItemErrorResponseClassSpecifier(RequestMethod method){ + return null; + }; + public DrupalClient getDrupalClient() { return drupalClient; diff --git a/library/src/main/java/com/ls/drupal/DrupalClient.java b/library/src/main/java/com/ls/drupal/DrupalClient.java index 395f541..e9a4342 100644 --- a/library/src/main/java/com/ls/drupal/DrupalClient.java +++ b/library/src/main/java/com/ls/drupal/DrupalClient.java @@ -70,7 +70,7 @@ public static interface OnResponseListener { void onResponseReceived(ResponseData data, Object tag); - void onError(VolleyError error, Object tag); + void onError(ResponseData data, Object tag); void onCancel(Object tag); } @@ -216,19 +216,19 @@ public void onResponseReceived(ResponseData data, Object tag) { } @Override - public void onError(VolleyError error, Object tag) { - if (VolleyResponseUtils.isAuthError(error)) { + public void onError(ResponseData data, Object tag) { + if (VolleyResponseUtils.isAuthError(data.getError())) { if (loginManager.canRestoreLogin()) { - new RestoreLoginAttemptTask(request, listener, tag, error).execute(); + new RestoreLoginAttemptTask(request, listener, tag, data).execute(); } else { loginManager.onLoginRestoreFailed(); if (listener != null) { - listener.onError(error, tag); + listener.onError(data, tag); } } } else { if (listener != null) { - listener.onError(error, tag); + listener.onError(data, tag); } } } @@ -254,16 +254,16 @@ public void onResponseReceived(ResponseData data, Object tag) { } @Override - public void onError(VolleyError error, Object tag) { - if (VolleyResponseUtils.isAuthError(error)) { + public void onError(ResponseData data, Object tag) { + if (VolleyResponseUtils.isAuthError(data.getError())) { if (!loginManager.canRestoreLogin()) { if (listener != null) { - listener.onError(error, tag); + listener.onError(data, tag); } } } else { if (listener != null) { - listener.onError(error, tag); + listener.onError(data, tag); } } } @@ -283,7 +283,7 @@ public void onCancel(Object tag) { if (restored) { result = performRequestNoLoginRestore(request, tag, new OnResponseAuthListenerDecorator(listener), true); } else { - listener.onError(result.getError(), tag); + listener.onError(result, tag); } } else { loginManager.onLoginRestoreFailed(); @@ -477,14 +477,14 @@ public void onResponseReceived(ResponseData data, BaseRequest request) { } @Override - public void onError(VolleyError error, BaseRequest request) { + public void onError(ResponseData data, BaseRequest request) { synchronized (listeners) { List listenerList = this.listeners.getListenersForRequest(request); this.listeners.removeListenersForRequest(request); this.onRequestComplete(); if (listenerList != null) { for (ResponseListenersSet.ListenerHolder holder : listenerList) { - holder.getListener().onError(error, holder.getTag()); + holder.getListener().onError(data, holder.getTag()); } } } @@ -630,12 +630,12 @@ public void onResponseReceived(ResponseData data, Object tag) { } @Override - public void onError(VolleyError error, Object tag) { - if (VolleyResponseUtils.isAuthError(error)) { + public void onError(ResponseData data, Object tag) { + if (VolleyResponseUtils.isAuthError(data.getError())) { loginManager.onLoginRestoreFailed(); } if (listener != null) { - this.listener.onError(error, tag); + this.listener.onError(data, tag); } } @@ -652,13 +652,13 @@ private class RestoreLoginAttemptTask { private final BaseRequest request; private final OnResponseListener listener; private final Object tag; - private final VolleyError originError; + private final ResponseData originData; - RestoreLoginAttemptTask(BaseRequest request, OnResponseListener listener, Object tag, VolleyError originError) { + RestoreLoginAttemptTask(BaseRequest request, OnResponseListener listener, Object tag, ResponseData originData) { this.request = request; this.listener = listener; this.tag = tag; - this.originError = originError; + this.originData = originData; } public void execute() { @@ -670,7 +670,7 @@ public void run() { if (restored) { performRequestNoLoginRestore(request, tag, new OnResponseAuthListenerDecorator(listener), false); } else { - listener.onError(originError, tag); + listener.onError(originData, tag); } } }.start(); diff --git a/library/src/main/java/com/ls/http/base/BaseRequest.java b/library/src/main/java/com/ls/http/base/BaseRequest.java index 99c85f5..c8507ac 100644 --- a/library/src/main/java/com/ls/http/base/BaseRequest.java +++ b/library/src/main/java/com/ls/http/base/BaseRequest.java @@ -75,22 +75,25 @@ public static enum ResponseFormat { private final RequestFormat requestFormat; private final ResponseFormat responseFormat; - private final RequestFuture syncLock; - private final Object responseClasSpecifier; private String defaultCharset; - private OnResponseListener responseListener; private Map requestHeaders; private Map postParameters; private Map getParameters; private Object objectToPost; - private RequestHandler requestHandler; + //Do not use during comparison + + private final RequestFuture syncLock; + private final Object responseClasSpecifier; + private final Object errorResponseClasSpecifier; + private RequestHandler requestHandler; private ResponseHandler responseHandler; + private ResponseHandler errorResponseHandler; private ResponseData result; - + private OnResponseListener responseListener; private boolean smartComparisonEnabled = false; /** @@ -119,6 +122,7 @@ protected BaseRequest(RequestMethod requestMethod, String requestUrl,RequestConf this.responseHandler = Handler.getResponseHandlerForFormat(this.responseFormat); this.initRequestHeaders(); this.responseClasSpecifier = requestConfig.getResponseClassSpecifier(); + this.errorResponseClasSpecifier = requestConfig.getErrorResponseClassSpecifier(); } @@ -163,8 +167,14 @@ protected VolleyError parseNetworkError(VolleyError volleyError) { if (volleyError.networkResponse != null) { this.result.headers = new HashMap(volleyError.networkResponse.headers); this.result.statusCode = volleyError.networkResponse.statusCode; + if(this.errorResponseClasSpecifier!= null) + { + Response result = this.responseHandler.parseNetworkResponse(volleyError.networkResponse,responseClasSpecifier); + this.result.parsedErrorResponse = result.result; + } } this.result.error = error; + return error; } @@ -180,7 +190,7 @@ protected void deliverResponse(ResponseData o) { public void deliverError(VolleyError error) { this.syncLock.onErrorResponse(error); if (this.responseListener != null) { - this.responseListener.onError(error, this); + this.responseListener.onError(result, this); } } @@ -188,7 +198,7 @@ public static interface OnResponseListener { void onResponseReceived(ResponseData data, BaseRequest request); - void onError(VolleyError error, BaseRequest request); + void onError(ResponseData data, BaseRequest request); } public OnResponseListener getResponseListener() { diff --git a/library/src/main/java/com/ls/http/base/RequestConfig.java b/library/src/main/java/com/ls/http/base/RequestConfig.java index b29d32a..380337e 100644 --- a/library/src/main/java/com/ls/http/base/RequestConfig.java +++ b/library/src/main/java/com/ls/http/base/RequestConfig.java @@ -29,6 +29,7 @@ public class RequestConfig { private BaseRequest.RequestFormat requestFormat; private BaseRequest.ResponseFormat responseFormat; private Object responseClassSpecifier; + private Object errorResponseClassSpecifier; public RequestConfig() { @@ -77,5 +78,11 @@ public void setResponseClassSpecifier(Object responseClassSpecifier) { this.responseClassSpecifier = responseClassSpecifier; } + public Object getErrorResponseClassSpecifier() { + return errorResponseClassSpecifier; + } + public void setErrorResponseClassSpecifier(Object errorResponseClassSpecifier) { + this.errorResponseClassSpecifier = errorResponseClassSpecifier; + } } diff --git a/library/src/main/java/com/ls/http/base/ResponseData.java b/library/src/main/java/com/ls/http/base/ResponseData.java index 599a3ef..4b37acc 100644 --- a/library/src/main/java/com/ls/http/base/ResponseData.java +++ b/library/src/main/java/com/ls/http/base/ResponseData.java @@ -31,6 +31,7 @@ public class ResponseData { protected Map headers; protected int statusCode; protected VolleyError error; + protected Object parsedErrorResponse; /** @@ -52,12 +53,21 @@ public VolleyError getError() { return error; } + /** + * + * @return parsed error response is errorResponseSpecifier was provided and error received. + */ + public Object getParsedErrorResponse() { + return parsedErrorResponse; + } + public void cloneTo(ResponseData target) { target.data = data; target.headers = headers; target.statusCode = statusCode; target.error = error; + target.parsedErrorResponse = parsedErrorResponse; } } diff --git a/library/src/main/java/com/ls/util/image/DrupalImageView.java b/library/src/main/java/com/ls/util/image/DrupalImageView.java index 693f2c0..2b4f92f 100644 --- a/library/src/main/java/com/ls/util/image/DrupalImageView.java +++ b/library/src/main/java/com/ls/util/image/DrupalImageView.java @@ -336,13 +336,13 @@ public void onRequestCompleted(AbstractBaseDrupalEntity entity, Object tag, Resp } @Override - public void onRequestFailed(AbstractBaseDrupalEntity entity, Object tag, VolleyError error) { + public void onRequestFailed(AbstractBaseDrupalEntity entity, Object tag, ResponseData data) { if(checkCurrentURL()) { applyNoImageDrawableIfNeeded(); } if(imageLoadingListener != null) { - imageLoadingListener.onImageLoadingFailed(DrupalImageView.this, error); + imageLoadingListener.onImageLoadingFailed(DrupalImageView.this, data); } } @@ -365,7 +365,7 @@ private boolean checkCurrentURL() public static interface ImageLoadingListener{ void onImageLoadingComplete(DrupalImageView view, Drawable image); - void onImageLoadingFailed(DrupalImageView view,VolleyError error); + void onImageLoadingFailed(DrupalImageView view,ResponseData data); void onImageLoadingCancelled(DrupalImageView view,String path); } diff --git a/sample/src/main/java/com/ls/drupal8demo/ArticleFragment.java b/sample/src/main/java/com/ls/drupal8demo/ArticleFragment.java index d3b67b3..b628499 100644 --- a/sample/src/main/java/com/ls/drupal8demo/ArticleFragment.java +++ b/sample/src/main/java/com/ls/drupal8demo/ArticleFragment.java @@ -149,7 +149,7 @@ public void onRequestCompleted(AbstractBaseDrupalEntity entity, Object tag, Resp } @Override - public void onRequestFailed(AbstractBaseDrupalEntity entity, Object tag, VolleyError error) { + public void onRequestFailed(AbstractBaseDrupalEntity entity, Object tag, ResponseData data) { Toast.makeText(getActivity(), "Page fetch failed", Toast.LENGTH_SHORT).show(); resetPageContent(); } diff --git a/sample/src/main/java/com/ls/drupal8demo/adapters/CategoryArticlesListAdapter.java b/sample/src/main/java/com/ls/drupal8demo/adapters/CategoryArticlesListAdapter.java index 908f81e..c9f9a50 100644 --- a/sample/src/main/java/com/ls/drupal8demo/adapters/CategoryArticlesListAdapter.java +++ b/sample/src/main/java/com/ls/drupal8demo/adapters/CategoryArticlesListAdapter.java @@ -180,7 +180,7 @@ public void onRequestCompleted(AbstractBaseDrupalEntity entity, Object tag, Resp } @Override - public void onRequestFailed(AbstractBaseDrupalEntity entity, Object tag, VolleyError error) { + public void onRequestFailed(AbstractBaseDrupalEntity entity, Object tag, ResponseData data) { setCanLoadMore(false); }