/* Copyright (c) 2001 - 2008 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.config.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.impl.CatalogImpl;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.config.ConfigurationListener;
import org.geoserver.config.GeoServer;
import org.geoserver.config.GeoServerFacade;
import org.geoserver.config.GeoServerFactory;
import org.geoserver.config.GeoServerInfo;
import org.geoserver.config.GeoServerLoader;
import org.geoserver.config.GeoServerLoaderProxy;
import org.geoserver.config.LoggingInfo;
import org.geoserver.config.ServiceInfo;
import org.geoserver.ows.LocalWorkspace;
import org.geoserver.platform.GeoServerExtensions;
import org.geotools.referencing.CRS;
import org.geotools.util.logging.Logging;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class GeoServerImpl implements GeoServer, ApplicationContextAware {
private static final Logger LOGGER = Logging.getLogger(GeoServerImpl.class);
/**
* factory for creating objects
*/
GeoServerFactory factory = new GeoServerFactoryImpl(this);
/**
* the catalog
*/
Catalog catalog;
/**
* data access object
*/
GeoServerFacade facade;
/**
* listeners
*/
List<ConfigurationListener> listeners = new ArrayList<ConfigurationListener>();
public GeoServerImpl() {
this.facade = new DefaultGeoServerFacade(this);
}
public GeoServerFacade getFacade() {
return facade;
}
public void setFacade(GeoServerFacade facade) {
this.facade = facade;
facade.setGeoServer(this);
}
public GeoServerFactory getFactory() {
return factory;
}
public void setFactory(GeoServerFactory factory) {
this.factory = factory;
}
public Catalog getCatalog() {
return catalog;
}
public void setCatalog(Catalog catalog) {
this.catalog = catalog;
}
public GeoServerInfo getGlobal() {
return facade.getGlobal();
}
public void setGlobal(GeoServerInfo global) {
facade.setGlobal(global);
//fire the modification event
fireGlobalPostModified();
}
public LoggingInfo getLogging() {
return facade.getLogging();
}
public void setLogging(LoggingInfo logging) {
facade.setLogging(logging);
fireLoggingPostModified();
}
@Override
public void setApplicationContext(ApplicationContext context) throws BeansException {
if (factory instanceof ApplicationContextAware) {
((ApplicationContextAware)factory).setApplicationContext(context);
}
}
public void add(ServiceInfo service) {
if (service.getId() != null && facade.getService(service.getId(), ServiceInfo.class) != null) {
throw new IllegalArgumentException( "service with id '" + service.getId() + "' already exists" );
}
WorkspaceInfo workspace = service.getWorkspace();
if (workspace != null) {
if (facade.getServiceByName(service.getName(), workspace, ServiceInfo.class) != null) {
throw new IllegalArgumentException( "service with name '" + service.getName() +
"' already exists in workspace '" + workspace.getName() + "'" );
}
}
facade.add(service);
//fire post modification event
firePostServiceModified(service);
}
public static <T> T unwrap(T obj) {
return DefaultGeoServerFacade.unwrap(obj);
}
public <T extends ServiceInfo> T getService(Class<T> clazz) {
T service =
LocalWorkspace.get() != null ? facade.getService(LocalWorkspace.get(), clazz) : null;
return service != null ? service : facade.getService(clazz);
}
@Override
public <T extends ServiceInfo> T getService(WorkspaceInfo workspace, Class<T> clazz) {
return facade.getService(workspace, clazz);
}
public <T extends ServiceInfo> T getService(String id, Class<T> clazz) {
return facade.getService(id, clazz);
}
public <T extends ServiceInfo> T getServiceByName(String name, Class<T> clazz) {
T service = LocalWorkspace.get() != null ?
facade.getServiceByName(name, LocalWorkspace.get(), clazz) : null;
return service != null ? service : facade.getServiceByName(name, clazz);
}
public <T extends ServiceInfo> T getServiceByName(WorkspaceInfo workspace, String name, Class<T> clazz) {
return facade.getServiceByName(name, workspace, clazz);
}
public Collection<? extends ServiceInfo> getServices() {
Collection<? extends ServiceInfo> services =
LocalWorkspace.get() != null ? facade.getServices(LocalWorkspace.get()) : null;
return services != null ? services : facade.getServices();
}
@Override
public Collection<? extends ServiceInfo> getServices(WorkspaceInfo workspace) {
return facade.getServices(workspace);
}
public void remove(ServiceInfo service) {
facade.remove(service);
fireServiceRemoved(service);
}
public void save(GeoServerInfo geoServer) {
facade.save(geoServer);
//fire post modification event
fireGlobalPostModified();
}
public void save(LoggingInfo logging) {
facade.save(logging);
//fire post modification event
fireLoggingPostModified();
}
void fireGlobalPostModified() {
for ( ConfigurationListener l : listeners ) {
try {
l.handlePostGlobalChange( facade.getGlobal() );
}
catch( Exception e ) {
LOGGER.log(Level.SEVERE, "Error occurred processing a configuration change listener", e);
}
}
}
public void fireGlobalModified(GeoServerInfo global, List<String> changed, List oldValues,
List newValues) {
for ( ConfigurationListener l : getListeners() ) {
try {
l.handleGlobalChange( global, changed, oldValues, newValues);
}
catch( Exception e ) {
LOGGER.log(Level.SEVERE, "Error occurred processing a configuration change listener", e);
}
}
}
public void fireLoggingModified(LoggingInfo logging, List<String> changed, List oldValues,
List newValues) {
for ( ConfigurationListener l : getListeners() ) {
try {
l.handleLoggingChange( logging, changed, oldValues, newValues);
}
catch( Exception e ) {
LOGGER.log(Level.SEVERE, "Error occurred processing a configuration change listener", e);
}
}
}
void fireLoggingPostModified() {
for ( ConfigurationListener l : listeners ) {
try {
l.handlePostLoggingChange( facade.getLogging() );
}
catch( Exception e ) {
LOGGER.log(Level.SEVERE, "Error occurred processing a configuration change listener", e);
}
}
}
public void save(ServiceInfo service) {
validate(service);
facade.save(service);
//fire post modification event
firePostServiceModified(service);
}
void validate(ServiceInfo service) {
CatalogImpl.validateKeywords(service.getKeywords());
}
public void fireServiceModified(ServiceInfo service, List<String> changed, List oldValues,
List newValues) {
for ( ConfigurationListener l : getListeners() ) {
try {
l.handleServiceChange( service, changed, oldValues, newValues);
}
catch( Exception e ) {
LOGGER.log(Level.SEVERE, "Error occurred processing a configuration change listener", e);
}
}
}
void firePostServiceModified(ServiceInfo service) {
for ( ConfigurationListener l : listeners ) {
try {
l.handlePostServiceChange( service );
}
catch( Exception e ) {
LOGGER.log(Level.SEVERE, "Error occurred processing a configuration change listener", e);
}
}
}
void fireServiceRemoved(ServiceInfo service) {
for ( ConfigurationListener l : getListeners() ) {
try {
l.handleServiceRemove(service);
}
catch( Exception e ) {
LOGGER.log(Level.SEVERE, "Error occurred processing a configuration change listener", e);
}
}
}
public void addListener(ConfigurationListener listener) {
listeners.add( listener );
}
public void removeListener(ConfigurationListener listener) {
listeners.remove( listener );
}
public Collection<ConfigurationListener> getListeners() {
return listeners;
}
public void dispose() {
// look for pluggable handlers
for(GeoServerLifecycleHandler handler : GeoServerExtensions.extensions(GeoServerLifecycleHandler.class)) {
try {
handler.onDispose();
} catch(Throwable t) {
LOGGER.log(Level.SEVERE, "A GeoServer lifecycle handler threw an exception during dispose", t);
}
}
// internal cleanup
if ( catalog != null ) catalog.dispose();
if ( facade != null ) facade.dispose();
}
public void reload() throws Exception {
// flush caches
reset();
// reload configuration
GeoServerLoaderProxy loader = GeoServerExtensions.bean(GeoServerLoaderProxy.class);
synchronized (org.geoserver.config.GeoServer.CONFIGURATION_LOCK) {
getCatalog().getResourcePool().dispose();
loader.reload();
}
// look for pluggable handlers
for(GeoServerLifecycleHandler handler : GeoServerExtensions.extensions(GeoServerLifecycleHandler.class)) {
try {
handler.onReload();
} catch(Throwable t) {
LOGGER.log(Level.SEVERE, "A GeoServer lifecycle handler threw an exception during reload", t);
}
}
}
public void reset() {
// drop all the catalog store/feature types/raster caches
catalog.getResourcePool().dispose();
// reset the referencing subsystem
CRS.reset("all");
// look for pluggable handlers
for(GeoServerLifecycleHandler handler : GeoServerExtensions.extensions(GeoServerLifecycleHandler.class)) {
try {
handler.onReset();
} catch(Throwable t) {
LOGGER.log(Level.SEVERE, "A GeoServer lifecycle handler threw an exception during reset", t);
}
}
}
}