dims 02/05/10 08:24:31 Modified: java/src/org/apache/axis/encoding/ser BeanDeserializer.java ElementDeserializer.java java/src/org/apache/axis/message RPCHandler.java java/test/wsdl/extensibility ExtensibilityQueryBindingImpl.java ExtensibilityQueryTestCase.java server-deploy.wsdd Log: "minor patches to xsd:any support" from "Thomas Sandholm" <[EMAIL PROTECTED]> Revision Changes Path 1.24 +8 -3 xml-axis/java/src/org/apache/axis/encoding/ser/BeanDeserializer.java Index: BeanDeserializer.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/BeanDeserializer.java,v retrieving revision 1.23 retrieving revision 1.24 diff -u -r1.23 -r1.24 --- BeanDeserializer.java 7 May 2002 16:08:49 -0000 1.23 +++ BeanDeserializer.java 10 May 2002 15:24:31 -0000 1.24 @@ -92,6 +92,8 @@ Class javaType; protected HashMap propertyMap = new HashMap(); protected QName prevQName; + + public static final String DESERIALIZE_ANY = "DeserializeAny"; /** Type metadata about this class for XML deserialization */ protected TypeDesc typeDesc = null; @@ -212,14 +214,17 @@ Deserializer dSer = null; MessageContext messageContext = context.getMessageContext(); if (propDesc == null && !messageContext.isEncoded()) { - // try to put unknown elements into an Object[] property + // try to put unknown elements into an Object property propDesc = getObjectPropertyDesc(elemQName, context); if (propDesc != null) { - dSer = context.getDeserializerForType(elemQName); + Boolean deserializeAny = (Boolean) messageContext.getProperty(DESERIALIZE_ANY); + if ((deserializeAny != null) && (deserializeAny.booleanValue())) { + dSer = context.getDeserializerForType(elemQName); + } if (dSer == null) { qn = Constants.XSD_ANYTYPE; // make sure that the Element Deserializer deserializes the current element and not the child - messageContext.setProperty("DeserializeCurrentElement", Boolean.TRUE); + messageContext.setProperty(ElementDeserializer.DESERIALIZE_CURRENT_ELEMENT, Boolean.TRUE); } else { qn = elemQName; } 1.5 +5 -2 xml-axis/java/src/org/apache/axis/encoding/ser/ElementDeserializer.java Index: ElementDeserializer.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/ElementDeserializer.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- ElementDeserializer.java 7 May 2002 16:08:50 -0000 1.4 +++ ElementDeserializer.java 10 May 2002 15:24:31 -0000 1.5 @@ -92,6 +92,9 @@ protected static Log log = LogFactory.getLog(ElementDeserializer.class.getName()); + public static final String DESERIALIZE_CURRENT_ELEMENT = "DeserializeCurrentElement"; + public static final String SERIALIZE_CURRENT_ELEMENT = "SerializeCurrentElement"; + public final void onEndElement(String namespace, String localName, DeserializationContext context) throws SAXException @@ -100,10 +103,10 @@ MessageElement msgElem = context.getCurElement(); if ( msgElem != null ) { MessageContext messageContext = context.getMessageContext(); - Boolean currentElement = (Boolean) messageContext.getProperty("DeserializeCurrentElement"); + Boolean currentElement = (Boolean) messageContext.getProperty(DESERIALIZE_CURRENT_ELEMENT); if (currentElement != null && currentElement.booleanValue()) { value = msgElem.getAsDOM(); - messageContext.setProperty("SerializeCurrentElement", Boolean.FALSE); + messageContext.setProperty(SERIALIZE_CURRENT_ELEMENT, Boolean.FALSE); return; } ArrayList children = msgElem.getChildren(); 1.38 +6 -4 xml-axis/java/src/org/apache/axis/message/RPCHandler.java Index: RPCHandler.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/RPCHandler.java,v retrieving revision 1.37 retrieving revision 1.38 diff -u -r1.37 -r1.38 --- RPCHandler.java 9 May 2002 18:25:17 -0000 1.37 +++ RPCHandler.java 10 May 2002 15:24:31 -0000 1.38 @@ -219,10 +219,12 @@ if ((type == null) && (namespace != null) && (!namespace.equals(""))) { dser = context.getDeserializerForType(qname); } - if ((type != null) && (dser == null)) { - dser = context.getDeserializerForType(type); - } else { - dser = new DeserializerImpl(); + if (dser == null) { + if (type != null) { + dser = context.getDeserializerForType(type); + } else { + dser = new DeserializerImpl(); + } } if (dser == null) { 1.3 +86 -2 xml-axis/java/test/wsdl/extensibility/ExtensibilityQueryBindingImpl.java Index: ExtensibilityQueryBindingImpl.java =================================================================== RCS file: /home/cvs/xml-axis/java/test/wsdl/extensibility/ExtensibilityQueryBindingImpl.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- ExtensibilityQueryBindingImpl.java 8 May 2002 13:04:46 -0000 1.2 +++ ExtensibilityQueryBindingImpl.java 10 May 2002 15:24:31 -0000 1.3 @@ -8,13 +8,53 @@ import java.util.Calendar; import javax.xml.rpc.namespace.QName; + +import org.apache.axis.AxisEngine; +import org.apache.axis.server.AxisServer; +import org.apache.axis.Message; +import org.apache.axis.MessageContext; +import org.apache.axis.message.SOAPEnvelope; +import org.apache.axis.message.SOAPBodyElement; +import org.apache.axis.message.RPCParam; +import org.apache.axis.message.RPCElement; +import org.apache.axis.encoding.SerializationContextImpl; +import org.apache.axis.encoding.SerializationContext; +import org.apache.axis.encoding.DeserializationContext; +import org.apache.axis.encoding.DeserializationContextImpl; +import org.apache.axis.encoding.ser.BeanDeserializer; +import org.apache.axis.utils.XMLUtils; +import org.apache.axis.client.Call; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.w3c.dom.Element; +import org.w3c.dom.Document; +import org.w3c.dom.NodeList; +import org.w3c.dom.Node; +import org.xml.sax.InputSource; + +import javax.xml.rpc.namespace.QName; +import java.io.Reader; +import java.io.StringWriter; +import java.io.StringReader; +import java.util.Calendar; +import java.util.Vector; +import java.rmi.RemoteException; + public class ExtensibilityQueryBindingImpl implements ExtensibilityQueryBinding { private final static String[] books = new String[] { "The Grid", "The Oxford Dictionary" }; private final static String[] subjects = new String[] { "Computer Science", "English" }; - public ExtensibilityType query(ExtensibilityType query) throws java.rmi.RemoteException { + public ExtensibilityType query(ExtensibilityType query) throws RemoteException { ExtensibilityType result = new ExtensibilityType(); - Object obj = query.getAny(); + Element element = (Element) query.getAny(); + Object obj = null; + try { + obj = ObjectSerializer.toObject(element); + } catch (Exception e) { + throw new RemoteException("Failed to deserialize any to object: " + e); + } + if (obj instanceof BookType) { BookType bookQuery = (BookType) obj; String subject = bookQuery.getSubject(); @@ -33,7 +73,51 @@ } resultList.setResult(queryResult); result.setAny(resultElement); + } else { + throw new RemoteException("Failed to get book type. Got: " + obj.getClass().getName() + ":" + obj.toString()); } return result; + } +} + +class ObjectSerializer { + + static Log logger = + LogFactory.getLog(ObjectSerializer.class.getName()); + + static Object toObject(Element element) throws Exception { + MessageContext currentContext = MessageContext.getCurrentContext(); + MessageContext messageContext = new MessageContext(currentContext.getAxisEngine()); + messageContext.setTypeMappingRegistry(currentContext.getTypeMappingRegistry()); + messageContext.setEncodingStyle(""); + messageContext.setProperty(Call.SEND_TYPE_ATTR, Boolean.FALSE); + SOAPEnvelope message = new SOAPEnvelope(); + Document doc = XMLUtils.newDocument(); + Element operationWrapper = doc.createElementNS("urn:operationNS","operation"); + doc.appendChild(operationWrapper); + Node node = doc.importNode(element,true); + operationWrapper.appendChild(node); + + message.addBodyElement(new SOAPBodyElement(operationWrapper)); + + StringWriter stringWriter = new StringWriter(); + SerializationContext context = new SerializationContextImpl(stringWriter, messageContext); + context.setDoMultiRefs(false); + message.output(context); + stringWriter.close(); + String messageString = stringWriter.getBuffer().toString(); + logger.debug(messageString); + Reader reader = new StringReader(messageString); + messageContext.setProperty(BeanDeserializer.DESERIALIZE_ANY, Boolean.TRUE); + DeserializationContext deserializer = new DeserializationContextImpl(new InputSource(reader), + messageContext, + Message.REQUEST); + deserializer.parse(); + SOAPEnvelope env = deserializer.getEnvelope(); + + RPCElement rpcElem = (RPCElement)env.getFirstBody(); + Vector parameters = rpcElem.getParams(); + RPCParam param = (RPCParam) parameters.get(0); + return param.getValue(); } } 1.3 +3 -0 xml-axis/java/test/wsdl/extensibility/ExtensibilityQueryTestCase.java Index: ExtensibilityQueryTestCase.java =================================================================== RCS file: /home/cvs/xml-axis/java/test/wsdl/extensibility/ExtensibilityQueryTestCase.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- ExtensibilityQueryTestCase.java 8 May 2002 13:04:46 -0000 1.2 +++ ExtensibilityQueryTestCase.java 10 May 2002 15:24:31 -0000 1.3 @@ -10,9 +10,11 @@ import org.apache.axis.EngineConfiguration; import org.apache.axis.AxisEngine; import org.apache.axis.client.AdminClient; +import org.apache.axis.client.Stub; import org.apache.axis.encoding.TypeMappingRegistry; import org.apache.axis.encoding.ser.BeanSerializerFactory; import org.apache.axis.encoding.ser.BeanDeserializerFactory; +import org.apache.axis.encoding.ser.BeanDeserializer; import javax.xml.rpc.encoding.TypeMapping; import javax.xml.rpc.namespace.QName; @@ -45,6 +47,7 @@ book.setSubject("all"); bookQuery.setBookQuery(book); expression.setAny(bookQuery); + ((Stub)binding)._setProperty(BeanDeserializer.DESERIALIZE_ANY, Boolean.TRUE); ExtensibilityType any = binding.query(expression); ResultListType result = (ResultListType) any.getAny(); QueryResultType[] queryResult = result.getResult(); 1.3 +9 -7 xml-axis/java/test/wsdl/extensibility/server-deploy.wsdd Index: server-deploy.wsdd =================================================================== RCS file: /home/cvs/xml-axis/java/test/wsdl/extensibility/server-deploy.wsdd,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- server-deploy.wsdd 8 May 2002 13:04:46 -0000 1.2 +++ server-deploy.wsdd 10 May 2002 15:24:31 -0000 1.3 @@ -34,13 +34,6 @@ encodingStyle="" /> - <typeMapping - qname="query:bookQuery" - type="java:test.wsdl.extensibility.BookType" - serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" - deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" - encodingStyle="" - /> <typeMapping qname="query:QueryResultElement" @@ -65,6 +58,15 @@ deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="" /> + + <typeMapping + qname="query:bookQuery" + type="java:test.wsdl.extensibility.BookType" + serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" + deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" + encodingStyle="" + /> </service> + </deployment>