freemarker.ext.beans
Class BeanModel

java.lang.Object
  extended by freemarker.ext.beans.BeanModel
All Implemented Interfaces:
WrapperTemplateModel, AdapterTemplateModel, TemplateHashModel, TemplateHashModelEx, TemplateModel
Direct Known Subclasses:
ArrayModel, BooleanModel, DateModel, EnumerationModel, IteratorModel, NumberModel, ResourceBundleModel, StringModel

public class BeanModel
extends java.lang.Object
implements TemplateHashModelEx, AdapterTemplateModel, WrapperTemplateModel

A class that will wrap an arbitrary object into TemplateHashModel interface allowing calls to arbitrary property getters and invocation of accessible methods on the object from a template using the object.foo to access properties and object.bar(arg1, arg2) to invoke methods on it. You can also use the object.foo[index] syntax to access indexed properties. It uses Beans Introspector to dynamically discover the properties and methods.

Version:
$Id: BeanModel.java,v 1.49.2.4 2006/11/12 10:20:37 szegedia Exp $
Author:
Attila Szegedi

Field Summary
protected  java.lang.Object object
           
protected  BeansWrapper wrapper
           
 
Fields inherited from interface freemarker.template.TemplateModel
NOTHING
 
Constructor Summary
BeanModel(java.lang.Object object, BeansWrapper wrapper)
          Creates a new model that wraps the specified object.
 
Method Summary
 TemplateModel get(java.lang.String key)
          Uses Beans introspection to locate a property or method with name matching the key name.
 java.lang.Object getAdaptedObject(java.lang.Class hint)
          Retrieves the underlying object, or some other object semantically equivalent to its value narrowed by the class hint.
 java.lang.Object getWrappedObject()
          Retrieves the object wrapped by this model.
protected  boolean hasPlainGetMethod()
          Whether the model has a plain get(String) or get(Object) method
protected  TemplateModel invokeGenericGet(java.util.Map keyMap, java.lang.Class clazz, java.lang.String key)
           
 boolean isEmpty()
          Tells whether the model is empty.
 TemplateCollectionModel keys()
           
protected  java.util.Set keySet()
          Helper method to support TemplateHashModelEx.
 int size()
           
 java.lang.String toString()
           
protected  java.lang.Object unwrap(TemplateModel model)
           
 TemplateCollectionModel values()
           
protected  TemplateModel wrap(java.lang.Object obj)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

object

protected final java.lang.Object object

wrapper

protected final BeansWrapper wrapper
Constructor Detail

BeanModel

public BeanModel(java.lang.Object object,
                 BeansWrapper wrapper)
Creates a new model that wraps the specified object. Note that there are specialized subclasses of this class for wrapping arrays, collections, enumeration, iterators, and maps. Note also that the superclass can be used to wrap String objects if only scalar functionality is needed. You can also choose to delegate the choice over which model class is used for wrapping to BeansWrapper.wrap(Object).

Parameters:
object - the object to wrap into a model.
wrapper - the BeansWrapper associated with this model. Every model has to have an associated BeansWrapper instance. The model gains many attributes from its wrapper, including the caching behavior, method exposure level, method-over-item shadowing policy etc.
Method Detail

get

public TemplateModel get(java.lang.String key)
                  throws TemplateModelException
Uses Beans introspection to locate a property or method with name matching the key name. If a method or property is found, it is wrapped into TemplateMethodModelEx (for a method or indexed property), or evaluated on-the-fly and the return value wrapped into appropriate model (for a simple property) Models for various properties and methods are cached on a per-class basis, so the costly introspection is performed only once per property or method of a class. (Side-note: this also implies that any class whose method has been called will be strongly referred to by the framework and will not become unloadable until this class has been unloaded first. Normally this is not an issue, but can be in a rare scenario where you create many classes on- the-fly. Also, as the cache grows with new classes and methods introduced to the framework, it may appear as if it were leaking memory. The framework does, however detect class reloads (if you happen to be in an environment that does this kind of things--servlet containers do it when they reload a web application) and flushes the cache. If no method or property matching the key is found, the framework will try to invoke methods with signature non-void-return-type get(java.lang.String), then non-void-return-type get(java.lang.Object), or alternatively (if the wrapped object is a resource bundle) Object getObject(java.lang.String).

Specified by:
get in interface TemplateHashModel
Parameters:
key - the name by which the TemplateModel is identified in the template.
Returns:
the TemplateModel referred to by the key, or null if not found.
Throws:
TemplateModelException - if there was no property nor method nor a generic get method to invoke.

hasPlainGetMethod

protected boolean hasPlainGetMethod()
Whether the model has a plain get(String) or get(Object) method


invokeGenericGet

protected TemplateModel invokeGenericGet(java.util.Map keyMap,
                                         java.lang.Class clazz,
                                         java.lang.String key)
                                  throws java.lang.IllegalAccessException,
                                         java.lang.reflect.InvocationTargetException,
                                         TemplateModelException
Throws:
java.lang.IllegalAccessException
java.lang.reflect.InvocationTargetException
TemplateModelException

wrap

protected TemplateModel wrap(java.lang.Object obj)
                      throws TemplateModelException
Throws:
TemplateModelException

unwrap

protected java.lang.Object unwrap(TemplateModel model)
                           throws TemplateModelException
Throws:
TemplateModelException

isEmpty

public boolean isEmpty()
Tells whether the model is empty. It is empty if either the wrapped object is null, or it is a Boolean with false value.

Specified by:
isEmpty in interface TemplateHashModel

getAdaptedObject

public java.lang.Object getAdaptedObject(java.lang.Class hint)
Description copied from interface: AdapterTemplateModel
Retrieves the underlying object, or some other object semantically equivalent to its value narrowed by the class hint.

Specified by:
getAdaptedObject in interface AdapterTemplateModel
Parameters:
hint - the desired class of the returned value. An implementation should make reasonable effort to retrieve an object of the requested class, but if that is impossible, it must at least return the underlying object as-is. As a minimal requirement, an implementation must always return the exact underlying object when hint.isInstance(underlyingObject) == true holds. When called with java.lang.Object.class, it should return a generic Java object (i.e. if the model is wrapping a scripting lanugage object that is further wrapping a Java object, the deepest underlying Java object should be returned).
Returns:
the underlying object, or its value accommodated for the hint class.

getWrappedObject

public java.lang.Object getWrappedObject()
Description copied from interface: WrapperTemplateModel
Retrieves the object wrapped by this model.

Specified by:
getWrappedObject in interface WrapperTemplateModel

size

public int size()
Specified by:
size in interface TemplateHashModelEx
Returns:
the number of key/value mappings in the hash.

keys

public TemplateCollectionModel keys()
Specified by:
keys in interface TemplateHashModelEx
Returns:
a collection containing the keys in the hash. Every element of the returned collection must implement the TemplateScalarModel (as the keys of hashes are always strings).

values

public TemplateCollectionModel values()
                               throws TemplateModelException
Specified by:
values in interface TemplateHashModelEx
Returns:
a collection containing the values in the hash.
Throws:
TemplateModelException

toString

public java.lang.String toString()
Overrides:
toString in class java.lang.Object

keySet

protected java.util.Set keySet()
Helper method to support TemplateHashModelEx. Returns the Set of Strings which are available via the TemplateHashModel interface. Subclasses that override invokeGenericGet to provide additional hash keys should also override this method.