StringResolver.java

package pro.verron.officestamper.api;

import org.docx4j.wml.R;
import org.springframework.lang.Nullable;

import static pro.verron.officestamper.utils.WmlFactory.newRun;

/// This is an abstract class that provides a generic implementation for
/// resolving objects to strings. It is used in conjunction with
/// [ObjectResolver] interface to provide a flexible way to
/// resolve different types of objects to strings.
///
/// @param <T> the type of the object to resolve
///
/// @author Joseph Verron
/// @version ${version}
/// @since 1.6.7
public abstract class StringResolver<T>
        implements ObjectResolver {

    private final Class<T> type;

    /// Creates a new StringResolver with the given type.
    ///
    /// @param type the type of object to be resolved
    protected StringResolver(Class<T> type) {
        assert type != null;
        this.type = type;
    }

    /// Resolves an object to a string and creates a new run with the resolved string as content.
    ///
    /// @param document   the WordprocessingMLPackage document
    /// @param expression the expression string
    /// @param object     the object to be resolved
    ///
    /// @return the newly created run with the resolved string as content
    @Override
    public final R resolve(
            DocxPart document,
            String expression,
            Object object
    ) {
        return newRun(resolve(type.cast(object)));
    }

    /// Determines if the given object can be resolved by the StringResolver.
    ///
    /// @param object the object to be resolved
    ///
    /// @return true if the object can be resolved, false otherwise
    @Override
    public final boolean canResolve(@Nullable Object object) {
        return type.isInstance(object);
    }

    /// Resolves an object to a string.
    ///
    /// @param object the object to be resolved
    ///
    /// @return the string representation of the object
    protected abstract String resolve(T object);
}