Java tutorial
/* * 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() { } }