Sorry about all the whitespace stuff in there, guys - I must have hit something inappropriate on my IDE.
> -----Original Message----- > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]] > Sent: Wednesday, February 20, 2002 11:28 PM > To: [EMAIL PROTECTED] > Subject: cvs commit: xml-axis/java/test/encoding TestDOM.java > TestSer.java > > > gdaniels 02/02/20 20:28:27 > > Modified: java/src/org/apache/axis/encoding > SerializationContextImpl.java > java/src/org/apache/axis/message MessageElement.java > RPCElement.java > java/test/encoding TestDOM.java TestSer.java > Log: > Bulletproof SerializationContextImpl a little more by > always using the > default TypeMapping even if there's no MessageContext at all. > > Add a unit test which exercises toString() on an RPCElement > which was > dynamically created and therefore has no current MessageContext. > > Revision Changes Path > 1.7 +63 -62 > xml-axis/java/src/org/apache/axis/encoding/SerializationContex > tImpl.java > > Index: SerializationContextImpl.java > =================================================================== > RCS file: > /home/cvs/xml-axis/java/src/org/apache/axis/encoding/Serializa > tionContextImpl.java,v > retrieving revision 1.6 > retrieving revision 1.7 > diff -u -r1.6 -r1.7 > --- SerializationContextImpl.java 19 Feb 2002 17:38:19 > -0000 1.6 > +++ SerializationContextImpl.java 21 Feb 2002 04:28:26 > -0000 1.7 > @@ -141,19 +141,19 @@ > > /** > * These three variables are necessary to process > multi-level object graphs for multi-ref > - * serialization. > - * While writing out nested multi-ref objects (via > outputMultiRef), we > + * serialization. > + * While writing out nested multi-ref objects (via > outputMultiRef), we > * will fill the secondLevelObjects vector with any > new objects encountered. > * The outputMultiRefsFlag indicates whether we are > currently within the > - * outputMultiRef() method (so that serialization() > knows to update the > + * outputMultiRef() method (so that serialization() > knows to update the > * secondLevelObjects vector). > * The forceSer variable is the trigger to force > actual serialization of the indicated object. > */ > private HashSet secondLevelObjects = null; > private Object forceSer = null; > private boolean outputMultiRefsFlag = false; > - > - /** > + > + /** > * Construct SerializationContextImpl with associated writer > * @param writer java.io.Writer > */ > @@ -161,9 +161,9 @@ > { > this.writer = writer; > } > - > - > - /** > + > + > + /** > * Construct SerializationContextImpl with associated > writer and MessageContext > * @param writer java.io.Writer > * @param msgContext is the MessageContext > @@ -180,14 +180,14 @@ > > AxisEngine.PROP_XML_DECL); > if (shouldSendDecl != null) > sendXMLDecl = shouldSendDecl.booleanValue(); > - > - Boolean shouldSendMultiRefs = > + > + Boolean shouldSendMultiRefs = > > (Boolean)msgContext.getProperty(AxisEngine.PROP_DOMULTIREFS); > - > + > if (shouldSendMultiRefs == null) > shouldSendMultiRefs = > > (Boolean)engine.getOption(AxisEngine.PROP_DOMULTIREFS); > - > + > if (shouldSendMultiRefs != null) > doMultiRefs = shouldSendMultiRefs.booleanValue(); > > @@ -196,7 +196,7 @@ > // Only turn this off is the user tells us to > if ( > !msgContext.isPropertyTrue(Call.SEND_TYPE_ATTR, true )) > sendXSIType = false ; > - > + > Boolean opt = > (Boolean)engine.getOption(AxisEngine.PROP_SEND_XSI); > if ((opt != null) && (opt.equals(Boolean.FALSE))) { > sendXSIType = false; > @@ -219,10 +219,10 @@ > public void setPretty(boolean pretty) { > this.pretty = pretty; > } > - > + > /** > * Set whether we are doing multirefs > - */ > + */ > public void setDoMultiRefs (boolean shouldDo) > { > doMultiRefs = shouldDo; > @@ -231,7 +231,7 @@ > /** > * Set whether or not we should write XML declarations. > * @param sendDecl true/false > - */ > + */ > public void setSendDecl(boolean sendDecl) > { > sendXMLDecl = sendDecl; > @@ -240,7 +240,7 @@ > /** > * Get whether or not to write xsi:type attributes. > * @return true/false > - */ > + */ > public boolean shouldSendXSIType() { > return sendXSIType; > } > @@ -248,21 +248,22 @@ > /** > * Get the TypeMapping we're using. > * @return TypeMapping or null > - */ > + */ > public TypeMapping getTypeMapping() > { > + // Always allow the default mappings > if (msgContext == null) > - return null; > - > + return DefaultTypeMappingImpl.create(); > + > return (TypeMapping) > msgContext.getTypeMappingRegistry().getTypeMapping(Constants.U > RI_CURRENT_SOAP_ENC); > } > > /** > * Get the TypeMappingRegistry we're using. > * @return TypeMapping or null > - */ > + */ > public TypeMappingRegistry getTypeMappingRegistry() { > - if (msgContext == null) > + if (msgContext == null) > return null; > return (TypeMappingRegistry) > msgContext.getTypeMappingRegistry(); > } > @@ -275,18 +276,18 @@ > * "ns<num>". > * @param uri is the namespace uri > * @return prefix > - */ > + */ > public String getPrefixForURI(String uri) > { > return getPrefixForURI(uri, null); > } > - > + > /** > * Get a prefix for the given namespace URI. If one > has already been > * defined in this serialization, use that. > Otherwise, map the passed > * default prefix to the URI, and return that. If a > null default prefix > * is passed, use one of the form "ns<num>" > - */ > + */ > public String getPrefixForURI(String uri, String defaultPrefix) > { > if ((uri == null) || (uri.equals(""))) > @@ -329,7 +330,7 @@ > > /** > * Return the current message > - */ > + */ > public Message getCurrentMessage() > { > if (msgContext == null) > @@ -369,7 +370,7 @@ > /** > * Indicates whether the object should be interpretted > as a primitive > * for the purposes of multi-ref processing. A primitive value > - * is serialized directly instead of using id/href > pairs. Thus > + * is serialized directly instead of using id/href pairs. Thus > * primitive serialization/deserialization is slightly faster. > * @param value to be serialized > * @param javaType is the "real" java type of value. > Used to distinguish > @@ -387,7 +388,7 @@ > if (Hex.class.isAssignableFrom(javaType)) return true; > if (Element.class.isAssignableFrom(javaType)) return true; > if (byte[].class.isAssignableFrom(javaType)) return true; > - > + > // There has been discussion as to whether arrays > themselves should > // be regarded as multi-ref. > // Here are the three options: > @@ -397,9 +398,9 @@ > // 2) Arrays are not full-fledged Objects and > therefore should > // always be passed as single ref (note the > elements of the array > // may be multi-ref'd.) (Pro: This seems > reasonable, if a user > - // wants multi-referencing put the array in a > container. Also > + // wants multi-referencing put the array in a > container. Also > // is more interop compatible. Con: Not like > java serialization.) > - // 3) Arrays of primitives should be single ref, > and arrays of > + // 3) Arrays of primitives should be single ref, > and arrays of > // non-primitives should be multi-ref. (Pro: > Takes care of the > // looping case. Con: Seems like an obtuse rule.) > // > @@ -409,7 +410,7 @@ > // Note that java.lang wrapper classes (i.e. > java.lang.Integer) are > // not primitives unless the corresponding type is > an xsd type. > // (If the wrapper maps to a soap encoded > primitive, it can be nillable > - // and multi-ref'd). > + // and multi-ref'd). > QName qName = getQNameForClass(javaType); > if (qName != null && > Constants.isSchemaXSD(qName.getNamespaceURI())) { > if (qName.equals(Constants.XSD_BOOLEAN) || > @@ -421,7 +422,7 @@ > qName.equals(Constants.XSD_BYTE) || > qName.equals(Constants.XSD_STRING) || > qName.equals(Constants.XSD_INTEGER) || > - qName.equals(Constants.XSD_DECIMAL)) { > + qName.equals(Constants.XSD_DECIMAL)) { > return true; > } > } > @@ -430,7 +431,7 @@ > } > > /** > - * Serialize the indicated value as an element named > qName. The attributes object are > + * Serialize the indicated value as an element named > qName. The attributes object are > * additional attributes that will be serialized with > the qName. The value > * could be serialized directly or could be serialized > as an href (with the > * actual serialize taking place later) > @@ -438,7 +439,7 @@ > * @param attributes are additional attributes > * @param value is the object to serialize > * @param javaType is the "real" type of the value. > For primitives, the value is the > - * associated java.lang class. So the javaType is > needed to know that the value > + * associated java.lang class. So the javaType is > needed to know that the value > * is really a wrapped primitive. > */ > public void serialize(QName qName, Attributes > attributes, Object value, Class javaType) > @@ -471,7 +472,7 @@ > > //Allow an the attachment to do its own serialization. > serializeActual(qName, attributes, value, javaType); > - > + > //No need to add to mulitRefs. Attachment > data stream handled by > // the message; > return; > @@ -480,7 +481,7 @@ > > // If multi-reference is enabled and this object > value is not a primitive > // and we are not forcing serialization of the > object, then generate > - // an element href (and store the object for > subsequent outputMultiRef > + // an element href (and store the object for > subsequent outputMultiRef > // processing. > if (doMultiRefs && (value != forceSer) && > !isPrimitive(value, javaType)) { > if (multiRefIndex == -1) > @@ -545,7 +546,7 @@ > // explicitly state that this attribute is not a root > String prefix = > getPrefixForURI(Constants.URI_CURRENT_SOAP_ENC); > String root = prefix + ":root"; > - attrs.addAttribute(Constants.URI_CURRENT_SOAP_ENC, > Constants.ATTR_ROOT, root, > + attrs.addAttribute(Constants.URI_CURRENT_SOAP_ENC, > Constants.ATTR_ROOT, root, > "CDATA", "0"); > > Iterator i = > ((HashMap)multiRefValues.clone()).keySet().iterator(); > @@ -556,8 +557,8 @@ > attrs.setAttribute(0, "", > Constants.ATTR_ID, "id", "CDATA", > id); > forceSer = val; > - // Now serialize the value. Note that it > is safe to > - // set the javaType argument using > value.getClass() because > + // Now serialize the value. Note that it > is safe to > + // set the javaType argument using > value.getClass() because > // values that represent primitives will > never get to this point > // because they cannot be multi-ref'ed > serialize(multirefQName, attrs, val, > val.getClass()); > @@ -743,7 +744,7 @@ > writeString(XMLUtils.xmlEncodeString(string)); > } > > - /** > + /** > * Output a DOM representation to a SerializationContext > * @param el is a DOM Element > */ > @@ -802,11 +803,11 @@ > * java type > * @param javaType is Class for a type to serialize > * @return Serializer > - */ > + */ > public final Serializer getSerializerForJavaType(Class > javaType) { > SerializerFactory dserF = null; > Serializer dser = null; > - try { > + try { > dserF = (SerializerFactory) > getTypeMapping().getSerializer(javaType); > } catch (JAXRPCException e) { > } > @@ -832,11 +833,11 @@ > (attributes.getIndex(Constants.URI_CURRENT_SCHEMA_XSI, > "type") != -1))) > return attributes; > - > + > AttributesImpl attrs = new AttributesImpl(); > if (attributes != null) > attrs.setAttributes(attributes); > - > + > String prefix = > getPrefixForURI(Constants.URI_CURRENT_SCHEMA_XSI, > "xsi"); > > @@ -846,15 +847,15 @@ > "CDATA", qName2String(type)); > return attrs; > } > - > + > /** > * Invoked to do the actual serialization of the qName > (called by serialize above). > - * additional attributes that will be serialized with > the qName. > + * additional attributes that will be serialized with > the qName. > * @param qName is the QName of the element > * @param attributes are additional attributes > * @param value is the object to serialize > * @param javaType is the "real" type of the value. > For primitives, the value is the > - * associated java.lang class. So the javaType is > needed to know that the value > + * associated java.lang class. So the javaType is > needed to know that the value > * is really a wrapped primitive. > */ > public void serializeActual(QName name, Attributes > attributes, Object value, Class javaType) > @@ -862,7 +863,7 @@ > { > if (value != null) { > TypeMapping tm = getTypeMapping(); > - > + > if (tm == null) { > throw new > IOException(JavaUtils.getMessage("noSerializer00", > > value.getClass().getName(), "" + this)); > @@ -874,7 +875,7 @@ > attributes = setTypeAttribute(attributes, type); > > // The multiref QName is our own fake name. > - // It may be beneficial to set the name to the > + // It may be beneficial to set the name to the > // type name, but I didn't see any improvements > // in the interop tests. > //if (name.equals(multirefQName) && type != null) > @@ -895,7 +896,7 @@ > } > /** > * getSerializer > - * Attempts to get a serializer for the indicated > type. Failure to > + * Attempts to get a serializer for the indicated > type. Failure to > * find a serializer causes the code to look backwards > through the > * inheritance list. Continued failured results in an > attempt to find > * a serializer for the type of the value. > @@ -907,43 +908,43 @@ > Class_Serializer pair = null; > SerializerFactory serFactory = null ; > TypeMapping tm = getTypeMapping(); > - > - // Classes is a list of the inherited interfaces to > + > + // Classes is a list of the inherited interfaces to > // check > ArrayList classes = null; > boolean firstPass = true; > - > + > // Search for a class that has a serializer factory > - Class _class = javaType; > + Class _class = javaType; > while( _class != null ) { > try { > serFactory = (SerializerFactory) > tm.getSerializer(_class); > } catch(JAXRPCException e) { > // For now continue if JAXRPCException > } > - if (serFactory != null) { > + if (serFactory != null) { > break ; > } > if ( classes == null ) { > classes = new ArrayList(); > } > Class[] ifaces = _class.getInterfaces(); > - for (int i = 0 ; i < ifaces.length ; i++ ) { > + for (int i = 0 ; i < ifaces.length ; i++ ) { > classes.add( ifaces[i] ); > } > _class = _class.getSuperclass(); > - > + > // Add any non-null (and non-Object) class. We skip > // the Object class because if we reach that then > - // there's an error and this error message return > + // there's an error and this error message return > // here is better than the one returned by the > // ObjSerializer. > if ( _class != null && > !_class.getName().equals("java.lang.Object")) { > classes.add( _class ); > } > - > - _class = (!classes.isEmpty()) ? > + > + _class = (!classes.isEmpty()) ? > (Class) classes.remove( 0 ) : > null; > > @@ -957,7 +958,7 @@ > _class = value.getClass(); > } > } > - > + > // Using the serialization factory, create a serializer and > // serialize the value. > Serializer ser = null; > @@ -972,7 +973,7 @@ > pair.ser = ser; > pair.javaType = _class; > } > - return pair; > + return pair; > } > > } > > > > 1.76 +1 -0 > xml-axis/java/src/org/apache/axis/message/MessageElement.java > > Index: MessageElement.java > =================================================================== > RCS file: > /home/cvs/xml-axis/java/src/org/apache/axis/message/MessageEle > ment.java,v > retrieving revision 1.75 > retrieving revision 1.76 > diff -u -r1.75 -r1.76 > --- MessageElement.java 21 Feb 2002 04:01:48 -0000 1.75 > +++ MessageElement.java 21 Feb 2002 04:28:26 -0000 1.76 > @@ -432,6 +432,7 @@ > msgContext = MessageContext.getCurrentContext(); > } > serializeContext = new > SerializationContextImpl(writer, msgContext); > + serializeContext.setSendDecl(false); > output(serializeContext); > writer.close(); > > > > > 1.34 +1 -1 > xml-axis/java/src/org/apache/axis/message/RPCElement.java > > Index: RPCElement.java > =================================================================== > RCS file: > /home/cvs/xml-axis/java/src/org/apache/axis/message/RPCElement.java,v > retrieving revision 1.33 > retrieving revision 1.34 > diff -u -r1.33 -r1.34 > --- RPCElement.java 20 Feb 2002 20:22:07 -0000 1.33 > +++ RPCElement.java 21 Feb 2002 04:28:27 -0000 1.34 > @@ -77,7 +77,7 @@ > protected boolean needDeser = false; > > // encoding style to put in soap body element > - protected String encodingStyle = null; > + protected String encodingStyle = > Constants.URI_CURRENT_SOAP_ENC; > > public RPCElement(String namespace, String localName, > String prefix, > Attributes attributes, > DeserializationContext context) > > > > 1.9 +3 -47 xml-axis/java/test/encoding/TestDOM.java > > Index: TestDOM.java > =================================================================== > RCS file: /home/cvs/xml-axis/java/test/encoding/TestDOM.java,v > retrieving revision 1.8 > retrieving revision 1.9 > diff -u -r1.8 -r1.9 > --- TestDOM.java 4 Dec 2001 16:01:03 -0000 1.8 > +++ TestDOM.java 21 Feb 2002 04:28:27 -0000 1.9 > @@ -21,93 +21,50 @@ > > public class TestDOM extends TestCase { > > - > - > public TestDOM(String name) { > - > super(name); > - > } > > - > - > private String request = > - > "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + > - > "<SOAP-ENV:Envelope" + > - > " > SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encod > ing/\"" + > - > " > xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"" + > - > " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"" + > - > " > xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" + > - > " <SOAP-ENV:Header>\n" + > - > " <SOAP-SEC:signature SOAP-ENV:actor=\"null\" > SOAP-ENV:mustUnderstand=\"1\"" + > - > " > xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"" + > - > " > xmlns:SOAP-SEC=\"http://schemas.xmlsoap.org/soap/security/\">\n" + > - > " <Signature > xmlns=\"http://www.w3.org/2000/09/xmldsig#\">\n" + > - > " </Signature>\n" + > - > " </SOAP-SEC:signature>\n" + > - > " </SOAP-ENV:Header>\n" + > - > " <SOAP-ENV:Body id=\"body\">\n" + > - > " <ns1:getQuote > xmlns:ns1=\"urn:xmltoday-delayed-quotes\">\n" + > - > " <symbol xsi:type=\"xsd:string\">IBM</symbol>\n" + > - > " </ns1:getQuote>\n" + > - > " </SOAP-ENV:Body>\n" + > - > "</SOAP-ENV:Envelope>"; > > - > - > public void testDOM() throws Exception { > > - > - > // setup > - > AxisEngine engine = new AxisServer(); > - > engine.init(); > - > MessageContext msgContext = new MessageContext(engine); > - > Message message = new Message(request); > - > message.setMessageContext(msgContext); > > - > - > // Now completely round trip it > - > SOAPEnvelope envelope = > message.getSOAPPart().getAsSOAPEnvelope(); > - > // Element dom = message.getAsDOM(); > - > String result = message.getSOAPPart().getAsString(); > > - > - > assertEquals("Request is not the same as the > result.", request, result); > - > } > - > - public void testEmptyNode() throws Exception > + > + public void testEmptyNode() throws Exception > { > SOAPBodyElement body = new > SOAPBodyElement(XMLUtils.newDocument().createElement("tmp")); > assertEquals("<tmp/>",body.toString()); > @@ -120,7 +77,7 @@ > SOAPBodyElement body = new SOAPBodyElement(element); > assertEquals("<tmp attrib=\"foo\"/>",body.toString()); > } > - > + > public static void main(String [] args) throws Exception > { > TestDOM tester = new TestDOM("TestDOM"); > @@ -128,6 +85,5 @@ > tester.testEmptyNode(); > tester.testDOM(); > } > - > } > > > > > 1.21 +16 -0 xml-axis/java/test/encoding/TestSer.java > > Index: TestSer.java > =================================================================== > RCS file: /home/cvs/xml-axis/java/test/encoding/TestSer.java,v > retrieving revision 1.20 > retrieving revision 1.21 > diff -u -r1.20 -r1.21 > --- TestSer.java 19 Feb 2002 17:38:22 -0000 1.20 > +++ TestSer.java 21 Feb 2002 04:28:27 -0000 1.21 > @@ -101,4 +101,20 @@ > assertEquals("Data and Val float members are not > equal",data.floatMember.floatValue(), > val.floatMember.floatValue(), 0.00001F); > } > + > + /** > + * Test RPC element serialization when we have no > MessageContext > + */ > + public void testRPCElement() throws Exception > + { > + SOAPEnvelope env = new SOAPEnvelope(); > + RPCElement method = new RPCElement("ns", > + "method", > + new Object [] { > "argument" }); > + env.addBodyElement(method); > + String soapStr = env.toString(); > + > + // If there was no exception, we succeeded in > serializing it. > + } > + > } > > > >