org.apache.xml.security.utils.DOMNamespaceContext Maven / Gradle / Ivy
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.xml.security.utils;
import java.util.Iterator;
import java.util.Objects;
import javax.xml.namespace.NamespaceContext;
import org.w3c.dom.Node;
import static javax.xml.XMLConstants.DEFAULT_NS_PREFIX;
import static javax.xml.XMLConstants.NULL_NS_URI;
import static javax.xml.XMLConstants.XMLNS_ATTRIBUTE;
import static javax.xml.XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
import static javax.xml.XMLConstants.XML_NS_PREFIX;
import static javax.xml.XMLConstants.XML_NS_URI;
/**
* This class adapts the {@link Node} namespace/prefix lookup API to that of {@link NamespaceContext}.
* There are some differences:
*
*
* Function
* {@link NamespaceContext} API
* {@link Node} API
*
*
* Look up the prefix for a given namespace URI.
* {@link NamespaceContext#getPrefix(String)}
* {@link Node#lookupPrefix(String)}
*
*
* Look up all the prefixes for a given namespace URI.
* {@link NamespaceContext#getPrefixes(String)}
* /
*
*
* Look up the namespace URI for a given prefix.
* {@link NamespaceContext#getNamespaceURI(String)}
* {@link Node#lookupNamespaceURI(String)}
*
*
* The default prefix.
* {@link javax.xml.XMLConstants#DEFAULT_NS_PREFIX}
* {@code null}
*
*
* The default namespace URI.
* {@link javax.xml.XMLConstants#NULL_NS_URI}
* {@code null}
*
*
*/
public class DOMNamespaceContext implements NamespaceContext {
private Node context;
public DOMNamespaceContext(Node context) {
setContext(context);
}
public void setContext(Node context) {
this.context = context;
}
@Override
public String getNamespaceURI(String prefix) {
if (prefix == null) {
throw new IllegalArgumentException("prefix is null");
}
if (prefix.equals(DEFAULT_NS_PREFIX)) {
prefix = null;
}
if (context != null) {
String namespaceURI = context.lookupNamespaceURI(prefix);
if (namespaceURI != null) {
return namespaceURI;
}
}
if (prefix == null) {
return NULL_NS_URI;
} else if (prefix.equals(XML_NS_PREFIX)) {
return XML_NS_URI;
} else if (prefix.equals(XMLNS_ATTRIBUTE)) {
return XMLNS_ATTRIBUTE_NS_URI;
}
return NULL_NS_URI;
}
@Override
public String getPrefix(String namespaceURI) {
if (namespaceURI == null) {
throw new IllegalArgumentException("namespace URI is null");
}
if (namespaceURI.equals(NULL_NS_URI)) {
namespaceURI = null;
}
if (context != null) {
String prefix = context.lookupPrefix(namespaceURI);
if (prefix != null) {
return prefix;
} else if (Objects.equals(context.lookupNamespaceURI(null), namespaceURI)) {
// context.lookupPrefix(namespaceURI) returns null when a namespace URI is unbound but also when it is
// bound to the default prefix.
// To distinguish the case of an unbound namespace URI from a bound one to the default prefix,
// we look up the namespace URI for the default prefix (null) and if it matches, we return the default
// prefix.
return DEFAULT_NS_PREFIX;
}
}
if (namespaceURI == null && context != null) {
return context.lookupNamespaceURI(null) != null ? null : DEFAULT_NS_PREFIX;
} else if (XML_NS_URI.equals(namespaceURI)) {
return XML_NS_PREFIX;
} else if (XMLNS_ATTRIBUTE_NS_URI.equals(namespaceURI)) {
return XMLNS_ATTRIBUTE;
}
return null;
}
/**
* Throws {@link UnsupportedOperationException}.
*/
@Override
public Iterator getPrefixes(String namespaceURI) {
throw new UnsupportedOperationException();
}
}