/*
 * Copyright 2002-2020 the original author or authors.
 *
 * 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
 *
 *      https://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 org.springframework.core;

import java.util.function.Function;

import org.springframework.lang.Nullable;
import org.springframework.util.Assert;

Interface defining a generic contract for attaching and accessing metadata to/from arbitrary objects.
Author:Rob Harrop, Sam Brannen
Since:2.0
/** * Interface defining a generic contract for attaching and accessing metadata * to/from arbitrary objects. * * @author Rob Harrop * @author Sam Brannen * @since 2.0 */
public interface AttributeAccessor {
Set the attribute defined by name to the supplied value.

If value is null, the attribute is removed.

In general, users should take care to prevent overlaps with other metadata attributes by using fully-qualified names, perhaps using class or package names as prefix.

Params:
  • name – the unique attribute key
  • value – the attribute value to be attached
/** * Set the attribute defined by {@code name} to the supplied {@code value}. * <p>If {@code value} is {@code null}, the attribute is {@link #removeAttribute removed}. * <p>In general, users should take care to prevent overlaps with other * metadata attributes by using fully-qualified names, perhaps using * class or package names as prefix. * @param name the unique attribute key * @param value the attribute value to be attached */
void setAttribute(String name, @Nullable Object value);
Get the value of the attribute identified by name.

Return null if the attribute doesn't exist.

Params:
  • name – the unique attribute key
Returns:the current value of the attribute, if any
/** * Get the value of the attribute identified by {@code name}. * <p>Return {@code null} if the attribute doesn't exist. * @param name the unique attribute key * @return the current value of the attribute, if any */
@Nullable Object getAttribute(String name);
Compute a new value for the attribute identified by name if necessary and set the new value in this AttributeAccessor.

If a value for the attribute identified by name already exists in this AttributeAccessor, the existing value will be returned without applying the supplied compute function.

The default implementation of this method is not thread safe but can overridden by concrete implementations of this interface.

Params:
  • name – the unique attribute key
  • computeFunction – a function that computes a new value for the attribute name; the function must not return a null value
Type parameters:
  • <T> – the type of the attribute value
See Also:
Returns:the existing value or newly computed value for the named attribute
Since:5.3.3
/** * Compute a new value for the attribute identified by {@code name} if * necessary and {@linkplain #setAttribute set} the new value in this * {@code AttributeAccessor}. * <p>If a value for the attribute identified by {@code name} already exists * in this {@code AttributeAccessor}, the existing value will be returned * without applying the supplied compute function. * <p>The default implementation of this method is not thread safe but can * overridden by concrete implementations of this interface. * @param <T> the type of the attribute value * @param name the unique attribute key * @param computeFunction a function that computes a new value for the attribute * name; the function must not return a {@code null} value * @return the existing value or newly computed value for the named attribute * @see #getAttribute(String) * @see #setAttribute(String, Object) * @since 5.3.3 */
@SuppressWarnings("unchecked") default <T> T computeAttribute(String name, Function<String, T> computeFunction) { Assert.notNull(name, "Name must not be null"); Assert.notNull(computeFunction, "Compute function must not be null"); Object value = getAttribute(name); if (value == null) { value = computeFunction.apply(name); Assert.state(value != null, () -> String.format("Compute function must not return null for attribute named '%s'", name)); setAttribute(name, value); } return (T) value; }
Remove the attribute identified by name and return its value.

Return null if no attribute under name is found.

Params:
  • name – the unique attribute key
Returns:the last value of the attribute, if any
/** * Remove the attribute identified by {@code name} and return its value. * <p>Return {@code null} if no attribute under {@code name} is found. * @param name the unique attribute key * @return the last value of the attribute, if any */
@Nullable Object removeAttribute(String name);
Return true if the attribute identified by name exists.

Otherwise return false.

Params:
  • name – the unique attribute key
/** * Return {@code true} if the attribute identified by {@code name} exists. * <p>Otherwise return {@code false}. * @param name the unique attribute key */
boolean hasAttribute(String name);
Return the names of all attributes.
/** * Return the names of all attributes. */
String[] attributeNames(); }