1 package com.atlassian.mail.config;
2
3 import com.atlassian.core.util.ClassLoaderUtils;
4 import com.atlassian.core.util.XMLUtils;
5 import com.atlassian.mail.Settings;
6 import com.atlassian.mail.server.MailServerManager;
7 import org.apache.log4j.Logger;
8 import org.w3c.dom.Document;
9 import org.w3c.dom.Element;
10 import org.w3c.dom.NodeList;
11
12 import javax.xml.parsers.DocumentBuilder;
13 import javax.xml.parsers.DocumentBuilderFactory;
14 import java.io.IOException;
15 import java.io.InputStream;
16 import java.util.HashMap;
17 import java.util.Map;
18
19 import static com.atlassian.core.util.ClassLoaderUtils.loadClass;
20
21 public class ConfigLoader
22 {
23 private static final Logger log = Logger.getLogger(ConfigLoader.class);
24 private static final String DEFAULT_CONFIG_FILE = "mail-config.xml";
25
26 private MailServerManager loadedManager;
27 private Settings loadedSettings;
28
29 public ConfigLoader(final String file)
30 {
31
32 final InputStream configurationFileAsStream = ClassLoaderUtils.getResourceAsStream(file, ConfigLoader.class);
33 try
34 {
35 final DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
36 final Document xmlDoc = db.parse(configurationFileAsStream);
37 final Element root = xmlDoc.getDocumentElement();
38 final Element manager = (Element) root.getElementsByTagName("manager").item(0);
39 final Class aClass = loadClass(manager.getAttribute("class"), this.getClass());
40 final MailServerManager mailServerManager = (MailServerManager) aClass.newInstance();
41
42 final Map<String, String> params = new HashMap<String, String>();
43 final NodeList properties = manager.getElementsByTagName("property");
44 if (properties.getLength() > 0)
45 {
46 for (int i = 0; i < properties.getLength(); i++)
47 {
48 final Element property = (Element) properties.item(i);
49 final String name = XMLUtils.getContainedText(property, "name");
50 final String value = XMLUtils.getContainedText(property, "value");
51 params.put(name, value);
52 }
53 }
54 mailServerManager.init(params);
55 setLoadedManager(mailServerManager);
56
57 final Element settingsNode = (Element) root.getElementsByTagName("settings").item(0);
58 if (settingsNode == null)
59 {
60 setLoadedSettings(new Settings.Default());
61 }
62 else
63 {
64 final Class settingsClass = loadClass(settingsNode.getAttribute("class"), ConfigLoader.class);
65 final Settings settingsInstance = (Settings) settingsClass.newInstance();
66 setLoadedSettings(settingsInstance);
67 }
68 }
69 catch (Exception e)
70 {
71 log.fatal(e, e);
72 throw new RuntimeException("Error in mail configuration: " + e.getMessage(), e);
73 }
74 finally
75 {
76 try
77 {
78 configurationFileAsStream.close();
79 }
80 catch (IOException e2)
81 {
82 log.error(e2);
83 }
84 }
85 }
86
87 public static MailServerManager getServerManager()
88 {
89 return getServerManager(DEFAULT_CONFIG_FILE);
90 }
91
92 public static MailServerManager getServerManager(final String file)
93 {
94 final ConfigLoader configLoader = new ConfigLoader(file);
95 return configLoader.getLoadedManager();
96 }
97
98 public static Settings getSettings(final String file)
99 {
100 final ConfigLoader configLoader = new ConfigLoader(file);
101 return configLoader.getLoadedSettings();
102 }
103
104 public static Settings getSettings()
105 {
106 return getSettings(DEFAULT_CONFIG_FILE);
107 }
108
109 public MailServerManager getLoadedManager()
110 {
111 return loadedManager;
112 }
113
114 public void setLoadedManager(final MailServerManager loadedManager)
115 {
116 this.loadedManager = loadedManager;
117 }
118
119 public void setLoadedSettings(final Settings loadedSettings)
120 {
121 this.loadedSettings = loadedSettings;
122 }
123
124 public Settings getLoadedSettings()
125 {
126 return loadedSettings;
127 }
128 }