Author: sagara
Date: Thu Jun 16 14:06:30 2011
New Revision: 1136443

URL: http://svn.apache.org/viewvc?rev=1136443&view=rev
Log:
Fixed AXIS2-5063

Provide support for complex object types.

1.) Added mapping between XSD types to Java types in  TypeTable . 
2.) Modified  BeanUtil and RPCUtil to include xsd:type details in  response 
messages when returning a Object or Object Array. 
3.) Created new test case - TypeTableTest and enhanced BeanUtilTest.
4.) Modified RPCMessageReceivers to support 2.)
5.) Updated osgi module pom file to import javax.xml.datatype package .

Added:
    
axis/axis2/java/core/trunk/modules/kernel/test/org/apache/axis2/description/java2wsdl/TypeTableTest.java
   (with props)
Modified:
    
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/databinding/utils/Constants.java
    
axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/RPCInOutAsyncMessageReceiver.java
    
axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/RPCMessageReceiver.java
    
axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/RPCUtil.java
    
axis/axis2/java/core/trunk/modules/adb/test/org/apache/axis2/databinding/utils/BeanUtilTest.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/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=1136443&r1=1136442&r2=1136443&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
 Thu Jun 16 14:06:30 2011
@@ -19,10 +19,12 @@
 
 package org.apache.axis2.databinding.typemapping;
 
+import org.apache.axiom.attachments.ByteArrayDataSource;
 import org.apache.axiom.attachments.utils.DataHandlerUtils;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMNode;
 import org.apache.axiom.om.OMText;
+import org.apache.axis2.databinding.types.HexBinary;
 import org.apache.axis2.databinding.utils.ConverterUtil;
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.description.AxisService;
@@ -188,6 +190,22 @@ public class SimpleTypeMapper {
             }
         }
         return null;
+    }    
+
+    /**
+     * Gets the DataHandler according to hexBin value.
+     *
+     * @param element the element
+     * @param hexBin the hex bin
+     * @return the DataHandler object
+     */
+    public static DataHandler getDataHandler(OMElement element, boolean 
hexBin) {
+       if(hexBin){
+          ByteArrayDataSource byteArrayDataSource = new ByteArrayDataSource(
+                               HexBinary.decode(element.getText()));
+           return new DataHandler(byteArrayDataSource);
+       }
+       return getDataHandler(element);
     }
 
 
@@ -327,5 +345,32 @@ public class SimpleTypeMapper {
     public static Object makeDate(String source) {
         return ConverterUtil.convertToDate(source);
     }
+    
+    
+       /**
+        * Checks weather passed parameter class is java.lang.Object[] or not.
+        * 
+        * @param obj the Class type of particular object.
+        * @return true, if is object array
+        */
+       public static boolean isObjectArray(Class obj) {
+               if 
(obj.getComponentType().getName().equals(Object.class.getName())) {
+                       return true;
+               }
+               return false;
+       }
+       
+       /**
+        * Checks weather passed parameter class is java.lang.Object or not.
+        *
+        * @param obj the Class type of particular object.
+        * @return true, if is object type
+        */
+       public static boolean isObjectType(Class obj) {
+               if (obj.getName().equals(Object.class.getName())) {
+                       return true;
+               }
+               return false;
+       }
 
 }

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=1136443&r1=1136442&r2=1136443&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
 Thu Jun 16 14:06:30 2011
@@ -38,6 +38,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
 
+import javax.activation.DataHandler;
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamReader;
 
@@ -256,15 +257,23 @@ public class BeanUtil {
                 } else {
                     addTypeQname(elemntNameSpace, propertyQnameValueList, 
property,
                                  beanName, processingDocLitBare);
-                    if (Object.class.equals(ptype)) {
-                        if ((value instanceof Integer) ||
-                            (value instanceof Short) ||
-                            (value instanceof Long) ||
-                            (value instanceof Float)) {
-                            propertyQnameValueList.add(value.toString());
-                            continue;
-                        }
-                    }
+                                       if (Object.class.equals(ptype)) {
+                                               //this is required to match 
this element prefix as
+                                               //root element's prefix.
+                                               QName qNamefortheType = (QName) 
typeTable
+                                                               
.getComplexSchemaMap().get(
+                                                                               
getClassName(beanClass));
+                                               OMFactory fac = 
OMAbstractFactory.getOMFactory();
+                                               OMElement element = fac
+                                                               
.createOMElement(new QName(elemntNameSpace
+                                                                               
.getNamespaceURI(), property.getName(),
+                                                                               
qNamefortheType.getPrefix()));
+                                               
element.addChild(fac.createOMText(SimpleTypeMapper
+                                                               
.getStringValue(value)));
+                                               addInstanceTypeAttribute(fac, 
element, value, typeTable);
+                                               
propertyQnameValueList.add(element);
+                                               continue;
+                                       }
 
                     propertyQnameValueList.add(value);
                 }
@@ -329,6 +338,7 @@ public class BeanUtil {
             // and retrieve the class.
             
             String instanceTypeName = beanElement.getAttributeValue(new 
QName(Constants.XSI_NAMESPACE, "type"));
+            boolean hexBin = false;
             if (instanceTypeName != null) {
                 MessageContext messageContext = 
MessageContext.getCurrentMessageContext();
                 // we can have this support only at the server side. we need 
to find the axisservice
@@ -337,6 +347,10 @@ public class BeanUtil {
                     AxisService axisService = messageContext.getAxisService();
                     if (axisService != null) {
                         QName typeQName = 
beanElement.resolveQName(instanceTypeName);
+                        //Need this flag to differentiate "xsd:hexBinary" and 
"xsd:base64Binary" data. 
+                        
if(org.apache.ws.commons.schema.constants.Constants.XSD_HEXBIN.equals(typeQName)){
+                               hexBin = true;
+                        }
                         TypeTable typeTable = axisService.getTypeTable();
                         String className = 
typeTable.getClassNameForQName(typeQName);
                         if (className != null) {
@@ -357,6 +371,10 @@ public class BeanUtil {
             if (beanElement.getAttribute(nilAttName) != null) {
                 return null;
             }
+            
+            if(beanClass.getName().equals(DataHandler.class.getName())){    
+               return SimpleTypeMapper.getDataHandler(beanElement,hexBin);     
        
+            }
 
             if (beanClass.isArray()) {
                 ArrayList<Object> valueList = new ArrayList<Object>();
@@ -884,13 +902,22 @@ public class BeanUtil {
                 }
 
             } else {
-                if (SimpleTypeMapper.isSimpleType(arg)) {
-                    if (partName == null) {
-                        objects.add("arg" + argCount);
-                    } else {
-                        objects.add(partName);
-                    }
-                    objects.add(SimpleTypeMapper.getStringValue(arg));
+                if (SimpleTypeMapper.isSimpleType(arg)) { 
+                       OMElement element;
+                       OMFactory fac = OMAbstractFactory.getOMFactory();
+                       if(partName != null){
+                               element = fac.createOMElement(partName, null);
+                       }else{
+                               String eleName = "arg" + argCount;
+                               element = fac.createOMElement(eleName, null);
+                       }                                       
+                                       
element.addChild(fac.createOMText(SimpleTypeMapper
+                                                       .getStringValue(arg)));
+                                       if 
(SimpleTypeMapper.isObjectArray(args.getClass())) {
+                                               addInstanceTypeAttribute(fac, 
element, arg, typeTable);
+                                       }
+                                       objects.add(element.getQName());
+                                       objects.add(element);
                 } else {
                     if (partName == null) {
                         objects.add(new QName("arg" + argCount));
@@ -981,5 +1008,40 @@ public class BeanUtil {
                                 omElement.getLocalName(), faultCode, e);
         }
     }
+    
+       /**
+        * Adds the instance type attribute to the passed OMElement.     
+        *  
+        *  e.g - <sam:obj xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+        *                xmlns:xsd="http://www.w3.org/2001/XMLSchema";
+        *                xsi:type="xsd:string">
+        *                String Value
+        *        </sam:obj> 
+        *
+        *
+        * @param fac the SOAPFactory instance.
+        * @param child the child OMElement to add attributes.
+        * @param method the java reflection method
+        * @param resObject the res object
+        * @param typeTable the type table of particular Axis2 service
+        */
+       public static void addInstanceTypeAttribute(OMFactory fac,
+                       OMElement element, Object resObject,
+                       TypeTable typeTable) {
+               if(typeTable == null){
+                       return;
+               }
+               OMNamespace xsiNS = 
fac.createOMNamespace(Constants.XSI_NAMESPACE,
+                               Constants.DEFAULT_XSI_NAMESPACE_PREFIX);
+               OMNamespace xsdNS = 
fac.createOMNamespace(Constants.XSD_NAMESPACE,
+                               Constants.DEFAULT_XSD_NAMESPACE_PREFIX);
+               element.declareNamespace(xsiNS);
+               element.declareNamespace(xsdNS);
+               QName xsdType = 
typeTable.getSimpleSchemaTypeName(resObject.getClass()
+                               .getName());
+               String attrValue = xsdType.getPrefix() + ":" + 
xsdType.getLocalPart();
+               element.addAttribute(Constants.XSI_TYPE_ATTRIBUTE, attrValue, 
xsiNS);
+       }
+       
 
 }

Modified: 
axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/databinding/utils/Constants.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/databinding/utils/Constants.java?rev=1136443&r1=1136442&r2=1136443&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/databinding/utils/Constants.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/databinding/utils/Constants.java
 Thu Jun 16 14:06:30 2011
@@ -29,6 +29,9 @@ public interface Constants {
     static String TRUE = "true";
     static String XSI_NAMESPACE = "http://www.w3.org/2001/XMLSchema-instance";;
     static String XSD_NAMESPACE = "http://www.w3.org/2001/XMLSchema";;
+    static String XSI_TYPE_ATTRIBUTE = "type";
+    static String DEFAULT_XSI_NAMESPACE_PREFIX = "xsi";
+    static String DEFAULT_XSD_NAMESPACE_PREFIX = "xs";
 
     static Object OM_ATTRIBUTE_KEY = new OMAttribKey();
     static Object OM_ELEMENT_KEY = new OMElementKey();

Modified: 
axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/RPCInOutAsyncMessageReceiver.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/RPCInOutAsyncMessageReceiver.java?rev=1136443&r1=1136442&r2=1136443&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/RPCInOutAsyncMessageReceiver.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/RPCInOutAsyncMessageReceiver.java
 Thu Jun 16 14:06:30 2011
@@ -123,7 +123,7 @@ public class RPCInOutAsyncMessageReceive
             Parameter generateBare = 
service.getParameter(Java2WSDLConstants.DOC_LIT_BARE_PARAMETER);
             if (generateBare!=null && "true".equals(generateBare.getValue())) {
                 RPCUtil.processResonseAsDocLitBare(resObject, service,
-                        envelope, fac, ns,
+                               method, envelope, fac, ns,
                         bodyContent, outMessage);
             } else {
                 RPCUtil.processResponseAsDocLitWrapped(resObject, service,

Modified: 
axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/RPCMessageReceiver.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/RPCMessageReceiver.java?rev=1136443&r1=1136442&r2=1136443&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/RPCMessageReceiver.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/adb/src/org/apache/axis2/rpc/receivers/RPCMessageReceiver.java
 Thu Jun 16 14:06:30 2011
@@ -147,7 +147,7 @@ public class RPCMessageReceiver extends 
             Parameter generateBare = 
service.getParameter(Java2WSDLConstants.DOC_LIT_BARE_PARAMETER);
             if (generateBare!=null && "true".equals(generateBare.getValue())) {
                 RPCUtil.processResonseAsDocLitBare(resObject, service,
-                        envelope, fac, ns,
+                               method, envelope, fac, ns,
                         bodyContent, outMessage);
             } else {
                 RPCUtil.processResponseAsDocLitWrapped(resObject, service,

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=1136443&r1=1136442&r2=1136443&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
 Thu Jun 16 14:06:30 2011
@@ -45,7 +45,6 @@ import javax.xml.stream.XMLStreamReader;
 import java.lang.reflect.Array;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
-import java.lang.reflect.Type;
 import java.util.Collection;
 
 public class RPCUtil {
@@ -84,6 +83,7 @@ public class RPCUtil {
                     child = fac.createOMElement(RETURN_WRAPPER, null);
                 }
                 child.addChild(fac.createOMText(child, 
SimpleTypeMapper.getStringValue(resObject)));
+                addInstanceTypeInfo(fac, child, method, resObject, typeTable); 
              
                 bodyContent.addChild(child);
             } else {
                 bodyContent = fac.createOMElement(
@@ -115,6 +115,7 @@ public class RPCUtil {
                                                  Object resObject,
                                                  OMElement bodyContent,
                                                  OMNamespace ns,
+                                                 Method method,
                                                  SOAPEnvelope envelope,
                                                  boolean qualified,
                                                  TypeTable typeTable,
@@ -127,6 +128,7 @@ public class RPCUtil {
         } else if (SimpleTypeMapper.isSimpleType(resObject)) {
             bodyContent = fac.createOMElement(
                     partName, ns);
+            addInstanceTypeInfo(fac, bodyContent, method, resObject, 
typeTable); 
             bodyContent.addChild(fac.createOMText(bodyContent,
                     SimpleTypeMapper.getStringValue(resObject)));
         } else {
@@ -145,6 +147,15 @@ public class RPCUtil {
             envelope.getBody().addChild(bodyContent);
         }
     }
+    
+       public static void processObjectAsDocLitBare(SOAPFactory fac,
+                       Object resObject, OMElement bodyContent, OMNamespace ns,
+                       SOAPEnvelope envelope, boolean qualified, TypeTable 
typeTable,
+                       String partName) {
+               processObjectAsDocLitBare(fac, resObject, bodyContent, ns, null,
+                               envelope, qualified, typeTable, partName);
+
+       }
 
     public static Object[] processRequest(OMElement methodElement,
                                           Method method, ObjectSupplier 
objectSupplier, String[] parameterNames)
@@ -234,6 +245,7 @@ public class RPCUtil {
 
     public static void processResonseAsDocLitBare(Object resObject,
                                                   AxisService service,
+                                                  Method method,
                                                   SOAPEnvelope envelope,
                                                   SOAPFactory fac,
                                                   OMNamespace ns,
@@ -311,6 +323,7 @@ public class RPCUtil {
                                     resObject,
                                     bodyContent,
                                     ns,
+                                    method,
                                     envelope,
                                     service.isElementFormDefault(),
                                     service.getTypeTable(),
@@ -320,6 +333,7 @@ public class RPCUtil {
                                     resObject,
                                     bodyContent,
                                     ns,
+                                    method,
                                     envelope,
                                     service.isElementFormDefault(),
                                     null,
@@ -331,7 +345,16 @@ public class RPCUtil {
         }
         outMessage.setEnvelope(envelope);
     }
+    
+       public static void processResonseAsDocLitBare(Object resObject,
+                       AxisService service, SOAPEnvelope envelope, SOAPFactory 
fac,
+                       OMNamespace ns, OMElement bodyContent, MessageContext 
outMessage)
+                       throws Exception {
+               processResonseAsDocLitBare(resObject, service, null, envelope, 
fac, ns,
+                               bodyContent, outMessage);
 
+       }
+       
     /**
      * This method is use to to crete the reposne when , the return value is 
null
      *
@@ -469,4 +492,14 @@ public class RPCUtil {
         }
         outMessage.setEnvelope(envelope);
     }
+    
+       private static void addInstanceTypeInfo(SOAPFactory fac, OMElement 
element,
+                       Method method, Object resObject, TypeTable typeTable) {
+               Class returnType = method.getReturnType();
+               // add instanceTypeInfo only if return type is java.lang.Object
+               if (SimpleTypeMapper.isObjectType(returnType)) {
+                       BeanUtil.addInstanceTypeAttribute(fac, element, 
resObject,
+                                       typeTable);
+               }
+       }
 }

Modified: 
axis/axis2/java/core/trunk/modules/adb/test/org/apache/axis2/databinding/utils/BeanUtilTest.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/adb/test/org/apache/axis2/databinding/utils/BeanUtilTest.java?rev=1136443&r1=1136442&r2=1136443&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/adb/test/org/apache/axis2/databinding/utils/BeanUtilTest.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/adb/test/org/apache/axis2/databinding/utils/BeanUtilTest.java
 Thu Jun 16 14:06:30 2011
@@ -23,6 +23,7 @@ import org.apache.axiom.om.*;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.description.AxisService;
 import org.apache.axis2.description.java2wsdl.TypeTable;
 import org.apache.axis2.engine.DefaultObjectSupplier;
 import org.apache.axis2.engine.ObjectSupplier;
@@ -33,6 +34,8 @@ import javax.activation.DataHandler;
 import javax.mail.util.ByteArrayDataSource;
 import javax.xml.namespace.QName;
 
+import java.io.ByteArrayInputStream;
+import java.math.BigInteger;
 import java.util.List;
 
 
@@ -66,7 +69,6 @@ public class BeanUtilTest extends TestCa
 
         MessageContext msgContext = new MessageContext();
         msgContext.setEnvelope(omFactory.createSOAPEnvelope());
-
         MessageContext.setCurrentMessageContext(msgContext);
     }
 
@@ -186,4 +188,83 @@ public class BeanUtilTest extends TestCa
             assertTrue(e.getMessage().contains("Brisbane"));
         }
     }
+    
+    public void testDeserializeWithArrayLocalNameForString() throws Exception 
{        
+          
omElement.declareNamespace(omFactory.createOMNamespace(Constants.XSD_NAMESPACE, 
"xs"));
+
+           omElement.setText("World");
+           omElement.addAttribute(createTypeAttribute("xs:string"));
+           
+           Object result = BeanUtil.deserialize(String.class, omElement, 
objectSupplier, null);
+           assertNotNull("Result can not be null",result);
+           assertEquals("Not the expected 
Class",String.class,result.getClass());
+           assertEquals("Not the expected value","World",result);
+          
+   }
+    
+    public void testDeserializeWithArrayLocalNameForInt() throws Exception {   
        
+          
omElement.declareNamespace(omFactory.createOMNamespace(Constants.XSD_NAMESPACE, 
"xs"));
+
+        omElement.setText("1000");
+        omElement.addAttribute(createTypeAttribute("xs:int"));
+        
+        Object result = BeanUtil.deserialize(Integer.class, omElement, 
objectSupplier, null);
+        assertNotNull("Result can not be null",result);
+        assertEquals("Not the expected Class",Integer.class,result.getClass());
+        assertEquals("Not the expected value",1000,result);
+          
+   } 
+    public void testDeserializeWithArrayLocalNameForInteger() throws Exception 
{       
+          
omElement.declareNamespace(omFactory.createOMNamespace(Constants.XSD_NAMESPACE, 
"xs"));
+
+         omElement.setText("100000");
+         omElement.addAttribute(createTypeAttribute("xs:integer"));
+         
+         Object result = BeanUtil.deserialize(BigInteger.class, omElement, 
objectSupplier, null);
+         assertNotNull("Result can not be null",result);
+         assertEquals("Not the expected 
Class",BigInteger.class,result.getClass());
+         assertEquals("Not the expected value",new 
BigInteger("100000"),result);
+          
+    } 
+    public void testDeserializeWithArrayLocalNameForBase64Binary() throws 
Exception {          
+          
omElement.declareNamespace(omFactory.createOMNamespace(Constants.XSD_NAMESPACE, 
"xs"));
+
+         omElement.setText("SGVsbG8gV29ybGQ=");
+         omElement.addAttribute(createTypeAttribute("xs:base64Binary"));
+         
+         Object result = BeanUtil.deserialize(DataHandler.class, omElement, 
objectSupplier, null);
+         assertNotNull("Result can not be null",result);
+         assertEquals("Not the expected 
Class",DataHandler.class,result.getClass());
+         assertEquals("Not the expected value","Hello 
World",toStr((ByteArrayInputStream) ((DataHandler)result).getContent()));
+          
+    } 
+    public void testDeserializeWithArrayLocalNameForHexBinary() throws 
Exception {
+        AxisService service = new AxisService();
+        service.setTypeTable(new TypeTable());
+        MessageContext.getCurrentMessageContext().setAxisService(service);
+            
omElement.declareNamespace(omFactory.createOMNamespace(Constants.XSD_NAMESPACE, 
"xs"));
+
+         omElement.setText("48656c6c6f20576f726c64");
+         omElement.addAttribute(createTypeAttribute("xs:hexBinary"));
+         
+         Object result = BeanUtil.deserialize(DataHandler.class, omElement, 
objectSupplier, null);
+         assertNotNull("Result can not be null",result);
+         assertEquals("Not the expected 
Class",DataHandler.class,result.getClass());
+         assertEquals("Not the expected value","Hello 
World",toStr((ByteArrayInputStream) ((DataHandler)result).getContent()));
+          
+    } 
+    
+    private static String toStr(ByteArrayInputStream is) {
+           int size = is.available();
+           char[] theChars = new char[size];
+           byte[] bytes    = new byte[size];
+
+           is.read(bytes, 0, size);
+           for (int i = 0; i < size;)
+               theChars[i] = (char)(bytes[i++]&0xff);
+           
+           return new String(theChars);
+             }
+  
+   
 }

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=1136443&r1=1136442&r2=1136443&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
 Thu Jun 16 14:06:30 2011
@@ -20,7 +20,11 @@
 package org.apache.axis2.description.java2wsdl;
 
 import org.apache.axiom.om.OMElement;
+import org.apache.ws.commons.schema.constants.Constants;
 
+import javax.activation.DataHandler;
+import javax.xml.datatype.Duration;
+import javax.xml.datatype.XMLGregorianCalendar;
 import javax.xml.namespace.QName;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -28,9 +32,11 @@ import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 import java.util.Vector;
-import java.util.concurrent.ConcurrentHashMap;
+import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.net.URI;
 
+
 public class TypeTable {
     
     private static HashMap  simpleTypetoxsd;
@@ -42,6 +48,11 @@ public class TypeTable {
      * this map is used to keep the class names with the Qnames.
      */
     private Map<QName, String> qNameToClassMap;
+    /**
+     * Keep simpleType to Java mapping separately so that
+     * this table does not not populate it over and over.  
+     */
+    private static Map<QName, String> qNameToJavaTypeMap;
 
     public TypeTable() {
         //complex type table is resetted every time this is
@@ -54,6 +65,7 @@ public class TypeTable {
     * change and we need not populate it over and over */
     static{
           populateSimpleTypes();
+          populateJavaTypeMap();
     }
 
     /* populate the simpletype hashmap */
@@ -147,6 +159,50 @@ public class TypeTable {
         simpleTypetoxsd.put("base64Binary",
                 new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, 
"base64Binary", "xs"));
     }
+    
+    private static void populateJavaTypeMap(){
+       /*
+        * This Table populated according to the JAXB 2.0 XSD2Java binding. 
+        * According to following table 
http://download.oracle.com/javaee/5/tutorial/doc/bnazq.html#bnazu 
+        */
+       qNameToJavaTypeMap = new HashMap<QName, String>();
+       qNameToJavaTypeMap.put(Constants.XSD_STRING, String.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_INT, Integer.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_INTEGER, 
BigInteger.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_LONG, Long.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_SHORT, Short.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_DECIMAL, 
BigDecimal.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_FLOAT, Float.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_DOUBLE, Double.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_BOOLEAN, Boolean.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_BYTE, Byte.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_QNAME, QName.class.getName());     
        
+       qNameToJavaTypeMap.put(Constants.XSD_UNSIGNEDINT, Long.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_UNSIGNEDSHORT, 
Integer.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_UNSIGNEDBYTE, 
Short.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_UNSIGNEDLONG, 
BigInteger.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_TIME, 
XMLGregorianCalendar.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_DATE, 
XMLGregorianCalendar.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_DATETIME, 
XMLGregorianCalendar.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_DURATION, 
Duration.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_NOTATION, QName.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_ANYURI, URI.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_ANY, Object.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_ANYSIMPLETYPE, 
Object.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_ANYTYPE, Object.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_NONNEGATIVEINTEGER, 
BigInteger.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_NONPOSITIVEINTEGER, 
BigInteger.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_NEGATIVEINTEGER, 
Integer.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_POSITIVEINTEGER, 
Integer.class.getName());
+       
qNameToJavaTypeMap.put(Constants.XSD_NORMALIZEDSTRING,String.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_POSITIVEINTEGER, 
Integer.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_POSITIVEINTEGER, 
Integer.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_POSITIVEINTEGER, 
Integer.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_POSITIVEINTEGER, 
Integer.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_BASE64, 
DataHandler.class.getName());
+       qNameToJavaTypeMap.put(Constants.XSD_HEXBIN, 
DataHandler.class.getName());
+       
+    }
 
     /**
      * Return the schema type QName given the type class name
@@ -193,10 +249,21 @@ public class TypeTable {
 
     public QName getComplexSchemaType(String name) {
         return (QName) complexTypeMap.get(name);
-    }
-
+    }   
+ 
+    /**
+     * Gets the class name for QName.
+     * first try the complex types if not try the simple types.
+     *
+     * @param qname the qname
+     * @return the class name for QName
+     */
     public String getClassNameForQName(QName qname) {
-        return this.qNameToClassMap.get(qname);
+        String className = this.qNameToClassMap.get(qname);
+        if(className == null){
+               className = qNameToJavaTypeMap.get(qname);
+        }
+               return className;
     }
 
     public void addClassNameForQName(QName qname, String className) {

Added: 
axis/axis2/java/core/trunk/modules/kernel/test/org/apache/axis2/description/java2wsdl/TypeTableTest.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/test/org/apache/axis2/description/java2wsdl/TypeTableTest.java?rev=1136443&view=auto
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/kernel/test/org/apache/axis2/description/java2wsdl/TypeTableTest.java
 (added)
+++ 
axis/axis2/java/core/trunk/modules/kernel/test/org/apache/axis2/description/java2wsdl/TypeTableTest.java
 Thu Jun 16 14:06:30 2011
@@ -0,0 +1,84 @@
+/*
+ * 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.axis2.description.java2wsdl;
+
+import java.math.BigInteger;
+
+import javax.activation.DataHandler;
+import javax.xml.namespace.QName;
+
+import junit.framework.TestCase;
+
+import org.apache.ws.commons.schema.constants.Constants;
+
+/**
+ * The Class TypeTableTest is used to test
+ * {@link org.apache.axis2.description.java2wsdl.TypeTable TypeTable} class.
+ * 
+ * @since 1.7.0 
+ * 
+ */
+public class TypeTableTest extends TestCase {
+       
+       /** The type table. */
+       private TypeTable typeTable;    
+       
+       /* (non-Javadoc)
+        * @see junit.framework.TestCase#setUp()
+        */
+       @Override
+       protected void setUp() throws Exception {               
+               super.setUp();
+               typeTable = new TypeTable();
+       }
+ 
+       /**
+        * Test get class name for QName.
+        */
+       public void testGetClassNameForQName() {
+               assertEquals("Failed to receive expected Class type",
+                               String.class.getName(),
+                               
typeTable.getClassNameForQName(Constants.XSD_STRING));
+               
+               assertEquals("Failed to receive expected Class type",
+                               BigInteger.class.getName(),
+                               
typeTable.getClassNameForQName(Constants.XSD_INTEGER));
+               
+               assertEquals("Failed to receive expected Class type",
+                               QName.class.getName(),
+                               
typeTable.getClassNameForQName(Constants.XSD_QNAME));
+               
+               assertEquals("Failed to receive expected Class type",
+                               Object.class.getName(),
+                               
typeTable.getClassNameForQName(Constants.XSD_ANY));
+               
+               assertEquals("Failed to receive expected Class type",
+                               DataHandler.class.getName(),
+                               
typeTable.getClassNameForQName(Constants.XSD_BASE64));
+               
+               assertEquals("Failed to receive expected Class type",
+                               DataHandler.class.getName(),
+                               
typeTable.getClassNameForQName(Constants.XSD_HEXBIN));
+               
+               assertNull("NULl value expected",
+                               
typeTable.getClassNameForQName(Constants.XSD_LANGUAGE));
+       }
+
+}

Propchange: 
axis/axis2/java/core/trunk/modules/kernel/test/org/apache/axis2/description/java2wsdl/TypeTableTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

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=1136443&r1=1136442&r2=1136443&view=diff
==============================================================================
--- axis/axis2/java/core/trunk/modules/osgi/pom.xml (original)
+++ axis/axis2/java/core/trunk/modules/osgi/pom.xml Thu Jun 16 14:06:30 2011
@@ -112,6 +112,7 @@
                             javax.xml.transform;resolution:=optional,
                             javax.xml.transform.dom;resolution:=optional,
                             javax.xml.transform.stream;resolution:=optional,
+                            javax.xml.datatype.*,
                             org.apache.axiom.*,
                             org.apache.commons.fileupload.*,
                             org.apache.commons.httpclient.*,


Reply via email to