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>