Author: sagara Date: Thu Sep 1 10:34:45 2011 New Revision: 1163991 URL: http://svn.apache.org/viewvc?rev=1163991&view=rev Log: Applied patch for AXIS2-3967.
Added: axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/engine/EnumService.java (with props) axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/engine/EnumTest.java (with props) axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/engine/Event.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/rpc/receivers/RPCUtil.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/TypeTable.java 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=1163991&r1=1163990&r2=1163991&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 Sep 1 10:34:45 2011 @@ -418,4 +418,13 @@ public class SimpleTypeMapper { } } + /*check weather passed parameter class is a java.lang.Enum + * + * @param classType the class type + * @return true , if it is an Enum + * */ + + public static boolean isEnum(Class classType) { + return java.lang.Enum.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=1163991&r1=1163990&r2=1163991&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 Sep 1 10:34:45 2011 @@ -79,6 +79,7 @@ import org.w3c.dom.traversal.TreeWalker; public class BeanUtil { + private static int nsCount = 1; /** @@ -367,7 +368,12 @@ public class BeanUtil { addTypeQname(elemntNameSpace, propertyQnameValueList, property, beanName, processingDocLitBare); propertyQnameValueList.add(map); - } else { + } else if (SimpleTypeMapper.isEnum(ptype)){ + addTypeQname(elemntNameSpace, propertyQnameValueList, property, + beanName, processingDocLitBare); + propertyQnameValueList.add( + value == null ? null : SimpleTypeMapper.getStringValue(value.toString())); + }else { addTypeQname(elemntNameSpace, propertyQnameValueList, property, beanName, processingDocLitBare); if (Object.class.equals(ptype)) { @@ -376,16 +382,16 @@ public class BeanUtil { QName qNamefortheType = (QName) typeTable .getComplexSchemaMap().get( getClassName(beanClass)); - OMFactory fac = OMAbstractFactory.getOMFactory(); + 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 = fac.createOMElement(elementName); element.addChild(fac.createOMText(SimpleTypeMapper - .getStringValue(value))); - }else{ + .getStringValue(value))); + }else{ XMLStreamReader xr = BeanUtil.getPullParser(value, elementName, typeTable, true, false); OMXMLParserWrapper stAXOMBuilder = @@ -625,6 +631,8 @@ public class BeanUtil { partObj = processGenericsMapElement(parameterArgTypes , (OMElement) parts.getParent(), null, parts.getChildren(), objectSupplier, beanClass); } + }else if (SimpleTypeMapper.isEnum(parameters)) { + partObj =processEnumObject(parameters , parts); } else { partObj = deserialize(parameters, parts, objectSupplier, null); } @@ -944,7 +952,10 @@ public class BeanUtil { return toReturn[0]; } } - } else { + } else if (SimpleTypeMapper.isEnum(classType)) { + /* handling enum types */ + retObjs[count] = processEnumObject(classType, omElement); + } else{ //handling refs retObjs[count] = processObject(omElement, classType, helper, false, objectSupplier, genericType); @@ -1065,13 +1076,32 @@ public class BeanUtil { } - } else { + }else if(SimpleTypeMapper.isEnum(classType)){ + return processEnumObject(classType, omElement); + }else { return BeanUtil.deserialize(classType, omElement, objectSupplier, null); } } } } + /*This method check is service method required enum type instance as method parameter + * if so return required enum object + * + * @param classType method required instance type + * @param omElement OMElement + * @return an Enum object + * */ + public static Object processEnumObject(Class classType , OMElement omElement)throws AxisFault{ + /* + *reason to add this block is check is soap sending a string but service require Enum + * then this convert string to relevant enum object and add to retObjs[] as object + * */ + Object enumIbj = Enum.valueOf(classType , omElement.getText()); + return enumIbj; + + } + public static OMElement getOMElement(QName opName, Object[] args, @@ -1188,6 +1218,9 @@ public class BeanUtil { OMText text = fac.createOMText(arg, true); wrappingElement.addChild(text); objects.add(wrappingElement); + }else if (SimpleTypeMapper.isEnum(arg.getClass())) { + // in here i can return enum instances but for now i return it as a simple string + objects.add(arg.toString()); } else { objects.add(arg); } @@ -1260,8 +1293,8 @@ public class BeanUtil { * * * @param fac the SOAPFactory instance. - * @param child the child OMElement to add attributes. - * @param method the java reflection method + * @param element the child OMElement to add attributes. + * @param resObject the java reflection method * @param resObject the res object * @param typeTable the type table of particular Axis2 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=1163991&r1=1163990&r2=1163991&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 Sep 1 10:34:45 2011 @@ -46,8 +46,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.ParameterizedType; -import java.lang.reflect.Type; import java.util.Collection; import java.util.Iterator; import java.util.List; @@ -511,7 +509,11 @@ public class RPCUtil { returnElement.addChild(text); resElemt.addChild(returnElement); envelope.getBody().addChild(resElemt); - } else { + } + else { + if(SimpleTypeMapper.isEnum(resObject.getClass())){ + resObject = resObject.toString(); + } if (service.isElementFormDefault()) { RPCUtil.processResponse(fac, resObject, bodyContent, ns, envelope, method, Added: axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/engine/EnumService.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/engine/EnumService.java?rev=1163991&view=auto ============================================================================== --- axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/engine/EnumService.java (added) +++ axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/engine/EnumService.java Thu Sep 1 10:34:45 2011 @@ -0,0 +1,64 @@ +/* + * 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.engine; + +public class EnumService { + + public EnumService() { + } + + public Day testDay(Day day){ + System.out.println(day.getClass().getName()); + return day; + } + + public Event enumPojo(Event newEvent){ + return newEvent; + } + + public Status testMultiEnumParameters(Status status1 , Day day1 , Status status2 , Day day){ + return status1; + } + + public enum Day{ + MONDAY , TUESDAY , WEDNESDAY, THURSDAY , FRIDAY , SATURDAY , SUNDAY; + } + + + + public enum Status{ + START(0,"start"), ACTIVE(1,"active") , STOP(2, "stop"); + + private final int val; + private final String desc; + Status(int val , String desc){ + this.val = val; + this.desc = desc; + } + + public int value(){ + return this.val; + } + + public String description(){ + return this.desc; + } + } +} Propchange: axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/engine/EnumService.java ------------------------------------------------------------------------------ svn:eol-style = native Added: axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/engine/EnumTest.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/engine/EnumTest.java?rev=1163991&view=auto ============================================================================== --- axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/engine/EnumTest.java (added) +++ axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/engine/EnumTest.java Thu Sep 1 10:34:45 2011 @@ -0,0 +1,100 @@ +/* + * 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.engine; + +import org.apache.axis2.addressing.EndpointReference; +import org.apache.axis2.client.Options; +import org.apache.axis2.description.WSDL2Constants; +import org.apache.axis2.integration.LocalTestCase; +import org.apache.axis2.rpc.client.RPCServiceClient; +import org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver; +import org.apache.axis2.rpc.receivers.RPCMessageReceiver; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.xml.namespace.QName; + +public class EnumTest extends LocalTestCase{ + private static final Log log = LogFactory.getLog(EnumTest.class); + @Override + public void setUp() throws Exception { + super.setUp(); + serverConfig.addMessageReceiver(WSDL2Constants.MEP_URI_IN_ONLY, + new RPCInOnlyMessageReceiver()); + serverConfig.addMessageReceiver(WSDL2Constants.MEP_URI_IN_OUT, + new RPCMessageReceiver()); + deployClassAsService("EnumService", EnumService.class); + } + + + public void testTestDay()throws Exception { + + QName opTestDay = new QName("http://engine.axis2.apache.org", "testDay" , "asix"); +// QName paraDay = new QName("http://engine.axis2.apache.org", "day" , "asix"); + + EnumService.Day aDay = EnumService.Day.MONDAY; + + Object[] opDayArg = new Object[]{aDay}; + RPCServiceClient serviceClient = getRPCClient(); + Options options = serviceClient.getOptions(); + EndpointReference targetEPR = new EndpointReference( + "local://services/EnumService"); + options.setTo(targetEPR); + options.setAction("testDay"); + +// Object[] ret = serviceClient.invokeBlocking( +// opTestDay, opDayArg, paraDay , new Class[]{String.class}); + Object[] ret = serviceClient.invokeBlocking(opTestDay ,opDayArg , new Class[]{String.class}); + log.debug(ret[0].toString()); + assertEquals(ret[0], "MONDAY"); + + } + + + public void testEnumPojo()throws Exception{ + QName opEnumPojo = new QName("http://engine.axis2.apache.org", "enumPojo" , "asix"); + + Event event = new Event(); + + event.setEventDesc("Event Description"); + event.setEventName("Event Name"); + event.setStartingDay(EnumService.Day.FRIDAY); + + // Constructing the arguments array for the method invocation + Object[] opAddEventArgs = new Object[] { event}; + + // Invoking the method + RPCServiceClient serviceClient = getRPCClient(); + Options options = serviceClient.getOptions(); + EndpointReference targetEPR = new EndpointReference( + "local://services/EnumService"); + options.setTo(targetEPR); + options.setAction("enumPojo"); + Class[] returnTypes = new Class[] { Event.class }; + + Object[] ret = serviceClient.invokeBlocking(opEnumPojo, opAddEventArgs, returnTypes); +// assertEquals(event, ret[0]); + Event res = (Event)ret[0]; + assertEquals(event.getEventDesc() , res.getEventDesc()); + assertEquals(event.getEventName(), res.getEventName()); + assertEquals(event.getStartingDay() , res.getStartingDay()); + + } +} Propchange: axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/engine/EnumTest.java ------------------------------------------------------------------------------ svn:eol-style = native Added: axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/engine/Event.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/engine/Event.java?rev=1163991&view=auto ============================================================================== --- axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/engine/Event.java (added) +++ axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/engine/Event.java Thu Sep 1 10:34:45 2011 @@ -0,0 +1,53 @@ + +/* + * 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.engine; + +public class Event { + + private EnumService.Day startingDay; + // private SampleService.Status eventDesc; + private String eventDesc ; + private String eventName; + + public EnumService.Day getStartingDay() { + return startingDay; + } + + public void setStartingDay(EnumService.Day startingDay) { + this.startingDay = startingDay; + } + + public String getEventDesc() { + return eventDesc; + } + + public void setEventDesc(String eventDesc) { + this.eventDesc = eventDesc; + } + + public String getEventName() { + return eventName; + } + + public void setEventName(String eventName) { + this.eventName = eventName; + } +} Propchange: axis/axis2/java/core/trunk/modules/integration/test/org/apache/axis2/engine/Event.java ------------------------------------------------------------------------------ svn:eol-style = native 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=1163991&r1=1163990&r2=1163991&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 Thu Sep 1 10:34:45 2011 @@ -330,6 +330,10 @@ public class Constants extends org.apach "http://ws.apache.org/namespaces/axis2/map"; public static final String AXIS2_MAP_NAMESPACE_PREFIX = "map"; + public static final String AXIS2_ENUM_NAMESPACE_PREFIX = "enum"; + public static final String AXIS2_ENUM_NAMESPACE_URI = "http://ws.apache.org/namespaces/axis2/enum"; + public static final String ENUM_ELEMENT_NAME = "enum"; + public static interface Configuration { public static final String ENABLE_REST = "enableREST"; public static final String ENABLE_HTTP_CONTENT_NEGOTIATION = "httpContentNegotiation"; 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=1163991&r1=1163990&r2=1163991&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 Thu Sep 1 10:34:45 2011 @@ -21,18 +21,17 @@ package org.apache.axis2.description.jav 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; import org.apache.axis2.deployment.util.BeanExcludeInfo; import org.apache.axis2.deployment.util.Utils; -import org.apache.axis2.description.*; +import org.apache.axis2.description.AxisMessage; +import org.apache.axis2.description.AxisOperation; +import org.apache.axis2.description.AxisService; +import org.apache.axis2.description.Parameter; import org.apache.axis2.description.java2wsdl.bytecode.MethodTable; -import org.apache.axis2.jsr181.JSR181Helper; -import org.apache.axis2.jsr181.WebMethodAnnotation; -import org.apache.axis2.jsr181.WebParamAnnotation; -import org.apache.axis2.jsr181.WebResultAnnotation; -import org.apache.axis2.jsr181.WebServiceAnnotation; +import org.apache.axis2.jaxrs.JAXRSModel; +import org.apache.axis2.jaxrs.JAXRSUtils; +import org.apache.axis2.jsr181.*; +import org.apache.axis2.util.JavaUtils; import org.apache.axis2.wsdl.WSDLConstants; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -44,13 +43,13 @@ import org.w3c.dom.Document; import javax.activation.DataHandler; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilderFactory; +import java.beans.BeanInfo; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; import java.io.*; import java.lang.annotation.Annotation; import java.lang.reflect.*; import java.util.*; -import java.beans.PropertyDescriptor; -import java.beans.BeanInfo; -import java.beans.Introspector; public class DefaultSchemaGenerator implements Java2WSDLConstants, SchemaGenerator { @@ -408,7 +407,9 @@ public class DefaultSchemaGenerator impl } else if(methodParameter != null && Collection.class.isAssignableFrom(methodParameter)){ generateWrappedSchemaTypeForCollection(sequence, genericParameterTypes[j], parameterName); - } else { + }else if(methodParameter != null && Enum.class.isAssignableFrom(methodParameter)){ + generateWrappedSchemaTypeForEnum(sequence , parameterName , methodParameter , false); + }else { Type genericParameterType = genericParameterTypes[j]; Type genericType = null; if(genericParameterType instanceof ParameterizedType){ @@ -417,7 +418,17 @@ public class DefaultSchemaGenerator impl genericType = parameterArgTypes[0]; generateSchemaForType(sequence, genericType, parameterName, true); }else{ - generateSchemaForType(sequence, methodParameter, parameterName); + if(methodParameter.isArray()){ + Class<?> componentType = methodParameter.getComponentType(); + if (Enum.class.isAssignableFrom(componentType)) { + generateWrappedSchemaTypeForEnum(sequence, parameterName, componentType, true); + } else { + generateSchemaForType(sequence, methodParameter, parameterName); + } + + }else{ + generateSchemaForType(sequence, methodParameter, parameterName); + } } } } @@ -455,13 +466,24 @@ public class DefaultSchemaGenerator impl generateWrappedSchemaTypeForCollection(sequence, genericParameterType, returnName); } else { generateWrappedSchemaTypeForCollection(sequence, genericParameterType, returnName); - } + } + }else if(Enum.class .isAssignableFrom(returnType)){ + generateWrappedSchemaTypeForEnum(sequence , returnName , returnType , false); } else if(genericParameterType instanceof ParameterizedType){ ParameterizedType aType = (ParameterizedType) genericParameterType; Type[] parameterArgTypes = aType.getActualTypeArguments(); generateSchemaForType(sequence, parameterArgTypes[0], returnName, true); } else { - generateSchemaForType(sequence, returnType, returnName); + if (returnType.isArray()) { + Class<?> returnComponentType = returnType.getComponentType(); + if (Enum.class.isAssignableFrom(returnComponentType)) { + generateWrappedSchemaTypeForEnum(sequence, returnName, returnComponentType, true); + } else { + generateSchemaForType(sequence, returnType, returnName); + } + } else { + generateSchemaForType(sequence, returnType, returnName); + } } AxisMessage outMessage = axisOperation.getMessage( @@ -702,25 +724,27 @@ public class DefaultSchemaGenerator impl .isAssignableFrom((Class) genericFieldType)) { generateSchemaTypeForDocument(sequence, propertyName); - + } else { - if(genericFieldType != null && Map.class.isAssignableFrom((Class)genericFieldType)){ - generateWrappedSchemaTypeForMap(sequence, genericFieldType, propertyName); - - } - if (genericFieldType != null - && Collection.class - .isAssignableFrom((Class) genericFieldType)) { - generateWrappedSchemaTypeForCollection( - sequence, genericFieldType, - propertyName); - } else { - generateSchemaforFieldsandProperties(xmlSchema, + if(genericFieldType != null && Map.class.isAssignableFrom((Class) genericFieldType)){ + generateWrappedSchemaTypeForMap(sequence, genericFieldType, propertyName); + + } + if (genericFieldType != null + && Collection.class + .isAssignableFrom((Class) genericFieldType)) { + generateWrappedSchemaTypeForCollection( + sequence, genericFieldType, + propertyName); + }else if (genericFieldType!=null && Enum.class.isAssignableFrom((Class)genericFieldType)) { + generateWrappedSchemaTypeForEnum(sequence , propertyName ,(Class)genericFieldType , false ); + }else { + generateSchemaforFieldsandProperties(xmlSchema, sequence, property.getPropertyType(), propertyName, - property.getPropertyType().isArray()); - } + property.getPropertyType().isArray()); + } } } } @@ -2041,4 +2065,96 @@ public class DefaultSchemaGenerator impl sequence.getItems().add(entryElement); } + + + /** + * Generate wrapped schema type for Enum. + * + * @param sequence the sequence + * @param methodParameterType the generic parameter type + * @param parameterName the parameter name + * @throws Exception the exception + */ + private void generateWrappedSchemaTypeForEnum(XmlSchemaSequence sequence, + String parameterName , Class<?> methodParameterType , boolean isArray) throws Exception { + //generateSchemaTypeForMap(sequence, genericParameterType, parameterName, false); + generateSchemaTypeForEnum(sequence , parameterName, isArray , methodParameterType); + } + + + /** + * Generate schema type for Enum. + * + * @param sequence the sequence + * @param classType the generic parameter type + * @param parameterName the parameter name + * @param isArrayType parameter is an array or not + * @return the q name + * @throws Exception the exception + */ + private QName generateSchemaTypeForEnum(XmlSchemaSequence sequence, + String parameterName, boolean isArrayType , Class<?> classType) { + if(Enum.class .isAssignableFrom(classType)){ + XmlSchema xmlSchema = getXmlSchema(Constants.AXIS2_ENUM_NAMESPACE_URI); + String targetNamespacePrefix = targetNamespacePrefixMap + .get(Constants.AXIS2_ENUM_NAMESPACE_URI); +// String enumName = generateUniqueNameForEnum(); + String enumClass = classType.getName().substring( + classType.getName().lastIndexOf("$")+1 , classType.getName().length()); + //String enumInstanceName = generateUniqueNameForEnumInstance(enumClass); + QName enumQname = new QName(Constants.AXIS2_ENUM_NAMESPACE_URI, + enumClass, targetNamespacePrefix); + // check weather this enum class have already added to schema + if(typeTable.getSimpleTypeEnum(classType.getName())==null){ + XmlSchemaSimpleType simpleType = new XmlSchemaSimpleType(xmlSchema); + simpleType.setName(enumClass); + XmlSchemaSimpleTypeRestriction restriction = new XmlSchemaSimpleTypeRestriction(); + restriction.setBaseTypeName(Constants.XSD_STRING); + List enumList = Arrays.asList(classType.getEnumConstants()); + for(Object enumObj : enumList){ // add all enum constants to restriction facet + restriction.getFacets().add(new XmlSchemaEnumerationFacet(enumObj.toString(), false)); + } + simpleType.setContent(restriction); + xmlSchema.getItems().add(simpleType); // add enum to wsdl + typeTable.addSimpleTypeEnum( classType.getName() ,enumQname ); //add to typetable + } + + + XmlSchemaElement entryElement = new XmlSchemaElement(); + entryElement.setName(Constants.ENUM_ELEMENT_NAME); + entryElement.setNillable(true); + entryElement.setSchemaTypeName(enumQname); + entryElement.setQName(enumQname); + QName schemaTypeName = new QName(Constants.AXIS2_ENUM_NAMESPACE_URI, + enumClass); + addImport(getXmlSchema(schemaTargetNameSpace), schemaTypeName); + if (sequence != null) { + XmlSchemaComplexType parameterType = new XmlSchemaComplexType( + xmlSchema); + QName parameterTypeName = new QName( + Constants.AXIS2_ENUM_NAMESPACE_URI, enumClass, + targetNamespacePrefix); + XmlSchemaSequence parameterSequence = new XmlSchemaSequence(); + parameterSequence.getItems().add(entryElement); + parameterType.setParticle(parameterSequence); + + XmlSchemaElement parameterElement = new XmlSchemaElement(); + parameterElement.setName(parameterName); + if(isArrayType){ + parameterElement.setMaxOccurs(Long.MAX_VALUE); + parameterElement.setMinOccurs(0); + parameterElement.setNillable(true); + } + sequence.getItems().add(parameterElement); + parameterElement.setSchemaTypeName(parameterTypeName); + return parameterTypeName; + } +// return enumTypeName; + return enumQname; + }else{ + // if classType is not enum + return null; + } + } + } \ No newline at end of file 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=1163991&r1=1163990&r2=1163991&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 Sep 1 10:34:45 2011 @@ -44,6 +44,8 @@ public class TypeTable { private HashMap<String,QName> complexTypeMap; + private HashMap<String , QName> simpleTypeEnum; + /** * this map is used to keep the class names with the Qnames. */ @@ -59,6 +61,9 @@ public class TypeTable { //instantiated complexTypeMap = new HashMap<String,QName>(); this.qNameToClassMap = new HashMap<QName, String>(); + + // keep qname of enum + simpleTypeEnum = new HashMap<String , QName>(); } /* statically populate the simple type map - this is not likely to @@ -236,17 +241,34 @@ public class TypeTable { * Return the complex type map * @return the map with complex types */ - public Map<String,QName> getComplexSchemaMap() { - return complexTypeMap; + public Map<String,QName> getSimpleTypeEnumMap() { + return simpleTypeEnum; + } + + public void addSimpleTypeEnum(String className, QName simpleSchemaType) { + simpleTypeEnum.put(className, simpleSchemaType); } - public void addComplexSchema(String name, QName schemaType) { - complexTypeMap.put(name, schemaType); + public QName getSimpleTypeEnum(String className) { + return (QName) simpleTypeEnum.get(className); } - public QName getComplexSchemaType(String name) { - return (QName) complexTypeMap.get(name); - } + /** + * Return the complex type map + * @return the map with complex types + */ + public Map<String,QName> getComplexSchemaMap() { + return complexTypeMap; + } + + public void addComplexSchema(String name, QName schemaType) { + complexTypeMap.put(name, schemaType); + } + + public QName getComplexSchemaType(String name) { + return (QName) complexTypeMap.get(name); + } + /** * Gets the class name for QName.