package org.xbib.elasticsearch.common.xcontent.xml;
import javax.xml.namespace.NamespaceContext;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
/**
* Contains a simple context for XML namespaces
*
*/
public class XmlNamespaceContext implements NamespaceContext {
private static final String DEFAULT_RESOURCE = "xml-namespaces";
private final SortedMap<String, String> namespaces = new TreeMap<>();
private final SortedMap<String, Set<String>> prefixes = new TreeMap<>();
protected XmlNamespaceContext() {
}
protected XmlNamespaceContext(ResourceBundle bundle) {
Enumeration<String> en = bundle.getKeys();
while (en.hasMoreElements()) {
String prefix = en.nextElement();
String namespace = bundle.getString(prefix);
addNamespace(prefix, namespace);
}
}
protected static String bundleName() {
return DEFAULT_RESOURCE;
}
/**
* Empty namespace context.
*
* @return a namespace context instance
*/
public static XmlNamespaceContext newInstance() {
return new XmlNamespaceContext();
}
/**
* Default namespaces from default resource bundle.
* @return a namespace context instance
*/
public static XmlNamespaceContext getDefaultInstance() {
return newInstance(bundleName());
}
/**
* Namespaces from given resource bundle name.
* @return a namespace context instance
*/
public static XmlNamespaceContext newInstance(String bundleName) {
try {
return new XmlNamespaceContext(ResourceBundle.getBundle(bundleName));
} catch (MissingResourceException e) {
return new XmlNamespaceContext();
}
}
public final synchronized void addNamespace(String prefix, String namespace) {
namespaces.put(prefix, namespace);
if (prefixes.containsKey(namespace)) {
prefixes.get(namespace).add(prefix);
} else {
Set<String> set = new HashSet<String>();
set.add(prefix);
prefixes.put(namespace, set);
}
}
public Map<String, String> getNamespaces() {
return namespaces;
}
@Override
public String getNamespaceURI(String prefix) {
if (prefix == null) {
return null;
}
return namespaces.containsKey(prefix) ? namespaces.get(prefix) : null;
}
@Override
public String getPrefix(String namespaceURI) {
Iterator<String> it = getPrefixes(namespaceURI);
return it != null && it.hasNext() ? it.next() : null;
}
@Override
public Iterator<String> getPrefixes(String namespace) {
if (namespace == null) {
throw new IllegalArgumentException("namespace URI cannot be null");
}
return prefixes.containsKey(namespace) ?
prefixes.get(namespace).iterator() : null;
}
public String toString() {
return namespaces.toString();
}
}