no stacktrace
[opensuse:sxkeeper.git] / src / de / suse / trigger / TriggerManager.java
1 /*
2  * Copyright (c) - 2007 by Thomas Schmidt <tschmidt@suse.de>
3  * 
4  * This file is part of the SUSE XML (SX) project. 
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of version 2 of the GNU General Public License as
8  * published by the Free Software Foundation.
9  */
10
11 package de.suse.trigger;
12
13 import java.util.*;
14
15 import org.apache.log4j.*;
16
17 import de.suse.xml.*;
18 /**
19  * @author Thomas Schmidt &lt;tschmidt@suse.de&gt;
20  *
21  * This is a singleton class that manages the trigger instances
22  */
23 public class TriggerManager {
24     
25     private static TriggerManager manager = null;
26     // caching trigger instances here. 
27     // key: containername; value: list with class instances
28     private final HashMap<String, List<TriggerIface>> triggerInstances = new HashMap<String, List<TriggerIface>>();
29     private final Logger log = Logger.getLogger("de.suse.trigger");
30     
31     
32     private TriggerManager() { }
33
34     
35     public void runPreWriteTriggers (SXDocumentType docType, SXDocument newDoc, Properties reqProps) throws Exception {
36         String containerName = docType.getName();
37         List<TriggerIface> triggerList = getTriggerInstances(containerName);
38         log.debug("running pre-triggers for container " + containerName + ": " + triggerList);
39         String errorMsg = "";
40         int httpCode = 400;
41         for (Iterator<TriggerIface> it = triggerList.iterator(); it.hasNext(); ) {
42             try {
43                 (it.next()).preWrite(docType, newDoc, reqProps);
44             } catch (Exception e) {
45                 //e.printStackTrace();
46                 if (!errorMsg.equals(""))
47                     httpCode = 450; // multiple trigger errors
48                 else if (e instanceof SXException) 
49                     httpCode = ((SXException) e).getHTTPResponseCode();
50                 errorMsg += e.getMessage() + "\n";
51             }
52         }
53         if (errorMsg.length() > 0) throw new SXException(errorMsg, httpCode);
54     }
55     
56     
57     
58     public void runPostWriteTriggers (SXDocumentType docType, SXDocument newDoc, SXDocument oldDoc, Properties reqProps) 
59         throws Exception {
60         String containerName = docType.getName();
61         List<TriggerIface> triggerList = getTriggerInstances(containerName);
62         log.debug("running post-triggers for container " + containerName + ": " + triggerList);
63         String errorMsg = "";
64         int httpCode = 400;
65         for (Iterator<TriggerIface> it = triggerList.iterator(); it.hasNext(); ) {
66             try {
67                 (it.next()).postWrite(docType, newDoc, oldDoc, reqProps);
68             } catch (Exception e) {
69                 e.printStackTrace();
70                 if (!errorMsg.equals("")) 
71                     httpCode = 450;
72                 else if (e instanceof SXException) 
73                     httpCode = ((SXException) e).getHTTPResponseCode();
74                 errorMsg += e.getMessage() + "\n";
75             }
76         }
77         if (errorMsg.length() > 0) throw new SXException(errorMsg, httpCode);
78     }
79     
80     
81     private List<TriggerIface> getTriggerInstances(String containerName) throws Exception {
82         if (!triggerInstances.containsKey(containerName)) {
83             PropertyManager propertyManager = PropertyManager.getInstance();
84             ArrayList<TriggerIface> containerTriggerInstances = new ArrayList<TriggerIface>();
85             String classes = propertyManager.getConfig(containerName).getProperty(PropertyManager.TRIGGER);
86             if (classes != null && !classes.trim().equals("")) {
87                 String [] classNames = classes.split(",");
88                 for (int i = 0; i < classNames.length; i++) {
89                     containerTriggerInstances.add(getTriggerInstance(classNames[i].trim()));
90                 }
91             }
92             triggerInstances.put(containerName, containerTriggerInstances);
93         }
94         return triggerInstances.get(containerName);
95     }
96     
97     
98     private TriggerIface getTriggerInstance(String className) throws Exception {
99         TriggerIface triggerInstance = null;
100             try {
101                 Class triggerClass = Class.forName(className);
102                 triggerInstance = (TriggerIface) triggerClass.newInstance();
103             } catch (Exception e) {
104                 log.error("Error loading configured trigger-class: " + className + " " + e.getMessage());
105                 throw e;
106             }
107         return triggerInstance;
108     }
109     
110     
111     
112     public synchronized static TriggerManager getInstance(){
113         if( manager == null ) {
114             manager = new TriggerManager();
115         }
116         return manager;
117     }
118 }