src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/XMLDSigRI.java

Print this page
7191662: JCE providers should be located via ServiceLoader

@@ -26,11 +26,11 @@
  * (C) Copyright IBM Corp. 2003 All Rights Reserved.
  *
  * ===========================================================================
  */
 /*
- * Copyright (c) 2005, 2014 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2015 Oracle and/or its affiliates. All rights reserved.
  */
 /*
  * $Id: XMLDSigRI.java 1400021 2012-10-19 10:16:04Z coheigea $
  */
 package org.jcp.xml.dsig.internal.dom;

@@ -57,106 +57,160 @@
     private static final String INFO = "XMLDSig " +
         "(DOM XMLSignatureFactory; DOM KeyInfoFactory; " +
         "C14N 1.0, C14N 1.1, Exclusive C14N, Base64, Enveloped, XPath, " +
         "XPath2, XSLT TransformServices)";
 
+    private static final class ProviderService extends Provider.Service {
+
+        ProviderService(Provider p, String type, String algo, String cn) {
+            super(p, type, algo, cn, null, null);
+        }
+
+        ProviderService(Provider p, String type, String algo, String cn,
+            String[] aliases) {
+            super(p, type, algo, cn,
+                (aliases == null? null : Arrays.asList(aliases)), null);
+        }
+
+        ProviderService(Provider p, String type, String algo, String cn,
+            String[] aliases, HashMap<String, String> attrs) {
+            super(p, type, algo, cn,
+                  (aliases == null? null : Arrays.asList(aliases)), attrs);
+        }
+
+        @Override
+        public Object newInstance(Object ctrParamObj)
+            throws NoSuchAlgorithmException {
+            String type = getType();
+            if (ctrParamObj != null) {
+                throw new InvalidParameterException
+                    ("constructorParameter not used with " + type + " engines");
+            }
+
+            String algo = getAlgorithm();
+            try {
+                if (type.equals("XMLSignatureFactory")) {
+                    if (algo.equals("DOM")) {
+                        return new DOMXMLSignatureFactory();
+                    }
+                } else if (type.equals("KeyInfoFactory")) {
+                    if (algo.equals("DOM")) {
+                        return new DOMKeyInfoFactory();
+                    }
+                } else if (type.equals("TransformService")) {
+                    if (algo.equals(CanonicalizationMethod.INCLUSIVE) ||
+                        algo.equals(CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS)) {
+                        return new DOMCanonicalXMLC14NMethod();
+                    } else if (algo.equals("http://www.w3.org/2006/12/xml-c14n11") ||
+                        algo.equals("http://www.w3.org/2006/12/xml-c14n11#WithComments")) {
+                        return new DOMCanonicalXMLC14N11Method();
+                    } else if (algo.equals(CanonicalizationMethod.EXCLUSIVE) ||
+                        algo.equals(CanonicalizationMethod.EXCLUSIVE_WITH_COMMENTS)) {
+                        return new DOMExcC14NMethod();
+                    } else if (algo.equals(Transform.BASE64)) {
+                        return new DOMBase64Transform();
+                    } else if (algo.equals(Transform.ENVELOPED)) {
+                        return new DOMEnvelopedTransform();
+                    } else if (algo.equals(Transform.XPATH2)) {
+                        return new DOMXPathFilter2Transform();
+                    } else if (algo.equals(Transform.XPATH)) {
+                        return new DOMXPathTransform();
+                    } else if (algo.equals(Transform.XSLT)) {
+                        return new DOMXSLTTransform();
+                    }
+                 }
+            } catch (Exception ex) {
+                throw new NoSuchAlgorithmException("Error constructing " +
+                    type + " for " + algo + " using XMLDSig", ex);
+            }
+            throw new ProviderException("No impl for " + algo +
+                " " + type);
+        }
+    }
+
     public XMLDSigRI() {
         /* We are the XMLDSig provider */
         super("XMLDSig", 1.9d, INFO);
 
-        final Map<Object, Object> map = new HashMap<Object, Object>();
-        map.put("XMLSignatureFactory.DOM",
-                "org.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory");
-        map.put("KeyInfoFactory.DOM",
-                "org.jcp.xml.dsig.internal.dom.DOMKeyInfoFactory");
+        final Provider p = this;
+        AccessController.doPrivileged(new PrivilegedAction<Void>() {
+            public Void run() {
+                HashMap<String, String> MECH_TYPE = new HashMap<>();
+                MECH_TYPE.put("MechanismType", "DOM");
 
+                putService(new ProviderService(p, "XMLSignatureFactory",
+                    "DOM", "org.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory"));
 
+                putService(new ProviderService(p, "KeyInfoFactory",
+                    "DOM", "org.jcp.xml.dsig.internal.dom.DOMKeyInfoFactory"));
+
+
         // Inclusive C14N
-        map.put("TransformService." + CanonicalizationMethod.INCLUSIVE,
-                "org.jcp.xml.dsig.internal.dom.DOMCanonicalXMLC14NMethod");
-        map.put("Alg.Alias.TransformService.INCLUSIVE",
-                CanonicalizationMethod.INCLUSIVE);
-        map.put("TransformService." + CanonicalizationMethod.INCLUSIVE +
-                " MechanismType", "DOM");
+                putService(new ProviderService(p, "TransformService",
+                    CanonicalizationMethod.INCLUSIVE,
+                    "org.jcp.xml.dsig.internal.dom.DOMCanonicalXMLC14NMethod",
+                    new String[] {"INCLUSIVE"}, MECH_TYPE));
 
         // InclusiveWithComments C14N
-        map.put("TransformService." +
+                putService(new ProviderService(p, "TransformService",
                 CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS,
-                "org.jcp.xml.dsig.internal.dom.DOMCanonicalXMLC14NMethod");
-        map.put("Alg.Alias.TransformService.INCLUSIVE_WITH_COMMENTS",
-                CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS);
-        map.put("TransformService." +
-                CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS +
-                " MechanismType", "DOM");
+                    "org.jcp.xml.dsig.internal.dom.DOMCanonicalXMLC14NMethod",
+                    new String[] {"INCLUSIVE_WITH_COMMENTS"}, MECH_TYPE));
 
         // Inclusive C14N 1.1
-        map.put("TransformService.http://www.w3.org/2006/12/xml-c14n11",
-                "org.jcp.xml.dsig.internal.dom.DOMCanonicalXMLC14N11Method");
-        map.put("TransformService.http://www.w3.org/2006/12/xml-c14n11" +
-                " MechanismType", "DOM");
+                putService(new ProviderService(p, "TransformService",
+                    "http://www.w3.org/2006/12/xml-c14n11",
+                    "org.jcp.xml.dsig.internal.dom.DOMCanonicalXMLC14N11Method",
+                    null, MECH_TYPE));
 
         // InclusiveWithComments C14N 1.1
-        map.put("TransformService.http://www.w3.org/2006/12/xml-c14n11#WithComments",
-                "org.jcp.xml.dsig.internal.dom.DOMCanonicalXMLC14N11Method");
-        map.put("TransformService.http://www.w3.org/2006/12/xml-c14n11#WithComments" +
-                " MechanismType", "DOM");
+                putService(new ProviderService(p, "TransformService",
+                    "http://www.w3.org/2006/12/xml-c14n11#WithComments",
+                    "org.jcp.xml.dsig.internal.dom.DOMCanonicalXMLC14N11Method",
+                    null, MECH_TYPE));
 
         // Exclusive C14N
-        map.put("TransformService." + CanonicalizationMethod.EXCLUSIVE,
-                "org.jcp.xml.dsig.internal.dom.DOMExcC14NMethod");
-        map.put("Alg.Alias.TransformService.EXCLUSIVE",
-                CanonicalizationMethod.EXCLUSIVE);
-        map.put("TransformService." + CanonicalizationMethod.EXCLUSIVE +
-                " MechanismType", "DOM");
+                putService(new ProviderService(p, "TransformService",
+                    CanonicalizationMethod.EXCLUSIVE,
+                    "org.jcp.xml.dsig.internal.dom.DOMExcC14NMethod",
+                    new String[] {"EXCLUSIVE"}, MECH_TYPE));
 
         // ExclusiveWithComments C14N
-        map.put("TransformService." +
+                putService(new ProviderService(p, "TransformService",
                 CanonicalizationMethod.EXCLUSIVE_WITH_COMMENTS,
-                "org.jcp.xml.dsig.internal.dom.DOMExcC14NMethod");
-        map.put("Alg.Alias.TransformService.EXCLUSIVE_WITH_COMMENTS",
-                CanonicalizationMethod.EXCLUSIVE_WITH_COMMENTS);
-        map.put("TransformService." +
-                CanonicalizationMethod.EXCLUSIVE_WITH_COMMENTS +
-                " MechanismType", "DOM");
+                    "org.jcp.xml.dsig.internal.dom.DOMExcC14NMethod",
+                    new String[] {"EXCLUSIVE_WITH_COMMENTS"}, MECH_TYPE));
 
         // Base64 Transform
-        map.put("TransformService." + Transform.BASE64,
-                "org.jcp.xml.dsig.internal.dom.DOMBase64Transform");
-        map.put("Alg.Alias.TransformService.BASE64", Transform.BASE64);
-        map.put("TransformService." + Transform.BASE64 +
-                " MechanismType", "DOM");
+                putService(new ProviderService(p, "TransformService",
+                    Transform.BASE64,
+                    "org.jcp.xml.dsig.internal.dom.DOMBase64Transform",
+                    new String[] {"BASE64"}, MECH_TYPE));
 
         // Enveloped Transform
-        map.put("TransformService." + Transform.ENVELOPED,
-                "org.jcp.xml.dsig.internal.dom.DOMEnvelopedTransform");
-        map.put("Alg.Alias.TransformService.ENVELOPED", Transform.ENVELOPED);
-        map.put("TransformService." + Transform.ENVELOPED +
-                " MechanismType", "DOM");
+                putService(new ProviderService(p, "TransformService",
+                    Transform.ENVELOPED,
+                    "org.jcp.xml.dsig.internal.dom.DOMEnvelopedTransform",
+                    new String[] {"ENVELOPED"}, MECH_TYPE));
 
         // XPath2 Transform
-        map.put("TransformService." + Transform.XPATH2,
-                "org.jcp.xml.dsig.internal.dom.DOMXPathFilter2Transform");
-        map.put("Alg.Alias.TransformService.XPATH2", Transform.XPATH2);
-        map.put("TransformService." + Transform.XPATH2 +
-                " MechanismType", "DOM");
+                putService(new ProviderService(p, "TransformService",
+                    Transform.XPATH2,
+                    "org.jcp.xml.dsig.internal.dom.DOMXPathFilter2Transform",
+                    new String[] {"XPATH2"}, MECH_TYPE));
 
         // XPath Transform
-        map.put("TransformService." + Transform.XPATH,
-                "org.jcp.xml.dsig.internal.dom.DOMXPathTransform");
-        map.put("Alg.Alias.TransformService.XPATH", Transform.XPATH);
-        map.put("TransformService." + Transform.XPATH +
-                " MechanismType", "DOM");
+                putService(new ProviderService(p, "TransformService",
+                    Transform.XPATH,
+                    "org.jcp.xml.dsig.internal.dom.DOMXPathTransform",
+                    new String[] {"XPATH"}, MECH_TYPE));
 
         // XSLT Transform
-        map.put("TransformService." + Transform.XSLT,
-                "org.jcp.xml.dsig.internal.dom.DOMXSLTTransform");
-        map.put("Alg.Alias.TransformService.XSLT", Transform.XSLT);
-        map.put("TransformService." + Transform.XSLT + " MechanismType", "DOM");
-
-        AccessController.doPrivileged(new PrivilegedAction<Void>() {
-            public Void run() {
-                putAll(map);
+                putService(new ProviderService(p, "TransformService",
+                    Transform.XSLT,
+                    "org.jcp.xml.dsig.internal.dom.DOMXSLTTransform",
+                    new String[] {"XSLT"}, MECH_TYPE));
                 return null;
             }
         });
     }
 }