src/java.xml.crypto/share/classes/javax/xml/crypto/dom/DOMCryptoContext.java
changeset 47216 71c04702a3d5
parent 27747 3a271dc8b758
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/java.xml.crypto/share/classes/javax/xml/crypto/dom/DOMCryptoContext.java	Tue Sep 12 19:03:39 2017 +0200
@@ -0,0 +1,244 @@
+/*
+ * Copyright (c) 2005, 2014, 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 java.util.Map;
+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<String,String> nsMap = new HashMap<>();
+    private HashMap<String,Element> idMap = new HashMap<>();
+    private HashMap<Object,Object> objMap = new HashMap<>();
+    private String baseURI;
+    private KeySelector ks;
+    private URIDereferencer dereferencer;
+    private HashMap<String,Object> 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 <code>defaultPrefix</code>
+     * if it maps to <code>null</code>.
+     *
+     * @throws NullPointerException {@inheritDoc}
+     */
+    public String getNamespacePrefix(String namespaceURI,
+        String defaultPrefix) {
+        if (namespaceURI == null) {
+            throw new NullPointerException("namespaceURI cannot be null");
+        }
+        String prefix = 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 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 <code>Element</code> with the specified ID attribute value.
+     *
+     * <p>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 <code>Element</code> with the specified ID attribute value,
+     *    or <code>null</code> if none.
+     * @throws NullPointerException if <code>idValue</code> is <code>null</code>
+     * @see #setIdAttributeNS
+     */
+    public Element getElementById(String idValue) {
+        if (idValue == null) {
+            throw new NullPointerException("idValue is null");
+        }
+        return 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.
+     *
+     * <p>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
+     *    <code>null</code> if not applicable)
+     * @param localName the local name of the attribute
+     * @throws IllegalArgumentException if <code>localName</code> is not an
+     *    attribute of the specified element or it does not contain a specific
+     *    value
+     * @throws NullPointerException if <code>element</code> or
+     *    <code>localName</code> is <code>null</code>
+     * @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 <code>DOMCryptoContext</code>. Attempts to modify the set via the
+     * {@link Iterator#remove} method throw an
+     * <code>UnsupportedOperationException</code>. The mappings are returned
+     * in no particular order. Each element in the iteration is represented as a
+     * {@link java.util.Map.Entry}. If the <code>DOMCryptoContext</code> 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<Map.Entry<String, Element>> 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);
+    }
+}