/* 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.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import org.geoserver.config.GeoServer; import org.geoserver.config.ServiceInfo; import org.geoserver.config.ServiceLoader; import org.geoserver.platform.GeoServerResourceLoader; import com.thoughtworks.xstream.XStream; /** * Service loader which loads and saves a service configuration with xstream. * * @author Justin Deoliveira, The Open Planning Project * */ public abstract class XStreamServiceLoader<T extends ServiceInfo> implements ServiceLoader<T> { GeoServerResourceLoader resourceLoader; String filenameBase; XStreamPersisterFactory xpf = new XStreamPersisterFactory(); public XStreamServiceLoader(GeoServerResourceLoader resourceLoader, String filenameBase) { this.resourceLoader = resourceLoader; this.filenameBase = filenameBase; } public void setXStreamPeristerFactory(XStreamPersisterFactory xpf) { this.xpf = xpf; } public final T load( GeoServer gs ) throws Exception { //look for file matching classname String filename = this.filenameBase + ".xml"; File file = resourceLoader.find( filename ); if ( file != null && file.exists() ) { //xstream it in BufferedInputStream in = new BufferedInputStream( new FileInputStream( file ) ); try { XStreamPersister xp = xpf.createXMLPersister(); initXStreamPersister(xp, gs); return initialize( xp.load( in, getServiceClass() ) ); } finally { in.close(); } } else { //create an 'empty' object ServiceInfo service = createServiceFromScratch( gs ); return initialize( (T) service ); } } protected T initialize( T service ) { return service; } public void save(T service, GeoServer gs) throws Exception { String filename = filenameBase + ".xml"; File file = resourceLoader.find( filename ); if ( file == null ) { file = resourceLoader.createFile(filename); } BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file)); try { XStreamPersister xp = xpf.createXMLPersister(); initXStreamPersister(xp, gs); xp.save( service, out ); out.flush(); } finally { out.close(); } } /** * Hook for subclasses to configure the xstream. * <p> * The most common use is to do some aliasing or omit some fields. * </p> */ protected void initXStreamPersister( XStreamPersister xp, GeoServer gs ) { xp.setGeoServer( gs ); xp.getXStream().alias( filenameBase, getServiceClass() ); } protected abstract T createServiceFromScratch(GeoServer gs); }