You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@axis.apache.org by am...@apache.org on 2011/01/04 11:17:07 UTC

svn commit: r1054954 - /axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/databinding/utils/BeanUtil.java

Author: amilas
Date: Tue Jan  4 10:17:07 2011
New Revision: 1054954

URL: http://svn.apache.org/viewvc?rev=1054954&view=rev
Log:
getting the type from the xsi:type attribute and process correctly. sending the java class name with the xml request is not an inter operable method. see AXIS2-4818

Modified:
    axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/databinding/utils/BeanUtil.java

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=1054954&r1=1054953&r2=1054954&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 Jan  4 10:17:07 2011
@@ -41,13 +41,7 @@ import java.util.TreeMap;
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamReader;
 
-import org.apache.axiom.om.OMAbstractFactory;
-import org.apache.axiom.om.OMAttribute;
-import org.apache.axiom.om.OMElement;
-import org.apache.axiom.om.OMFactory;
-import org.apache.axiom.om.OMText;
-import org.apache.axiom.om.OMXMLBuilderFactory;
-import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.*;
 import org.apache.axiom.om.util.Base64;
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.context.MessageContext;
@@ -333,12 +327,38 @@ public class BeanUtil {
             // to support polymorphism in POJO approach.
             // Retrieve the type name of the instance from the 'type' attribute
             // and retrieve the class.
-            String instanceTypeName = beanElement.getAttributeValue(new QName("type"));
-            if ((instanceTypeName != null) && (!beanClass.isArray())) {
-                try {
-                    beanClass = Loader.loadClass(beanClass.getClassLoader(), instanceTypeName);
-                } catch (ClassNotFoundException ce) {
-                    throw AxisFault.makeFault(ce);
+            
+            String instanceTypeName = beanElement.getAttributeValue(new QName(Constants.XSI_NAMESPACE, "type"));
+            if (instanceTypeName != null) {
+                MessageContext messageContext = MessageContext.getCurrentMessageContext();
+                // we can have this support only at the server side. we need to find the axisservice
+                // to get the type table.
+                if (messageContext != null) {
+                    AxisService axisService = messageContext.getAxisService();
+                    QName typeQName = null;
+                    if (instanceTypeName.indexOf(":") > -1) {
+                        String prefix = instanceTypeName.substring(0, instanceTypeName.indexOf(":"));
+                        for (Iterator namespaceIter = beanElement.getAllDeclaredNamespaces(); namespaceIter.hasNext();) {
+                            OMNamespace omNamespace = (OMNamespace) namespaceIter.next();
+                            if (omNamespace.getPrefix().equals(prefix)) {
+                                typeQName = new QName(omNamespace.getNamespaceURI(), instanceTypeName.substring(instanceTypeName.indexOf(":") + 1));
+                            }
+                        }
+                    } else {
+                        typeQName = new QName(instanceTypeName);
+                    }
+
+                    TypeTable typeTable = axisService.getTypeTable();
+                    String className = typeTable.getClassNameForQName(typeQName);
+                    if (className != null) {
+                        try {
+                            beanClass = Loader.loadClass(beanClass.getClassLoader(), className);
+                        } catch (ClassNotFoundException ce) {
+                            throw AxisFault.makeFault(ce);
+                        }
+                    } else {
+                        throw new AxisFault("Unknow type " + typeQName);
+                    }
                 }
             }