/* * 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.autobean.shared; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * A controller for an implementation of a bean interface. Instances of * AutoBeans are obtained from an {@link AutoBeanFactory}. * * @param <T> the type of interface that will be wrapped. */ public interface AutoBean<T> { /** * An annotation that allows inferred property names to be overridden. * <p> * This annotation is asymmetric, applying it to a getter will not affect the * setter. The asymmetry allows existing users of an interface to read old * {@link AutoBeanCodex} messages, but write new ones. */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target(value = {ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER}) public @interface PropertyName { String value(); } /** * Accept an AutoBeanVisitor. * * @param visitor an {@link AutoBeanVisitor} */ void accept(AutoBeanVisitor visitor); /** * Returns a proxy implementation of the <code>T</code> interface which will * delegate to the underlying wrapped object, if any. * * @return a proxy that delegates to the wrapped object */ T as(); /** * This method always throws an {@link UnsupportedOperationException}. The * implementation of this method in previous releases was not sufficiently * robust and there are no further uses of this method within the GWT code * base. Furthermore, there are many different semantics that can be applied * to a cloning process that cannot be adequately addressed with a single * implementation. * <p> * A simple clone of an acyclic datastructure can be created by using * {@link AutoBeanCodex} to encode and decode the root object. Other cloning * algorithms are best implemented by using an {@link AutoBeanVisitor}. * * @throws UnsupportedOperationException * @deprecated with no replacement */ @Deprecated AutoBean<T> clone(boolean deep); /** * Returns the AutoBeanFactory that created the AutoBean. * * @return an AutoBeanFactory */ AutoBeanFactory getFactory(); /** * Retrieve a tag value that was previously provided to * {@link #setTag(String, Object)}. * * @param tagName the tag name * @return the tag value * @see #setTag(String, Object) */ <Q> Q getTag(String tagName); /** * Returns the wrapped interface type. */ Class<T> getType(); /** * Returns the value most recently passed to {@link #setFrozen}, or * {@code false} if it has never been called. * * @return {@code true} if this instance is frozen */ boolean isFrozen(); /** * Returns {@code true} if the AutoBean was provided with an external object. * * @return {@code true} if this instance is a wrapper */ boolean isWrapper(); /** * Disallows any method calls other than getters. All setter and call * operations will throw an {@link IllegalStateException}. * * @param frozen if {@code true}, freeze this instance */ void setFrozen(boolean frozen); /** * A tag is an arbitrary piece of external metadata to be associated with the * wrapped value. * * @param tagName the tag name * @param value the wrapped value * @see #getTag(String) */ void setTag(String tagName, Object value); /** * If the AutoBean wraps an object, return the underlying object. The AutoBean * will no longer function once unwrapped. * * @return the previously-wrapped object * @throws IllegalStateException if the AutoBean is not a wrapper */ T unwrap(); }