Repository: camel
Updated Branches:
  refs/heads/master 3c0e75bb0 -> 9afc1bd9b


CAMEL-7631. Enhancement for xmlsecurity component (XML Signature): Configurable 
Signature Id. Thanks to Franz Forsthofer for the patch.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/9afc1bd9
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/9afc1bd9
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/9afc1bd9

Branch: refs/heads/master
Commit: 9afc1bd9bae063a60faf0e0133a736cbf6aa8f94
Parents: 3c0e75b
Author: Claus Ibsen <davscl...@apache.org>
Authored: Thu Jul 24 09:31:17 2014 +0200
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Thu Jul 24 09:31:17 2014 +0200

----------------------------------------------------------------------
 .../xmlsecurity/XmlSignerEndpoint.java          |  12 ++-
 .../xmlsecurity/api/XmlSignatureHelper.java     |   4 +
 .../xmlsecurity/api/XmlSignatureProperties.java |   7 +-
 .../processor/XmlSignatureProcessor.java        |   4 +-
 .../processor/XmlSignerConfiguration.java       |  21 +++-
 .../processor/XmlSignerProcessor.java           |  14 ++-
 .../xmlsecurity/SpringXmlSignatureTest.java     |   2 +-
 .../component/xmlsecurity/XmlSignatureTest.java | 104 +++++++++++++------
 .../xmlsecurity/SpringXmlSignatureTests.xml     |   2 +-
 9 files changed, 124 insertions(+), 46 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/9afc1bd9/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/XmlSignerEndpoint.java
----------------------------------------------------------------------
diff --git 
a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/XmlSignerEndpoint.java
 
b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/XmlSignerEndpoint.java
index 993a979..26fd77a 100644
--- 
a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/XmlSignerEndpoint.java
+++ 
b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/XmlSignerEndpoint.java
@@ -169,12 +169,20 @@ public class XmlSignerEndpoint extends 
XmlSignatureEndpoint {
         getConfiguration().setContentObjectId(contentObjectId);
     }
 
-    public List<XPathFilterParameterSpec> getXpathToIdAttributes() {
-        return getConfiguration().getXpathToIdAttributes();
+    public List<XPathFilterParameterSpec> getXpathsToIdAttributes() {
+        return getConfiguration().getXpathsToIdAttributes();
     }
 
     public void setXpathsToIdAttributes(List<XPathFilterParameterSpec> 
xpathsToIdAttributes) {
         getConfiguration().setXpathsToIdAttributes(xpathsToIdAttributes);
     }
 
+    public String getSignatureId() {
+        return getConfiguration().getSignatureId();
+    }
+
+    public void setSignatureId(String signatureId) {
+        getConfiguration().setSignatureId(signatureId);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/9afc1bd9/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/api/XmlSignatureHelper.java
----------------------------------------------------------------------
diff --git 
a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/api/XmlSignatureHelper.java
 
b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/api/XmlSignatureHelper.java
index 68f9f0f..2593e3b 100644
--- 
a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/api/XmlSignatureHelper.java
+++ 
b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/api/XmlSignatureHelper.java
@@ -162,6 +162,10 @@ public final class XmlSignatureHelper {
                 namespaceMap);
         return params;
     }
+    
+    public static XPathFilterParameterSpec getXpathFilter(String xpath) {
+        return getXpathFilter(xpath, null);
+    }
 
     @SuppressWarnings("unchecked")
     public static XPathExpression getXPathExpression(XPathFilterParameterSpec 
xpathFilter) throws XPathExpressionException {

http://git-wip-us.apache.org/repos/asf/camel/blob/9afc1bd9/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/api/XmlSignatureProperties.java
----------------------------------------------------------------------
diff --git 
a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/api/XmlSignatureProperties.java
 
b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/api/XmlSignatureProperties.java
index 871793f..9fe72c8 100644
--- 
a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/api/XmlSignatureProperties.java
+++ 
b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/api/XmlSignatureProperties.java
@@ -42,7 +42,7 @@ public interface XmlSignatureProperties {
      * @throws Exception
      *             if an error occurs during creating the output
      */
-    Output get(Input input) throws Exception;
+    Output get(Input input) throws Exception; //NOPMD
 
     public interface Input {
 
@@ -88,7 +88,10 @@ public interface XmlSignatureProperties {
          */
         String getContentDigestAlgorithm();
 
-        /** Signature Id. Can be <code>null</code>. */
+        /**
+         * Signature Id. Can be <code>null</code>, then no signature Id
+         * attribute is generated.
+         */
         String getSignatureId();
 
         /**

http://git-wip-us.apache.org/repos/asf/camel/blob/9afc1bd9/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlSignatureProcessor.java
----------------------------------------------------------------------
diff --git 
a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlSignatureProcessor.java
 
b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlSignatureProcessor.java
index d474084..9a425ba 100644
--- 
a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlSignatureProcessor.java
+++ 
b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlSignatureProcessor.java
@@ -50,7 +50,7 @@ public abstract class XmlSignatureProcessor implements 
Processor {
         try {
             SantuarioUtil.initializeSantuario();
             SantuarioUtil.addSantuarioJSR105Provider();
-        } catch (Throwable t) {
+        } catch (Throwable t) { //NOPMD
             // provider not in classpath, ignore and fall back to jre default
             LOG.info("Cannot add the SantuarioJSR105Provider due to {0}, fall 
back to JRE default.", t);
         }
@@ -101,7 +101,7 @@ public abstract class XmlSignatureProcessor implements 
Processor {
     protected Schema getSchema(Message message) throws SAXException, 
XmlSignatureException, IOException {
 
         String schemaResourceUri = getSchemaResourceUri(message);
-        if (schemaResourceUri == null) {
+        if (schemaResourceUri == null || schemaResourceUri.isEmpty()) {
             return null;
         }
         InputStream is = 
ResourceHelper.resolveResourceAsInputStream(getConfiguration().getCamelContext().getClassResolver(),

http://git-wip-us.apache.org/repos/asf/camel/blob/9afc1bd9/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlSignerConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlSignerConfiguration.java
 
b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlSignerConfiguration.java
index 6b2d4fe..e2a25e6 100644
--- 
a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlSignerConfiguration.java
+++ 
b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlSignerConfiguration.java
@@ -67,6 +67,9 @@ public class XmlSignerConfiguration extends 
XmlSignatureConfiguration {
 
     private String contentObjectId;
 
+    // default value is null so that a unique ID is generated.
+    private String signatureId;
+
     /**
      * The URI of the content reference. This value can be overwritten by the
      * header {@link XmlSignatureConstants#HEADER_CONTENT_REFERENCE_URI}. Can
@@ -322,6 +325,22 @@ public class XmlSignerConfiguration extends 
XmlSignatureConfiguration {
         this.contentObjectId = contentObjectId;
     }
 
+    public String getSignatureId() {
+        return signatureId;
+    }
+
+    /**
+     * Sets the signature Id. If this parameter is not set (null value) then a
+     * unique ID is generated for the signature ID (default). If this parameter
+     * is set to "" (empty string) then no Id attribute is created in the
+     * signature element.
+     * 
+     * @param signatureId
+     */
+    public void setSignatureId(String signatureId) {
+        this.signatureId = signatureId;
+    }
+
     public String getContentReferenceUri() {
         return contentReferenceUri;
     }
@@ -421,7 +440,7 @@ public class XmlSignerConfiguration extends 
XmlSignatureConfiguration {
         this.propertiesName = propertiesName;
     }
 
-    public List<XPathFilterParameterSpec> getXpathToIdAttributes() {
+    public List<XPathFilterParameterSpec> getXpathsToIdAttributes() {
         return xpathsToIdAttributes;
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/9afc1bd9/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlSignerProcessor.java
----------------------------------------------------------------------
diff --git 
a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlSignerProcessor.java
 
b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlSignerProcessor.java
index 1b8180e..4607aff 100644
--- 
a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlSignerProcessor.java
+++ 
b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlSignerProcessor.java
@@ -262,7 +262,13 @@ public class XmlSignerProcessor extends 
XmlSignatureProcessor {
                 // and this method must be called within the loop over the 
content reference URIs, because for each signature the key info ID must be 
different
                 final KeyInfo keyInfo = 
getConfiguration().getKeyAccessor().getKeyInfo(out, node, 
fac.getKeyInfoFactory());
 
-                String signatureId = "_" + UUID.randomUUID().toString();
+                String signatureId = getConfiguration().getSignatureId();
+                if (signatureId == null) {
+                    signatureId = "_" + UUID.randomUUID().toString();
+                } else if (signatureId.isEmpty()) {
+                    // indicator that no signature Id attribute shall be 
generated
+                    signatureId = null;
+                }
 
                 // parent only relevant for enveloping or detached signature
                 Node parent = getParentOfSignature(out, node, 
contentReferenceUri, signatureType);
@@ -344,7 +350,7 @@ public class XmlSignerProcessor extends 
XmlSignatureProcessor {
         List<XPathFilterParameterSpec> result = 
(List<XPathFilterParameterSpec>) message
                 
.getHeader(XmlSignatureConstants.HEADER_XPATHS_TO_ID_ATTRIBUTES);
         if (result == null) {
-            result = getConfiguration().getXpathToIdAttributes();
+            result = getConfiguration().getXpathsToIdAttributes();
         }
         return result;
     }
@@ -635,7 +641,7 @@ public class XmlSignerProcessor extends 
XmlSignatureProcessor {
     }
 
     private List<String> getContentReferenceUrisForDetachedCase(Message 
message, Node messageBodyNode) throws XmlSignatureException,
-        XPathExpressionException {
+            XPathExpressionException {
         List<XPathFilterParameterSpec> xpathsToIdAttributes = 
getXpathToIdAttributes(message);
         if (xpathsToIdAttributes.isEmpty()) {
             // should not happen, has already been checked earlier
@@ -707,7 +713,7 @@ public class XmlSignerProcessor extends 
XmlSignatureProcessor {
     }
 
     private List<Transform> getTransforms(XMLSignatureFactory fac, 
SignatureType sigType) throws NoSuchAlgorithmException,
-        InvalidAlgorithmParameterException {
+            InvalidAlgorithmParameterException {
         List<AlgorithmMethod> configuredTrafos = 
getConfiguration().getTransformMethods();
         if (SignatureType.enveloped == sigType) {
             // add enveloped transform if necessary

http://git-wip-us.apache.org/repos/asf/camel/blob/9afc1bd9/components/camel-xmlsecurity/src/test/java/org/apache/camel/component/xmlsecurity/SpringXmlSignatureTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-xmlsecurity/src/test/java/org/apache/camel/component/xmlsecurity/SpringXmlSignatureTest.java
 
b/components/camel-xmlsecurity/src/test/java/org/apache/camel/component/xmlsecurity/SpringXmlSignatureTest.java
index 628a532..3f7f089 100644
--- 
a/components/camel-xmlsecurity/src/test/java/org/apache/camel/component/xmlsecurity/SpringXmlSignatureTest.java
+++ 
b/components/camel-xmlsecurity/src/test/java/org/apache/camel/component/xmlsecurity/SpringXmlSignatureTest.java
@@ -66,7 +66,7 @@ public class SpringXmlSignatureTest extends XmlSignatureTest {
         XmlSignerEndpoint endpoint = (XmlSignerEndpoint) context()
                 .getEndpoint(
                         
"xmlsecurity:sign://detached?keyAccessor=#accessorRsa&xpathsToIdAttributes=#xpathsToIdAttributes&"//
-                        + 
"schemaResourceUri=org/apache/camel/component/xmlsecurity/Test.xsd&clearHeaders=false");
+                        + 
"schemaResourceUri=org/apache/camel/component/xmlsecurity/Test.xsd&signatureId=&clearHeaders=false");
         return endpoint;
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/9afc1bd9/components/camel-xmlsecurity/src/test/java/org/apache/camel/component/xmlsecurity/XmlSignatureTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-xmlsecurity/src/test/java/org/apache/camel/component/xmlsecurity/XmlSignatureTest.java
 
b/components/camel-xmlsecurity/src/test/java/org/apache/camel/component/xmlsecurity/XmlSignatureTest.java
index 2562763..0965d3c 100644
--- 
a/components/camel-xmlsecurity/src/test/java/org/apache/camel/component/xmlsecurity/XmlSignatureTest.java
+++ 
b/components/camel-xmlsecurity/src/test/java/org/apache/camel/component/xmlsecurity/XmlSignatureTest.java
@@ -62,6 +62,8 @@ import javax.xml.xpath.XPathExpression;
 import javax.xml.xpath.XPathExpressionException;
 import javax.xml.xpath.XPathFactory;
 
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.xml.sax.SAXException;
 
@@ -140,7 +142,7 @@ public class XmlSignatureTest extends CamelTestSupport {
             public void configure() throws Exception {
                 // START SNIPPET: enveloping XML signature
                 
onException(XmlSignatureException.class).handled(true).to("mock:exception");
-                
from("direct:enveloping").to("xmlsecurity:sign://enveloping?keyAccessor=#accessor")
+                
from("direct:enveloping").to("xmlsecurity:sign://enveloping?keyAccessor=#accessor&schemaResourceUri=")
                         
.to("xmlsecurity:verify://enveloping?keySelector=#selector").to("mock:result");
                 // END SNIPPET: enveloping XML signature
             }
@@ -349,7 +351,7 @@ public class XmlSignatureTest extends CamelTestSupport {
                 
onException(Exception.class).handled(false).to("mock:exception");
                 from("direct:detached")
                         
.to("xmlsecurity:sign://detached?keyAccessor=#keyAccessorDefault&xpathsToIdAttributes=#xpathsToIdAttributes&"//
-                        + 
"schemaResourceUri=org/apache/camel/component/xmlsecurity/Test.xsd&clearHeaders=false")
+                                + 
"schemaResourceUri=org/apache/camel/component/xmlsecurity/Test.xsd&signatureId=&clearHeaders=false")
                         .to("mock:result")
                         
.to("xmlsecurity:verify://detached?keySelector=#keySelectorDefault&schemaResourceUri=org/apache/camel/component/xmlsecurity/Test.xsd")
                         .to("mock:verified");
@@ -441,7 +443,7 @@ public class XmlSignatureTest extends CamelTestSupport {
         Map<String, Object> headers = new TreeMap<String, Object>();
         headers.put(XmlSignatureConstants.HEADER_OMIT_XML_DECLARATION, 
Boolean.TRUE);
         InputStream payload = XmlSignatureTest.class
-            
.getResourceAsStream("/org/apache/camel/component/xmlsecurity/ExampleEnvelopedXmlSig.xml");
+                
.getResourceAsStream("/org/apache/camel/component/xmlsecurity/ExampleEnvelopedXmlSig.xml");
         assertNotNull("Cannot load payload", payload);
         sendBody("direct:outputnodesearchelementname", payload, headers);
         assertMockEndpointsSatisfied();
@@ -473,24 +475,23 @@ public class XmlSignatureTest extends CamelTestSupport {
     public void testSetTransformMethodXpath2InRouteDefinition() throws 
Exception {
         // example from http://www.w3.org/TR/2002/REC-xmldsig-filter2-20021108/
         String payload = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
-            + "<Document xmlns=\"http://test/test\";>                           
  "
-            + "<ToBeSigned>                                                    
 "
-            + "   <!-- comment -->                                             
 "
-            + "   <Data>1</Data>                                               
 "
-            + "   <NotToBeSigned>                                              
 "
-            + "     <ReallyToBeSigned>                                         
 "
-            + "       <!-- comment -->                                         
 "
-            + "       <Data>2</Data>                                           
 "
-            + "     </ReallyToBeSigned>                                        
 "
-            + "   </NotToBeSigned>                                             
 "
-            + " </ToBeSigned>                                                  
 "
-            + " <ToBeSigned>                                                   
 "
-            + "   <Data>3</Data>                                               
 "
-            + "   <NotToBeSigned>                                              
 "
-            + "     <Data>4</Data>                                             
 "
-            + "   </NotToBeSigned>                                             
 "
-            + " </ToBeSigned>                                                  
 "
-            + "</Document>";
+                + "<Document xmlns=\"http://test/test\";>                       
      "
+                + "<ToBeSigned>                                                
     "
+                + "   <!-- comment -->                                         
     "
+                + "   <Data>1</Data>                                           
     "
+                + "   <NotToBeSigned>                                          
     "
+                + "     <ReallyToBeSigned>                                     
     "
+                + "       <!-- comment -->                                     
     "
+                + "       <Data>2</Data>                                       
     "
+                + "     </ReallyToBeSigned>                                    
     "
+                + "   </NotToBeSigned>                                         
     "
+                + " </ToBeSigned>                                              
     "
+                + " <ToBeSigned>                                               
     "
+                + "   <Data>3</Data>                                           
     "
+                + "   <NotToBeSigned>                                          
     "
+                + "     <Data>4</Data>                                         
     "
+                + "   </NotToBeSigned>                                         
     "
+                + " </ToBeSigned>                                              
     " + "</Document>";
 
         setupMock(payload);
         sendBody("direct:transformsXPath2", payload);
@@ -528,7 +529,7 @@ public class XmlSignatureTest extends CamelTestSupport {
     public void testVerifyOutputNodeSearchElementName() throws Exception {
         setupMock();
         InputStream payload = XmlSignatureTest.class
-            
.getResourceAsStream("/org/apache/camel/component/xmlsecurity/ExampleEnvelopedXmlSig.xml");
+                
.getResourceAsStream("/org/apache/camel/component/xmlsecurity/ExampleEnvelopedXmlSig.xml");
         assertNotNull("Cannot load payload", payload);
         sendBody("direct:outputnodesearchelementname", payload);
         assertMockEndpointsSatisfied();
@@ -542,7 +543,7 @@ public class XmlSignatureTest extends CamelTestSupport {
         endpoint.setOutputNodeSearch("{wrongformat"); // closing '}' missing
         MockEndpoint mock = setupExceptionMock();
         InputStream payload = XmlSignatureTest.class
-            
.getResourceAsStream("/org/apache/camel/component/xmlsecurity/ExampleEnvelopedXmlSig.xml");
+                
.getResourceAsStream("/org/apache/camel/component/xmlsecurity/ExampleEnvelopedXmlSig.xml");
         assertNotNull("Cannot load payload", payload);
         sendBody("direct:outputnodesearchelementname", payload);
         assertMockEndpointsSatisfied();
@@ -558,7 +559,7 @@ public class XmlSignatureTest extends CamelTestSupport {
         // local name missing
         MockEndpoint mock = setupExceptionMock();
         InputStream payload = XmlSignatureTest.class
-            
.getResourceAsStream("/org/apache/camel/component/xmlsecurity/ExampleEnvelopedXmlSig.xml");
+                
.getResourceAsStream("/org/apache/camel/component/xmlsecurity/ExampleEnvelopedXmlSig.xml");
         assertNotNull("Cannot load payload", payload);
         sendBody("direct:outputnodesearchelementname", payload);
         assertMockEndpointsSatisfied();
@@ -569,7 +570,7 @@ public class XmlSignatureTest extends CamelTestSupport {
     public void testExceptionVerifyOutputNodeSearchWrongElementName() throws 
Exception {
         MockEndpoint mock = setupExceptionMock();
         InputStream payload = XmlSignatureTest.class
-            
.getResourceAsStream("/org/apache/camel/component/xmlsecurity/ExampleEnvelopingDigSig.xml");
+                
.getResourceAsStream("/org/apache/camel/component/xmlsecurity/ExampleEnvelopingDigSig.xml");
         assertNotNull("Cannot load payload", payload);
         sendBody("direct:outputnodesearchelementname", payload);
         assertMockEndpointsSatisfied();
@@ -580,7 +581,7 @@ public class XmlSignatureTest extends CamelTestSupport {
     public void 
testExceptionVerifyOutputNodeSearchElementNameMoreThanOneOutputElement() throws 
Exception {
         MockEndpoint mock = setupExceptionMock();
         InputStream payload = XmlSignatureTest.class
-            
.getResourceAsStream("/org/apache/camel/component/xmlsecurity/ExampleEnvelopingDigSigWithSeveralElementsWithNameRoot.xml");
+                
.getResourceAsStream("/org/apache/camel/component/xmlsecurity/ExampleEnvelopingDigSigWithSeveralElementsWithNameRoot.xml");
         assertNotNull("Cannot load payload", payload);
         sendBody("direct:outputnodesearchelementname", payload);
         assertMockEndpointsSatisfied();
@@ -591,7 +592,7 @@ public class XmlSignatureTest extends CamelTestSupport {
     public void testVerifyOutputNodeSearchXPath() throws Exception {
         setupMock();
         InputStream payload = XmlSignatureTest.class
-            
.getResourceAsStream("/org/apache/camel/component/xmlsecurity/ExampleEnvelopedXmlSig.xml");
+                
.getResourceAsStream("/org/apache/camel/component/xmlsecurity/ExampleEnvelopedXmlSig.xml");
         assertNotNull("Cannot load payload", payload);
         sendBody("direct:outputnodesearchxpath", payload);
         assertMockEndpointsSatisfied();
@@ -785,6 +786,41 @@ public class XmlSignatureTest extends CamelTestSupport {
 
     @Test
     public void testDetachedSignature() throws Exception {
+        testDetachedSignatureInternal();
+    }
+
+    @Test
+    public void testSignatureIdAtributeNull() throws Exception {
+        // the signature Id parameter must be empty, this is set in the URI 
already
+        Element sigEle = testDetachedSignatureInternal();
+        Attr attr = sigEle.getAttributeNode("Id");
+        assertNull("Signature element contains Id attribute", attr);
+    }
+
+    @Test
+    public void testSignatureIdAttribute() throws Exception {
+        String signatureId = "sigId";
+        XmlSignerEndpoint endpoint = getDetachedSignerEndpoint();
+        endpoint.setSignatureId(signatureId);
+        Element sigEle = testDetachedSignatureInternal();
+        String value = sigEle.getAttribute("Id");
+        assertNotNull("Signature Id is null", value);
+        assertEquals(signatureId, value);
+    }
+
+    @Test
+    public void testSignatureIdAttributeGenerated() throws Exception {
+        String signatureId = null;
+        XmlSignerEndpoint endpoint = getDetachedSignerEndpoint();
+        endpoint.setSignatureId(signatureId);
+        Element sigEle = testDetachedSignatureInternal();
+        String value = sigEle.getAttribute("Id");
+        assertNotNull("Signature Id is null", value);
+        assertTrue("Signature Id value does not start with '_'", 
value.startsWith("_"));
+    }
+
+    private Element testDetachedSignatureInternal() throws 
InterruptedException, XPathExpressionException, SAXException, IOException,
+            ParserConfigurationException {
         String detachedPayload = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" 
+ //
                 "<ns:root xmlns:ns=\"http://test\";><a 
ID=\"myID\"><b>bValue</b></a></ns:root>";
         MockEndpoint mock = getMockEndpoint("mock:result");
@@ -796,7 +832,9 @@ public class XmlSignatureTest extends CamelTestSupport {
         Map<String, String> namespaceMap = new TreeMap<String, String>();
         namespaceMap.put("ns", "http://test";);
         namespaceMap.put("ds", XMLSignature.XMLNS);
-        checkXpath(mock, "ns:root/ds:Signature", namespaceMap);
+        Object obj = checkXpath(mock, "ns:root/ds:Signature", namespaceMap);
+        Element sigEle = (Element) obj;
+        return sigEle;
     }
 
     @Test
@@ -970,10 +1008,9 @@ public class XmlSignatureTest extends CamelTestSupport {
     }
 
     XmlSignerEndpoint getDetachedSignerEndpoint() {
-        XmlSignerEndpoint endpoint = (XmlSignerEndpoint) context()
-                .getEndpoint(
-                        
"xmlsecurity:sign://detached?keyAccessor=#keyAccessorDefault&xpathsToIdAttributes=#xpathsToIdAttributes&"//
-                        + 
"schemaResourceUri=org/apache/camel/component/xmlsecurity/Test.xsd&clearHeaders=false");
+        XmlSignerEndpoint endpoint = (XmlSignerEndpoint) context().getEndpoint(
+                
"xmlsecurity:sign://detached?keyAccessor=#keyAccessorDefault&xpathsToIdAttributes=#xpathsToIdAttributes&"//
+                        + 
"schemaResourceUri=org/apache/camel/component/xmlsecurity/Test.xsd&signatureId=&clearHeaders=false");
         return endpoint;
     }
 
@@ -985,7 +1022,7 @@ public class XmlSignatureTest extends CamelTestSupport {
                 body.contains(expectedPartContent));
     }
 
-    private void checkXpath(MockEndpoint mock, String xpathString, final 
Map<String, String> prefix2Namespace)
+    private Object checkXpath(MockEndpoint mock, String xpathString, final 
Map<String, String> prefix2Namespace)
         throws XPathExpressionException, SAXException, IOException, 
ParserConfigurationException {
         Message mess = getMessage(mock);
         InputStream body = mess.getBody(InputStream.class);
@@ -1014,6 +1051,7 @@ public class XmlSignatureTest extends CamelTestSupport {
         XPathExpression expr = xpath.compile(xpathString);
         Object result = 
expr.evaluate(XmlSignatureHelper.newDocumentBuilder(true).parse(body), 
XPathConstants.NODE);
         assertNotNull("The xpath " + xpathString + " returned a null value", 
result);
+        return result;
     }
 
     private Message getMessage(MockEndpoint mock) {

http://git-wip-us.apache.org/repos/asf/camel/blob/9afc1bd9/components/camel-xmlsecurity/src/test/resources/org/apache/camel/component/xmlsecurity/SpringXmlSignatureTests.xml
----------------------------------------------------------------------
diff --git 
a/components/camel-xmlsecurity/src/test/resources/org/apache/camel/component/xmlsecurity/SpringXmlSignatureTests.xml
 
b/components/camel-xmlsecurity/src/test/resources/org/apache/camel/component/xmlsecurity/SpringXmlSignatureTests.xml
index 8ce4688..96ccd0c 100644
--- 
a/components/camel-xmlsecurity/src/test/resources/org/apache/camel/component/xmlsecurity/SpringXmlSignatureTests.xml
+++ 
b/components/camel-xmlsecurity/src/test/resources/org/apache/camel/component/xmlsecurity/SpringXmlSignatureTests.xml
@@ -262,7 +262,7 @@
         <route>
             <from uri="direct:detached" />
             <to
-                
uri="xmlsecurity:sign://detached?keyAccessor=#accessorRsa&amp;xpathsToIdAttributes=#xpathsToIdAttributes&amp;schemaResourceUri=org/apache/camel/component/xmlsecurity/Test.xsd&amp;clearHeaders=false"
 />
+                
uri="xmlsecurity:sign://detached?keyAccessor=#accessorRsa&amp;xpathsToIdAttributes=#xpathsToIdAttributes&amp;schemaResourceUri=org/apache/camel/component/xmlsecurity/Test.xsd&amp;signatureId=&amp;clearHeaders=false"
 />
             <to uri="mock:result" />
             <to
                 
uri="xmlsecurity:verify://detached?keySelector=#selectorRsa&amp;schemaResourceUri=org/apache/camel/component/xmlsecurity/Test.xsd"
 />

Reply via email to