@ -64,8 +64,9 @@ import org.springframework.lang.Nullable;
* read - only access to properties via { @link DataBindingPropertyAccessor } . Similarly ,
* read - only access to properties via { @link DataBindingPropertyAccessor } . Similarly ,
* { @link SimpleEvaluationContext # forReadWriteDataBinding ( ) } enables read and write access
* { @link SimpleEvaluationContext # forReadWriteDataBinding ( ) } enables read and write access
* to properties . Alternatively , configure custom accessors via
* to properties . Alternatively , configure custom accessors via
* { @link SimpleEvaluationContext # forPropertyAccessors } and potentially activate method
* { @link SimpleEvaluationContext # forPropertyAccessors } , potentially
* resolution and / or a type converter through the builder .
* { @linkplain Builder # withAssignmentDisabled ( ) disable assignment } , and optionally
* activate method resolution and / or a type converter through the builder .
*
*
* < p > Note that { @code SimpleEvaluationContext } is typically not configured
* < p > Note that { @code SimpleEvaluationContext } is typically not configured
* with a default root object . Instead it is meant to be created once and
* with a default root object . Instead it is meant to be created once and
@ -234,9 +235,8 @@ public final class SimpleEvaluationContext implements EvaluationContext {
* ( { @code + + } ) , and decrement ( { @code - - } ) operators are disabled .
* ( { @code + + } ) , and decrement ( { @code - - } ) operators are disabled .
* @return { @code true } if assignment is enabled ; { @code false } otherwise
* @return { @code true } if assignment is enabled ; { @code false } otherwise
* @since 5 . 3 . 38
* @since 5 . 3 . 38
* @see # forPropertyAccessors ( PropertyAccessor . . . )
* @see # forReadOnlyDataBinding ( )
* @see # forReadOnlyDataBinding ( )
* @see # forReadWriteDataBinding ( )
* @see Builder # withAssignmentDisabled ( )
* /
* /
@Override
@Override
public boolean isAssignmentEnabled ( ) {
public boolean isAssignmentEnabled ( ) {
@ -245,15 +245,18 @@ public final class SimpleEvaluationContext implements EvaluationContext {
/ * *
/ * *
* Create a { @code SimpleEvaluationContext } for the specified { @link PropertyAccessor }
* Create a { @code SimpleEvaluationContext } for the specified { @link PropertyAccessor }
* delegates : typically a custom { @code PropertyAccessor } specific to a use case
* delegates : typically a custom { @code PropertyAccessor } specific to a use case & mdash ;
* ( e . g . attribute resolution in a custom data structure ) , potentially combined with
* for example , for attribute resolution in a custom data structure & mdash ; potentially
* a { @link DataBindingPropertyAccessor } if property dereferences are needed as well .
* combined with a { @link DataBindingPropertyAccessor } if property dereferences are
* < p > Assignment is enabled within expressions evaluated by the context created via
* needed as well .
* this factory method .
* < p > By default , assignment is enabled within expressions evaluated by the context
* created via this factory method ; however , assignment can be disabled via
* { @link Builder # withAssignmentDisabled ( ) } .
* @param accessors the accessor delegates to use
* @param accessors the accessor delegates to use
* @see DataBindingPropertyAccessor # forReadOnlyAccess ( )
* @see DataBindingPropertyAccessor # forReadOnlyAccess ( )
* @see DataBindingPropertyAccessor # forReadWriteAccess ( )
* @see DataBindingPropertyAccessor # forReadWriteAccess ( )
* @see # isAssignmentEnabled ( )
* @see # isAssignmentEnabled ( )
* @see Builder # withAssignmentDisabled ( )
* /
* /
public static Builder forPropertyAccessors ( PropertyAccessor . . . accessors ) {
public static Builder forPropertyAccessors ( PropertyAccessor . . . accessors ) {
for ( PropertyAccessor accessor : accessors ) {
for ( PropertyAccessor accessor : accessors ) {
@ -262,7 +265,7 @@ public final class SimpleEvaluationContext implements EvaluationContext {
"ReflectivePropertyAccessor. Consider using DataBindingPropertyAccessor or a custom subclass." ) ;
"ReflectivePropertyAccessor. Consider using DataBindingPropertyAccessor or a custom subclass." ) ;
}
}
}
}
return new Builder ( true , accessors ) ;
return new Builder ( accessors ) ;
}
}
/ * *
/ * *
@ -273,22 +276,26 @@ public final class SimpleEvaluationContext implements EvaluationContext {
* @see DataBindingPropertyAccessor # forReadOnlyAccess ( )
* @see DataBindingPropertyAccessor # forReadOnlyAccess ( )
* @see # forPropertyAccessors
* @see # forPropertyAccessors
* @see # isAssignmentEnabled ( )
* @see # isAssignmentEnabled ( )
* @see Builder # withAssignmentDisabled ( )
* /
* /
public static Builder forReadOnlyDataBinding ( ) {
public static Builder forReadOnlyDataBinding ( ) {
return new Builder ( false , DataBindingPropertyAccessor . forReadOnlyAccess ( ) ) ;
return new Builder ( DataBindingPropertyAccessor . forReadOnlyAccess ( ) ) . withAssignmentDisabled ( ) ;
}
}
/ * *
/ * *
* Create a { @code SimpleEvaluationContext } for read - write access to
* Create a { @code SimpleEvaluationContext } for read - write access to
* public properties via { @link DataBindingPropertyAccessor } .
* public properties via { @link DataBindingPropertyAccessor } .
* < p > Assignment is enabled within expressions evaluated by the context created via
* < p > By default , assignment is enabled within expressions evaluated by the context
* this factory method .
* created via this factory method . Assignment can be disabled via
* { @link Builder # withAssignmentDisabled ( ) } ; however , it is preferable to use
* { @link # forReadOnlyDataBinding ( ) } if you desire read - only access .
* @see DataBindingPropertyAccessor # forReadWriteAccess ( )
* @see DataBindingPropertyAccessor # forReadWriteAccess ( )
* @see # forPropertyAccessors
* @see # forPropertyAccessors
* @see # isAssignmentEnabled ( )
* @see # isAssignmentEnabled ( )
* @see Builder # withAssignmentDisabled ( )
* /
* /
public static Builder forReadWriteDataBinding ( ) {
public static Builder forReadWriteDataBinding ( ) {
return new Builder ( true , DataBindingPropertyAccessor . forReadWriteAccess ( ) ) ;
return new Builder ( DataBindingPropertyAccessor . forReadWriteAccess ( ) ) ;
}
}
@ -307,15 +314,24 @@ public final class SimpleEvaluationContext implements EvaluationContext {
@Nullable
@Nullable
private TypedValue rootObject ;
private TypedValue rootObject ;
private final boolean assignmentEnabled ;
private boolean assignmentEnabled = true ;
private Builder ( boolean assignmentEnabled , PropertyAccessor . . . accessors ) {
private Builder ( PropertyAccessor . . . accessors ) {
this . assignmentEnabled = assignmentEnabled ;
this . accessors = Arrays . asList ( accessors ) ;
this . accessors = Arrays . asList ( accessors ) ;
}
}
/ * *
* Disable assignment within expressions evaluated by this evaluation context .
* @since 5 . 3 . 38
* @see SimpleEvaluationContext # isAssignmentEnabled ( )
* /
public Builder withAssignmentDisabled ( ) {
this . assignmentEnabled = false ;
return this ;
}
/ * *
/ * *
* Register the specified { @link MethodResolver } delegates for
* Register the specified { @link MethodResolver } delegates for
* a combination of property access and method resolution .
* a combination of property access and method resolution .
@ -347,7 +363,6 @@ public final class SimpleEvaluationContext implements EvaluationContext {
return this ;
return this ;
}
}
/ * *
/ * *
* Register a custom { @link ConversionService } .
* Register a custom { @link ConversionService } .
* < p > By default a { @link StandardTypeConverter } backed by a
* < p > By default a { @link StandardTypeConverter } backed by a
@ -359,6 +374,7 @@ public final class SimpleEvaluationContext implements EvaluationContext {
this . typeConverter = new StandardTypeConverter ( conversionService ) ;
this . typeConverter = new StandardTypeConverter ( conversionService ) ;
return this ;
return this ;
}
}
/ * *
/ * *
* Register a custom { @link TypeConverter } .
* Register a custom { @link TypeConverter } .
* < p > By default a { @link StandardTypeConverter } backed by a
* < p > By default a { @link StandardTypeConverter } backed by a