/*
* Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* $Id: DOMCryptoContext.java,v 1.3 2005/05/09 18:33:26 mullan Exp $
*/
package javax.xml.crypto.dom;
import javax.xml.crypto.KeySelector;
import javax.xml.crypto.URIDereferencer;
import javax.xml.crypto.XMLCryptoContext;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import org.w3c.dom.Element;
/**
* This class provides a DOM-specific implementation of the
* {@link XMLCryptoContext} interface. It also includes additional
* methods that are specific to a DOM-based implementation for registering
* and retrieving elements that contain attributes of type ID.
*
* @author Sean Mullan
* @author JSR 105 Expert Group
* @since 1.6
*/
public class DOMCryptoContext implements XMLCryptoContext {
private HashMap nsMap = new HashMap();
private HashMap idMap = new HashMap();
private HashMap objMap = new HashMap();
private String baseURI;
private KeySelector ks;
private URIDereferencer dereferencer;
private HashMap propMap = new HashMap();
private String defaultPrefix;
/**
* Default constructor. (For invocation by subclass constructors).
*/
protected DOMCryptoContext() {}
/**
* This implementation uses an internal {@link HashMap} to get the prefix
* that the specified URI maps to. It returns the defaultPrefix
* if it maps to null
.
*
* @throws NullPointerException {@inheritDoc}
*/
public String getNamespacePrefix(String namespaceURI,
String defaultPrefix) {
if (namespaceURI == null) {
throw new NullPointerException("namespaceURI cannot be null");
}
String prefix = (String) nsMap.get(namespaceURI);
return (prefix != null ? prefix : defaultPrefix);
}
/**
* This implementation uses an internal {@link HashMap} to map the URI
* to the specified prefix.
*
* @throws NullPointerException {@inheritDoc}
*/
public String putNamespacePrefix(String namespaceURI, String prefix) {
if (namespaceURI == null) {
throw new NullPointerException("namespaceURI is null");
}
return (String) nsMap.put(namespaceURI, prefix);
}
public String getDefaultNamespacePrefix() {
return defaultPrefix;
}
public void setDefaultNamespacePrefix(String defaultPrefix) {
this.defaultPrefix = defaultPrefix;
}
public String getBaseURI() {
return baseURI;
}
/**
* @throws IllegalArgumentException {@inheritDoc}
*/
public void setBaseURI(String baseURI) {
if (baseURI != null) {
java.net.URI.create(baseURI);
}
this.baseURI = baseURI;
}
public URIDereferencer getURIDereferencer() {
return dereferencer;
}
public void setURIDereferencer(URIDereferencer dereferencer) {
this.dereferencer = dereferencer;
}
/**
* This implementation uses an internal {@link HashMap} to get the object
* that the specified name maps to.
*
* @throws NullPointerException {@inheritDoc}
*/
public Object getProperty(String name) {
if (name == null) {
throw new NullPointerException("name is null");
}
return propMap.get(name);
}
/**
* This implementation uses an internal {@link HashMap} to map the name
* to the specified object.
*
* @throws NullPointerException {@inheritDoc}
*/
public Object setProperty(String name, Object value) {
if (name == null) {
throw new NullPointerException("name is null");
}
return propMap.put(name, value);
}
public KeySelector getKeySelector() {
return ks;
}
public void setKeySelector(KeySelector ks) {
this.ks = ks;
}
/**
* Returns the Element
with the specified ID attribute value.
*
*
This implementation uses an internal {@link HashMap} to get the
* element that the specified attribute value maps to.
*
* @param idValue the value of the ID
* @return the Element
with the specified ID attribute value,
* or null
if none.
* @throws NullPointerException if idValue
is null
* @see #setIdAttributeNS
*/
public Element getElementById(String idValue) {
if (idValue == null) {
throw new NullPointerException("idValue is null");
}
return (Element) idMap.get(idValue);
}
/**
* Registers the element's attribute specified by the namespace URI and
* local name to be of type ID. The attribute must have a non-empty value.
*
*
This implementation uses an internal {@link HashMap} to map the
* attribute's value to the specified element.
*
* @param element the element
* @param namespaceURI the namespace URI of the attribute (specify
* null
if not applicable)
* @param localName the local name of the attribute
* @throws IllegalArgumentException if localName
is not an
* attribute of the specified element or it does not contain a specific
* value
* @throws NullPointerException if element
or
* localName
is null
* @see #getElementById
*/
public void setIdAttributeNS(Element element, String namespaceURI,
String localName) {
if (element == null) {
throw new NullPointerException("element is null");
}
if (localName == null) {
throw new NullPointerException("localName is null");
}
String idValue = element.getAttributeNS(namespaceURI, localName);
if (idValue == null || idValue.length() == 0) {
throw new IllegalArgumentException(localName + " is not an " +
"attribute");
}
idMap.put(idValue, element);
}
/**
* Returns a read-only iterator over the set of Id/Element mappings of
* this DOMCryptoContext
. Attempts to modify the set via the
* {@link Iterator#remove} method throw an
* UnsupportedOperationException
. The mappings are returned
* in no particular order. Each element in the iteration is represented as a
* {@link java.util.Map.Entry}. If the DOMCryptoContext
is
* modified while an iteration is in progress, the results of the
* iteration are undefined.
*
* @return a read-only iterator over the set of mappings
*/
public Iterator iterator() {
return Collections.unmodifiableMap(idMap).entrySet().iterator();
}
/**
* This implementation uses an internal {@link HashMap} to get the object
* that the specified key maps to.
*/
public Object get(Object key) {
return objMap.get(key);
}
/**
* This implementation uses an internal {@link HashMap} to map the key
* to the specified object.
*
* @throws IllegalArgumentException {@inheritDoc}
*/
public Object put(Object key, Object value) {
return objMap.put(key, value);
}
}