org.springframework.expression.spel.ast
Class PropertyOrFieldReference

java.lang.Object
  extended by org.springframework.expression.spel.ast.SpelNodeImpl
      extended by org.springframework.expression.spel.ast.PropertyOrFieldReference
All Implemented Interfaces:
SpelNode

public class PropertyOrFieldReference
extends SpelNodeImpl

Represents a simple property or field reference.

Since:
3.0
Author:
Andy Clement, Juergen Hoeller

Field Summary
private  PropertyAccessor cachedReadAccessor
           
private  PropertyAccessor cachedWriteAccessor
           
private  java.lang.String name
           
private  boolean nullSafe
           
 
Fields inherited from class org.springframework.expression.spel.ast.SpelNodeImpl
children, pos
 
Constructor Summary
PropertyOrFieldReference(boolean nullSafe, java.lang.String propertyOrFieldName, int pos)
           
 
Method Summary
 java.lang.String getName()
           
private  java.util.List<PropertyAccessor> getPropertyAccessorsToTry(java.lang.Class<?> targetType, ExpressionState state)
          Determines the set of property resolvers that should be used to try and access a property on the specified target type.
 TypedValue getValueInternal(ExpressionState state)
           
 boolean isNullSafe()
           
 boolean isWritable(ExpressionState state)
          Determine if this expression node will support a setValue() call.
 boolean isWritableProperty(java.lang.String name, ExpressionState state)
           
private  TypedValue readProperty(ExpressionState state, java.lang.String name)
          Attempt to read the named property from the current context object.
 void setValue(ExpressionState state, java.lang.Object newValue)
          Evaluate the expression to a node and then set the new value on that node.
 java.lang.String toStringAST()
           
private  void writeProperty(ExpressionState state, java.lang.String name, java.lang.Object newValue)
           
 
Methods inherited from class org.springframework.expression.spel.ast.SpelNodeImpl
getChild, getChildCount, getEndPosition, getObjectClass, getPreviousChild, getStartPosition, getTypedValue, getValue, getValue, nextChildIs
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

nullSafe

private final boolean nullSafe

name

private final java.lang.String name

cachedReadAccessor

private volatile PropertyAccessor cachedReadAccessor

cachedWriteAccessor

private volatile PropertyAccessor cachedWriteAccessor
Constructor Detail

PropertyOrFieldReference

public PropertyOrFieldReference(boolean nullSafe,
                                java.lang.String propertyOrFieldName,
                                int pos)
Method Detail

isNullSafe

public boolean isNullSafe()

getName

public java.lang.String getName()

getValueInternal

public TypedValue getValueInternal(ExpressionState state)
                            throws EvaluationException
Specified by:
getValueInternal in class SpelNodeImpl
Throws:
EvaluationException

setValue

public void setValue(ExpressionState state,
                     java.lang.Object newValue)
              throws SpelEvaluationException
Description copied from interface: SpelNode
Evaluate the expression to a node and then set the new value on that node. For example, if the expression evaluates to a property reference then the property will be set to the new value.

Specified by:
setValue in interface SpelNode
Overrides:
setValue in class SpelNodeImpl
Parameters:
state - the current expression state (includes the context)
newValue - the new value
Throws:
SpelEvaluationException

isWritable

public boolean isWritable(ExpressionState state)
                   throws SpelEvaluationException
Description copied from interface: SpelNode
Determine if this expression node will support a setValue() call.

Specified by:
isWritable in interface SpelNode
Overrides:
isWritable in class SpelNodeImpl
Parameters:
state - the current expression state (includes the context)
Returns:
true if the expression node will allow setValue()
Throws:
SpelEvaluationException

toStringAST

public java.lang.String toStringAST()
Specified by:
toStringAST in interface SpelNode
Specified by:
toStringAST in class SpelNodeImpl
Returns:
the string form of this AST node

readProperty

private TypedValue readProperty(ExpressionState state,
                                java.lang.String name)
                         throws EvaluationException
Attempt to read the named property from the current context object.

Parameters:
state - the evaluation state
name - the name of the property
Returns:
the value of the property
Throws:
SpelEvaluationException - if any problem accessing the property or it cannot be found
EvaluationException

writeProperty

private void writeProperty(ExpressionState state,
                           java.lang.String name,
                           java.lang.Object newValue)
                    throws SpelEvaluationException
Throws:
SpelEvaluationException

isWritableProperty

public boolean isWritableProperty(java.lang.String name,
                                  ExpressionState state)
                           throws SpelEvaluationException
Throws:
SpelEvaluationException

getPropertyAccessorsToTry

private java.util.List<PropertyAccessor> getPropertyAccessorsToTry(java.lang.Class<?> targetType,
                                                                   ExpressionState state)
Determines the set of property resolvers that should be used to try and access a property on the specified target type. The resolvers are considered to be in an ordered list, however in the returned list any that are exact matches for the input target type (as opposed to 'general' resolvers that could work for any type) are placed at the start of the list. In addition, there are specific resolvers that exactly name the class in question and resolvers that name a specific class but it is a supertype of the class we have. These are put at the end of the specific resolvers set and will be tried after exactly matching accessors but before generic accessors.

Parameters:
targetType - the type upon which property access is being attempted
Returns:
a list of resolvers that should be tried in order to access the property