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>