/** * Copyright (C) 2009-2012 the original author or authors. * See the notice.md file distributed with this work for additional * information regarding copyright ownership. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.fusesource.restygwt.client.dispatcher; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; import org.fusesource.restygwt.client.Method; import com.google.gwt.core.client.GWT; import com.google.gwt.http.client.Request; import com.google.gwt.http.client.RequestBuilder; import com.google.gwt.http.client.RequestException; import com.google.gwt.logging.client.LogConfiguration; /** * Some valuable ideas came from: * http://turbomanage.wordpress.com/2010/07/12/caching-batching-dispatcher-for-gwt-dispatch/ * * Thanks David! * * Especially: - Waiting if a particular request is already on the way * (otherwise you end up having many requests on the same source. * * @author <a href="mailto:mail@raphaelbauer.com">rEyez</a> * @author <a href="http://hiramchirino.com">Hiram Chirino</a> */ public class DefaultFilterawareDispatcher implements FilterawareDispatcher { public static DefaultFilterawareDispatcher INSTANCE; /** * list of dispatcherfilters to be performed when an request is done */ final protected List<DispatcherFilter> dispatcherFilters = new ArrayList<DispatcherFilter>(); /** * get one instance of this class * * @return the DefaultFilterawareDispatcher singleton */ public static DefaultFilterawareDispatcher singleton() { if (null != INSTANCE) return INSTANCE; INSTANCE = new DefaultFilterawareDispatcher(); return INSTANCE; } public DefaultFilterawareDispatcher(){ } public DefaultFilterawareDispatcher(DispatcherFilter... filters){ for(DispatcherFilter filter: filters){ addFilter(filter); } } @Override public Request send(Method method, RequestBuilder builder) throws RequestException { for (DispatcherFilter f : dispatcherFilters) { if (!f.filter(method, builder)) { // filter returned false, no continue if (GWT.isClient() && LogConfiguration.loggingIsEnabled()) { Logger.getLogger(DefaultFilterawareDispatcher.class.getName()) .fine(f.getClass() + " told me not to continue filtering for: " + builder.getHTTPMethod() + " " + builder.getUrl()); } return null; } } return builder.send(); } /** * well, add one more dispatcherfilter */ @Override public void addFilter(DispatcherFilter filter) { this.dispatcherFilters.add(filter); } }