Author: sagara
Date: Tue Jul 5 11:25:06 2011
New Revision: 1142991
URL: http://svn.apache.org/viewvc?rev=1142991&view=rev
Log:
AXIS2-5064 - Implemented basic Java Map Support.
Modified:
axis/axis2/java/core/trunk/modules/adb/src/ (props changed)
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/adb/test/org/apache/axis2/databinding/utils/BeanUtilTest.java
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/Constants.java
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/java2wsdl/DefaultSchemaGenerator.java
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/java2wsdl/DocLitBareSchemaGenerator.java
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/java2wsdl/TypeTable.java
Propchange: axis/axis2/java/core/trunk/modules/adb/src/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Tue Jul 5 11:25:06 2011
@@ -0,0 +1 @@
+META-INF
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=1142991&r1=1142990&r2=1142991&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 Jul 5 11:25:06 2011
@@ -384,5 +384,15 @@ public class SimpleTypeMapper {
public static boolean isDomDocument(Class classType) {
return Document.class.isAssignableFrom(classType);
}
+
+ /**
+ * Checks weather passed parameter class is a java.util.Map
+ *
+ * @param classType the class type
+ * @return true, if it is a map
+ */
+ public static boolean isMap(Class classType){
+ return java.util.Map.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=1142991&r1=1142990&r2=1142991&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 Jul 5 11:25:06 2011
@@ -271,7 +271,25 @@ public class BeanUtil {
beanName, processingDocLitBare);
propertyQnameValueList.add(value);
}
- } else {
+ } else if (SimpleTypeMapper.isMap(ptype)) {
+ OMFactory fac =
OMAbstractFactory.getOMFactory();
+ QName qNamefortheType = (QName)
typeTable
+
.getComplexSchemaMap().get(getClassName(beanClass));
+ OMNamespace ns = fac.createOMNamespace(
+
qNamefortheType.getNamespaceURI(),
+
qNamefortheType.getPrefix());
+ List<OMElement> mapEntries =
getMapElement(fac,
+ ptype, (Map) value,
typeTable, qualified);
+ OMElement map =
fac.createOMElement(propertyName,
+
qNamefortheType.getNamespaceURI(),
+
qNamefortheType.getPrefix());
+ for (OMElement ele : mapEntries) {
+ map.addChild(ele);
+ }
+ addTypeQname(elemntNameSpace,
propertyQnameValueList,
+ property, beanName,
processingDocLitBare);
+ propertyQnameValueList.add(map);
+ } else {
addTypeQname(elemntNameSpace, propertyQnameValueList,
property,
beanName, processingDocLitBare);
if (Object.class.equals(ptype)) {
@@ -280,13 +298,25 @@ public class BeanUtil {
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)));
+ OMFactory fac =
OMAbstractFactory.getOMFactory();
+ QName elementName = new
QName(elemntNameSpace
+
.getNamespaceURI(), property.getName(),
+
qNamefortheType.getPrefix());
+ OMElement element;
+
if(SimpleTypeMapper.isSimpleType(value)){
+ element =
fac.createOMElement(elementName);
+
element.addChild(fac.createOMText(SimpleTypeMapper
+
.getStringValue(value)));
+ }else{
+ XMLStreamReader xr =
BeanUtil.getPullParser(value,
+ elementName,
typeTable, true, false);
+ OMXMLParserWrapper stAXOMBuilder =
+
OMXMLBuilderFactory.createStAXOMBuilder(
+
OMAbstractFactory.getOMFactory(), new StreamWrapper(xr));
+ element =
stAXOMBuilder.getDocumentElement();
+
+
+ }
addInstanceTypeAttribute(fac,
element, value, typeTable);
propertyQnameValueList.add(element);
continue;
@@ -503,6 +533,19 @@ public class BeanUtil {
} else if (parameters.isArray()) {
partObj = deserialize(parameters, (OMElement)
parts.getParent(),
objectSupplier,
prty.getName());
+ } else if (SimpleTypeMapper.isMap(parameters)){
+ partObj = null;
+ final Type type =
prty.getReadMethod().getGenericReturnType();
+ if (type instanceof ParameterizedType) {
+ ParameterizedType aType =
(ParameterizedType) type;
+ Type[] parameterArgTypes =
aType.getActualTypeArguments();
+ partObj =
processGenericsMapElement(parameterArgTypes
+ , (OMElement)
parts.getParent(), null, parts.getChildren(), objectSupplier, beanClass);
+ } else {
+ Type[] parameterArgTypes =
{Object.class,Object.class};
+ partObj =
processGenericsMapElement(parameterArgTypes
+ , (OMElement)
parts.getParent(), null, parts.getChildren(), objectSupplier, beanClass);
+ }
} else {
partObj = deserialize(parameters, parts,
objectSupplier, null);
}
@@ -863,6 +906,21 @@ public class BeanUtil {
} else if(SimpleTypeMapper.isDomDocument(classType)){
return convertOMtoDOM(omElement);
+ } else if(SimpleTypeMapper.isMap(classType)){
+ if (generictype != null && (generictype instanceof
ParameterizedType)) {
+ ParameterizedType aType = (ParameterizedType)
generictype;
+ Type[] parameterArgTypes =
aType.getActualTypeArguments();
+ Iterator parts = omElement.getChildElements();
+ return processGenericsMapElement(parameterArgTypes
+ , omElement, helper, parts, objectSupplier,
generictype);
+ } else {
+ Type[] parameterArgTypes =
{Object.class,Object.class};
+ Iterator parts = omElement.getChildElements();
+ return processGenericsMapElement(parameterArgTypes,
+ omElement, helper, parts, objectSupplier,
generictype);
+ }
+
+
} else {
return BeanUtil.deserialize(classType, omElement,
objectSupplier, null);
}
@@ -1059,8 +1117,8 @@ public class BeanUtil {
Constants.DEFAULT_XSD_NAMESPACE_PREFIX);
element.declareNamespace(xsiNS);
element.declareNamespace(xsdNS);
- QName xsdType =
typeTable.getSimpleSchemaTypeName(resObject.getClass()
- .getName());
+ QName xsdType = typeTable.getSchemaTypeName(resObject.getClass()
+ .getName());
String attrValue = xsdType.getPrefix() + ":" +
xsdType.getLocalPart();
element.addAttribute(Constants.XSI_TYPE_ATTRIBUTE, attrValue,
xsiNS);
}
@@ -1164,5 +1222,242 @@ public class BeanUtil {
return curr;
}
+ /**
+ * This method deserialize OM model in to a instance of java.util.Map
+ *
+ * @param parameterArgTypes the parameter argument types of Map <k,V>
+ * @param omElement the OMElement
+ * @param helper the helper
+ * @param parts the parts
+ * @param objectSupplier the object supplier
+ * @param genericType the generic type
+ * @return a instance of java.util.Map
+ * @throws AxisFault the axis fault
+ */
+ private static Map<Object,Object> processGenericsMapElement(Type[]
parameterArgTypes,
+ OMElement omElement, MultirefHelper helper, Iterator
parts,
+ ObjectSupplier objectSupplier, Type genericType) throws
AxisFault {
+ Object objValue;
+ Map<Object,Object> valueMap = getMapInstance(genericType) ;
+ while (parts.hasNext()) {
+ objValue = parts.next();
+ if (objValue instanceof OMElement) {
+ omElement = (OMElement) objValue;
+ } else {
+ continue;
+ }
+
+ if(omElement != null){
+ Iterator entryParts = omElement.getChildren();
+ Object entryKey = null;
+ Object entryValue = null;
+ while (entryParts.hasNext()) {
+ objValue = entryParts.next();
+ if (objValue instanceof OMElement) {
+ omElement = (OMElement)
objValue;
+ } else {
+ continue;
+ }
+ if (omElement.getLocalName().equals(
+
org.apache.axis2.Constants.MAP_KEY_ELEMENT_NAME)) {
+ entryKey =
processMapParameterObject( parameterArgTypes[0], omElement,
+ helper,
objectSupplier, genericType);
+ continue;
+ }
+ if (omElement.getLocalName().equals(
+
org.apache.axis2.Constants.MAP_VALUE_ELEMENT_NAME)) {
+ entryValue =
processMapParameterObject( parameterArgTypes[1],
+ omElement,
helper, objectSupplier, genericType);
+ continue;
+ }
+ }
+ if(entryKey != null){
+ valueMap.put(entryKey, entryValue);
+ }
+ }
+
+ }
+ return valueMap;
+ }
+
+
+ /**
+ * This method convert a instance of java.util.Map into
+ * OM object model for serialization.
+ *
+ * @param fac the OMFactory
+ * @param type of the java.util.Map
+ * @param results the results values
+ * @param typeTable the type table
+ * @param elementFormDefault the element form default
+ * @return list of OMElement
+ */
+ public static List<OMElement> getMapElement(OMFactory fac, Type type,
+ Map results, TypeTable typeTable, boolean
elementFormDefault) {
+ Iterator<Object> keyItr = results.keySet().iterator();
+ List<OMElement> list = new ArrayList<OMElement>();
+ OMNamespace ns = fac.createOMNamespace(
+
org.apache.axis2.Constants.AXIS2_MAP_NAMESPACE_URI,
+
org.apache.axis2.Constants.AXIS2_MAP_NAMESPACE_PREFIX);
+ Type keyType = Object.class;
+ Type valueType = Object.class;
+ if (type instanceof ParameterizedType) {
+ ParameterizedType aType = (ParameterizedType) type;
+ Type[] parameterArgTypes =
aType.getActualTypeArguments();
+ keyType = parameterArgTypes[0];
+ valueType = parameterArgTypes[1];
+ }
+ while (keyItr.hasNext()) {
+ OMElement omEntry;
+ Object key = keyItr.next();
+ Object value;
+ if (key != null) {
+ value = results.get(key);
+ List<Object> properties = new
ArrayList<Object>();
+
+ key = getMapParameterElement(fac,
+
org.apache.axis2.Constants.MAP_KEY_ELEMENT_NAME, key,
+ keyType, typeTable, ns,
elementFormDefault);
+ properties.add(new QName(ns.getNamespaceURI(),
+
org.apache.axis2.Constants.MAP_KEY_ELEMENT_NAME, ns
+ .getPrefix()));
+ properties.add(key);
+
+ value = getMapParameterElement(fac,
+
org.apache.axis2.Constants.MAP_VALUE_ELEMENT_NAME,
+ value, valueType, typeTable,
ns, elementFormDefault);
+ properties.add(new QName(ns.getNamespaceURI(),
+
org.apache.axis2.Constants.MAP_VALUE_ELEMENT_NAME, ns
+ .getPrefix()));
+ properties.add(value);
+
+ XMLStreamReader pullParser = new
ADBXMLStreamReaderImpl(
+ new QName(
+
ns.getNamespaceURI(),
+
org.apache.axis2.Constants.MAP_ENTRY_ELEMENT_NAME,
+
ns.getPrefix()), properties.toArray(), null,
+ typeTable, elementFormDefault);
+
+ StAXOMBuilder stAXOMBuilder = new StAXOMBuilder(
+
OMAbstractFactory.getOMFactory(), new StreamWrapper(
+ pullParser));
+ omEntry = stAXOMBuilder.getDocumentElement();
+ list.add(omEntry);
+ }
+ }
+ return list;
+ }
+
+ /**
+ * Helper method to deserialize each parameter of Map.
+ *
+ * @param paraType the parameter type
+ * @param omElement the OMElement
+ * @param helper the helper
+ * @param objectSupplier the object supplier
+ * @param genericType the generic type
+ * @return the object
+ * @throws AxisFault the axis fault
+ */
+ private static Object processMapParameterObject(Type paraType,
OMElement omElement,
+ MultirefHelper helper, ObjectSupplier objectSupplier,
+ Type genericType) throws AxisFault {
+ if (paraType instanceof ParameterizedType) {
+ if (Map.class.isAssignableFrom((Class)
+ ((ParameterizedType)
paraType).getRawType())) {
+ return processGenericsMapElement(
+ ((ParameterizedType)
paraType).getActualTypeArguments(),
+ omElement, helper,
omElement.getChildren(),
+ objectSupplier, paraType);
+ } else if (Collection.class
.isAssignableFrom((Class)
+ ((ParameterizedType)
paraType).getRawType())) {
+ //TODO
+ return null;
+ } else {
+ // TODO - support for custom ParameterizedTypes
+ return null;
+ }
+
+ } else {
+ return processObject(omElement, (Class) paraType,
helper, true,
+ objectSupplier, genericType);
+ }
+ }
+
+ /**
+ * This method instantiate a Map instance according to the expected
+ * parameter type of the service method. a instance HashMap<Object,
Object>
+ * returns as the default value and in case of Exception.
+ *
+ * @param genericType the generic type
+ * @return the map instance
+ */
+ private static Map<Object, Object> getMapInstance(Type genericType) {
+ Class rowType;
+ if (genericType instanceof ParameterizedType) {
+ rowType = (Class) ((ParameterizedType)
genericType).getRawType();
+ } else {
+ rowType = (Class) genericType;
+ }
+
+ if (Map.class.getName().equals(rowType.getName())) {
+ return new HashMap<Object, Object>();
+ } else {
+ try {
+ return (Map<Object, Object>)
rowType.newInstance();
+ } catch (Exception e) {
+ return new HashMap<Object, Object>();
+ }
+ }
+ }
+
+ /**
+ * Process the provided return value and constructs OMElement
accordingly.
+ *
+ * @param fac the OMFactory instance
+ * @param elementName the element name for return OMElement
+ * @param value the actual return value
+ * @param valueType the value type of return value
+ * @param typeTable the type table
+ * @param ns the OMNamespace
+ * @param elementFormDefault the element form default
+ * @return the map parameter object
+ */
+ private static Object getMapParameterElement(OMFactory fac,
+ String elementName, Object value, Type valueType,
+ TypeTable typeTable, OMNamespace ns, boolean
elementFormDefault) {
+ //TODO - key/value can be a Collection, Array , Dom document
,OMElement etc
+ if (SimpleTypeMapper.isMap(value.getClass())) {
+ List<OMElement> childList = getMapElement(fac,
valueType,
+ (Map) value, typeTable,
elementFormDefault);
+ OMElement omValue = fac.createOMElement(elementName,
+ ns.getNamespaceURI(), ns.getPrefix());
+ for (OMElement child : childList) {
+ omValue.addChild(child);
+ }
+ return omValue;
+
+ } else if (SimpleTypeMapper.isObjectType((Class) valueType)) {
+ OMElement omValue;
+ omValue = fac.createOMElement(elementName, ns);
+ if (SimpleTypeMapper.isSimpleType(value)) {
+
omValue.addChild(fac.createOMText(SimpleTypeMapper
+ .getStringValue(value)));
+ } else {
+ QName name = new QName(ns.getNamespaceURI(),
elementName,
+ ns.getPrefix());
+ XMLStreamReader xr =
BeanUtil.getPullParser(value, name,
+ typeTable, true, false);
+ OMXMLParserWrapper stAXOMBuilder =
OMXMLBuilderFactory
+
.createStAXOMBuilder(OMAbstractFactory.getOMFactory(),
+ new
StreamWrapper(xr));
+ omValue = stAXOMBuilder.getDocumentElement();
+
+ }
+ addInstanceTypeAttribute(fac, omValue, value,
typeTable);
+ return omValue;
+ }
+ return value;
+ }
}
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=1142991&r1=1142990&r2=1142991&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 Jul 5 11:25:06 2011
@@ -46,6 +46,9 @@ import java.lang.reflect.Array;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
public class RPCUtil {
@@ -322,7 +325,22 @@ public class RPCUtil {
service.isElementFormDefault(),
service.getTypeTable());
envelope.getBody().addChild(bodyChild);
- } else if
(SimpleTypeMapper.isDataHandler(resObject.getClass())) {
+
+ } else if
(SimpleTypeMapper.isMap(resObject.getClass())) {
+ OMElement resElemt =
fac.createOMElement(
+ partName, ns);
+ List<OMElement> omList =
BeanUtil.getMapElement(fac,
+
method.getGenericReturnType(), (Map) resObject,
+
service.getTypeTable(),
+
service.isElementFormDefault());
+ Iterator<OMElement> omItr =
omList.iterator();
+ while (omItr.hasNext()) {
+
resElemt.addChild(omItr.next());
+ }
+
envelope.getBody().addChild(resElemt);
+
+ } else if
(SimpleTypeMapper.isDataHandler(resObject
+ .getClass())) {
OMElement resElemt;
if (service.isElementFormDefault()) {
resElemt = fac.createOMElement(partName, ns);
@@ -477,6 +495,22 @@ public class RPCUtil {
service.isElementFormDefault(),
service.getTypeTable());
envelope.getBody().addChild(bodyChild);
+ } else if (SimpleTypeMapper.isMap(resObject.getClass())){
+ OMElement resElemt =
fac.createOMElement(method.getName() + "Response", ns);
+ List<OMElement> omList =
BeanUtil.getMapElement(fac,method.getGenericReturnType(), (Map)
resObject,service.getTypeTable(),service.isElementFormDefault());
+ OMElement returnElement;
+ if (service.isElementFormDefault()) {
+ returnElement =
fac.createOMElement(RETURN_WRAPPER, ns);
+ } else {
+ returnElement =
fac.createOMElement(RETURN_WRAPPER, null);
+ }
+ Iterator<OMElement> omItr = omList.iterator();
+ while(omItr.hasNext()){
+ returnElement.addChild(omItr.next());
+ }
+ resElemt.addChild(returnElement);
+ envelope.getBody().addChild(resElemt);
+
} else if
(SimpleTypeMapper.isDataHandler(resObject.getClass())) {
OMElement resElemt =
fac.createOMElement(method.getName() + "Response", ns);
OMText text = fac.createOMText(resObject, true);
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=1142991&r1=1142990&r2=1142991&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
Tue Jul 5 11:25:06 2011
@@ -37,6 +37,7 @@ import javax.xml.namespace.QName;
import java.io.ByteArrayInputStream;
import java.math.BigInteger;
import java.util.List;
+import java.util.Map;
public class BeanUtilTest extends TestCase {
@@ -254,6 +255,22 @@ public class BeanUtilTest extends TestCa
}
+ public void testProcessSimpleMap() throws Exception {
+ OMNamespace ns =
omFactory.createOMNamespace(org.apache.axis2.Constants.AXIS2_MAP_NAMESPACE_URI,
+ org.apache.axis2.Constants.AXIS2_MAP_NAMESPACE_PREFIX);
+ OMElement entry =
omFactory.createOMElement(org.apache.axis2.Constants.MAP_ENTRY_ELEMENT_NAME,ns);
+ OMElement key =
omFactory.createOMElement(org.apache.axis2.Constants.MAP_KEY_ELEMENT_NAME,ns);
+ OMElement value =
omFactory.createOMElement(org.apache.axis2.Constants.MAP_VALUE_ELEMENT_NAME,ns);
+ key.setText("key1");
+ value.setText("value1");
+ entry.addChild(key);
+ entry.addChild(value);
+ omElement.addChild(entry);
+
+ Object result = BeanUtil.processObject(omElement, Map.class, new
MultirefHelper(omElement), false, objectSupplier, Map.class);
+ assertTrue(result instanceof Map);
+ }
+
private static String toStr(ByteArrayInputStream is) {
int size = is.available();
char[] theChars = new char[size];
Modified:
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/Constants.java
URL:
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/Constants.java?rev=1142991&r1=1142990&r2=1142991&view=diff
==============================================================================
---
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/Constants.java
(original)
+++
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/Constants.java
Tue Jul 5 11:25:06 2011
@@ -320,6 +320,15 @@ public class Constants extends org.apach
*/
public static int MAX_HIERARCHICAL_DEPTH = 10;
public static final String HIDDEN_SERVICE_PARAM_NAME = "hiddenService";
+
+
+ public static final String MAP_MAP_ELEMENT_NAME = "map";
+ public static final String MAP_ENTRY_ELEMENT_NAME = "entry";
+ public static final String MAP_KEY_ELEMENT_NAME = "key";
+ public static final String MAP_VALUE_ELEMENT_NAME = "value";
+ public static final String AXIS2_MAP_NAMESPACE_URI =
+ "http://ws.apache.org/namespaces/axis2/map";
+ public static final String AXIS2_MAP_NAMESPACE_PREFIX = "map";
public static interface Configuration {
public static final String ENABLE_REST = "enableREST";
Modified:
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/java2wsdl/DefaultSchemaGenerator.java
URL:
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/java2wsdl/DefaultSchemaGenerator.java?rev=1142991&r1=1142990&r2=1142991&view=diff
==============================================================================
---
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/java2wsdl/DefaultSchemaGenerator.java
(original)
+++
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/java2wsdl/DefaultSchemaGenerator.java
Tue Jul 5 11:25:06 2011
@@ -20,6 +20,7 @@
package org.apache.axis2.description.java2wsdl;
import org.apache.axis2.AxisFault;
+import org.apache.axis2.Constants;
import org.apache.axis2.jaxrs.JAXRSUtils;
import org.apache.axis2.jaxrs.JAXRSModel;
import org.apache.axis2.util.JavaUtils;
@@ -58,6 +59,12 @@ public class DefaultSchemaGenerator impl
public static final String NAME_SPACE_PREFIX = "ax2";// axis2 name space
private static int prefixCount = 1;
+
+ /* This is required to get unique name for java.util.Map.
+ * e.g - Map<String,Map<String,Object>> outerMap;
+ */
+ private static int mapCount = 1;
+ private static int entryCount = 1;
private JAXRSModel classModel;
@@ -391,7 +398,11 @@ public class DefaultSchemaGenerator impl
if (nonRpcMethods.contains(jMethod.getName())) {
generateSchemaForType(sequence, null, jMethod.getName());
break;
- } else {
+
+ } else if(methodParameter != null &&
Map.class.isAssignableFrom(methodParameter)) {
+
generateWrappedSchemaTypeForMap(sequence,genericParameterTypes[j],
parameterName);
+ }
+ else {
Type genericParameterType = genericParameterTypes[j];
Type genericType = null;
if(genericParameterType instanceof ParameterizedType){
@@ -423,12 +434,18 @@ public class DefaultSchemaGenerator impl
Type genericParameterType = jMethod.getGenericReturnType();
if (nonRpcMethods.contains(jMethod.getName())) {
generateSchemaForType(sequence, null, returnName);
+ } else if (Map.class.isAssignableFrom(returnType)){
+ if (genericParameterType instanceof
ParameterizedType) {
+
generateWrappedSchemaTypeForMap(sequence, genericParameterType, returnName);
+ } else {
+
generateWrappedSchemaTypeForMap(sequence, returnType, returnName);
+ }
} else if(genericParameterType instanceof ParameterizedType){
- ParameterizedType aType = (ParameterizedType)
genericParameterType;
- Type[] parameterArgTypes =
aType.getActualTypeArguments();
- generateSchemaForType(sequence, parameterArgTypes[0],
returnName, true);
- } else {
- generateSchemaForType(sequence, returnType, returnName);
+ ParameterizedType aType = (ParameterizedType)
genericParameterType;
+ Type[] parameterArgTypes = aType.getActualTypeArguments();
+ generateSchemaForType(sequence, parameterArgTypes[0],
returnName, true);
+ } else {
+ generateSchemaForType(sequence, returnType, returnName);
}
AxisMessage outMessage = axisOperation.getMessage(
@@ -646,24 +663,34 @@ public class DefaultSchemaGenerator impl
if(genericFieldType instanceof ParameterizedType){
ParameterizedType aType = (ParameterizedType)
genericFieldType;
Type[] fieldArgTypes =
aType.getActualTypeArguments();
- try {
- generateSchemaforGenericFields(xmlSchema,
- sequence,
- fieldArgTypes[0],
- propertyName);
- } catch (Exception e) {
- generateSchemaforFieldsandProperties(xmlSchema,
- sequence,
- property.getPropertyType(),
- propertyName,
- property.getPropertyType().isArray());
+
if(Map.class.isAssignableFrom((Class)((ParameterizedType)aType).getRawType())){
+ generateWrappedSchemaTypeForMap(sequence,
aType, propertyName);
+ } else {
+ try {
+ generateSchemaforGenericFields(xmlSchema,
+ sequence,
+ fieldArgTypes[0],
+ propertyName);
+ } catch (Exception e) {
+
generateSchemaforFieldsandProperties(xmlSchema,
+ sequence,
+ property.getPropertyType(),
+ propertyName,
+ property.getPropertyType().isArray());
+ }
+
}
+
} else {
- generateSchemaforFieldsandProperties(xmlSchema,
- sequence,
- property.getPropertyType(),
- propertyName,
- property.getPropertyType().isArray());
+ if(genericFieldType != null &&
Map.class.isAssignableFrom((Class)genericFieldType)){
+
generateWrappedSchemaTypeForMap(sequence, genericFieldType, propertyName);
+ } else {
+ generateSchemaforFieldsandProperties(xmlSchema,
+ sequence,
+ property.getPropertyType(),
+ propertyName,
+ property.getPropertyType().isArray());
+ }
}
}
}
@@ -1665,4 +1692,152 @@ public class DefaultSchemaGenerator impl
}
}
}
+
+ /**
+ * Generate wrapped schema type for map.
+ *
+ * @param sequence the sequence
+ * @param genericParameterType the generic parameter type
+ * @param parameterName the parameter name
+ * @throws Exception the exception
+ */
+ private void generateWrappedSchemaTypeForMap(XmlSchemaSequence sequence,
+ Type genericParameterType, String parameterName) throws
Exception {
+ generateSchemaTypeForMap(sequence, genericParameterType,
parameterName);
+ }
+
+ /**
+ * Generate schema type for map.
+ *
+ * @param sequence the sequence
+ * @param genericParameterType the generic parameter type
+ * @param parameterName the parameter name
+ * @return the q name
+ * @throws Exception the exception
+ */
+ protected QName generateSchemaTypeForMap(XmlSchemaSequence sequence,
+ Type genericParameterType, String parameterName) throws
Exception {
+ /*
+ * In Doc/Lit Wrapped - sequence should not be null.
+ * In Doc/lit Bare - sequence should be null.
+ */
+ Type keyType = Object.class;
+ Type valueType = Object.class;
+ String entryName = generateUniqueNameForMapEntry();
+ String mapName = generateUniqueNameForMap();
+
+ if (genericParameterType instanceof ParameterizedType) {
+ ParameterizedType aType = (ParameterizedType)
genericParameterType;
+ Type[] parameterArgTypes =
aType.getActualTypeArguments();
+ keyType = parameterArgTypes[0];
+ valueType = parameterArgTypes[1];
+ }
+
+ XmlSchema xmlSchema =
getXmlSchema(Constants.AXIS2_MAP_NAMESPACE_URI);
+ String targetNamespacePrefix = targetNamespacePrefixMap
+ .get(Constants.AXIS2_MAP_NAMESPACE_URI);
+
+ XmlSchemaComplexType entryType = new
XmlSchemaComplexType(xmlSchema);
+ QName entryTypeName = new
QName(Constants.AXIS2_MAP_NAMESPACE_URI,
+ entryName, targetNamespacePrefix);
+ XmlSchemaSequence entrySequence = new XmlSchemaSequence();
+ generateSchemaTypeForMapParameter(entrySequence, keyType,
+ Constants.MAP_KEY_ELEMENT_NAME);
+ generateSchemaTypeForMapParameter(entrySequence, valueType,
+ Constants.MAP_VALUE_ELEMENT_NAME);
+ entryType.setParticle(entrySequence);
+ entryType.setName(entryName);
+ xmlSchema.getItems().add(entryType);
+
+ XmlSchemaElement entryElement = new XmlSchemaElement();
+ entryElement.setName(Constants.MAP_ENTRY_ELEMENT_NAME);
+ entryElement.setNillable(true);
+ entryElement.setSchemaTypeName(entryTypeName);
+ entryElement.setMaxOccurs(Long.MAX_VALUE);
+ entryElement.setQName(entryTypeName);
+
+ XmlSchemaComplexType mapType = new
XmlSchemaComplexType(xmlSchema);
+ QName mapTypeName = new QName(Constants.AXIS2_MAP_NAMESPACE_URI,
+ mapName, targetNamespacePrefix);
+ XmlSchemaSequence mapSequence = new XmlSchemaSequence();
+ mapSequence.getItems().add(entryElement);
+ mapType.setParticle(mapSequence);
+ mapType.setName(mapName);
+ xmlSchema.getItems().add(mapType);
+
+ QName schemaTypeName = new
QName(Constants.AXIS2_MAP_NAMESPACE_URI,
+ mapName);
+ addImport(getXmlSchema(schemaTargetNameSpace), schemaTypeName);
+
+ if (sequence != null) {
+ XmlSchemaComplexType parameterType = new
XmlSchemaComplexType(
+ xmlSchema);
+ QName parameterTypeName = new QName(
+ Constants.AXIS2_MAP_NAMESPACE_URI,
mapName,
+ targetNamespacePrefix);
+ XmlSchemaSequence parameterSequence = new
XmlSchemaSequence();
+ parameterSequence.getItems().add(entryElement);
+ parameterType.setParticle(parameterSequence);
+
+ XmlSchemaElement parameterElement = new
XmlSchemaElement();
+ parameterElement.setName(parameterName);
+ sequence.getItems().add(parameterElement);
+ parameterElement.setSchemaTypeName(parameterTypeName);
+ return parameterTypeName;
+ }
+ return mapTypeName;
+ }
+
+ /**
+ * Generate schema type for map parameter.
+ *
+ * @param entrySequence the entry sequence
+ * @param parameterType the parameter type
+ * @param elementName the element name
+ * @throws Exception the exception
+ */
+ private void generateSchemaTypeForMapParameter(
+ XmlSchemaSequence entrySequence, Type parameterType,
+ String elementName) throws Exception {
+ if (parameterType instanceof ParameterizedType) {
+ if (Map.class
+ .isAssignableFrom((Class)
((ParameterizedType) parameterType)
+ .getRawType())) {
+ generateWrappedSchemaTypeForMap(entrySequence,
parameterType,
+ elementName);
+
+ } else if (Collection.class
+ .isAssignableFrom((Class)
((ParameterizedType) parameterType)
+ .getRawType())) {
+ // TODO - support for Collection and Arrays
+ } else {
+ // TODO - support for custom ParameterizedTypes
+ }
+ } else {
+ generateSchemaForType(entrySequence, parameterType,
elementName,
+ false);
+ }
+ }
+
+ /**
+ * Provides unique name for a Map.
+ *
+ * @return the string
+ */
+ private static String generateUniqueNameForMap() {
+ String name = Constants.MAP_MAP_ELEMENT_NAME + mapCount;
+ mapCount++;
+ return name;
+ }
+
+ /**
+ * Provides unique name for a Map entry.
+ *
+ * @return the unique name for map entry
+ */
+ private static String generateUniqueNameForMapEntry() {
+ String name = Constants.MAP_ENTRY_ELEMENT_NAME + entryCount;
+ entryCount++;
+ return name;
+ }
}
\ No newline at end of file
Modified:
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/java2wsdl/DocLitBareSchemaGenerator.java
URL:
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/java2wsdl/DocLitBareSchemaGenerator.java?rev=1142991&r1=1142990&r2=1142991&view=diff
==============================================================================
---
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/java2wsdl/DocLitBareSchemaGenerator.java
(original)
+++
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/java2wsdl/DocLitBareSchemaGenerator.java
Tue Jul 5 11:25:06 2011
@@ -41,10 +41,12 @@ import javax.xml.namespace.QName;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
+import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
+import java.util.Map;
public class DocLitBareSchemaGenerator extends DefaultSchemaGenerator {
@@ -122,6 +124,7 @@ public class DocLitBareSchemaGenerator e
uniqueMethods.put(methodName, jMethod);
Class<?>[] paras = jMethod.getParameterTypes();
+ Type[] genericParameterTypes = jMethod.getGenericParameterTypes();
String parameterNames[] =
methodTable.getParameterNames(methodName);
AxisMessage inMessage =
axisOperation.getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
if (inMessage != null) {
@@ -139,7 +142,7 @@ public class DocLitBareSchemaGenerator e
for (int j = 0; j < paras.length; j++) {
Class<?> methodParameter = paras[j];
String parameterName =
getParameterName(parameterAnnotation, j, parameterNames);
- if (generateRequestSchema(methodParameter ,
parameterName,jMethod, sequence)) {
+ if (generateRequestSchema(methodParameter ,
parameterName,jMethod, sequence, genericParameterTypes[j])) {
break;
}
}
@@ -155,7 +158,7 @@ public class DocLitBareSchemaGenerator e
axisOperation);
inMessage.setPartName(methodName);
String parameterName =
getParameterName(parameterAnnotation, 0, parameterNames);
- if (generateRequestSchema(methodParameter ,
parameterName,jMethod, sequence)) {
+ if (generateRequestSchema(methodParameter ,
parameterName,jMethod, sequence, genericParameterTypes[0])) {
break;
}
} else {
@@ -168,7 +171,11 @@ public class DocLitBareSchemaGenerator e
jMethod.getName() + " ]which have the same
parameter names");
} else {
processedParameters.put(parameterName, jMethod);
- generateSchemaForType(null, methodParameter,
parameterName);
+ if (methodParameter != null &&
Map.class.isAssignableFrom(methodParameter)){
+
generateBareSchemaTypeForMap(parameterName, genericParameterTypes[0], null);
+ } else {
+ generateSchemaForType(null, methodParameter,
parameterName);
+ }
inMessage.setElementQName(typeTable.getQNamefortheType(parameterName));
inMessage.setPartName(parameterName);
inMessage.setWrapped(false);
@@ -180,6 +187,7 @@ public class DocLitBareSchemaGenerator e
// for its return type
Class<?> returnType = jMethod.getReturnType();
+ Type genericReturnType = jMethod.getGenericReturnType();
if (!"void".equals(jMethod.getReturnType().getName())) {
AxisMessage outMessage = axisOperation.getMessage(
@@ -203,7 +211,11 @@ public class DocLitBareSchemaGenerator e
generateSchemaForType(sequence, returnType,
returnName);
}
} else {
- generateSchemaForType(null, returnType, methodName +
RESULT);
+ if (returnType != null &&
Map.class.isAssignableFrom(returnType)){
+
generateBareSchemaTypeForMap(methodName + RESULT, genericReturnType, null);
+ } else {
+ generateSchemaForType(null, returnType, methodName +
RESULT);
+ }
outMessage.setWrapped(false);
}
outMessage.setElementQName(typeTable.getQNamefortheType(methodName + RESULT));
@@ -224,10 +236,12 @@ public class DocLitBareSchemaGenerator e
private boolean generateRequestSchema(Class<?> methodParameter,
String parameterName,
Method jMethod,
- XmlSchemaSequence sequence) throws
Exception {
+ XmlSchemaSequence sequence, Type
genericParameterType) throws Exception {
if (nonRpcMethods.contains(jMethod.getName())) {
generateSchemaForType(sequence, null, jMethod.getName());
return true;
+ } else if (methodParameter != null &&
Map.class.isAssignableFrom(methodParameter)){
+ generateBareSchemaTypeForMap(parameterName,
genericParameterType, sequence);
} else {
generateSchemaForType(sequence, methodParameter, parameterName);
}
@@ -359,5 +373,35 @@ public class DocLitBareSchemaGenerator e
}
return xmlSchema;
}
+
+ /**
+ * Generate bare schema type for map.
+ *
+ * @param paraName the para name
+ * @param genericParameterType the generic parameter type
+ * @param sequence the sequence
+ * @throws Exception the exception
+ */
+ private void generateBareSchemaTypeForMap(String paraName,
+ Type genericParameterType, XmlSchemaSequence sequence)
+ throws Exception {
+ QName schemaTypeName = generateSchemaTypeForMap(sequence,
+ genericParameterType, paraName);
+ if (sequence != null) {
+ return;
+ }
+ XmlSchemaElement elt1 = new XmlSchemaElement();
+ elt1.setSchemaTypeName(schemaTypeName);
+ elt1.setName(paraName);
+ elt1.setNillable(true);
+ QName elementName = new QName(schemaTargetNameSpace, paraName,
+ schema_namespace_prefix);
+ elt1.setQName(elementName);
+ XmlSchema xmlSchema = getXmlSchema(schemaTargetNameSpace);
+ xmlSchema.getElements().add(elementName, elt1);
+ xmlSchema.getItems().add(elt1);
+ typeTable.addComplexSchema(paraName, elementName);
+
+ }
}
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=1142991&r1=1142990&r2=1142991&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 Jul 5 11:25:06 2011
@@ -29,7 +29,6 @@ import javax.xml.datatype.XMLGregorianCa
import javax.xml.namespace.QName;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Vector;
@@ -152,10 +151,6 @@ public class TypeTable {
ANY_TYPE);
simpleTypetoxsd.put(List.class.getName(),
ANY_TYPE);
- simpleTypetoxsd.put(HashMap.class.getName(),
- ANY_TYPE);
- simpleTypetoxsd.put(Hashtable.class.getName(),
- ANY_TYPE);
simpleTypetoxsd.put(Document.class.getName(), ANY_TYPE);
//byteArrat
simpleTypetoxsd.put("base64Binary",
@@ -285,6 +280,20 @@ public class TypeTable {
}
return type;
}
+
+ /**
+ * Gets the schema type name.
+ *
+ * @param name the name
+ * @return the schema type name
+ */
+ public QName getSchemaTypeName(String name) {
+ QName qName = getSimpleSchemaTypeName(name);
+ if( qName == null){
+ qName = getComplexSchemaType(name);
+ }
+ return qName;
+ }
}