package org.geoserver.config;
import java.util.List;
import org.geoserver.logging.LoggingUtils;
import org.geoserver.platform.GeoServerExtensions;
import org.geoserver.platform.resource.GlobalLockProvider;
import org.geoserver.platform.resource.LockProvider;
import org.geoserver.platform.resource.MemoryLockProvider;
import org.geoserver.platform.resource.NullLockProvider;
/**
* Initializes LockProvider based on configuration settings.
* <p>
*
* @author Jody Garnett (Boundless)
*
*/
public class LockProviderInitializer implements GeoServerInitializer {
ConfigurationListenerAdapter listener = new ConfigurationListenerAdapter() {
@Override
public void handleGlobalChange(GeoServerInfo global, List<String> propertyNames,
List<Object> oldValues, List<Object> newValues) {
boolean reload = false;
String lockProviderName = null;
if ( propertyNames.contains( "lockProviderName") ) {
lockProviderName = (String) newValues.get( propertyNames.indexOf( "lockProviderName" ) );
reload = true;
}
if( reload ){
try {
setLockProvider( lockProviderName );
}
catch (Exception e) {
throw new RuntimeException( e );
}
}
}
};
@Override
public void initialize(GeoServer geoServer) throws Exception {
// Consider moving earlier to make use of the requested LockProvider during initial configuration
String lockProviderName = geoServer.getGlobal().getLockProviderName();
setLockProvider(lockProviderName);
geoServer.addListener( listener);
}
public static void setLockProvider( String lockProviderName ){
LockProvider delegate;
if( lockProviderName == null ) {
// for backwards compatibility
delegate = new NullLockProvider();
} else {
Object provider = GeoServerExtensions.bean(lockProviderName);
if( provider == null ){
throw new IllegalStateException("Could not find "+lockProviderName+" lock provider in spring application context");
}
else if (!(provider instanceof LockProvider)){
throw new IllegalStateException("Found "+lockProviderName+"("+provider.getClass().getName()+") in application context, but it was not a LockProvider");
}
delegate = (LockProvider) provider;
}
GlobalLockProvider lockProvider = (GlobalLockProvider) GeoServerExtensions.bean("lockProvider");
if( lockProvider.getDelegate() != delegate ){
lockProvider.setDelegate( delegate );
}
}
}