Author: sagara
Date: Tue Jun 21 11:20:39 2011
New Revision: 1137959

URL: http://svn.apache.org/viewvc?rev=1137959&view=rev
Log:
Fixed AXIS2-5065 - Provide support for org.w3c.dom.Document in web service.

Modified:
    axis/axis2/java/core/trunk/modules/adb/pom.xml
    
axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/databinding/typemapping/SimpleTypeMapper.java
    
axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/databinding/utils/BeanUtil.java
    
axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/RPCUtil.java
    
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/java2wsdl/TypeTable.java
    axis/axis2/java/core/trunk/modules/osgi/pom.xml

Modified: axis/axis2/java/core/trunk/modules/adb/pom.xml
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/adb/pom.xml?rev=1137959&r1=1137958&r2=1137959&view=diff
==============================================================================
--- axis/axis2/java/core/trunk/modules/adb/pom.xml (original)
+++ axis/axis2/java/core/trunk/modules/adb/pom.xml Tue Jun 21 11:20:39 2011
@@ -44,6 +44,10 @@
             <version>${project.version}</version>
         </dependency>
         <dependency>
+            <groupId>org.apache.ws.commons.axiom</groupId>
+            <artifactId>axiom-dom</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.apache.geronimo.specs</groupId>
             <artifactId>geronimo-activation_1.1_spec</artifactId>
         </dependency>
@@ -51,12 +55,7 @@
             <groupId>xmlunit</groupId>
             <artifactId>xmlunit</artifactId>
             <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.ws.commons.axiom</groupId>
-            <artifactId>axiom-dom</artifactId>
-            <scope>test</scope>
-        </dependency>
+        </dependency>       
     </dependencies>
 
     <build>

Modified: 
axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/databinding/typemapping/SimpleTypeMapper.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/databinding/typemapping/SimpleTypeMapper.java?rev=1137959&r1=1137958&r2=1137959&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/databinding/typemapping/SimpleTypeMapper.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/databinding/typemapping/SimpleTypeMapper.java
 Tue Jun 21 11:20:39 2011
@@ -28,6 +28,7 @@ import org.apache.axis2.databinding.type
 import org.apache.axis2.databinding.utils.ConverterUtil;
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.description.AxisService;
+import org.w3c.dom.Document;
 
 import javax.activation.DataHandler;
 import javax.xml.namespace.QName;
@@ -372,5 +373,16 @@ public class SimpleTypeMapper {
                }
                return false;
        }
+       
+       /**
+        * Checks that given classType is a W3C Document.
+        * 
+        * @param classType
+        *            the class type
+        * @return true, if is dom document
+        */
+       public static boolean isDomDocument(Class classType) {
+               return Document.class.isAssignableFrom(classType);
+       }
 
 }

Modified: 
axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/databinding/utils/BeanUtil.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/databinding/utils/BeanUtil.java?rev=1137959&r1=1137958&r2=1137959&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/databinding/utils/BeanUtil.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/databinding/utils/BeanUtil.java
 Tue Jun 21 11:20:39 2011
@@ -43,6 +43,8 @@ import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamReader;
 
 import org.apache.axiom.om.*;
+import org.apache.axiom.om.impl.builder.StAXOMBuilder;
+import org.apache.axiom.om.impl.dom.DOOMAbstractFactory;
 import org.apache.axiom.om.util.Base64;
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.context.MessageContext;
@@ -54,6 +56,15 @@ import org.apache.axis2.description.java
 import org.apache.axis2.engine.ObjectSupplier;
 import org.apache.axis2.util.Loader;
 import org.apache.axis2.util.StreamWrapper;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Comment;
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.ProcessingInstruction;
+import org.w3c.dom.traversal.DocumentTraversal;
+import org.w3c.dom.traversal.NodeFilter;
+import org.w3c.dom.traversal.TreeWalker;
 
 
 public class BeanUtil {
@@ -196,6 +207,12 @@ public class BeanUtil {
                                  beanName, processingDocLitBare);
                     propertyQnameValueList.add(
                             value == null ? null : 
SimpleTypeMapper.getStringValue(value));
+                } else if(SimpleTypeMapper.isDomDocument(ptype)){
+                       addTypeQname(elemntNameSpace, propertyQnameValueList, 
property,
+                            beanName, processingDocLitBare);
+                       OMFactory fac = OMAbstractFactory.getOMFactory();
+                    propertyQnameValueList.add(convertDOMtoOM(fac, value));    
                
+                       
                 } else if (ptype.isArray()) {
                     if 
(SimpleTypeMapper.isSimpleType(ptype.getComponentType())) {
                         if (value != null) {
@@ -409,6 +426,8 @@ public class BeanUtil {
                     }
                     return ConverterUtil.convertToArray(arrayClassType, 
valueList);
                 }
+            }else if(SimpleTypeMapper.isDomDocument(beanClass)){               
        
+                return convertOMtoDOM(beanElement);
             } else {
                 if (SimpleTypeMapper.isSimpleType(beanClass)) {
                     return getSimpleTypeObjectChecked(beanClass, beanElement);
@@ -841,6 +860,9 @@ public class BeanUtil {
                     return SimpleTypeMapper.getArrayList(omElement);
                 } else if (SimpleTypeMapper.isDataHandler(classType)) {
                     return SimpleTypeMapper.getDataHandler(omElement);
+                    
+                } else if(SimpleTypeMapper.isDomDocument(classType)){          
                
+                    return convertOMtoDOM(omElement);
                 } else {
                     return BeanUtil.deserialize(classType, omElement, 
objectSupplier, null);
                 }
@@ -1043,5 +1065,104 @@ public class BeanUtil {
                element.addAttribute(Constants.XSI_TYPE_ATTRIBUTE, attrValue, 
xsiNS);
        }
        
+       /**
+        * Gets the DOOM implementation of org.w3c.dom.Document  
+        *
+        * @param omElement the OMelement
+        * @return the DOOM document
+        */
+       public static OMDocument convertOMtoDOM(OMContainer omElement) {
+               // use AXIOM DOOMAbstractFactory to get org.w3c.dom.Document
+               OMFactory doomFactory = DOOMAbstractFactory.getOMFactory();
+               StAXOMBuilder doomBuilder = new StAXOMBuilder(doomFactory,
+                               omElement.getXMLStreamReader());
+               OMDocument domElement = doomBuilder.getDocument();
+               return domElement;
+       }
+       
+       /**
+        * Convert DOM Document to a OMElement.
+        *
+        * @param fac the fac
+        * @param document the document
+        * @return the OMElement
+        */
+       public static OMElement convertDOMtoOM(OMFactory fac, Object document) {
+               DocumentTraversal traversal = (DocumentTraversal) document;
+               TreeWalker walker = traversal.createTreeWalker(
+                               ((Document)document).getDocumentElement(), 
NodeFilter.SHOW_ALL, null, true);
+               return (OMElement) traverseDOMDocument(fac, walker, null);
+       }
+       
+       /**
+        * Traverse dom document and construct a OMElement.
+        * Act as a helper method for convertDOMtoOM()
+        *
+        * @param fac the fac
+        * @param walker the walker
+        * @param parent the parent
+        * @return the oM node
+        */
+       private static OMNode traverseDOMDocument(OMFactory fac, TreeWalker 
walker,
+                       OMContainer parent) {
+               OMNode curr = null;
+               Node node = walker.getCurrentNode();
+               
+               switch (node.getNodeType()) {
+               case Node.ELEMENT_NODE:
+                       OMNamespace eleNS = null;
+                       if (node.getNamespaceURI() != null) {
+                               eleNS = 
fac.createOMNamespace(node.getNamespaceURI(),
+                                               node.getPrefix());
+                       }
+                       curr = fac.createOMElement(node.getNodeName(), eleNS);
+                       curr = processDOMAttributes(fac, (OMElement) curr,      
node.getAttributes());
+                       if (parent != null) {
+                               parent.addChild(curr);
+                       }
+                       if (node.getFirstChild() != null) {
+                               walker.setCurrentNode(node.getFirstChild());
+                               traverseDOMDocument(fac, walker, (OMContainer) 
curr);
+                       }
+                       break;
+
+               case Node.PROCESSING_INSTRUCTION_NODE:
+                       ProcessingInstruction domPI = (ProcessingInstruction) 
node;
+                       
parent.addChild(fac.createOMProcessingInstruction(parent,
+                                       domPI.getTarget(), domPI.getData()));
+                       break;
+
+               case Node.COMMENT_NODE:
+                       parent.addChild(fac.createOMComment(parent,
+                                       ((Comment) node).getNodeValue()));
+                       break;
+
+               case Node.TEXT_NODE:
+                       parent.addChild(fac.createOMText(node.getNodeValue()));
+                       break;
+               }
+               if (node.getNextSibling() != null && parent != null) {
+                       walker.setCurrentNode(node.getNextSibling());
+                       traverseDOMDocument(fac, walker, parent);
+               }
+               return curr;
+       }
+       
+       private static OMElement processDOMAttributes(OMFactory fac,
+                       OMElement curr, NamedNodeMap attMap) {
+               if (attMap != null && attMap.getLength() > 0) {                 
+                       for (int i = 0; i < attMap.getLength(); i++) {
+                               Attr att = (Attr) attMap.item(i);
+                               OMNamespace attrNS = null;                      
        
+                               if (att.getNamespaceURI() != null) {
+                                       attrNS = 
fac.createOMNamespace(att.getNamespaceURI(),
+                                                       att.getPrefix());
+                               }
+                               curr.addAttribute(att.getNodeName(), 
att.getNodeValue(), attrNS);
+                       }
+               }
+               return curr;
+       }
+       
 
 }

Modified: 
axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/RPCUtil.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/RPCUtil.java?rev=1137959&r1=1137958&r2=1137959&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/RPCUtil.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/RPCUtil.java
 Tue Jun 21 11:20:39 2011
@@ -73,7 +73,18 @@ public class RPCUtil {
                 }
                 resWrapper.addChild(result);
                 bodyContent.addChild(resWrapper);
-            } else if (SimpleTypeMapper.isSimpleType(resObject)) {
+            } else if (SimpleTypeMapper.isDomDocument(resObject.getClass())){  
                        
+                               OMElement doc = BeanUtil.convertDOMtoOM(fac, 
resObject);
+                               bodyContent = 
fac.createOMElement(method.getName() + "Response", ns);
+                               OMElement child;
+                               if (qualified) {
+                                       child = 
fac.createOMElement(RETURN_WRAPPER, ns);
+                               } else {
+                                       child = 
fac.createOMElement(RETURN_WRAPPER, null);
+                               }
+                               child.addChild(doc);
+                               bodyContent.addChild(child);    
+                       } else if (SimpleTypeMapper.isSimpleType(resObject)) {
                 bodyContent = fac.createOMElement(
                         method.getName() + "Response", ns);
                 OMElement child;
@@ -125,6 +136,10 @@ public class RPCUtil {
             bodyContent = fac.createOMElement(
                     partName, ns);
             bodyContent.addChild(result);
+        } else if(SimpleTypeMapper.isDomDocument(resObject.getClass())){
+               bodyContent = fac.createOMElement(
+                    partName, ns);          
+            bodyContent.addChild(BeanUtil.convertDOMtoOM(fac, resObject));     
        
         } else if (SimpleTypeMapper.isSimpleType(resObject)) {
             bodyContent = fac.createOMElement(
                     partName, ns);

Modified: 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/java2wsdl/TypeTable.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/java2wsdl/TypeTable.java?rev=1137959&r1=1137958&r2=1137959&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/java2wsdl/TypeTable.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/java2wsdl/TypeTable.java
 Tue Jun 21 11:20:39 2011
@@ -21,6 +21,7 @@ package org.apache.axis2.description.jav
 
 import org.apache.axiom.om.OMElement;
 import org.apache.ws.commons.schema.constants.Constants;
+import org.w3c.dom.Document;
 
 import javax.activation.DataHandler;
 import javax.xml.datatype.Duration;
@@ -155,6 +156,7 @@ public class TypeTable {
                  ANY_TYPE);
          simpleTypetoxsd.put(Hashtable.class.getName(),
                  ANY_TYPE);
+        simpleTypetoxsd.put(Document.class.getName(), ANY_TYPE);
         //byteArrat
         simpleTypetoxsd.put("base64Binary",
                 new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, 
"base64Binary", "xs"));

Modified: axis/axis2/java/core/trunk/modules/osgi/pom.xml
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/osgi/pom.xml?rev=1137959&r1=1137958&r2=1137959&view=diff
==============================================================================
--- axis/axis2/java/core/trunk/modules/osgi/pom.xml (original)
+++ axis/axis2/java/core/trunk/modules/osgi/pom.xml Tue Jun 21 11:20:39 2011
@@ -133,6 +133,7 @@
                             org.apache.woden.*;version="0.0.0",
                             org.apache.ws.commons.schema.*,
                             org.w3c.dom;resolution:=optional,
+                            org.w3c.dom.traversal;resolution:=optional,
                             org.xml.sax;resolution:=optional,
                         </Import-Package>
                         <Private-Package>


Reply via email to