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

Commit

Permalink
1. Duplicate request filter "reject" option implemented.
Browse files Browse the repository at this point in the history
  • Loading branch information
TarasKunyk committed Apr 30, 2015
1 parent c67aa34 commit 64d45a1
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 14 deletions.
33 changes: 20 additions & 13 deletions library/src/main/java/com/ls/drupal/DrupalClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.Volley;
import com.ls.drupal.login.AnonymousLoginManager;
import com.ls.drupal.login.ILoginManager;
Expand All @@ -35,7 +34,6 @@
import com.ls.http.base.BaseRequest.RequestMethod;
import com.ls.http.base.RequestConfig;
import com.ls.http.base.ResponseData;
import com.ls.util.L;
import com.ls.util.internal.VolleyResponseUtils;

import android.content.Context;
Expand All @@ -52,6 +50,7 @@
* @author lemberg
*/
public class DrupalClient implements OnResponseListener {
public enum DuplicateRequestPolicy {ALLOW,ATTACH,REJECT}

private final RequestFormat requestFormat;
private String baseURL;
Expand All @@ -64,7 +63,7 @@ public class DrupalClient implements OnResponseListener {

private int requestTimeout = 1500;

private boolean allowDuplicateRequests = true;
private DuplicateRequestPolicy duplicateRequestPolicy = DuplicateRequestPolicy.ATTACH;

public static interface OnResponseListener {

Expand Down Expand Up @@ -183,17 +182,22 @@ protected ResponseData performRequestNoLoginRestore(BaseRequest request, Object
request.setTag(tag);
request.setResponseListener(this);
this.loginManager.applyLoginDataToRequest(request);
request.setSmartComparisonEnabled(!this.allowDuplicateRequests);
request.setSmartComparisonEnabled(this.duplicateRequestPolicy !=DuplicateRequestPolicy.ALLOW);

boolean wasRegisterred ;
boolean skipDuplicateRequestListeners = this.duplicateRequestPolicy == DrupalClient.DuplicateRequestPolicy.REJECT;
synchronized (listeners) {
wasRegisterred = this.listeners.registerListenerForRequest(request, listener,tag);
wasRegisterred = this.listeners.registerListenerForRequest(request, listener,tag,skipDuplicateRequestListeners);
}

if(wasRegisterred||synchronous) {
this.onNewRequestStarted();
return request.performRequest(synchronous, queue);
}else{
if(skipDuplicateRequestListeners && listener != null)
{
listener.onCancel(tag);
}
return null;
}
}
Expand Down Expand Up @@ -519,19 +523,22 @@ public void cancelAll() {
}

/**
* If true - duplicate simultaneous requests will be ignored (all response listeners will be triggered after first unique request instance completes). Similarity is defined based on requests "equals" value
* @return
* @return current duplicate request policy
*/
public boolean isAllowDuplicateRequests() {
return allowDuplicateRequests;
public DuplicateRequestPolicy getDuplicateRequestPolicy() {
return duplicateRequestPolicy;
}

/**
* If true - duplicate simultaneous requests will be ignored (all response listeners will be triggered after first unique request instance completes). Similarity is defined based on requests "equals" value
* @param allowDuplicateRequests
* Sets duplicate request handling policy according to parameter provided. Only simultaneous requests are compared (executing at the same time).
* @param duplicateRequestPolicy in case if
* "ALLOW" - all requests are performed
* "ATTACH" - only first unique request from queue will be performed all other listeners will be attached to this request and triggered.
* "REJECT" - only first unique request from queue will be performed and it's listener triggered. "onCancel()" listener method will be called for all requests skipped.
* Default value is "ALLOW"
*/
public void setAllowDuplicateRequests(boolean allowDuplicateRequests) {
this.allowDuplicateRequests = allowDuplicateRequests;
public void setDuplicateRequestPolicy(DuplicateRequestPolicy duplicateRequestPolicy) {
this.duplicateRequestPolicy = duplicateRequestPolicy;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,15 +46,22 @@ public ResponseListenersSet()
* @param listener listener to register for request
* @return true if new request was registered, false otherwise
*/
public boolean registerListenerForRequest(Request request,DrupalClient.OnResponseListener listener,Object tag)
public boolean registerListenerForRequest(Request request,DrupalClient.OnResponseListener listener,Object tag,boolean skipDuplicateRequestListeners)
{
boolean result = false;
List<ListenerHolder> listenersList = listeners.get(request);

if(listenersList == null)
{
listenersList = new LinkedList<ListenerHolder>();
listeners.put(request,listenersList);
result = true;
}else{
if(!listenersList.isEmpty() && skipDuplicateRequestListeners)
{
//We don't add duplicate listners in case of reject policy
return result;
}
}

listenersList.add(new ListenerHolder(listener,tag));
Expand Down

0 comments on commit 64d45a1

Please sign in to comment.