/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.config; import java.io.IOException; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.geoserver.catalog.WorkspaceInfo; import org.geoserver.config.util.XStreamServiceLoader; import org.geoserver.platform.GeoServerResourceLoader; import org.geoserver.platform.resource.Paths; import org.geoserver.platform.resource.Resource; import org.geotools.util.logging.Logging; public class ServicePersister extends ConfigurationListenerAdapter { static Logger LOGGER = Logging.getLogger( "org.geoserver" ); List<XStreamServiceLoader> loaders; GeoServer geoServer; GeoServerResourceLoader resourceLoader; public ServicePersister(List<XStreamServiceLoader> loaders, GeoServer geoServer) { this.loaders = loaders; this.geoServer = geoServer; this.resourceLoader = geoServer.getCatalog().getResourceLoader(); } @Override public void handleServiceChange(ServiceInfo service, List<String> propertyNames, List<Object> oldValues, List<Object> newValues) { XStreamServiceLoader loader = findServiceLoader(service); //handle the case of a service changing workspace and move the file int i = propertyNames.indexOf("workspace"); if (i != -1) { //TODO: share code with GeoServerPersister WorkspaceInfo old = (WorkspaceInfo) oldValues.get(i); if (old != null) { WorkspaceInfo ws = (WorkspaceInfo) newValues.get(i); Resource f; try { f = dir(ws).get(loader.getFilename()); f.renameTo(dir(ws).get(loader.getFilename())); } catch (IOException e) { throw new RuntimeException( e ); } } } } public void handlePostServiceChange(ServiceInfo service) { XStreamServiceLoader loader = findServiceLoader(service); try { //TODO: handle workspace move, factor this class out into // separate persister class Resource directory = service.getWorkspace() != null ? dir(service.getWorkspace()) : null; loader.save( service, geoServer, directory); } catch (Throwable t) { throw new RuntimeException( t ); //LOGGER.log(Level.SEVERE, "Error occurred while saving configuration", t); } } public void handleServiceRemove(ServiceInfo service) { XStreamServiceLoader loader = findServiceLoader(service); try { Resource dir = service.getWorkspace() != null ? dir(service.getWorkspace()) : resourceLoader.get(Paths.BASE); dir.get(loader.getFilename()).delete(); } catch(Throwable t) { throw new RuntimeException(t); } } XStreamServiceLoader findServiceLoader(ServiceInfo service) { XStreamServiceLoader loader = null; for ( XStreamServiceLoader<ServiceInfo> l : loaders ) { if ( l.getServiceClass().isInstance( service ) ) { loader = l; break; } } if (loader == null) { throw new IllegalArgumentException("No loader for " + service.getName()); } return loader; } Resource dir( WorkspaceInfo ws ) throws IOException { return resourceLoader.get(Paths.path("workspaces", ws.getName())); } }