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 2012/05/04 16:59:47 UTC

svn commit: r1334007 - in /santuario/xml-security-java/trunk/src: main/java/org/apache/jcp/xml/dsig/internal/ main/java/org/apache/jcp/xml/dsig/internal/dom/ main/java/org/apache/xml/security/algorithms/ main/java/org/apache/xml/security/c14n/implement...

Author: coheigea
Date: Fri May  4 14:59:46 2012
New Revision: 1334007

URL: http://svn.apache.org/viewvc?rev=1334007&view=rev
Log:
Fixed threadlocal problems by removing some and making sure that others are properly remove'd when the outputstream is closed

Modified:
    santuario/xml-security-java/trunk/src/main/java/org/apache/jcp/xml/dsig/internal/DigesterOutputStream.java
    santuario/xml-security-java/trunk/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMReference.java
    santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/algorithms/MessageDigestAlgorithm.java
    santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/c14n/implementations/CanonicalizerBase.java
    santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/signature/Reference.java
    santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/signature/XMLSignature.java
    santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/utils/UnsyncBufferedOutputStream.java
    santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/utils/UnsyncByteArrayOutputStream.java
    santuario/xml-security-java/trunk/src/test/java/javax/xml/crypto/test/dsig/DetachedTest.java

Modified: santuario/xml-security-java/trunk/src/main/java/org/apache/jcp/xml/dsig/internal/DigesterOutputStream.java
URL: http://svn.apache.org/viewvc/santuario/xml-security-java/trunk/src/main/java/org/apache/jcp/xml/dsig/internal/DigesterOutputStream.java?rev=1334007&r1=1334006&r2=1334007&view=diff
==============================================================================
--- santuario/xml-security-java/trunk/src/main/java/org/apache/jcp/xml/dsig/internal/DigesterOutputStream.java (original)
+++ santuario/xml-security-java/trunk/src/main/java/org/apache/jcp/xml/dsig/internal/DigesterOutputStream.java Fri May  4 14:59:46 2012
@@ -25,6 +25,7 @@
 package org.apache.jcp.xml.dsig.internal;
 
 import java.io.ByteArrayInputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.security.MessageDigest;
@@ -112,4 +113,11 @@ public class DigesterOutputStream extend
             return null;
         }
     }
+    
+    @Override
+    public void close() throws IOException {
+        if (buffer) {
+            bos.close();
+        }
+    }
 }

Modified: santuario/xml-security-java/trunk/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMReference.java
URL: http://svn.apache.org/viewvc/santuario/xml-security-java/trunk/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMReference.java?rev=1334007&r1=1334006&r2=1334007&view=diff
==============================================================================
--- santuario/xml-security-java/trunk/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMReference.java (original)
+++ santuario/xml-security-java/trunk/src/main/java/org/apache/jcp/xml/dsig/internal/dom/DOMReference.java Fri May  4 14:59:46 2012
@@ -446,22 +446,19 @@ public final class DOMReference extends 
         } else {
             dos = new DigesterOutputStream(md);
         }
-        OutputStream os = new UnsyncBufferedOutputStream(dos);
+        OutputStream os = null;
         Data data = dereferencedData;
-        for (int i = 0, size = transforms.size(); i < size; i++) {
-            DOMTransform transform = (DOMTransform)transforms.get(i);
-            try {
+        try {
+            os = new UnsyncBufferedOutputStream(dos);
+            for (int i = 0, size = transforms.size(); i < size; i++) {
+                DOMTransform transform = (DOMTransform)transforms.get(i);
                 if (i < size - 1) {
                     data = transform.transform(data, context);
                 } else {
                     data = transform.transform(data, context, os);
                 }
-            } catch (TransformException te) {
-                throw new XMLSignatureException(te);
             }
-        }
         
-        try {
             if (data != null) {
                 XMLSignatureInput xi;
                 // explicitly use C14N 1.1 when generating signature
@@ -550,6 +547,21 @@ public final class DOMReference extends 
             throw new XMLSignatureException(e);
         } catch (org.apache.xml.security.c14n.CanonicalizationException e) {
             throw new XMLSignatureException(e);
+        } finally {
+            if (os != null) {
+                try {
+                    os.close();
+                } catch (IOException e) {
+                    throw new XMLSignatureException(e);
+                } 
+            }
+            if (dos != null) {
+                try {
+                    dos.close();
+                } catch (IOException e) {
+                    throw new XMLSignatureException(e);
+                } 
+            }
         }
     }
 

Modified: santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/algorithms/MessageDigestAlgorithm.java
URL: http://svn.apache.org/viewvc/santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/algorithms/MessageDigestAlgorithm.java?rev=1334007&r1=1334006&r2=1334007&view=diff
==============================================================================
--- santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/algorithms/MessageDigestAlgorithm.java (original)
+++ santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/algorithms/MessageDigestAlgorithm.java Fri May  4 14:59:46 2012
@@ -20,8 +20,6 @@ package org.apache.xml.security.algorith
 
 import java.security.MessageDigest;
 import java.security.NoSuchProviderException;
-import java.util.HashMap;
-import java.util.Map;
 
 import org.apache.xml.security.signature.XMLSignatureException;
 import org.apache.xml.security.utils.Constants;
@@ -58,14 +56,6 @@ public class MessageDigestAlgorithm exte
     /** Field algorithm stores the actual {@link java.security.MessageDigest} */
     private final MessageDigest algorithm;
     
-    private static ThreadLocal<Map<String, MessageDigest>> instances = 
-        new ThreadLocal<Map<String, MessageDigest>>() {
-        
-        protected Map<String, MessageDigest> initialValue() {
-            return new HashMap<String, MessageDigest>();
-        };
-    };
-
     /**
      * Constructor for the brave who pass their own message digest algorithms and the 
      * corresponding URI.
@@ -94,11 +84,6 @@ public class MessageDigestAlgorithm exte
     }
 
     private static MessageDigest getDigestInstance(String algorithmURI) throws XMLSignatureException {
-        Map<String, MessageDigest> digestMap = instances.get();
-        MessageDigest result = digestMap.get(algorithmURI);
-        if (result != null) {
-            return result;
-        }
         String algorithmID = JCEMapper.translateURItoJCEID(algorithmURI);
 
         if (algorithmID == null) {
@@ -123,7 +108,6 @@ public class MessageDigestAlgorithm exte
 
             throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs);
         }
-        digestMap.put(algorithmURI, md);
         
         return md;
     }

Modified: santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/c14n/implementations/CanonicalizerBase.java
URL: http://svn.apache.org/viewvc/santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/c14n/implementations/CanonicalizerBase.java?rev=1334007&r1=1334006&r2=1334007&view=diff
==============================================================================
--- santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/c14n/implementations/CanonicalizerBase.java (original)
+++ santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/c14n/implementations/CanonicalizerBase.java Fri May  4 14:59:46 2012
@@ -94,13 +94,13 @@ public abstract class CanonicalizerBase 
     private List<NodeFilter> nodeFilter;
 
     private boolean includeComments;  
-    private Set<Node> xpathNodeSet = null;
+    private Set<Node> xpathNodeSet;
     /**
      * The node to be skipped/excluded from the DOM tree 
      * in subtree canonicalizations.
      */
-    private Node excludeNode =null;
-    private OutputStream writer = new UnsyncByteArrayOutputStream();
+    private Node excludeNode;
+    private OutputStream writer = new ByteArrayOutputStream();
 
     /**
      * Constructor CanonicalizerBase
@@ -184,9 +184,9 @@ public abstract class CanonicalizerBase 
      * Canonicalizes a Subtree node.
      * 
      * @param rootNode
-     *            the root of the subtree to canicalize
+     *            the root of the subtree to canonicalize
      * @param excludeNode
-     *            a node to be excluded from the canicalize operation
+     *            a node to be excluded from the canonicalize operation
      * @return The canonicalize stream.
      * @throws CanonicalizationException
      */
@@ -202,19 +202,25 @@ public abstract class CanonicalizerBase 
                 nodeLevel = NODE_NOT_BEFORE_OR_AFTER_DOCUMENT_ELEMENT;
             }         
             this.canonicalizeSubTree(rootNode, ns, rootNode, nodeLevel);
-            this.writer.close();
+            this.writer.flush();
             if (this.writer instanceof ByteArrayOutputStream) {
                 byte[] result = ((ByteArrayOutputStream)this.writer).toByteArray();
                 if (reset) {
                     ((ByteArrayOutputStream)this.writer).reset();        
+                } else {
+                    this.writer.close();
                 }
                 return result;
             } else if (this.writer instanceof UnsyncByteArrayOutputStream) {
                 byte[] result = ((UnsyncByteArrayOutputStream)this.writer).toByteArray();
                 if (reset) {
                     ((UnsyncByteArrayOutputStream)this.writer).reset();        
+                } else {
+                    this.writer.close();
                 }
                 return result;
+            } else {
+                this.writer.close();
             }
             return null;
 
@@ -346,19 +352,25 @@ public abstract class CanonicalizerBase 
         throws CanonicalizationException {   
         try { 
             this.canonicalizeXPathNodeSet(doc, doc);
-            this.writer.close();
+            this.writer.flush();
             if (this.writer instanceof ByteArrayOutputStream) {
                 byte[] sol = ((ByteArrayOutputStream)this.writer).toByteArray();
                 if (reset) {
                     ((ByteArrayOutputStream)this.writer).reset();
+                } else {
+                    this.writer.close();
                 }
                 return sol;
             } else if (this.writer instanceof UnsyncByteArrayOutputStream) {
                 byte[] result = ((UnsyncByteArrayOutputStream)this.writer).toByteArray();
                 if (reset) {
                     ((UnsyncByteArrayOutputStream)this.writer).reset();        
+                } else {
+                    this.writer.close();
                 }
                 return result;
+            } else {
+                this.writer.close();
             }
             return null;
         } catch (UnsupportedEncodingException ex) {

Modified: santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/signature/Reference.java
URL: http://svn.apache.org/viewvc/santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/signature/Reference.java?rev=1334007&r1=1334006&r2=1334007&view=diff
==============================================================================
--- santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/signature/Reference.java (original)
+++ santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/signature/Reference.java Fri May  4 14:59:46 2012
@@ -679,12 +679,13 @@ public class Reference extends Signature
      */
     private byte[] calculateDigest(boolean validating)
         throws ReferenceNotInitializedException, XMLSignatureException {
+        OutputStream os = null;
         try {
             MessageDigestAlgorithm mda = this.getMessageDigestAlgorithm();
 
             mda.reset();
             DigesterOutputStream diOs = new DigesterOutputStream(mda);
-            OutputStream os = new UnsyncBufferedOutputStream(diOs);
+            os = new UnsyncBufferedOutputStream(diOs);
             XMLSignatureInput output = this.dereferenceURIandPerformTransforms(os);         
             // if signing and c14n11 property == true explicitly add
             // C14N11 transform if needed
@@ -709,6 +710,14 @@ public class Reference extends Signature
             throw new ReferenceNotInitializedException("empty", ex);
         } catch (IOException ex) {
             throw new ReferenceNotInitializedException("empty", ex);
+        } finally {
+            if (os != null) {
+                try {
+                    os.close();
+                } catch (IOException ex) {
+                    throw new ReferenceNotInitializedException("empty", ex);
+                } 
+            }
         }
     }
 

Modified: santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/signature/XMLSignature.java
URL: http://svn.apache.org/viewvc/santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/signature/XMLSignature.java?rev=1334007&r1=1334006&r2=1334007&view=diff
==============================================================================
--- santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/signature/XMLSignature.java (original)
+++ santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/signature/XMLSignature.java Fri May  4 14:59:46 2012
@@ -585,25 +585,29 @@ public final class XMLSignature extends 
         try {
             //Create a SignatureAlgorithm object
             SignedInfo si = this.getSignedInfo();
-            SignatureAlgorithm sa = si.getSignatureAlgorithm();               
+            SignatureAlgorithm sa = si.getSignatureAlgorithm();
+            OutputStream so = null;
             try {
                 // initialize SignatureAlgorithm for signing
                 sa.initSign(signingKey);            
 
                 // generate digest values for all References in this SignedInfo
                 si.generateDigestValues();
-                OutputStream so = new UnsyncBufferedOutputStream(new SignerOutputStream(sa));
+                so = new UnsyncBufferedOutputStream(new SignerOutputStream(sa));
                 // get the canonicalized bytes from SignedInfo
                 si.signInOctetStream(so);
-
-                so.close();
-            } catch (IOException ex) {
-                if (log.isDebugEnabled()) {
-                    log.debug(ex);
-                }
-                // Impossible...
             } catch (XMLSecurityException ex) {
                 throw ex;
+            } finally {
+                if (so != null) {
+                    try {
+                        so.close();
+                    } catch (IOException ex) {
+                        if (log.isDebugEnabled()) {
+                            log.debug(ex);
+                        }
+                    }
+                }
             }
 
             // set them on the SignatureValue element

Modified: santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/utils/UnsyncBufferedOutputStream.java
URL: http://svn.apache.org/viewvc/santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/utils/UnsyncBufferedOutputStream.java?rev=1334007&r1=1334006&r2=1334007&view=diff
==============================================================================
--- santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/utils/UnsyncBufferedOutputStream.java (original)
+++ santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/utils/UnsyncBufferedOutputStream.java Fri May  4 14:59:46 2012
@@ -93,7 +93,8 @@ public class UnsyncBufferedOutputStream 
 
     /** @inheritDoc */
     public void close() throws IOException {
-        flush();				
+        flush();
+        bufCache.remove();
     }
 
 }

Modified: santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/utils/UnsyncByteArrayOutputStream.java
URL: http://svn.apache.org/viewvc/santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/utils/UnsyncByteArrayOutputStream.java?rev=1334007&r1=1334006&r2=1334007&view=diff
==============================================================================
--- santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/utils/UnsyncByteArrayOutputStream.java (original)
+++ santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/utils/UnsyncByteArrayOutputStream.java Fri May  4 14:59:46 2012
@@ -18,6 +18,7 @@
  */
 package org.apache.xml.security.utils;
 
+import java.io.IOException;
 import java.io.OutputStream;
 
 /**
@@ -77,12 +78,18 @@ public class UnsyncByteArrayOutputStream
 
     public void reset() {
         pos = 0;
+        bufCache.remove();
+    }
+    
+    @Override
+    public void close() throws IOException {
+        bufCache.remove();
     }
 
     private void expandSize(int newPos) {
         int newSize = size;
         while (newPos > newSize) {
-            newSize = newSize<<2;
+            newSize = newSize << 2;
         }
         byte newBuf[] = new byte[newSize];
         System.arraycopy(buf, 0, newBuf, 0, pos);

Modified: santuario/xml-security-java/trunk/src/test/java/javax/xml/crypto/test/dsig/DetachedTest.java
URL: http://svn.apache.org/viewvc/santuario/xml-security-java/trunk/src/test/java/javax/xml/crypto/test/dsig/DetachedTest.java?rev=1334007&r1=1334006&r2=1334007&view=diff
==============================================================================
--- santuario/xml-security-java/trunk/src/test/java/javax/xml/crypto/test/dsig/DetachedTest.java (original)
+++ santuario/xml-security-java/trunk/src/test/java/javax/xml/crypto/test/dsig/DetachedTest.java Fri May  4 14:59:46 2012
@@ -172,7 +172,7 @@ public class DetachedTest extends org.ju
             signature = fac.unmarshalXMLSignature(vc);
             coreValidity = signature.validate(vc);
             assertTrue("Core validity of unmarshalled XMLSignature is false", coreValidity);
-        } catch(Exception ex) {
+        } catch (Exception ex) {
             fail("Exception: " + ex);
         }
     }