org.daisy.pipeline.client.utils.NamespaceContextMap Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of clientlib-java Show documentation
Show all versions of clientlib-java Show documentation
A Java library for communicating with the DAISY Pipeline 2.
package org.daisy.pipeline.client.utils;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.xml.XMLConstants;
import javax.xml.namespace.NamespaceContext;
/**
* An implementation of
* NamespaceContext . Instances are immutable.
*
* @author McDowell
*/
public final class NamespaceContextMap implements NamespaceContext {
private final Map prefixMap;
private final Map> nsMap;
/**
* Constructor that takes a map of XML prefix-namespaceURI values. A defensive
* copy is made of the map. An IllegalArgumentException will be thrown if the
* map attempts to remap the standard prefixes defined in the NamespaceContext
* contract.
*
* @param prefixMappings a map of prefix:namespaceURI values
*/
public NamespaceContextMap(Map prefixMappings) {
prefixMap = createPrefixMap(prefixMappings);
nsMap = createNamespaceMap(prefixMap);
}
/**
* Convenience constructor.
*
* @param mappingPairs pairs of prefix-namespaceURI values
*/
public NamespaceContextMap(String... mappingPairs) {
this(toMap(mappingPairs));
}
private static Map toMap(String... mappingPairs) {
Map prefixMappings = new HashMap(mappingPairs.length / 2);
for (int i = 0; i < mappingPairs.length; i++) {
prefixMappings.put(mappingPairs[i], mappingPairs[++i]);
}
return prefixMappings;
}
private Map createPrefixMap(Map prefixMappings) {
Map prefixMap = new HashMap(prefixMappings);
addConstant(prefixMap, XMLConstants.XML_NS_PREFIX,XMLConstants.XML_NS_URI);
addConstant(prefixMap, XMLConstants.XMLNS_ATTRIBUTE,XMLConstants.XMLNS_ATTRIBUTE_NS_URI);
return Collections.unmodifiableMap(prefixMap);
}
private void addConstant(Map prefixMap, String prefix, String nsURI) {
String previous = prefixMap.put(prefix, nsURI);
if (previous != null && !previous.equals(nsURI)) {
throw new IllegalArgumentException(prefix + " -> " + previous + "; see NamespaceContext contract");
}
}
private Map> createNamespaceMap(Map prefixMap) {
Map> nsMap = new HashMap>();
for (Map.Entry entry : prefixMap.entrySet()) {
String nsURI = entry.getValue();
Set prefixes = nsMap.get(nsURI);
if (prefixes == null) {
prefixes = new HashSet();
nsMap.put(nsURI, prefixes);
}
prefixes.add(entry.getKey());
}
for (Map.Entry> entry : nsMap.entrySet()) {
Set readOnly = Collections.unmodifiableSet(entry.getValue());
entry.setValue(readOnly);
}
return nsMap;
}
// @Override
public String getNamespaceURI(String prefix) {
checkNotNull(prefix);
String nsURI = prefixMap.get(prefix);
return nsURI == null ? XMLConstants.NULL_NS_URI : nsURI;
}
// @Override
public String getPrefix(String namespaceURI) {
checkNotNull(namespaceURI);
Set set = nsMap.get(namespaceURI);
return set == null ? null : set.iterator().next();
}
// @Override
public Iterator getPrefixes(String namespaceURI) {
checkNotNull(namespaceURI);
Set set = nsMap.get(namespaceURI);
return set.iterator();
}
private void checkNotNull(String value) {
if (value == null) {
throw new IllegalArgumentException("null");
}
}
/**
* @return an unmodifiable map of the mappings in the form prefix-namespaceURI
*/
public Map getMap() {
return prefixMap;
}
public String toString() {
String result = "";
for (String prefix : prefixMap.keySet()) {
result += prefix+":"+prefixMap.get(prefix)+" , ";
}
return "{ "+result+" } ";
}
}