Skip to content
This repository has been archived by the owner on Sep 26, 2023. It is now read-only.

Commit

Permalink
1. Error parsing logic implemented
Browse files Browse the repository at this point in the history
  • Loading branch information
TarasKunyk committed Apr 29, 2015
1 parent 85a8476 commit c67aa34
Show file tree
Hide file tree
Showing 8 changed files with 84 additions and 38 deletions.
31 changes: 25 additions & 6 deletions library/src/main/java/com/ls/drupal/AbstractBaseDrupalEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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
Expand All @@ -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;
}

Expand Down Expand Up @@ -329,21 +340,29 @@ 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){
return null;
};

/**
* @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;
Expand Down
40 changes: 20 additions & 20 deletions library/src/main/java/com/ls/drupal/DrupalClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -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);
}
}
}
Expand All @@ -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);
}
}
}
Expand All @@ -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();
Expand Down Expand Up @@ -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<ResponseListenersSet.ListenerHolder> 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());
}
}
}
Expand Down Expand Up @@ -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);
}
}

Expand All @@ -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() {
Expand All @@ -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();
Expand Down
24 changes: 17 additions & 7 deletions library/src/main/java/com/ls/http/base/BaseRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -75,22 +75,25 @@ public static enum ResponseFormat {
private final RequestFormat requestFormat;
private final ResponseFormat responseFormat;

private final RequestFuture<ResponseData> syncLock;
private final Object responseClasSpecifier;
private String defaultCharset;

private OnResponseListener responseListener;

private Map<String, String> requestHeaders;
private Map<String, String> postParameters;
private Map<String, String> getParameters;
private Object objectToPost;

private RequestHandler requestHandler;

//Do not use during comparison

private final RequestFuture<ResponseData> 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;

/**
Expand Down Expand Up @@ -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();
}


Expand Down Expand Up @@ -163,8 +167,14 @@ protected VolleyError parseNetworkError(VolleyError volleyError) {
if (volleyError.networkResponse != null) {
this.result.headers = new HashMap<String, String>(volleyError.networkResponse.headers);
this.result.statusCode = volleyError.networkResponse.statusCode;
if(this.errorResponseClasSpecifier!= null)
{
Response<ResponseData> result = this.responseHandler.parseNetworkResponse(volleyError.networkResponse,responseClasSpecifier);
this.result.parsedErrorResponse = result.result;
}
}
this.result.error = error;

return error;
}

Expand All @@ -180,15 +190,15 @@ 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);
}
}

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() {
Expand Down
7 changes: 7 additions & 0 deletions library/src/main/java/com/ls/http/base/RequestConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ public class RequestConfig {
private BaseRequest.RequestFormat requestFormat;
private BaseRequest.ResponseFormat responseFormat;
private Object responseClassSpecifier;
private Object errorResponseClassSpecifier;

public RequestConfig()
{
Expand Down Expand Up @@ -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;
}
}
10 changes: 10 additions & 0 deletions library/src/main/java/com/ls/http/base/ResponseData.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ public class ResponseData {
protected Map<String, String> headers;
protected int statusCode;
protected VolleyError error;
protected Object parsedErrorResponse;


/**
Expand All @@ -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;
}

}
6 changes: 3 additions & 3 deletions library/src/main/java/com/ls/util/image/DrupalImageView.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

Expand All @@ -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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down

0 comments on commit c67aa34

Please sign in to comment.