org.hibernate.cache.spi.AbstractRegionFactory Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of hibernate-core Show documentation
Show all versions of hibernate-core Show documentation
Hibernate's core ORM functionality
/*
* 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.cache.spi;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import org.hibernate.boot.spi.SessionFactoryOptions;
import org.hibernate.cache.CacheException;
import org.hibernate.cache.spi.access.AccessType;
import org.hibernate.cache.spi.support.RegionNameQualifier;
import org.hibernate.cache.spi.support.SimpleTimestamper;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
/**
* @author Steve Ebersole
*/
public abstract class AbstractRegionFactory implements RegionFactory {
private final AtomicBoolean started = new AtomicBoolean( false );
/**
* Legacy names that used to be the default for the query results region.
*/
public static final List LEGACY_QUERY_RESULTS_REGION_UNQUALIFIED_NAMES =
Collections.unmodifiableList( Arrays.asList(
"org.hibernate.cache.spi.QueryResultsRegion",
"org.hibernate.cache.internal.StandardQueryCache"
) );
/**
* Legacy names that used to be the default for the update timestamps region.
*/
public static final List LEGACY_UPDATE_TIMESTAMPS_REGION_UNQUALIFIED_NAMES =
Collections.unmodifiableList( Arrays.asList(
"org.hibernate.cache.spi.TimestampsRegion",
"org.hibernate.cache.spi.UpdateTimestampsCache"
) );
private Exception startingException;
private SessionFactoryOptions options;
protected boolean isStarted() {
if ( started.get() ) {
assert options != null;
return true;
}
else {
assert options == null;
throw new IllegalStateException( "Cache provider not started", startingException );
}
}
protected void verifyStarted() {
if ( ! verifiedStartStatus() ) {
throw new IllegalStateException( "Cache provider not started", startingException );
}
}
protected boolean verifiedStartStatus() {
if ( started.get() ) {
assert options != null;
return true;
}
else {
assert options == null;
return false;
}
}
protected SessionFactoryOptions getOptions() {
verifyStarted();
return options;
}
@Override
public final void start(SessionFactoryOptions settings, Map configValues) throws CacheException {
if ( started.compareAndSet( false, true ) ) {
synchronized (this) {
this.options = settings;
try {
prepareForUse( settings, configValues );
startingException = null;
}
catch ( Exception e ) {
options = null;
started.set( false );
startingException = e;
}
}
}
else {
SecondLevelCacheLogger.INSTANCE.attemptToStartAlreadyStartedCacheProvider();
}
}
protected abstract void prepareForUse(SessionFactoryOptions settings, Map configValues);
@Override
public final void stop() {
if ( started.compareAndSet( true, false ) ) {
synchronized ( this ) {
try {
releaseFromUse();
}
finally {
options = null;
startingException = null;
}
}
}
else {
SecondLevelCacheLogger.INSTANCE.attemptToStopAlreadyStoppedCacheProvider();
}
}
protected abstract void releaseFromUse();
@Override
public boolean isMinimalPutsEnabledByDefault() {
return false;
}
@Override
public AccessType getDefaultAccessType() {
return AccessType.READ_WRITE;
}
@Override
public String qualify(String regionName) {
return RegionNameQualifier.INSTANCE.qualify( regionName, options );
}
@Override
public CacheTransactionSynchronization createTransactionContext(SharedSessionContractImplementor session) {
return new StandardCacheTransactionSynchronization( this );
}
@Override
public long nextTimestamp() {
return SimpleTimestamper.next();
}
@Override
public long getTimeout() {
return SimpleTimestamper.timeOut();
}
}