/* (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.util; import java.util.ArrayList; import java.util.List; import org.geoserver.platform.GeoServerExtensions; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import com.thoughtworks.xstream.io.HierarchicalStreamDriver; import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver; /** * Factory for {@link XStreamPersister} instances. * <p> * This class is a singleton registered in a spring context. Any code that needs * to create an XStreamPersister instance should do one of the following: * <ol> * <li>Use dependency injection via spring. Example: * <pre> * <bean id="myBean" class="com.xyz.MyBean"> * <constructor-arg ref="xstreamPersisterFactory"/> * </bean> * </pre> * <li>Lookup via {@link GeoServerExtensions#bean(Class)}: * <pre> * XStreamPersisterFactory xpf = GeoServerExtension.bean(XStreamPeristerFactory.class); * </pre> * </ol> * </p> * * @author Justin Deoliveira, OpenGeo * */ public class XStreamPersisterFactory implements ApplicationContextAware { private List<XStreamPersisterInitializer> initializers; /** * Creates an instance configured to persist XML. */ public XStreamPersister createXMLPersister() { return buildPersister(null); } /** * Creates an instance configured to persist JSON. */ public XStreamPersister createJSONPersister() { return buildPersister(new JettisonMappedXmlDriver()); } /** * Builds a persister and runs the initializers against it */ private XStreamPersister buildPersister(HierarchicalStreamDriver driver) { XStreamPersister persister = new XStreamPersister(driver); // give the initializers a chance to register their own converters, aliases and so on for (XStreamPersisterInitializer initializer : getInitializers()) { initializer.init(persister); } return persister; } private List<XStreamPersisterInitializer> getInitializers() { if (initializers == null) { initializers = new ArrayList<XStreamPersisterInitializer>( GeoServerExtensions.extensions(XStreamPersisterInitializer.class)); } return initializers; } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { initializers = new ArrayList<XStreamPersisterInitializer>(GeoServerExtensions.extensions( XStreamPersisterInitializer.class, applicationContext)); } /** * Programmatically adds a {@link XStreamPersisterInitializer} to the factory (initializers are * also automatically looked up from the Spring context, use this method only if you cannot * Declare your initializer as a spring bean) * * @param initializer */ public void addInitializer(XStreamPersisterInitializer initializer) { getInitializers().add(initializer); } /** * Removes an initializer * * @return True if the initializer was found and removed, false otherwise */ public boolean removeInitializer(XStreamPersisterInitializer initializer) { return getInitializers().remove(initializer); } }