1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.opencastproject.index.service.catalog.adapter;
23
24 import static java.lang.String.format;
25 import static org.apache.commons.lang3.StringUtils.isBlank;
26
27 import org.opencastproject.util.ConfigurationException;
28 import org.opencastproject.util.XmlNamespaceContext;
29
30 import java.util.Dictionary;
31 import java.util.Enumeration;
32 import java.util.HashMap;
33 import java.util.Map;
34
35
36
37
38 public final class CatalogUIAdapterConfiguration {
39
40
41 public static final String KEY_XML_ROOT_ELEMENT_NAME = "xml.rootElement.name";
42 public static final String KEY_XML_ROOT_ELEMENT_NS_URI = "xml.rootElement.namespace.URI";
43 public static final String XML_BINDING_KEY_PREFIX = "xml.namespaceBinding.";
44 public static final String XML_BINDING_URI_SUFFIX = ".URI";
45 public static final String XML_BINDING_PREFIX_SUFFIX = ".prefix";
46
47
48 private final Dictionary<String, ?> configProperties;
49
50
51 private XmlNamespaceContext xmlNSContext;
52
53
54
55
56
57
58
59
60
61
62 public static CatalogUIAdapterConfiguration loadFromDictionary(Dictionary<String, ?> properties)
63 throws ConfigurationException {
64 return new CatalogUIAdapterConfiguration(properties);
65 }
66
67 private CatalogUIAdapterConfiguration(Dictionary<String, ?> properties) throws ConfigurationException {
68 this.configProperties = properties;
69 loadXmlNSContext();
70 validate();
71 }
72
73
74
75
76
77
78
79 private void validate() throws ConfigurationException {
80 if (configProperties.get(KEY_XML_ROOT_ELEMENT_NAME) == null)
81 throw new ConfigurationException(
82 format("Value for configuration key '%s' is missing", KEY_XML_ROOT_ELEMENT_NAME));
83
84 if (configProperties.get(KEY_XML_ROOT_ELEMENT_NS_URI) == null)
85 throw new ConfigurationException(
86 format("Value for configuration key '%s' is missing", KEY_XML_ROOT_ELEMENT_NS_URI));
87
88 if (xmlNSContext.getPrefix(getCatalogXmlRootNamespace()) == null)
89 throw new ConfigurationException(
90 format("Binding for XML namespace URI '%s' is missing", getCatalogXmlRootNamespace()));
91 }
92
93
94
95
96 private void loadXmlNSContext() {
97 final Enumeration<String> keys = configProperties.keys();
98 final Map<String, String> prefixToUri = new HashMap<String, String>();
99 while (keys.hasMoreElements()) {
100 final String key = keys.nextElement();
101 if (key.startsWith(XML_BINDING_KEY_PREFIX)) {
102
103 final String nsBindingName = getXmlBindingNameFromConfigKey(key);
104
105 final String nsUri = (String) configProperties
106 .get(XML_BINDING_KEY_PREFIX + nsBindingName + XML_BINDING_URI_SUFFIX);
107 final String nsPrefix = (String) configProperties
108 .get(XML_BINDING_KEY_PREFIX + nsBindingName + XML_BINDING_PREFIX_SUFFIX);
109
110 if (isBlank(nsUri))
111 throw new ConfigurationException(format("No URI for namespace binding '%s' found", nsBindingName));
112 if (nsPrefix == null)
113 throw new ConfigurationException(format("No prefix for namespace binding '%s' found", nsBindingName));
114
115 prefixToUri.put(nsPrefix, nsUri);
116 }
117 }
118
119 xmlNSContext = new XmlNamespaceContext(prefixToUri);
120 }
121
122
123
124
125
126
127
128
129 private static String getXmlBindingNameFromConfigKey(final String key) {
130 if (isBlank(key) || !key.startsWith(XML_BINDING_KEY_PREFIX))
131 throw new IllegalArgumentException(format("The given key '%s' is not part of a XML binding definition", key));
132 final String keyWithoutPrefix = key.substring(XML_BINDING_KEY_PREFIX.length());
133 return keyWithoutPrefix.substring(0, keyWithoutPrefix.indexOf("."));
134 }
135
136
137
138
139 public String getCatalogXmlRootElementName() {
140 return (String) configProperties.get(KEY_XML_ROOT_ELEMENT_NAME);
141 }
142
143
144
145
146 public String getCatalogXmlRootNamespace() {
147 return (String) configProperties.get(KEY_XML_ROOT_ELEMENT_NS_URI);
148 }
149
150
151
152
153 public XmlNamespaceContext getXmlNamespaceContext() {
154 return xmlNSContext;
155 }
156
157 }