You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@santuario.apache.org by co...@apache.org on 2011/05/04 12:53:49 UTC

svn commit: r1099406 - in /santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security: Init.java keys/keyresolver/KeyResolver.java keys/keyresolver/KeyResolverSpi.java

Author: coheigea
Date: Wed May  4 10:53:49 2011
New Revision: 1099406

URL: http://svn.apache.org/viewvc?rev=1099406&view=rev
Log:
Some thread-safety changes to the KeyResolvers.

Modified:
    santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/Init.java
    santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/keys/keyresolver/KeyResolver.java
    santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/keys/keyresolver/KeyResolverSpi.java

Modified: santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/Init.java
URL: http://svn.apache.org/viewvc/santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/Init.java?rev=1099406&r1=1099405&r2=1099406&view=diff
==============================================================================
--- santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/Init.java (original)
+++ santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/Init.java Wed May  4 10:53:49 2011
@@ -47,6 +47,14 @@ import org.apache.xml.security.c14n.impl
 import org.apache.xml.security.c14n.implementations.Canonicalizer20010315WithComments;
 import org.apache.xml.security.encryption.XMLCipher;
 import org.apache.xml.security.keys.keyresolver.KeyResolver;
+import org.apache.xml.security.keys.keyresolver.KeyResolverSpi;
+import org.apache.xml.security.keys.keyresolver.implementations.DSAKeyValueResolver;
+import org.apache.xml.security.keys.keyresolver.implementations.RSAKeyValueResolver;
+import org.apache.xml.security.keys.keyresolver.implementations.RetrievalMethodResolver;
+import org.apache.xml.security.keys.keyresolver.implementations.X509CertificateResolver;
+import org.apache.xml.security.keys.keyresolver.implementations.X509IssuerSerialResolver;
+import org.apache.xml.security.keys.keyresolver.implementations.X509SKIResolver;
+import org.apache.xml.security.keys.keyresolver.implementations.X509SubjectNameResolver;
 import org.apache.xml.security.signature.XMLSignature;
 import org.apache.xml.security.transforms.Transform;
 import org.apache.xml.security.transforms.TransformSpi;
@@ -106,6 +114,8 @@ public class Init {
         new HashMap<String, Class<? extends CanonicalizerSpi>>();
     private static List<ResourceResolverSpi> defaultResolverList = 
         new ArrayList<ResourceResolverSpi>();
+    private static List<KeyResolverSpi> defaultKeyResolverList = 
+        new ArrayList<KeyResolverSpi>();
     
     static {
         //
@@ -357,7 +367,7 @@ public class Init {
         );
         
         //
-        // Default IRI-Canonicalizer class pairs
+        // Default URI-Canonicalizer class pairs
         //
         defaultC14nAlgorithms.put(
             Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS, Canonicalizer20010315OmitComments.class
@@ -385,6 +395,17 @@ public class Init {
         defaultResolverList.add(new ResolverLocalFilesystem());
         defaultResolverList.add(new ResolverXPointer());
         defaultResolverList.add(new ResolverDirectHTTP());
+        
+        //
+        // Default KeyResolvers
+        //
+        defaultKeyResolverList.add(new RSAKeyValueResolver());
+        defaultKeyResolverList.add(new DSAKeyValueResolver());
+        defaultKeyResolverList.add(new X509CertificateResolver());
+        defaultKeyResolverList.add(new X509SKIResolver());
+        defaultKeyResolverList.add(new RetrievalMethodResolver());
+        defaultKeyResolverList.add(new X509SubjectNameResolver());
+        defaultKeyResolverList.add(new X509IssuerSerialResolver());
     }
     
     /**
@@ -679,10 +700,18 @@ public class Init {
             for (ResourceResolverSpi resourceResolverSpi : defaultResolverList) {
                 ResourceResolver.register(resourceResolverSpi, false);
             }
+            
+            //
+            // Register the default key resolvers
+            //
+            for (KeyResolverSpi keyResolverSpi : defaultKeyResolverList) {
+                KeyResolver.register(keyResolverSpi, false);
+            }
         } catch (Exception ex) {
             log.error(ex);
             ex.printStackTrace();
         }
+        alreadyInitialized = true;
     }
 
 }

Modified: santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/keys/keyresolver/KeyResolver.java
URL: http://svn.apache.org/viewvc/santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/keys/keyresolver/KeyResolver.java?rev=1099406&r1=1099405&r2=1099406&view=diff
==============================================================================
--- santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/keys/keyresolver/KeyResolver.java (original)
+++ santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/keys/keyresolver/KeyResolver.java Wed May  4 10:53:49 2011
@@ -44,21 +44,15 @@ public class KeyResolver {
     private static List<KeyResolver> resolverVector = new ArrayList<KeyResolver>();
 
     /** Field resolverSpi */
-    protected KeyResolverSpi resolverSpi = null;
+    private final KeyResolverSpi resolverSpi;
     
     /**
-     * Constructor ResourceResolver
-     *
-     * @param className
-     * @throws ClassNotFoundException
-     * @throws IllegalAccessException
-     * @throws InstantiationException
+     * Constructor.
+     * 
+     * @param keyResolverSpi a KeyResolverSpi instance
      */
-    private KeyResolver(String className, boolean globalResolver)
-        throws ClassNotFoundException, IllegalAccessException, InstantiationException {
-        this.resolverSpi =
-            (KeyResolverSpi) Class.forName(className).newInstance();
-        this.resolverSpi.setGlobalResolver(globalResolver);
+    private KeyResolver(KeyResolverSpi keyResolverSpi) {
+        resolverSpi = keyResolverSpi;
     }
 
     /**
@@ -66,8 +60,12 @@ public class KeyResolver {
      *
      * @return the length of resolvers registered
      */
-    public synchronized static int length() {
-        return KeyResolver.resolverVector.size();
+    public static int length() {
+        int size = 0;
+        synchronized (resolverVector) {
+            size = resolverVector.size();
+        }
+        return size;
     }
 
     /**
@@ -80,26 +78,28 @@ public class KeyResolver {
      * 
      * @throws KeyResolverException
      */
-    public synchronized static final X509Certificate getX509Certificate(
+    public static final X509Certificate getX509Certificate(
         Element element, String BaseURI, StorageResolver storage
     ) throws KeyResolverException {
-        for (KeyResolver resolver : resolverVector) {
-            if (resolver == null) {
-                Object exArgs[] = {
-                                   (((element != null)
-                                   && (element.getNodeType() == Node.ELEMENT_NODE))
-                                   ? element.getTagName() : "null") 
-                                  };
-
-                throw new KeyResolverException("utils.resolver.noClass", exArgs);
-            }
-            if (log.isDebugEnabled()) {
-                log.debug("check resolvability by class " + resolver.getClass());
-            }
-
-            X509Certificate cert = resolver.resolveX509Certificate(element, BaseURI, storage);
-            if (cert != null) {
-                return cert;
+        synchronized (resolverVector) {
+            for (KeyResolver resolver : resolverVector) {
+                if (resolver == null) {
+                    Object exArgs[] = {
+                                       (((element != null)
+                                       && (element.getNodeType() == Node.ELEMENT_NODE))
+                                       ? element.getTagName() : "null") 
+                                      };
+    
+                    throw new KeyResolverException("utils.resolver.noClass", exArgs);
+                }
+                if (log.isDebugEnabled()) {
+                    log.debug("check resolvability by class " + resolver.getClass());
+                }
+    
+                X509Certificate cert = resolver.resolveX509Certificate(element, BaseURI, storage);
+                if (cert != null) {
+                    return cert;
+                }
             }
         }
 
@@ -121,27 +121,28 @@ public class KeyResolver {
      * 
      * @throws KeyResolverException
      */
-    public synchronized static final PublicKey getPublicKey(
+    public static final PublicKey getPublicKey(
         Element element, String BaseURI, StorageResolver storage
     ) throws KeyResolverException {
-        for (int i = 0; i < resolverVector.size(); i++) {
-            KeyResolver resolver = resolverVector.get(i);
-            if (resolver == null) {
-                Object exArgs[] = {
-                                   (((element != null)
-                                   && (element.getNodeType() == Node.ELEMENT_NODE))
-                                   ? element.getTagName() : "null")
-                                  };
-
-                throw new KeyResolverException("utils.resolver.noClass", exArgs);
-            }
-            if (log.isDebugEnabled()) {
-                log.debug("check resolvability by class " + resolver.getClass());
-            }
-
-            PublicKey cert = resolver.resolvePublicKey(element, BaseURI, storage);
-            if (cert != null) {
-                return cert;
+        synchronized (resolverVector) {
+            for (KeyResolver resolver : resolverVector) {
+                if (resolver == null) {
+                    Object exArgs[] = {
+                                       (((element != null)
+                                       && (element.getNodeType() == Node.ELEMENT_NODE))
+                                       ? element.getTagName() : "null")
+                                      };
+    
+                    throw new KeyResolverException("utils.resolver.noClass", exArgs);
+                }
+                if (log.isDebugEnabled()) {
+                    log.debug("check resolvability by class " + resolver.getClass());
+                }
+    
+                PublicKey cert = resolver.resolvePublicKey(element, BaseURI, storage);
+                if (cert != null) {
+                    return cert;
+                }
             }
         }
 
@@ -184,9 +185,12 @@ public class KeyResolver {
      * @throws IllegalAccessException 
      * @throws ClassNotFoundException 
      */
-    public synchronized static void register(String className, boolean globalResolver) 
+    public static void register(String className, boolean globalResolver) 
         throws ClassNotFoundException, IllegalAccessException, InstantiationException {
-        KeyResolver.resolverVector.add(new KeyResolver(className, globalResolver));
+        KeyResolverSpi keyResolverSpi =
+            (KeyResolverSpi) Class.forName(className).newInstance();
+        keyResolverSpi.setGlobalResolver(globalResolver);
+        register(keyResolverSpi, false);
     }
 
     /**
@@ -213,13 +217,11 @@ public class KeyResolver {
      * @param className
      * @param globalResolver Whether the KeyResolverSpi is a global resolver or not
      */
-    public synchronized static void registerAtStart(String className, boolean globalResolver) {
-        // For backwards compatibility, use a RuntimeException instead of adding a throws clause
-        KeyResolver resolver = null;
+    public static void registerAtStart(String className, boolean globalResolver) {
+        KeyResolverSpi keyResolverSpi = null;
         Exception ex = null;
-
         try {
-            resolver = new KeyResolver(className, globalResolver);
+            keyResolverSpi = (KeyResolverSpi) Class.forName(className).newInstance();
         } catch (ClassNotFoundException e) {
             ex = e;
         } catch (IllegalAccessException e) {
@@ -232,8 +234,32 @@ public class KeyResolver {
             throw (IllegalArgumentException) new
             IllegalArgumentException("Invalid KeyResolver class name").initCause(ex);
         }
-
-        KeyResolver.resolverVector.add(0, resolver);
+        keyResolverSpi.setGlobalResolver(globalResolver);
+        register(keyResolverSpi, true);
+    }
+    
+    /**
+     * This method is used for registering {@link KeyResolverSpi}s which are
+     * available to <I>all</I> {@link org.apache.xml.security.keys.KeyInfo} objects. This means that
+     * personalized {@link KeyResolverSpi}s should only be registered directly
+     * to the {@link org.apache.xml.security.keys.KeyInfo} using 
+     * {@link org.apache.xml.security.keys.KeyInfo#registerInternalKeyResolver}.
+     *
+     * @param keyResolverSpi a KeyResolverSpi instance to register
+     * @param start whether to register the KeyResolverSpi at the start of the list or not
+     */
+    public static void register(
+        KeyResolverSpi keyResolverSpi, 
+        boolean start
+    ) {
+        KeyResolver resolver = new KeyResolver(keyResolverSpi);
+        synchronized (resolverVector) {
+            if (start) {
+                resolverVector.add(0, resolver);
+            } else {
+                resolverVector.add(resolver);
+            }
+        }
     }
 
     /**
@@ -249,7 +275,7 @@ public class KeyResolver {
     public PublicKey resolvePublicKey(
         Element element, String BaseURI, StorageResolver storage
     ) throws KeyResolverException {
-        return this.resolverSpi.engineLookupAndResolvePublicKey(element, BaseURI, storage);
+        return resolverSpi.engineLookupAndResolvePublicKey(element, BaseURI, storage);
     }
 
     /**
@@ -265,7 +291,7 @@ public class KeyResolver {
     public X509Certificate resolveX509Certificate(
         Element element, String BaseURI, StorageResolver storage
     ) throws KeyResolverException {
-        return this.resolverSpi.engineLookupResolveX509Certificate(element, BaseURI, storage);
+        return resolverSpi.engineLookupResolveX509Certificate(element, BaseURI, storage);
     }
 
     /**
@@ -278,7 +304,7 @@ public class KeyResolver {
     public SecretKey resolveSecretKey(
         Element element, String BaseURI, StorageResolver storage
     ) throws KeyResolverException {
-        return this.resolverSpi.engineLookupAndResolveSecretKey(element, BaseURI, storage);
+        return resolverSpi.engineLookupAndResolveSecretKey(element, BaseURI, storage);
     }
 
     /**
@@ -288,7 +314,7 @@ public class KeyResolver {
      * @param value
      */
     public void setProperty(String key, String value) {
-        this.resolverSpi.engineSetProperty(key, value);
+        resolverSpi.engineSetProperty(key, value);
     }
 
     /**
@@ -298,7 +324,7 @@ public class KeyResolver {
      * @return the property set for this resolver
      */
     public String getProperty(String key) {
-        return this.resolverSpi.engineGetProperty(key);
+        return resolverSpi.engineGetProperty(key);
     }
 
 
@@ -309,7 +335,7 @@ public class KeyResolver {
      * @return true if the resolver understands property propertyToTest
      */
     public boolean understandsProperty(String propertyToTest) {
-        return this.resolverSpi.understandsProperty(propertyToTest);
+        return resolverSpi.understandsProperty(propertyToTest);
     }
 
 
@@ -319,7 +345,7 @@ public class KeyResolver {
      * @return the name of the resolver.
      */
     public String resolverClassName() {
-        return this.resolverSpi.getClass().getName();
+        return resolverSpi.getClass().getName();
     }
 
     /**

Modified: santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/keys/keyresolver/KeyResolverSpi.java
URL: http://svn.apache.org/viewvc/santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/keys/keyresolver/KeyResolverSpi.java?rev=1099406&r1=1099405&r2=1099406&view=diff
==============================================================================
--- santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/keys/keyresolver/KeyResolverSpi.java (original)
+++ santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/keys/keyresolver/KeyResolverSpi.java Wed May  4 10:53:49 2011
@@ -97,7 +97,7 @@ public abstract class KeyResolverSpi {
         KeyResolverSpi tmp = this;    
         if (globalResolver) {
             try {
-                tmp = (KeyResolverSpi) getClass().newInstance();    	    
+                tmp = getClass().newInstance();    	    
             } catch (InstantiationException e) {
                 throw new KeyResolverException("", e);
             } catch (IllegalAccessException e) {
@@ -224,7 +224,7 @@ public abstract class KeyResolverSpi {
             return null;
         }
 
-        return (String)properties.get(key);
+        return properties.get(key);
     }
 
     /**