Author: veithen
Date: Mon Nov 24 14:00:13 2008
New Revision: 720303

URL: http://svn.apache.org/viewvc?rev=720303&view=rev
Log:
SYNAPSE-378: Finalized AXIOMSource/AXIOMXMLReader implementation.

Added:
    synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/util/jaxp/
    
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/util/jaxp/AXIOMSourceTest.java
   (with props)
    synapse/trunk/java/modules/core/src/test/resources/org/apache/synapse/util/
    
synapse/trunk/java/modules/core/src/test/resources/org/apache/synapse/util/jaxp/
    
synapse/trunk/java/modules/core/src/test/resources/org/apache/synapse/util/jaxp/test.xml
   (with props)
Modified:
    
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/AXIOMSource.java
    
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/AXIOMXMLReader.java

Modified: 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/AXIOMSource.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/AXIOMSource.java?rev=720303&r1=720302&r2=720303&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/AXIOMSource.java
 (original)
+++ 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/AXIOMSource.java
 Mon Nov 24 14:00:13 2008
@@ -28,8 +28,6 @@
  * Implementation of [EMAIL PROTECTED] javax.xml.transform.Source} for AXIOM.
  * The implementation is based on [EMAIL PROTECTED] SAXSource} and directly 
transforms an AXIOM
  * tree into a stream of SAX events using [EMAIL PROTECTED] AXIOMXMLReader}.
- * <p>
- * NOTE: THIS IS WORK IN PROGRESS!
  */
 public class AXIOMSource extends SAXSource {
     public AXIOMSource(OMElement element) {

Modified: 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/AXIOMXMLReader.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/AXIOMXMLReader.java?rev=720303&r1=720302&r2=720303&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/AXIOMXMLReader.java
 (original)
+++ 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/AXIOMXMLReader.java
 Mon Nov 24 14:00:13 2008
@@ -25,6 +25,7 @@
 import java.util.List;
 
 import org.apache.axiom.om.OMAttribute;
+import org.apache.axiom.om.OMComment;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMNode;
@@ -39,14 +40,15 @@
 import org.xml.sax.SAXNotRecognizedException;
 import org.xml.sax.SAXNotSupportedException;
 import org.xml.sax.XMLReader;
+import org.xml.sax.ext.LexicalHandler;
 
 /**
  * SAX [EMAIL PROTECTED] XMLReader} implementation that reads the supplied 
AXIOM tree and invokes the
  * callback methods on the configured [EMAIL PROTECTED] ContentHandler}.
- * <p>
- * NOTE: THIS IS WORK IN PROGRESS!
  */
 public class AXIOMXMLReader implements XMLReader {
+    private static final String URI_LEXICAL_HANDLER = 
"http://xml.org/sax/properties/lexical-handler";;
+    
     private final OMElement element;
     private final AttributesAdapter attributesAdapter = new 
AttributesAdapter();
     
@@ -54,6 +56,7 @@
     private boolean namespacePrefixes = false;
     
     private ContentHandler contentHandler;
+    private LexicalHandler lexicalHandler;
     private DTDHandler dtdHandler;
     private EntityResolver entityResolver;
     private ErrorHandler errorHandler;
@@ -118,6 +121,8 @@
             return namespaces;
         } else if 
("http://xml.org/sax/features/namespace-prefixes".equals(name)) {
             return namespacePrefixes;
+        } else if (URI_LEXICAL_HANDLER.equals(name)) {
+            return lexicalHandler;
         } else {
             throw new SAXNotRecognizedException(name);
         }
@@ -125,7 +130,11 @@
 
     public void setProperty(String name, Object value)
             throws SAXNotRecognizedException, SAXNotSupportedException {
-        throw new SAXNotRecognizedException(name);
+        if (URI_LEXICAL_HANDLER.equals(name)) {
+            lexicalHandler = (LexicalHandler)value;
+        } else {
+            throw new SAXNotRecognizedException(name);
+        }
     }
 
     public void parse(InputSource input) throws IOException, SAXException {
@@ -142,7 +151,24 @@
         contentHandler.endDocument();
     }
     
+    private void generatePrefixMappingEvents(OMElement omElement, boolean 
start)
+            throws SAXException {
+        
+        for (Iterator it = omElement.getAllDeclaredNamespaces(); it.hasNext(); 
) {
+            OMNamespace ns = (OMNamespace)it.next();
+            String prefix = ns.getPrefix();
+            if (prefix != null) {
+                if (start) {
+                    contentHandler.startPrefixMapping(prefix, 
ns.getNamespaceURI());
+                } else {
+                    contentHandler.endPrefixMapping(prefix);
+                }
+            }
+        }
+    }
+    
     private void generateEvents(OMElement omElement) throws SAXException {
+        generatePrefixMappingEvents(omElement, true);
         OMNamespace omNamespace = omElement.getNamespace();
         String uri;
         String prefix;
@@ -171,11 +197,26 @@
                     generateEvents((OMElement)node);
                     break;
                 case OMNode.TEXT_NODE:
+                    generateEvents((OMText)node);
+                    break;
                 case OMNode.CDATA_SECTION_NODE:
+                    if (lexicalHandler != null) {
+                        lexicalHandler.startCDATA();
+                    }
                     generateEvents((OMText)node);
+                    if (lexicalHandler != null) {
+                        lexicalHandler.endCDATA();
+                    }
+                    break;
+                case OMNode.COMMENT_NODE:
+                    if (lexicalHandler != null) {
+                        char[] ch = ((OMComment)node).getValue().toCharArray();
+                        lexicalHandler.comment(ch, 0, ch.length);
+                    }
             }
         }
         contentHandler.endElement(uri, localName, qName);
+        generatePrefixMappingEvents(omElement, false);
     }
     
     private void generateEvents(OMText omText) throws SAXException {
@@ -184,11 +225,9 @@
     }
 
     protected static class AttributesAdapter implements Attributes {
-        private OMElement element;
         private List<OMAttribute> attributes = new ArrayList<OMAttribute>(5);
 
         public void setAttributes(OMElement element) {
-            this.element = element;
             attributes.clear();
             for (Iterator it = element.getAllAttributes(); it.hasNext(); ) {
                 attributes.add((OMAttribute)it.next());
@@ -199,12 +238,22 @@
             return attributes.size();
         }
 
-        public int getIndex(String name) {
-            throw new UnsupportedOperationException();
+        public int getIndex(String qName) {
+            for (int i=0, len=attributes.size(); i<len; i++) {
+                if (getQName(i).equals(qName)) {
+                    return i;
+                }
+            }
+            return -1;
         }
 
         public int getIndex(String uri, String localName) {
-            throw new UnsupportedOperationException();
+            for (int i=0, len=attributes.size(); i<len; i++) {
+                if (getURI(i).equals(uri) && 
getLocalName(i).equals(localName)) {
+                    return i;
+                }
+            }
+            return -1;
         }
 
         public String getLocalName(int index) {
@@ -230,12 +279,14 @@
             return attributes.get(index).getAttributeType();
         }
 
-        public String getType(String name) {
-            throw new UnsupportedOperationException();
+        public String getType(String qName) {
+            int index = getIndex(qName);
+            return index == -1 ? null : getType(index);
         }
 
         public String getType(String uri, String localName) {
-            throw new UnsupportedOperationException();
+            int index = getIndex(uri, localName);
+            return index == -1 ? null : getType(index);
         }
 
         public String getURI(int index) {
@@ -247,12 +298,14 @@
             return attributes.get(index).getAttributeValue();
         }
 
-        public String getValue(String name) {
-            throw new UnsupportedOperationException();
+        public String getValue(String qName) {
+            int index = getIndex(qName);
+            return index == -1 ? null : getValue(index);
         }
 
         public String getValue(String uri, String localName) {
-            throw new UnsupportedOperationException();
+            int index = getIndex(uri, localName);
+            return index == -1 ? null : getValue(index);
         }
     }
 }

Added: 
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/util/jaxp/AXIOMSourceTest.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/util/jaxp/AXIOMSourceTest.java?rev=720303&view=auto
==============================================================================
--- 
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/util/jaxp/AXIOMSourceTest.java
 (added)
+++ 
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/util/jaxp/AXIOMSourceTest.java
 Mon Nov 24 14:00:13 2008
@@ -0,0 +1,55 @@
+/*
+ *  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.apache.synapse.util.jaxp;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stream.StreamResult;
+
+import org.apache.axiom.om.impl.builder.StAXOMBuilder;
+import org.custommonkey.xmlunit.XMLTestCase;
+import org.xml.sax.InputSource;
+
+public class AXIOMSourceTest extends XMLTestCase {
+    private InputStream getInputStream() {
+        return AXIOMSourceTest.class.getResourceAsStream("test.xml");
+    }
+    
+    public void test() throws Exception {
+        XMLInputFactory inputFactory = XMLInputFactory.newInstance();
+        // Turn off coalescing mode so that CDATA sections are reported by the 
StAX parser
+        inputFactory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.FALSE);
+        XMLStreamReader reader = 
inputFactory.createXMLStreamReader(getInputStream());
+        StAXOMBuilder builder = new StAXOMBuilder(reader);
+        Transformer transformer = 
TransformerFactory.newInstance().newTransformer();
+        AXIOMSource source = new AXIOMSource(builder.getDocumentElement());
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        StreamResult result = new StreamResult(out);
+        transformer.transform(source, result);
+//        System.out.write(out.toByteArray());
+        assertXMLEqual(new InputSource(getInputStream()), new InputSource(new 
ByteArrayInputStream(out.toByteArray())));
+    }
+}

Propchange: 
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/util/jaxp/AXIOMSourceTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
synapse/trunk/java/modules/core/src/test/resources/org/apache/synapse/util/jaxp/test.xml
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/test/resources/org/apache/synapse/util/jaxp/test.xml?rev=720303&view=auto
==============================================================================
--- 
synapse/trunk/java/modules/core/src/test/resources/org/apache/synapse/util/jaxp/test.xml
 (added)
+++ 
synapse/trunk/java/modules/core/src/test/resources/org/apache/synapse/util/jaxp/test.xml
 Mon Nov 24 14:00:13 2008
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+    <!-- Some comment -->
+    <element xmlns="urn:ns1" xmlns:ns2="urn:ns2">
+        <ns2:subelement attr1="test" attr2="test2">Some text</ns2:subelement>
+        <otherelement attr1="test" ns2:attr2="test2"><![CDATA[some 
CDATA]]></otherelement>
+    </element>
+</root>

Propchange: 
synapse/trunk/java/modules/core/src/test/resources/org/apache/synapse/util/jaxp/test.xml
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to