All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.daisy.pipeline.client.utils.NamespaceContextMap Maven / Gradle / Ivy

There is a newer version: 5.0.1
Show newest version
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+" } ";
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy