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          //This is a bit of a hack for JBOSS
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 }