/* * Copyright 2010 Google Inc. * * 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 com.google.gwt.sample.expenses.shared; import com.google.web.bindery.requestfactory.shared.EntityProxy; import java.util.Collections; import java.util.HashSet; import java.util.Set; /** * A helper class for dealing with proxy types. Subclass it and override the * various handle methods for type specific handling of proxy objects or * classes, then call {@link #process(Class)} or {@link #process(Object)}. * Optionally use {#setResult} to set the return value of the {@link #process} * call. * <P> * Use {@link #getAll} for a set of all proxy types. * * @param <T> the type to filter to */ public abstract class ExpensesEntityTypesProcessor<T> { /** * Return a set of all proxy types available to this application. */ public static Set<Class<? extends EntityProxy>> getAll() { Set<Class<? extends EntityProxy>> rtn = new HashSet<Class<? extends EntityProxy>>(); rtn.add(EmployeeProxy.class); rtn.add(ReportProxy.class); return Collections.unmodifiableSet(rtn); } private static void process(ExpensesEntityTypesProcessor<?> processor, Class<?> clazz) { if (EmployeeProxy.class.equals(clazz)) { processor.handleEmployee((EmployeeProxy) null); return; } if (ReportProxy.class.equals(clazz)) { processor.handleReport((ReportProxy) null); return; } processor.handleNonProxy(null); } private static void process(ExpensesEntityTypesProcessor<?> processor, Object proxy) { if (proxy instanceof EmployeeProxy) { processor.handleEmployee((EmployeeProxy) proxy); return; } if (proxy instanceof ReportProxy) { processor.handleReport((ReportProxy) proxy); return; } processor.handleNonProxy(proxy); } private final T defaultValue; private T result; /** * Create an instance with a null default value. */ public ExpensesEntityTypesProcessor() { defaultValue = null; } /** * Create an instance with the given default value. * * @param defaultValue the value that will be returned by {@link #process} if * {@link #setResult} is not called. */ public ExpensesEntityTypesProcessor(T defaultValue) { this.defaultValue = defaultValue; } public abstract void handleEmployee(EmployeeProxy proxy); /** * Called if {@link #process} is called with a non-proxy object. This default * implementation does nothing. */ public void handleNonProxy(@SuppressWarnings("unused") Object object) { } public abstract void handleReport(ReportProxy proxy); /** * Call the handle method of the appropriate type, with a null argument. Note * that this will not work as expected on the class objects returned by the * {@link #getClass()} method of a proxy object, due to limitations of GWT's * metadata. It will only work with against class objects in the set returned * by {@link #getAll()}, or returned by * {@link com.google.web.bindery.requestfactory.shared.RequestFactory#getClass(EntityProxy)} * or * {@link com.google.web.bindery.requestfactory.shared.RequestFactory#getClass(String)} * . * * @param clazz the proxy type to resolve * @return the value provided via {@link #setResult}, or the default value */ public T process(Class<?> clazz) { setResult(defaultValue); ExpensesEntityTypesProcessor.process(this, clazz); return result; } /** * Process a proxy object. * * @param proxy the proxy to process * @return the value provided via {@link #setResult}, or the default value */ public T process(Object proxy) { setResult(defaultValue); ExpensesEntityTypesProcessor.process(this, proxy); return result; } /** * Set the value to return from a call to {@link #process(Class)} or * {@link #process(Object)}. * * @param result the value to return */ protected void setResult(T result) { this.result = result; } }