|
|
|
@ -1,5 +1,5 @@ |
|
|
|
/* |
|
|
|
/* |
|
|
|
* Copyright 2002-2019 the original author or authors. |
|
|
|
* Copyright 2002-2024 the original author or authors. |
|
|
|
* |
|
|
|
* |
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
@ -20,78 +20,91 @@ import org.springframework.expression.spel.ast.ValueRef; |
|
|
|
import org.springframework.lang.Nullable; |
|
|
|
import org.springframework.lang.Nullable; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* A index accessor is able to read from (and possibly write to) an array's elements. |
|
|
|
* An index accessor is able to read from (and possibly write to) an indexed |
|
|
|
|
|
|
|
* structure of an object. |
|
|
|
* |
|
|
|
* |
|
|
|
* <p>This interface places no restrictions, and so implementors are free to access elements |
|
|
|
* <p>This interface places no restrictions on what constitutes an indexed |
|
|
|
* directly as fields or through getters or in any other way they see as appropriate. |
|
|
|
* structure. Implementors are therefore free to access indexed values any way |
|
|
|
|
|
|
|
* they deem appropriate. |
|
|
|
* |
|
|
|
* |
|
|
|
* <p>A resolver can optionally specify an array of target classes for which it should be |
|
|
|
* <p>An index accessor can optionally specify an array of target classes for |
|
|
|
* called. However, if it returns {@code null} from {@link #getSpecificTargetClasses()}, |
|
|
|
* which it should be called. However, if it returns {@code null} or an empty |
|
|
|
* it will be called for all property references and given a chance to determine if it |
|
|
|
* array from {@link #getSpecificTargetClasses()}, it will be called for all |
|
|
|
* can read or write them. |
|
|
|
* indexing operations and given a chance to determine if it can read from or |
|
|
|
|
|
|
|
* write to the indexed structure. |
|
|
|
* |
|
|
|
* |
|
|
|
* <p>Property resolvers are considered to be ordered, and each will be called in turn. |
|
|
|
* <p>Index accessors are considered to be ordered, and each will be called in |
|
|
|
* The only rule that affects the call order is that any resolver naming the target |
|
|
|
* turn. The only rule that affects the call order is that any index accessor |
|
|
|
* class directly in {@link #getSpecificTargetClasses()} will be called first, before |
|
|
|
* which specifies explicit support for the target class via |
|
|
|
* the general resolvers. |
|
|
|
* {@link #getSpecificTargetClasses()} will be called first, before other |
|
|
|
|
|
|
|
* generic index accessors. |
|
|
|
* |
|
|
|
* |
|
|
|
* @author jackmiking lee |
|
|
|
* @author Jackmiking Lee |
|
|
|
* @since 3.0 |
|
|
|
* @author Sam Brannen |
|
|
|
|
|
|
|
* @since 6.2 |
|
|
|
|
|
|
|
* @see PropertyAccessor |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public interface IndexAccessor { |
|
|
|
public interface IndexAccessor extends TargetedAccessor { |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Return an array of classes for which this resolver should be called. |
|
|
|
* Get the set of classes for which this index accessor should be called. |
|
|
|
* <p>Returning {@code null} indicates this is a general resolver that |
|
|
|
* <p>Returning {@code null} or an empty array indicates this is a generic |
|
|
|
* can be called in an attempt to resolve a property on any type. |
|
|
|
* index accessor that can be called in an attempt to access an index on any |
|
|
|
* @return an array of classes that this resolver is suitable for |
|
|
|
* type. |
|
|
|
* (or {@code null} if a general resolver) |
|
|
|
* @return an array of classes that this index accessor is suitable for |
|
|
|
|
|
|
|
* (or {@code null} or an empty array if a generic index accessor) |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
|
|
|
|
@Override |
|
|
|
@Nullable |
|
|
|
@Nullable |
|
|
|
Class<?>[] getSpecificTargetClasses(); |
|
|
|
Class<?>[] getSpecificTargetClasses(); |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Called to determine if a resolver instance is able to access a specified property |
|
|
|
* Called to determine if this index accessor is able to read a specified |
|
|
|
* on a specified target object. |
|
|
|
* index on a specified target object. |
|
|
|
* @param context the evaluation context in which the access is being attempted |
|
|
|
* @param context the evaluation context in which the access is being attempted |
|
|
|
* @param target the target object upon which the property is being accessed |
|
|
|
* @param target the target object upon which the index is being accessed |
|
|
|
* @param index the index of the array being accessed |
|
|
|
* @param index the index being accessed |
|
|
|
* @return true if this resolver is able to read the property |
|
|
|
* @return true if this index accessor is able to read the index |
|
|
|
* @throws AccessException if there is any problem determining whether the property can be read |
|
|
|
* @throws AccessException if there is any problem determining whether the |
|
|
|
|
|
|
|
* index can be read |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
boolean canRead(EvaluationContext context, @Nullable Object target, Object index) throws AccessException; |
|
|
|
boolean canRead(EvaluationContext context, @Nullable Object target, Object index) throws AccessException; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Called to read a property from a specified target object. |
|
|
|
* Called to read an index from a specified target object. |
|
|
|
* Should only succeed if {@link #canRead} also returns {@code true}. |
|
|
|
* <p>Should only succeed if {@link #canRead} also returns {@code true}. |
|
|
|
* @param context the evaluation context in which the access is being attempted |
|
|
|
* @param context the evaluation context in which the access is being attempted |
|
|
|
* @param target the target object upon which the property is being accessed |
|
|
|
* @param target the target object upon which the index is being accessed |
|
|
|
* @param index the index of the array being accessed |
|
|
|
* @param index the index being accessed |
|
|
|
* @return a TypedValue object wrapping the property value read and a type descriptor for it |
|
|
|
* @return a TypedValue object wrapping the index value read and a type |
|
|
|
* @throws AccessException if there is any problem accessing the property value |
|
|
|
* descriptor for it |
|
|
|
|
|
|
|
* @throws AccessException if there is any problem reading the index value |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
ValueRef read(EvaluationContext context, @Nullable Object target,Object index) throws AccessException; |
|
|
|
// TODO Change return type to TypedValue to avoid package cycle.
|
|
|
|
|
|
|
|
ValueRef read(EvaluationContext context, @Nullable Object target, Object index) throws AccessException; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Called to determine if a resolver instance is able to write to a specified |
|
|
|
* Called to determine if this index accessor is able to write to a specified |
|
|
|
* property on a specified target object. |
|
|
|
* index on a specified target object. |
|
|
|
* @param context the evaluation context in which the access is being attempted |
|
|
|
* @param context the evaluation context in which the access is being attempted |
|
|
|
* @param target the target object upon which the property is being accessed |
|
|
|
* @param target the target object upon which the index is being accessed |
|
|
|
* @param index the index of the array being accessed |
|
|
|
* @param index the index being accessed |
|
|
|
* @return true if this resolver is able to write to the property |
|
|
|
* @return true if this index accessor is able to write to the index |
|
|
|
* @throws AccessException if there is any problem determining whether the |
|
|
|
* @throws AccessException if there is any problem determining whether the |
|
|
|
* property can be written to |
|
|
|
* index can be written to |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
boolean canWrite(EvaluationContext context, @Nullable Object target, Object index) throws AccessException; |
|
|
|
boolean canWrite(EvaluationContext context, @Nullable Object target, Object index) throws AccessException; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Called to write to a property on a specified target object. |
|
|
|
* Called to write to an index on a specified target object. |
|
|
|
* Should only succeed if {@link #canWrite} also returns {@code true}. |
|
|
|
* <p>Should only succeed if {@link #canWrite} also returns {@code true}. |
|
|
|
* @param context the evaluation context in which the access is being attempted |
|
|
|
* @param context the evaluation context in which the access is being attempted |
|
|
|
* @param target the target object upon which the property is being accessed |
|
|
|
* @param target the target object upon which the index is being accessed |
|
|
|
* @param index the index of the array being accessed |
|
|
|
* @param index the index being accessed |
|
|
|
* @param newValue the new value for the property |
|
|
|
* @param newValue the new value for the index |
|
|
|
* @throws AccessException if there is any problem writing to the property value |
|
|
|
* @throws AccessException if there is any problem writing to the index value |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
void write(EvaluationContext context, @Nullable Object target, Object index, @Nullable Object newValue) |
|
|
|
void write(EvaluationContext context, @Nullable Object target, Object index, @Nullable Object newValue) |
|
|
|
throws AccessException; |
|
|
|
throws AccessException; |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|