/* Copyright (c) 2011 GeoSolutions - http://www.geo-solutions.it/. All rights reserved.
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.config;
import it.geosolutions.geoserver.jms.configuration.JMSConfiguration;
import it.geosolutions.geoserver.jms.configuration.ReadOnlyConfiguration;
import java.io.IOException;
import java.util.List;
import javax.annotation.PostConstruct;
import org.geoserver.catalog.Catalog;
import org.geoserver.config.util.XStreamPersister;
import org.geoserver.config.util.XStreamServiceLoader;
import org.geoserver.platform.GeoServerExtensions;
import org.geoserver.platform.GeoServerResourceLoader;
import org.springframework.beans.factory.annotation.Autowired;
/**
*
* A Read Only persister which inhibits write operation on the disk (if enabled)<br/>
*
* Note: to work this class is declared in the same package of the extending one
* since some member are declared as package protected.
*
* @author carlo cancellieri - GeoSolutions SAS
*
*/
public class ReadOnlyGeoServerLoader extends DefaultGeoServerLoader {
private boolean enabled = false;
@Autowired
public JMSConfiguration config;
public ReadOnlyGeoServerLoader(final GeoServerResourceLoader resourceLoader) {
super(resourceLoader);
}
@PostConstruct
private void init() {
enabled = ReadOnlyConfiguration.isReadOnly(config);
}
protected synchronized void loadCatalog(Catalog catalog, XStreamPersister xp)
throws Exception {
if (enabled) {
catalog.setResourceLoader(resourceLoader);
readCatalog(catalog, xp);
} else {
super.loadCatalog(catalog, xp);
}
}
protected synchronized void loadGeoServer(final GeoServer geoServer,
XStreamPersister xp) throws Exception {
if (enabled) {
readConfiguration(geoServer, xp);
} else {
super.loadGeoServer(geoServer, xp);
}
}
@Override
protected void initializeStyles(Catalog catalog, XStreamPersister xp)
throws IOException {
super.initializeStyles(catalog, xp);
}
public synchronized boolean isEnabled() {
return enabled;
}
public synchronized void enable(boolean enabled) {
this.enabled = enabled;
if (enabled) {
// remove Default persister
if (persister != null) {
geoserver.removeListener(persister);
persister = null;
}
// remove Default listener
if (listener != null) {
geoserver.removeListener(listener);
listener = null;
}
} else {
if (listener == null) {
// add event listener which persists changes
final List<XStreamServiceLoader> loaders = GeoServerExtensions
.extensions(XStreamServiceLoader.class);
listener = new ServicePersister(loaders, geoserver);
geoserver.addListener(listener);
}
if (persister == null) {
persister = new GeoServerPersister(resourceLoader,
xpf.createXMLPersister());
// attach back the persister
geoserver.addListener(persister);
}
}
}
}