Fixes authentication issues
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / mkjsf / config / Mk2ConfigReader.java
1 package com.indexdata.mkjsf.config;\r
2 \r
3 import java.io.IOException;\r
4 import java.util.ArrayList;\r
5 import java.util.HashMap;\r
6 import java.util.List;\r
7 import java.util.Map;\r
8 \r
9 import javax.enterprise.context.SessionScoped;\r
10 import javax.enterprise.inject.Alternative;\r
11 import javax.faces.context.ExternalContext;\r
12 import javax.faces.context.FacesContext;\r
13 import javax.inject.Named;\r
14 import javax.servlet.ServletContext;\r
15 import javax.servlet.http.HttpServletRequest;\r
16 \r
17 import org.apache.log4j.Logger;\r
18 \r
19 import com.indexdata.masterkey.config.MasterkeyConfiguration;\r
20 import com.indexdata.masterkey.config.ModuleConfiguration;\r
21 import com.indexdata.mkjsf.errors.ConfigurationException;\r
22 import com.indexdata.mkjsf.errors.MissingConfigurationContextException;\r
23 import com.indexdata.mkjsf.utils.Utils;\r
24 \r
25 import static com.indexdata.mkjsf.utils.Utils.nl;\r
26 \r
27 /**\r
28  * Reads configuration from a MasterKey configuration scheme\r
29  * \r
30  * \r
31  * @author Niels Erik\r
32  *\r
33  */\r
34 @Named @SessionScoped @Alternative\r
35 public class Mk2ConfigReader implements ConfigurationReader  {\r
36 \r
37   private static final long serialVersionUID = 8865086878660568870L;\r
38   private static Logger logger = Logger.getLogger(Mk2ConfigReader.class);\r
39   private Map<String,Configuration> configs = new HashMap<String,Configuration>(); \r
40   private Map<String,Configurable> configurables = new HashMap<String,Configurable>();\r
41 \r
42   public Mk2ConfigReader () throws IOException {\r
43     logger.info(Utils.objectId(this) + " is instantiating Pazpar2 service configuration by MasterKey configuration scheme.");\r
44   }\r
45 \r
46   @Override\r
47   public Configuration getConfiguration(Configurable configurable) throws ConfigurationException {    \r
48     if (configs.get(configurable.getModuleName()) == null) {\r
49       Configuration config = readConfig(configurable);\r
50       configs.put(configurable.getModuleName(), config); \r
51       configurables.put(configurable.getModuleName(), configurable);\r
52     }\r
53     return configs.get(configurable.getModuleName());    \r
54   }\r
55     \r
56   private Configuration readConfig (Configurable configurable) throws ConfigurationException {\r
57     Configuration config = new Configuration();\r
58     MasterkeyConfiguration mkConfigContext = null;\r
59     ExternalContext externalContext = null;\r
60     try {\r
61       externalContext = FacesContext.getCurrentInstance().getExternalContext();      \r
62     } catch (NullPointerException npe){\r
63       throw new MissingConfigurationContextException("No FacesContext available to get configuration context from: " + npe.getMessage());\r
64     }\r
65     ServletContext servletContext = (ServletContext) externalContext.getContext();\r
66     try {\r
67       mkConfigContext = MasterkeyConfiguration.getInstance(servletContext,\r
68       "mkjsf", ((HttpServletRequest) externalContext.getRequest()).getServerName());\r
69     } catch (IOException e) {\r
70       throw new ConfigurationException(Mk2ConfigReader.class + " could not read configuration for '" + configurable.getModuleName() + "' using MasterKey configuration scheme: "+e.getMessage(),e);\r
71     }        \r
72     try {\r
73       ModuleConfiguration moduleConfig = mkConfigContext.getModuleConfiguration(configurable.getModuleName());      \r
74       config.addAll(configurable.getDefaults(),moduleConfig.getConfigMap());\r
75       config.set("configpath", moduleConfig.getConfigFilePath());            \r
76     } catch (IOException e) {\r
77       throw new ConfigurationException(Mk2ConfigReader.class + " could not read configuration for '"+ configurable.getModuleName() + "': "+e.getMessage(),e);\r
78     }        \r
79     return config;\r
80   }\r
81         \r
82   public List<String> document() {\r
83     List<String> doc = new ArrayList<String>();\r
84     doc.add("Application properties as read by " + this.getClass());\r
85     for (String moduleName : configs.keySet()) {\r
86       doc.add(nl+"Module: " + moduleName);\r
87       Configurable module = configurables.get(moduleName);\r
88       Map<String,String> map = configs.get(moduleName).getConfigMap();\r
89       for (String key :  map.keySet()) {\r
90         doc.add(nl+key+": "+ map.get(key) +\r
91             (module.getDefaults().containsKey(key) ? \r
92                 (module.getDefaults().get(key).equals(map.get(key)) ? " [default]" : " [override]")\r
93                 : "")); \r
94       }\r
95     }\r
96     return doc;\r
97   }\r
98     \r
99 \r
100 }\r