/* (c) 2017 Open Source Geospatial Foundation - all rights reserved
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.notification;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.geoserver.config.GeoServer;
import org.geoserver.config.GeoServerInitializer;
import org.geoserver.notification.common.NotificationConfiguration;
import org.geoserver.notification.common.NotificationXStreamInitializer;
import org.geoserver.platform.GeoServerExtensions;
import org.geoserver.platform.GeoServerResourceLoader;
import org.geoserver.platform.resource.Paths;
import org.geoserver.platform.resource.Resource;
import org.geoserver.platform.resource.Resources;
import org.geoserver.util.IOUtils;
import org.geotools.util.logging.Logging;
import com.thoughtworks.xstream.XStream;
public class NotifierInitializer implements GeoServerInitializer {
static Logger LOGGER = Logging.getLogger(NotifierInitializer.class);
public static final String PROPERTYFILENAME = "notifier.xml";
public static final String THREAD_NAME = "MessageMultiplexer";
private GeoServerResourceLoader loader;
public NotifierInitializer(GeoServerResourceLoader loader) {
this.loader = loader;
}
public void initialize(GeoServer geoServer) throws Exception {
XStream xs = new XStream();
List<NotificationXStreamInitializer> xstreamInitializers = GeoServerExtensions
.extensions(NotificationXStreamInitializer.class);
for (NotificationXStreamInitializer ni : xstreamInitializers) {
ni.init(xs);
}
NotificationConfiguration cfg = getConfiguration(xs);
MessageMultiplexer mm = new MessageMultiplexer(cfg);
List<INotificationCatalogListener> catalogListeners = GeoServerExtensions
.extensions(INotificationCatalogListener.class);
for (INotificationCatalogListener cl : catalogListeners) {
cl.setMessageMultiplexer(mm);
geoServer.getCatalog().addListener(cl);
}
List<INotificationTransactionListener> transactionListeners = GeoServerExtensions
.extensions(INotificationTransactionListener.class);
for (INotificationTransactionListener tl : transactionListeners) {
tl.setMessageMultiplexer(mm);
}
(new Thread(mm,THREAD_NAME)).start();
}
private NotificationConfiguration getConfiguration(XStream xs) {
NotificationConfiguration nc = null;
try {
Resource f = this.loader.get(Paths.path("notifier", PROPERTYFILENAME));
if (!Resources.exists(f)) {
/*
* Copy and use the sample notifier
*/
IOUtils.copy(
getClass().getClassLoader().getResourceAsStream(
NotifierInitializer.PROPERTYFILENAME), f.file());
}
nc = (NotificationConfiguration) xs.fromXML(f.in());
} catch (Exception e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
}
return nc;
}
}