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(format(
82 "Value for configuration key '%s' is missing", KEY_XML_ROOT_ELEMENT_NAME));
83 }
84
85 if (configProperties.get(KEY_XML_ROOT_ELEMENT_NS_URI) == null) {
86 throw new ConfigurationException(format(
87 "Value for configuration key '%s' is missing", KEY_XML_ROOT_ELEMENT_NS_URI));
88 }
89
90 if (xmlNSContext.getPrefix(getCatalogXmlRootNamespace()) == null) {
91 throw new ConfigurationException(format(
92 "Binding for XML namespace URI '%s' is missing", getCatalogXmlRootNamespace()));
93 }
94 }
95
96
97
98
99 private void loadXmlNSContext() {
100 final Enumeration<String> keys = configProperties.keys();
101 final Map<String, String> prefixToUri = new HashMap<String, String>();
102 while (keys.hasMoreElements()) {
103 final String key = keys.nextElement();
104 if (key.startsWith(XML_BINDING_KEY_PREFIX)) {
105
106 final String nsBindingName = getXmlBindingNameFromConfigKey(key);
107
108 final String nsUri = (String) configProperties
109 .get(XML_BINDING_KEY_PREFIX + nsBindingName + XML_BINDING_URI_SUFFIX);
110 final String nsPrefix = (String) configProperties
111 .get(XML_BINDING_KEY_PREFIX + nsBindingName + XML_BINDING_PREFIX_SUFFIX);
112
113 if (isBlank(nsUri)) {
114 throw new ConfigurationException(format("No URI for namespace binding '%s' found", nsBindingName));
115 }
116 if (nsPrefix == null) {
117 throw new ConfigurationException(format("No prefix for namespace binding '%s' found", nsBindingName));
118 }
119
120 prefixToUri.put(nsPrefix, nsUri);
121 }
122 }
123
124 xmlNSContext = new XmlNamespaceContext(prefixToUri);
125 }
126
127
128
129
130
131
132
133
134 private static String getXmlBindingNameFromConfigKey(final String key) {
135 if (isBlank(key) || !key.startsWith(XML_BINDING_KEY_PREFIX)) {
136 throw new IllegalArgumentException(format("The given key '%s' is not part of a XML binding definition", key));
137 }
138 final String keyWithoutPrefix = key.substring(XML_BINDING_KEY_PREFIX.length());
139 return keyWithoutPrefix.substring(0, keyWithoutPrefix.indexOf("."));
140 }
141
142
143
144
145 public String getCatalogXmlRootElementName() {
146 return (String) configProperties.get(KEY_XML_ROOT_ELEMENT_NAME);
147 }
148
149
150
151
152 public String getCatalogXmlRootNamespace() {
153 return (String) configProperties.get(KEY_XML_ROOT_ELEMENT_NS_URI);
154 }
155
156
157
158
159 public XmlNamespaceContext getXmlNamespaceContext() {
160 return xmlNSContext;
161 }
162
163 }