org.hibernate.id.enhanced.OptimizerFactory.java Source code

Java tutorial

Introduction

Here is the source code for org.hibernate.id.enhanced.OptimizerFactory.java

Source

/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
 * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
 */
package org.hibernate.id.enhanced;

import java.lang.reflect.Constructor;
import java.util.Properties;

import org.hibernate.cfg.AvailableSettings;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.internal.util.ReflectHelper;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.internal.util.config.ConfigurationHelper;

import org.jboss.logging.Logger;

/**
 * Factory for {@link Optimizer} instances.
 *
 * @author Steve Ebersole
 */
public class OptimizerFactory {
    private static final CoreMessageLogger LOG = Logger.getMessageLogger(CoreMessageLogger.class,
            OptimizerFactory.class.getName());

    /**
     * Does the given optimizer name represent a pooled strategy?
     *
     * @param optimizerName The name of the optimizer
     *
     * @return {@code true} indicates the optimizer is a pooled strategy.
     */
    public static boolean isPooledOptimizer(String optimizerName) {
        final StandardOptimizerDescriptor standardDescriptor = StandardOptimizerDescriptor
                .fromExternalName(optimizerName);
        return standardDescriptor != null && standardDescriptor.isPooled();
    }

    private static final Class[] CTOR_SIG = new Class[] { Class.class, int.class };

    /**
     * Builds an optimizer
     *
     * @param type The optimizer type, either a short-hand name or the {@link Optimizer} class name.
     * @param returnClass The generated value java type
     * @param incrementSize The increment size.
     *
     * @return The built optimizer
     *
     * @deprecated Use {@link #buildOptimizer(String, Class, int, long)} instead
     */
    @Deprecated
    public static Optimizer buildOptimizer(String type, Class returnClass, int incrementSize) {
        final Class<? extends Optimizer> optimizerClass;

        final StandardOptimizerDescriptor standardDescriptor = StandardOptimizerDescriptor.fromExternalName(type);
        if (standardDescriptor != null) {
            optimizerClass = standardDescriptor.getOptimizerClass();
        } else {
            try {
                optimizerClass = ReflectHelper.classForName(type);
            } catch (Throwable ignore) {
                LOG.unableToLocateCustomOptimizerClass(type);
                return buildFallbackOptimizer(returnClass, incrementSize);
            }
        }

        try {
            final Constructor ctor = optimizerClass.getConstructor(CTOR_SIG);
            return (Optimizer) ctor.newInstance(returnClass, incrementSize);
        } catch (Throwable ignore) {
            LOG.unableToInstantiateOptimizer(type);
        }

        return buildFallbackOptimizer(returnClass, incrementSize);
    }

    private static Optimizer buildFallbackOptimizer(Class returnClass, int incrementSize) {
        return new NoopOptimizer(returnClass, incrementSize);
    }

    /**
     * Builds an optimizer
     *
     * @param type The optimizer type, either a short-hand name or the {@link Optimizer} class name.
     * @param returnClass The generated value java type
     * @param incrementSize The increment size.
     * @param explicitInitialValue The user supplied initial-value (-1 indicates the user did not specify).
     *
     * @return The built optimizer
     */
    public static Optimizer buildOptimizer(String type, Class returnClass, int incrementSize,
            long explicitInitialValue) {
        final Optimizer optimizer = buildOptimizer(type, returnClass, incrementSize);
        if (InitialValueAwareOptimizer.class.isInstance(optimizer)) {
            ((InitialValueAwareOptimizer) optimizer).injectInitialValue(explicitInitialValue);
        }
        return optimizer;
    }

    /**
     * Deprecated!
     *
     * @deprecated Use {@link StandardOptimizerDescriptor#getExternalName()} via {@link StandardOptimizerDescriptor#NONE}
     */
    @Deprecated
    @SuppressWarnings({ "UnusedDeclaration" })
    public static final String NONE = StandardOptimizerDescriptor.NONE.getExternalName();

    /**
     * Deprecated!
     *
     * @deprecated Use {@link StandardOptimizerDescriptor#getExternalName()} via {@link StandardOptimizerDescriptor#HILO}
     */
    @Deprecated
    @SuppressWarnings({ "UnusedDeclaration" })
    public static final String HILO = StandardOptimizerDescriptor.HILO.getExternalName();

    /**
     * Deprecated!
     *
     * @deprecated Use {@link StandardOptimizerDescriptor#getExternalName()} via {@link StandardOptimizerDescriptor#LEGACY_HILO}
     */
    @Deprecated
    @SuppressWarnings({ "UnusedDeclaration" })
    public static final String LEGACY_HILO = "legacy-hilo";

    /**
     * Deprecated!
     *
     * @deprecated Use {@link StandardOptimizerDescriptor#getExternalName()} via {@link StandardOptimizerDescriptor#POOLED}
     */
    @Deprecated
    @SuppressWarnings({ "UnusedDeclaration" })
    public static final String POOL = "pooled";

    /**
     * Deprecated!
     *
     * @deprecated Use {@link StandardOptimizerDescriptor#getExternalName()} via {@link StandardOptimizerDescriptor#POOLED_LO}
     */
    @Deprecated
    @SuppressWarnings({ "UnusedDeclaration" })
    public static final String POOL_LO = "pooled-lo";

    /**
     * Determine the optimizer to use when there was not one explicitly specified.
     */
    public static String determineImplicitOptimizerName(int incrementSize, Properties configSettings) {
        if (incrementSize <= 1) {
            return StandardOptimizerDescriptor.NONE.getExternalName();
        }

        // see if the user defined a preferred pooled optimizer...
        final String preferredPooledOptimizerStrategy = configSettings
                .getProperty(AvailableSettings.PREFERRED_POOLED_OPTIMIZER);
        if (StringHelper.isNotEmpty(preferredPooledOptimizerStrategy)) {
            return preferredPooledOptimizerStrategy;
        }

        // otherwise fallback to the fallback strategy (considering the deprecated PREFER_POOLED_VALUES_LO setting)
        return ConfigurationHelper.getBoolean(AvailableSettings.PREFER_POOLED_VALUES_LO, configSettings, false)
                ? StandardOptimizerDescriptor.POOLED_LO.getExternalName()
                : StandardOptimizerDescriptor.POOLED.getExternalName();
    }

    private OptimizerFactory() {
    }
}