diff artifact-database/src/main/java/de/intevation/artifactdatabase/FactoryBootstrap.java @ 311:1d517e051e95

Made backend listeners loadable at boot time. artifacts/trunk@2436 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 01 Aug 2011 14:17:09 +0000
parents d96bcb40dbf9
children f2277458823e
line wrap: on
line diff
--- a/artifact-database/src/main/java/de/intevation/artifactdatabase/FactoryBootstrap.java	Mon Aug 01 09:41:40 2011 +0000
+++ b/artifact-database/src/main/java/de/intevation/artifactdatabase/FactoryBootstrap.java	Mon Aug 01 14:17:09 2011 +0000
@@ -123,6 +123,9 @@
     public static final String LIFETIME_LISTENERS =
         "/artifact-database/lifetime-listeners/listener";
 
+    public static final String BACKEND_LISTENERS =
+        "/artifact-database/backend-listeners/listener";
+
     /**
      * Default export signing secret.
      * <strong>PLEASE CHANGE THE SECRET VIA THE XPATH EXPORT_SECRET
@@ -169,6 +172,8 @@
 
     protected List<LifetimeListener> lifetimeListeners;
 
+    protected List<BackendListener> backendListeners;
+
     /**
      * byte array holding the export signing secret.
      */
@@ -491,6 +496,49 @@
         lifetimeListeners = ltls;
     }
 
+    protected void loadBackendListeners() {
+        logger.info("loading backend listeners");
+
+        NodeList nodes = Config.getNodeSetXPath(BACKEND_LISTENERS);
+
+        if (nodes == null) {
+            logger.debug("no backend listeners configure");
+            return;
+        }
+
+        List<BackendListener> bls = new ArrayList<BackendListener>();
+
+        for (int i = 0, N = nodes.getLength(); i < N; ++i) {
+            Node node = nodes.item(i);
+            String className = node.getTextContent();
+            if (className == null
+            || (className = className.trim()).length() == 0) {
+                continue;
+            }
+            try {
+                Class clazz = Class.forName(className);
+                BackendListener listener =
+                    (BackendListener)clazz.newInstance();
+
+                bls.add(listener);
+            }
+            catch (ClassNotFoundException cnfe) {
+                logger.error(cnfe.getLocalizedMessage(), cnfe);
+            }
+            catch (InstantiationException ie) {
+                logger.error(ie.getLocalizedMessage(), ie);
+            }
+            catch (ClassCastException cce) {
+                logger.error(cce.getLocalizedMessage(), cce);
+            }
+            catch (IllegalAccessException iae) {
+                logger.error(iae.getLocalizedMessage(), iae);
+            }
+        }
+
+        backendListeners = bls;
+    }
+
     protected void loadHooks() {
         logger.info("loading hooks");
 
@@ -584,6 +632,7 @@
         loadHTTPServer();
         loadHooks();
         loadLifetimeListeners();
+        loadBackendListeners();
     }
 
     /**
@@ -661,5 +710,9 @@
     public List<LifetimeListener> getLifetimeListeners() {
         return lifetimeListeners;
     }
+
+    public List<BackendListener> getBackendListeners() {
+        return backendListeners;
+    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org