All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.google.web.bindery.requestfactory.shared.Locator Maven / Gradle / Ivy

There is a newer version: 2.10.0
Show newest version
/*
 * 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.web.bindery.requestfactory.shared;

/**
 * A Locator allows entity types that do not conform to the RequestFactory
 * entity protocol to be used. Instead of attempting to use a {@code findFoo()},
 * {@code getId()}, and {@code getVersion()} declared in the domain entity type,
 * an instance of a Locator will be created to provide implementations of these
 * methods.
 * 

* Locator subtypes must be default instantiable (i.e. public static types with * a no-arg constructor). Instances of Locators may be retained and reused by * the RequestFactory service layer. * * @param the type of domain object the Locator will operate on * @param the type of object the Locator expects to use as an id for the * domain object * @see ProxyFor#locator() */ public abstract class Locator { /** * Create a new instance of the requested type. * * @param clazz the type of object to create * @return the new instance of the domain type */ public abstract T create(Class clazz); /** * Retrieve an object. May return {@code null} to indicate that the requested * object could not be found. * * @param clazz the type of object to retrieve * @param id an id previously returned from {@link #getId(Object)} * @return the requested object or {@code null} if it could not be found */ public abstract T find(Class clazz, I id); /** * Returns the {@code T} type. */ public abstract Class getDomainType(); /** * Returns a domain object to be used as the id for the given object. This * method may return {@code null} if the object has not been persisted or * should be treated as irretrievable. * * @param domainObject the object to obtain an id for * @return the object's id or {@code null} */ public abstract I getId(T domainObject); /** * Returns the {@code I} type. */ public abstract Class getIdType(); /** * Returns a domain object to be used as the version for the given object. * This method may return {@code null} if the object has not been persisted or * should be treated as irretrievable. * * @param domainObject the object to obtain an id for * @return the object's version or {@code null} */ public abstract Object getVersion(T domainObject); /** * Returns a value indicating if the domain object should no longer be * considered accessible. This method might return false if the record * underlying the domain object had been deleted as a side-effect of * processing a request. *

* The default implementation of this method uses {@link #getId(Object)} and * {@link #find(Class, Object)} to determine if an object can be retrieved. */ public boolean isLive(T domainObject) { // Can't us Class.asSubclass() in web-mode code @SuppressWarnings("unchecked") Class clazz = (Class) domainObject.getClass(); return find(clazz, getId(domainObject)) != null; } }