You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ws.apache.org by gi...@apache.org on 2011/11/01 21:58:06 UTC

svn commit: r1196271 - in /webservices/wss4j/branches/swssf/streaming-xml-security/src: main/java/org/swssf/xmlsec/impl/XMLSecurityStreamReader.java test/java/org/swssf/xmlsec/test/XMLSecurityStreamReaderTest.java

Author: giger
Date: Tue Nov  1 20:58:06 2011
New Revision: 1196271

URL: http://svn.apache.org/viewvc?rev=1196271&view=rev
Log:
XMLSecurityStreamReader test and fixes

Added:
    webservices/wss4j/branches/swssf/streaming-xml-security/src/test/java/org/swssf/xmlsec/test/XMLSecurityStreamReaderTest.java   (with props)
Modified:
    webservices/wss4j/branches/swssf/streaming-xml-security/src/main/java/org/swssf/xmlsec/impl/XMLSecurityStreamReader.java

Modified: webservices/wss4j/branches/swssf/streaming-xml-security/src/main/java/org/swssf/xmlsec/impl/XMLSecurityStreamReader.java
URL: http://svn.apache.org/viewvc/webservices/wss4j/branches/swssf/streaming-xml-security/src/main/java/org/swssf/xmlsec/impl/XMLSecurityStreamReader.java?rev=1196271&r1=1196270&r2=1196271&view=diff
==============================================================================
--- webservices/wss4j/branches/swssf/streaming-xml-security/src/main/java/org/swssf/xmlsec/impl/XMLSecurityStreamReader.java (original)
+++ webservices/wss4j/branches/swssf/streaming-xml-security/src/main/java/org/swssf/xmlsec/impl/XMLSecurityStreamReader.java Tue Nov  1 20:58:06 2011
@@ -68,7 +68,10 @@ public class XMLSecurityStreamReader imp
         } catch (XMLSecurityException e) {
             throw new XMLStreamException(e);
         }
-        return getCurrentEvent().getEventType();
+        if (currentEvent.isCharacters() && currentEvent.asCharacters().isIgnorableWhiteSpace()) {
+            return XMLStreamConstants.SPACE;
+        }
+        return currentEvent.getEventType();
     }
 
     private XMLEvent getCurrentEvent() {
@@ -440,7 +443,14 @@ public class XMLSecurityStreamReader imp
     public int getEventType() {
         XMLEvent xmlEvent = getCurrentEvent();
         if (xmlEvent == null) {
-            return XMLStreamConstants.START_DOCUMENT;
+            try {
+                return next();
+            } catch (XMLStreamException e) {
+                throw new IllegalStateException(e);
+            }
+        }
+        if (xmlEvent.isCharacters() && xmlEvent.asCharacters().isIgnorableWhiteSpace()) {
+            return XMLStreamConstants.SPACE;
         }
         return xmlEvent.getEventType();
     }
@@ -533,7 +543,7 @@ public class XMLSecurityStreamReader imp
     }
 
     public String getEncoding() {
-        return null;
+        return inputProcessorChain.getDocumentContext().getEncoding();
     }
 
     public boolean hasText() {

Added: webservices/wss4j/branches/swssf/streaming-xml-security/src/test/java/org/swssf/xmlsec/test/XMLSecurityStreamReaderTest.java
URL: http://svn.apache.org/viewvc/webservices/wss4j/branches/swssf/streaming-xml-security/src/test/java/org/swssf/xmlsec/test/XMLSecurityStreamReaderTest.java?rev=1196271&view=auto
==============================================================================
--- webservices/wss4j/branches/swssf/streaming-xml-security/src/test/java/org/swssf/xmlsec/test/XMLSecurityStreamReaderTest.java (added)
+++ webservices/wss4j/branches/swssf/streaming-xml-security/src/test/java/org/swssf/xmlsec/test/XMLSecurityStreamReaderTest.java Tue Nov  1 20:58:06 2011
@@ -0,0 +1,289 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.swssf.xmlsec.test;
+
+import junit.framework.Assert;
+import org.custommonkey.xmlunit.XMLAssert;
+import org.swssf.xmlsec.ext.*;
+import org.swssf.xmlsec.impl.DocumentContextImpl;
+import org.swssf.xmlsec.impl.InputProcessorChainImpl;
+import org.swssf.xmlsec.impl.SecurityContextImpl;
+import org.swssf.xmlsec.impl.XMLSecurityStreamReader;
+import org.testng.annotations.Test;
+
+import javax.xml.stream.*;
+import javax.xml.stream.events.XMLEvent;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stax.StAXSource;
+import javax.xml.transform.stream.StreamResult;
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author $Author$
+ * @version $Revision$ $Date$
+ */
+public class XMLSecurityStreamReaderTest {
+
+    @Test
+    public void testPassThroughDocumentEvents() throws Exception {
+        XMLSecurityProperties securityProperties = new XMLSecurityProperties();
+        securityProperties.setSkipDocumentEvents(false);
+        SecurityContextImpl securityContext = new SecurityContextImpl();
+        InputProcessorChainImpl inputProcessorChain = new InputProcessorChainImpl(securityContext);
+        inputProcessorChain.addProcessor(new EventReaderProcessor());
+        XMLSecurityStreamReader xmlSecurityStreamReader = new XMLSecurityStreamReader(inputProcessorChain, securityProperties);
+        int event = xmlSecurityStreamReader.next();
+        Assert.assertEquals(XMLStreamConstants.START_DOCUMENT, event);
+    }
+
+    @Test
+    public void testSkipThroughDocumentEvents() throws Exception {
+        XMLSecurityProperties securityProperties = new XMLSecurityProperties();
+        securityProperties.setSkipDocumentEvents(true);
+        SecurityContextImpl securityContext = new SecurityContextImpl();
+        InputProcessorChainImpl inputProcessorChain = new InputProcessorChainImpl(securityContext);
+        inputProcessorChain.addProcessor(new EventReaderProcessor());
+        XMLSecurityStreamReader xmlSecurityStreamReader = new XMLSecurityStreamReader(inputProcessorChain, securityProperties);
+        int event = xmlSecurityStreamReader.next();
+        Assert.assertEquals(XMLStreamConstants.CHARACTERS, event);
+    }
+
+    @Test
+    public void testIdentityTransformSource() throws Exception {
+        XMLSecurityProperties securityProperties = new XMLSecurityProperties();
+        SecurityContextImpl securityContext = new SecurityContextImpl();
+        InputProcessorChainImpl inputProcessorChain = new InputProcessorChainImpl(securityContext);
+        inputProcessorChain.addProcessor(new EventReaderProcessor());
+        XMLSecurityStreamReader xmlSecurityStreamReader = new XMLSecurityStreamReader(inputProcessorChain, securityProperties);
+        //use the sun internal TransformerFactory since the current xalan version don't know how to handle StaxSources:
+        TransformerFactory transformerFactory = TransformerFactory.newInstance("com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl", this.getClass().getClassLoader());
+        javax.xml.transform.Transformer transformer = transformerFactory.newTransformer();
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        transformer.transform(new StAXSource(xmlSecurityStreamReader), new StreamResult(baos));
+        XMLAssert.assertXMLEqual(readTestFile(), baos.toString("UTF-8"));
+    }
+
+    @Test
+    public void testCorrectness() throws Exception {
+        XMLSecurityProperties securityProperties = new XMLSecurityProperties();
+        SecurityContextImpl securityContext = new SecurityContextImpl();
+        DocumentContextImpl documentContext = new DocumentContextImpl();
+        documentContext.setEncoding("UTF-8");
+        InputProcessorChainImpl inputProcessorChain = new InputProcessorChainImpl(securityContext, documentContext);
+        inputProcessorChain.addProcessor(new EventReaderProcessor());
+        XMLSecurityStreamReader xmlSecurityStreamReader = new XMLSecurityStreamReader(inputProcessorChain, securityProperties);
+
+        XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
+        xmlInputFactory.setProperty(XMLInputFactory.IS_COALESCING, true);
+        xmlInputFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, true);
+        XMLStreamReader stdXmlStreamReader = xmlInputFactory.createXMLStreamReader(this.getClass().getClassLoader().getResourceAsStream("testdata/plain-soap-1.1.xml"));
+
+        //hmm why does a streamreader return a DOCUMENT_EVENT before we did call next() ??
+        int stdXMLEventType = stdXmlStreamReader.getEventType();
+        int secXMLEventType = xmlSecurityStreamReader.getEventType();
+        do {
+            switch (stdXMLEventType) {
+                case XMLStreamConstants.START_ELEMENT:
+                    Assert.assertTrue(xmlSecurityStreamReader.isStartElement());
+                    Assert.assertFalse(xmlSecurityStreamReader.isEndElement());
+                    Assert.assertEquals(stdXmlStreamReader.getLocalName(), xmlSecurityStreamReader.getLocalName());
+                    Assert.assertEquals(stdXmlStreamReader.getName(), xmlSecurityStreamReader.getName());
+                    Assert.assertEquals(stdXmlStreamReader.getNamespaceURI(), xmlSecurityStreamReader.getNamespaceURI());
+                    if (stdXmlStreamReader.getPrefix() == null) {
+                        Assert.assertEquals("", xmlSecurityStreamReader.getPrefix());
+                    } else {
+                        Assert.assertEquals(stdXmlStreamReader.getPrefix(), xmlSecurityStreamReader.getPrefix());
+                    }
+                    Assert.assertEquals(stdXmlStreamReader.hasName(), xmlSecurityStreamReader.hasName());
+                    Assert.assertEquals(stdXmlStreamReader.hasText(), xmlSecurityStreamReader.hasText());
+                    Assert.assertEquals(stdXmlStreamReader.getAttributeCount(), xmlSecurityStreamReader.getAttributeCount());
+                    Assert.assertEquals(stdXmlStreamReader.getNamespaceCount(), xmlSecurityStreamReader.getNamespaceCount());
+                    for (int i = 0; i < stdXmlStreamReader.getAttributeCount(); i++) {
+                        Assert.assertEquals(stdXmlStreamReader.getAttributeLocalName(i), xmlSecurityStreamReader.getAttributeLocalName(i));
+                        Assert.assertEquals(stdXmlStreamReader.getAttributeName(i), xmlSecurityStreamReader.getAttributeName(i));
+                        if (stdXmlStreamReader.getAttributeNamespace(i) == null) {
+                            Assert.assertEquals("", xmlSecurityStreamReader.getAttributeNamespace(i));
+                        } else {
+                            Assert.assertEquals(stdXmlStreamReader.getAttributeNamespace(i), xmlSecurityStreamReader.getAttributeNamespace(i));
+                        }
+                        if (stdXmlStreamReader.getAttributePrefix(i) == null) {
+                            Assert.assertEquals("", xmlSecurityStreamReader.getAttributePrefix(i));
+                        } else {
+                            Assert.assertEquals(stdXmlStreamReader.getAttributePrefix(i), xmlSecurityStreamReader.getAttributePrefix(i));
+                        }
+                        Assert.assertEquals(stdXmlStreamReader.getAttributeType(i), xmlSecurityStreamReader.getAttributeType(i));
+                        Assert.assertEquals(stdXmlStreamReader.getAttributeValue(i), xmlSecurityStreamReader.getAttributeValue(i));
+                    }
+                    for (int i = 0; i < stdXmlStreamReader.getNamespaceCount(); i++) {
+                        if (stdXmlStreamReader.getNamespacePrefix(i) == null) {
+                            Assert.assertEquals("", xmlSecurityStreamReader.getNamespacePrefix(i));
+                        } else {
+                            Assert.assertEquals(stdXmlStreamReader.getNamespacePrefix(i), xmlSecurityStreamReader.getNamespacePrefix(i));
+                        }
+                        Assert.assertEquals(stdXmlStreamReader.getNamespaceURI(i), xmlSecurityStreamReader.getNamespaceURI(i));
+                    }
+                    break;
+                case XMLStreamConstants.END_ELEMENT:
+                    Assert.assertFalse(xmlSecurityStreamReader.isStartElement());
+                    Assert.assertTrue(xmlSecurityStreamReader.isEndElement());
+                    Assert.assertEquals(stdXmlStreamReader.getLocalName(), xmlSecurityStreamReader.getLocalName());
+                    Assert.assertEquals(stdXmlStreamReader.getName(), xmlSecurityStreamReader.getName());
+                    Assert.assertEquals(stdXmlStreamReader.getNamespaceURI(), xmlSecurityStreamReader.getNamespaceURI());
+                    if (stdXmlStreamReader.getPrefix() == null) {
+                        Assert.assertEquals("", xmlSecurityStreamReader.getPrefix());
+                    } else {
+                        Assert.assertEquals(stdXmlStreamReader.getPrefix(), xmlSecurityStreamReader.getPrefix());
+                    }
+                    Assert.assertEquals(stdXmlStreamReader.hasName(), xmlSecurityStreamReader.hasName());
+                    Assert.assertEquals(stdXmlStreamReader.hasText(), xmlSecurityStreamReader.hasText());
+                    break;
+                case XMLStreamConstants.PROCESSING_INSTRUCTION:
+                    Assert.assertEquals(stdXmlStreamReader.isCharacters(), xmlSecurityStreamReader.isCharacters());
+                    Assert.assertEquals(stdXmlStreamReader.getPITarget(), xmlSecurityStreamReader.getPITarget());
+                    Assert.assertEquals(stdXmlStreamReader.getPIData(), xmlSecurityStreamReader.getPIData());
+                    break;
+                case XMLStreamConstants.CHARACTERS:
+                    Assert.assertEquals(stdXmlStreamReader.isCharacters(), xmlSecurityStreamReader.isCharacters());
+                    Assert.assertEquals(stdXmlStreamReader.isWhiteSpace(), xmlSecurityStreamReader.isWhiteSpace());
+                    Assert.assertEquals(stdXmlStreamReader.getText(), xmlSecurityStreamReader.getText());
+                    Assert.assertEquals(
+                            new String(stdXmlStreamReader.getTextCharacters(), stdXmlStreamReader.getTextStart(), stdXmlStreamReader.getTextLength()),
+                            new String(xmlSecurityStreamReader.getTextCharacters(), xmlSecurityStreamReader.getTextStart(), xmlSecurityStreamReader.getTextLength()));
+                    Assert.assertEquals(stdXmlStreamReader.getTextLength(), xmlSecurityStreamReader.getTextLength());
+                    break;
+                case XMLStreamConstants.COMMENT:
+                    Assert.assertEquals(stdXmlStreamReader.isCharacters(), xmlSecurityStreamReader.isCharacters());
+                    Assert.assertEquals(stdXmlStreamReader.isWhiteSpace(), xmlSecurityStreamReader.isWhiteSpace());
+                    Assert.assertEquals(stdXmlStreamReader.getText(), xmlSecurityStreamReader.getText());
+                    Assert.assertEquals(
+                            new String(stdXmlStreamReader.getTextCharacters(), stdXmlStreamReader.getTextStart(), stdXmlStreamReader.getTextLength()),
+                            new String(xmlSecurityStreamReader.getTextCharacters(), xmlSecurityStreamReader.getTextStart(), xmlSecurityStreamReader.getTextLength()));
+                    Assert.assertEquals(stdXmlStreamReader.getTextLength(), xmlSecurityStreamReader.getTextLength());
+                    break;
+                case XMLStreamConstants.SPACE:
+                    Assert.assertEquals(stdXmlStreamReader.isWhiteSpace(), xmlSecurityStreamReader.isWhiteSpace());
+                    Assert.assertEquals(stdXmlStreamReader.getText(), xmlSecurityStreamReader.getText());
+                    Assert.assertEquals(
+                            new String(stdXmlStreamReader.getTextCharacters(), stdXmlStreamReader.getTextStart(), stdXmlStreamReader.getTextLength()),
+                            new String(xmlSecurityStreamReader.getTextCharacters(), xmlSecurityStreamReader.getTextStart(), xmlSecurityStreamReader.getTextLength()));
+                    Assert.assertEquals(stdXmlStreamReader.getTextLength(), xmlSecurityStreamReader.getTextLength());
+                    break;
+                case XMLStreamConstants.START_DOCUMENT:
+                    Assert.assertEquals(stdXmlStreamReader.getCharacterEncodingScheme(), xmlSecurityStreamReader.getCharacterEncodingScheme());
+                    Assert.assertEquals(stdXmlStreamReader.getEncoding(), xmlSecurityStreamReader.getEncoding());
+                    //Assert.assertEquals(stdXmlStreamReader.getVersion(), xmlSecurityStreamReader.getVersion());
+                    break;
+                case XMLStreamConstants.END_DOCUMENT:
+                    break;
+                case XMLStreamConstants.ENTITY_REFERENCE:
+                    Assert.assertEquals(stdXmlStreamReader.isCharacters(), xmlSecurityStreamReader.isCharacters());
+                    Assert.assertEquals(stdXmlStreamReader.getText(), xmlSecurityStreamReader.getText());
+                    break;
+                case XMLStreamConstants.ATTRIBUTE:
+                    break;
+                case XMLStreamConstants.DTD:
+                    Assert.assertEquals(stdXmlStreamReader.isCharacters(), xmlSecurityStreamReader.isCharacters());
+                    break;
+                case XMLStreamConstants.CDATA:
+                    Assert.assertEquals(stdXmlStreamReader.isCharacters(), xmlSecurityStreamReader.isCharacters());
+                    break;
+                case XMLStreamConstants.NAMESPACE:
+                    break;
+                case XMLStreamConstants.NOTATION_DECLARATION:
+                    break;
+                case XMLStreamConstants.ENTITY_DECLARATION:
+                    Assert.assertEquals(stdXmlStreamReader.isCharacters(), xmlSecurityStreamReader.isCharacters());
+                    break;
+            }
+            //hmm2 an eventreader returns a CHARACTER EVENT for an ignorable whitespace whereby a streamReader returns it as SPACE
+            if (stdXMLEventType == XMLStreamConstants.SPACE && secXMLEventType == XMLStreamConstants.CHARACTERS) {
+                secXMLEventType = XMLStreamConstants.SPACE;
+            }
+            Assert.assertEquals(stdXMLEventType, secXMLEventType);
+            if (stdXmlStreamReader.hasNext()) {
+                Assert.assertTrue(xmlSecurityStreamReader.hasNext());
+                stdXMLEventType = stdXmlStreamReader.next();
+                secXMLEventType = xmlSecurityStreamReader.next();
+            } else {
+                Assert.assertFalse(xmlSecurityStreamReader.hasNext());
+                break;
+            }
+        } while (true);
+    }
+
+    private String readTestFile() throws Exception {
+        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("testdata/plain-soap-1.1.xml");
+        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
+        char[] buf = new char[1024];
+        int read;
+        StringBuilder stringBuilder = new StringBuilder();
+        while ((read = bufferedReader.read(buf)) != -1) {
+            stringBuilder.append(buf, 0, read);
+        }
+        return stringBuilder.toString();
+    }
+
+    class EventReaderProcessor implements InputProcessor {
+
+        private XMLEventReader xmlEventReader;
+
+        EventReaderProcessor() throws Exception {
+            XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
+            xmlInputFactory.setProperty(XMLInputFactory.IS_COALESCING, true);
+            xmlInputFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, true);
+            xmlEventReader = xmlInputFactory.createXMLEventReader(this.getClass().getClassLoader().getResourceAsStream("testdata/plain-soap-1.1.xml"));
+        }
+
+        @Override
+        public Set<Object> getBeforeProcessors() {
+            return new HashSet<Object>();
+        }
+
+        @Override
+        public Set<Object> getAfterProcessors() {
+            return new HashSet<Object>();
+        }
+
+        @Override
+        public XMLSecurityConstants.Phase getPhase() {
+            return XMLSecurityConstants.Phase.PROCESSING;
+        }
+
+        @Override
+        public XMLEvent processNextHeaderEvent(InputProcessorChain inputProcessorChain) throws XMLStreamException, XMLSecurityException {
+            return null;
+        }
+
+        @Override
+        public XMLEvent processNextEvent(InputProcessorChain inputProcessorChain) throws XMLStreamException, XMLSecurityException {
+            inputProcessorChain.reset();
+            XMLEvent xmlEvent = xmlEventReader.nextEvent();
+            return xmlEvent;
+        }
+
+        @Override
+        public void doFinal(InputProcessorChain inputProcessorChain) throws XMLStreamException, XMLSecurityException {
+        }
+    }
+}

Propchange: webservices/wss4j/branches/swssf/streaming-xml-security/src/test/java/org/swssf/xmlsec/test/XMLSecurityStreamReaderTest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision