All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.tangosol.coherence.config.ResourceMapping Maven / Gradle / Ivy

There is a newer version: 24.03
Show newest version
/*
 * Copyright (c) 2000, 2020, Oracle and/or its affiliates.
 *
 * Licensed under the Universal Permissive License v 1.0 as shown at
 * http://oss.oracle.com/licenses/upl.
 */
package com.tangosol.coherence.config;

import com.tangosol.coherence.config.builder.NamedEventInterceptorBuilder;
import com.tangosol.coherence.config.scheme.Scheme;

import com.tangosol.config.annotation.Injectable;
import com.tangosol.config.expression.Parameter;
import com.tangosol.config.expression.ParameterResolver;

import com.tangosol.util.Base;
import com.tangosol.util.ResourceRegistry;
import com.tangosol.util.SimpleResourceRegistry;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * A base class for mapping elements.
 *
 * @author jk  2015.05.21
 * @since Coherence 14.1.1
 */
public abstract class ResourceMapping
    {
    // ----- constructors ---------------------------------------------------

    /**
     * Construct a {@link ResourceMapping} for resources that will use raw types by default.
     *
     * @param sNamePattern  the pattern that maps resource names to caching schemes
     * @param sSchemeName   the name of the caching scheme to which a resource matching
     *                      this {@link ResourceMapping} will be associated
     */
    public ResourceMapping(String sNamePattern, String sSchemeName)
        {
        Base.azzert(sNamePattern != null);
        Base.azzert(sSchemeName != null);

        f_sNamePattern = sNamePattern;
        f_sSchemeName = sSchemeName;
        m_parameterResolver            = new ResolvableParameterList();
        m_listEventInterceptorBuilders = new LinkedList<>();
        f_resourceRegistry = new SimpleResourceRegistry();
        f_subMappings = new ArrayList<>();
        }

    // ----- ResourceMapping methods --------------------------------------------

    /**
     * Obtain the xml element name of this mapping.
     *
     * @return  the xml element name of this mapping
     */
    public abstract String getConfigElementName();

    /**
     * Determine whether the specified schem is valid
     * for this mapping type.
     *
     * @param scheme  the scheme to validate
     *
     * @throws IllegalStateException if the scheme is not valid
     */
    public abstract void validateScheme(Scheme scheme);

    /**
     * Set the flag to indicate if this mapping is for internal resources
     * used by the service.
     *
     * @param  fInternal  true if this is for internal resource
     *
     * @return  this ResourceMapping object
     */
    public ResourceMapping setInternal(boolean fInternal)
        {
        m_fInternal = fInternal;

        return this;
        }

    /**
     * Check if this ResourceMapping is for internal resources.
     *
     * @return  true if this is for internal resources
     */
    public boolean isInternal()
        {
        return m_fInternal;
        }

    /**
     * Obtains the pattern used to match resource names
     * to this {@link ResourceMapping}.
     *
     * @return the pattern
     */
    public String getNamePattern()
        {
        return f_sNamePattern;
        }

    /**
     * Obtains the name of the caching scheme to be used
     * that match this {@link ResourceMapping}.
     *
     * @return the name of the associated caching scheme
     */
    public String getSchemeName()
        {
        return f_sSchemeName;
        }

    /**
     * Obtains the {@link ResourceRegistry} that holds resources
     * associated with the {@link ResourceMapping}.
     *
     * @return the {@link ResourceRegistry}
     */
    public ResourceRegistry getResourceRegistry()
        {
        return f_resourceRegistry;
        }

    /**
     * Obtains the {@link ParameterResolver} that is to be used to
     * resolve {@link Parameter}s associated with this {@link ResourceMapping}.
     *
     * @return the {@link ParameterResolver}
     */
    public ParameterResolver getParameterResolver()
        {
        return m_parameterResolver;
        }

    /**
     * Sets the {@link ParameterResolver} that is used to resolve
     * {@link Parameter}s associated with the {@link ResourceMapping}.
     *
     * @param resolver  the {@link ParameterResolver}
     */
    @Injectable("init-params")
    public void setParameterResolver(ParameterResolver resolver)
        {
        m_parameterResolver = resolver == null
                              ? new ResolvableParameterList()
                              : resolver;
        }

    /**
     * Obtains the {@link List} of {@link NamedEventInterceptorBuilder}s
     * for this {@link ResourceMapping}.
     *
     * @return an {@link List} over {@link NamedEventInterceptorBuilder}s
     *         or null if none are defined
     */
    public List getEventInterceptorBuilders()
        {
        return m_listEventInterceptorBuilders;
        }

    /**
     * Sets the {@link List} of {@link NamedEventInterceptorBuilder}s for the {@link ResourceMapping}.
     *
     * @param listBuilders  the {@link List} of {@link NamedEventInterceptorBuilder}s
     */
    @Injectable("interceptors")
    public void setEventInterceptorBuilders(List listBuilders)
        {
        m_listEventInterceptorBuilders = listBuilders;
        }

    /**
     * Determines if the {@link ResourceMapping} is for (matches) the specified resource name.
     *
     * @param sName  the resource name to check for a match
     *
     * @return true if the {@link ResourceMapping} is for the specified resource name,
     *         false otherwise
     */
    public boolean isForName(String sName)
        {
        return (f_sNamePattern.endsWith("*") && sName.regionMatches(0, f_sNamePattern, 0, f_sNamePattern.length() - 1))
                || f_sNamePattern.equals(sName);
        }

    /**
     * Determines if the {@link ResourceMapping} pattern contains a * wildcard.
     *
     * @return true if the pattern contains a * wildcard,
     *         false otherwise
     */
    public boolean usesWildcard()
        {
        return f_sNamePattern.contains("*");
        }

    /**
     * Determines the value the wildcard * declared in the resource name
     * pattern for the {@link ResourceMapping} matches.  If the pattern does
     * not contain a wildcard * or the resource name does not match the
     * mapping, null is returned.
     * 

* Examples: *

* 1. Calling mapping.getWildcardMatch("dist-test") on a ResourceMapping with * the resource name pattern "dist-*" will return "test". *

* 2. Calling mapping.getWildcardMatch("dist-*") on a ResourceMapping with * the resource name pattern "dist-*" will return "*". *

* 3. Calling mapping.getWildcardMatch("dist-fred") on a ResourceMapping with * the resource name pattern "dist-fred" will return null. *

* 4. Calling mapping.getWildcardMatch("dist-fred") on a ResourceMapping with * the resource name pattern "repl-*" will return null. *

* 5. Calling mapping.getWildcardMatch("dist-fred") on a ResourceMapping with * the resource name pattern "*" will return "dist-fred". * * @param sName the resource name to match * * @return the resource name string that matches the wildcard. */ public String getWildcardMatch(String sName) { if (sName != null && !sName.isEmpty() && usesWildcard() && isForName(sName)) { return f_sNamePattern.equals("*") ? sName : sName.substring(f_sNamePattern.indexOf("*")); } else { return null; } } /** * Get value of sParamName associated with this {@link CacheMapping} * * @param sParamName parameter name to look up * @param paramValueType parameter value type * @param parameter value type * * @return parameter value as an instance of paramValueType or null if parameter is not defined */ public T getValue(String sParamName, Class paramValueType) { Parameter param = getParameterResolver().resolve(sParamName); return param == null ? null : param.evaluate(getParameterResolver()).as(paramValueType); } /** * Get value of sParamName associated with this {@link CacheMapping} * * @param sParamName parameter name to look up * * @return parameter value or null if parameter is not found */ public Object getValue(String sParamName) { ParameterResolver resolver = getParameterResolver(); Parameter param = resolver.resolve(sParamName); return param == null ? null : param.evaluate(resolver).get(); } /** * Determines the name of a resource given a value for the wildcard * (assuming the resource name pattern for the mapping is using a wildcard). * If the pattern does not contain a wildcard *, null will * be returned. *

* Examples: *

* 1. Calling mapping.getNameUsing("test") on a ResourceMapping with * the resource name pattern "dist-*" will return "dist-test". *

* 2. Calling mapping.getNameUsing("*") on a ResourceMapping with * the resource name pattern "dist-*" will return "dist-*". *

* 3. Calling mapping.getNameUsing("fred") on a ResourceMapping with * the resource name pattern "dist-fred" will return null. *

* 4. Calling mapping.getNameUsing("dist-fred") on a ResourceMapping with * the resource name pattern "*" will return "dist-fred". * * @param sWildCardValue the value to replace the wildcard * with * * @return the resource name with the wildcard replaced with the specified value */ public String getNameUsing(String sWildCardValue) { if (sWildCardValue != null && !sWildCardValue.isEmpty() && usesWildcard()) { return f_sNamePattern.replaceAll("\\*", sWildCardValue); } else { return null; } } /** * Obtain the list of sub-mappings that this mapping contains * * @return the list of sub-mappings that this mapping contains. */ public List getSubMappings() { return f_subMappings; } // ----- data members --------------------------------------------------- /** * The flag to indicate if this {@link ResourceMapping} is for internal resources. */ private boolean m_fInternal; /** * The pattern to be used to match and associate resource names with this {@link ResourceMapping}. */ private final String f_sNamePattern; /** * The name of the caching scheme to which resource matching this {@link ResourceMapping} will be bound. */ private final String f_sSchemeName; /** * The {@link ParameterResolver} to use for resolving {@link Parameter}s defined by this {@link ResourceMapping}. */ private ParameterResolver m_parameterResolver; /** * The {@link ResourceRegistry} associated with this {@link ResourceMapping}. */ private final ResourceRegistry f_resourceRegistry; /** * The {@link List} of {@link NamedEventInterceptorBuilder}s associated with this {@link ResourceMapping}. */ private List m_listEventInterceptorBuilders; /** * The {@link List} of child mappings of this mapping. */ private final List f_subMappings; }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy