You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by gd...@apache.org on 2001/08/14 05:49:19 UTC
cvs commit: xml-axis/java/test/encoding TestDeser.java TestHrefs.java TestSer.java
gdaniels 01/08/13 20:49:19
Modified: java/docs install.html
java/src/org/apache/axis Message.java
java/src/org/apache/axis/encoding
DeserializationContext.java Deserializer.java
SerializationContext.java TypeMappingRegistry.java
java/src/org/apache/axis/message BodyBuilder.java
EnvelopeBuilder.java HeaderBuilder.java
MessageElement.java RPCElement.java
SAX2EventRecorder.java SOAPEnvelope.java
SOAPHandler.java
java/src/org/apache/axis/utils NSStack.java
java/test/RPCDispatch TestRPC.java
java/test/encoding TestDeser.java TestHrefs.java
TestSer.java
Added: java/src/org/apache/axis/utils Mapping.java
Log:
Now that the alpha has been branched.....
Some fairly major changes to the parsing/deserialization code.
The main thrust is decoupling deserialization from the creation of
a MessageElement-based object model for the XML.
* MessageElements are now created for every XML element, and
they keep track of their namespace mappings. The
functionality that was only in NSStack before is now replicated
in MessageElement, with the elements searching local mappings
for a prefix/URI, and asking their parent if it's not found.
* Keep track of the "current element" in DeserializationContext,
and look for namespace mappings from there.
* Deserialization is no longer automatic during the initial
parse - rather we can parse into MessageElements, record the
whole message, and then deserialize at the point someone asks
for an RPCElement's params. This should help the digsig guys,
although the general architecture needs another cleaning /
optimization pass.
* SAX2Recorder now records a "dummy" event, which indicates
when the "current element" in a DeserializationContext should
change. If the record is playing the events back, it checks
to see if the target handler is a DeserializationContext, and
if so, it feeds it the current element events, so it can
correctly accomplish namespace mappings during deserialization
after the "normal" NSStack is long empty.
* Default SOAPHandler behaviour is to make MessageElements,
assuming we're in the middle of a parse.
* Pull out Mapping into its own class (used to be inside
NSSTack)
* Use DeserializationContext.parse() in Message.java
Revision Changes Path
1.8 +2 -2 xml-axis/java/docs/install.html
Index: install.html
===================================================================
RCS file: /home/cvs/xml-axis/java/docs/install.html,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- install.html 2001/08/13 18:58:58 1.7
+++ install.html 2001/08/14 03:49:18 1.8
@@ -180,9 +180,9 @@
the distribution directory for xml-axis and execute the following
command:
<blockquote><code>java samples.stock.GetQuote -lhttp://localhost:8080/axis/servlet/AxisServlet
- -uuser1 -wpass1 IBM</code></blockquote>
+ -uuser1 -wpass1 XXX</code></blockquote>
</li>
-
+ <li>You should get back "55.25" as a result.</li>
</ul>
<p><span class="note">Note:</span>
1.42 +2 -5 xml-axis/java/src/org/apache/axis/Message.java
Index: Message.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/Message.java,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -r1.41 -r1.42
--- Message.java 2001/07/21 15:36:01 1.41
+++ Message.java 2001/08/14 03:49:18 1.42
@@ -307,20 +307,17 @@
} else {
is = new InputSource(new StringReader(getAsString()));
}
- SAXParser parser = XMLUtils.getSAXParser();
DeserializationContext dser =
- new DeserializationContext(msgContext, messageType);
+ new DeserializationContext(is, msgContext, messageType);
// This may throw a SAXException
try {
- parser.parse(is, dser);
+ dser.parse();
} catch (SAXException e) {
Exception real = e.getException();
if (real == null)
real = e;
throw new AxisFault(real);
- } catch (IOException ioe) {
- throw new AxisFault(ioe);
}
setCurrentMessage(dser.getEnvelope(), FORM_SOAPENVELOPE);
1.20 +58 -17 xml-axis/java/src/org/apache/axis/encoding/DeserializationContext.java
Index: DeserializationContext.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/DeserializationContext.java,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- DeserializationContext.java 2001/08/10 13:08:22 1.19
+++ DeserializationContext.java 2001/08/14 03:49:18 1.20
@@ -117,24 +117,38 @@
protected HandlerFactory initialFactory;
- protected boolean doneParsing = false;
+ public boolean doneParsing = false;
protected InputSource inputSource = null;
- public DeserializationContext(MessageContext ctx, String messageType)
+ public DeserializationContext(MessageContext ctx, EnvelopeBuilder initialHandler)
{
msgContext = ctx;
- envelope = new SOAPEnvelope();
+ envelope = initialHandler.getEnvelope();
envelope.setRecorder(recorder);
- envelope.setMessageType(messageType);
- pushElementHandler(new EnvelopeHandler(new EnvelopeBuilder()));
+ pushElementHandler(new EnvelopeHandler(initialHandler));
}
+ MessageElement curElement;
+
+ public void setCurElement(MessageElement el)
+ {
+ curElement = el;
+ }
+
public DeserializationContext(InputSource is, MessageContext ctx,
String messageType)
{
- this(ctx, messageType);
+ EnvelopeBuilder builder = new EnvelopeBuilder(messageType);
+
+ msgContext = ctx;
+
+ envelope = builder.getEnvelope();
+ envelope.setRecorder(recorder);
+
+ pushElementHandler(new EnvelopeHandler(builder));
+
inputSource = is;
}
@@ -166,10 +180,18 @@
return recorder;
}
+ public ArrayList getCurrentNSMappings()
+ {
+ return (ArrayList)namespaces.peek().clone();
+ }
+
/** Grab a namespace prefix
*/
public String getNamespaceURI(String prefix)
{
+ if (curElement != null)
+ return curElement.getNamespaceURI(prefix);
+
return namespaces.getNamespaceURI(prefix);
}
@@ -189,7 +211,7 @@
//System.out.println("namespace = " + nsURI);
if (nsURI == null)
- return null; // ???
+ return null;
return new QName(nsURI, qNameStr.substring(i + 1));
}
@@ -312,12 +334,22 @@
public int getStartOfMappingsPos()
{
if (startOfMappingsPos == -1) {
- return getCurrentRecordPos();
+ return getCurrentRecordPos() + 1;
}
return startOfMappingsPos;
}
+ public void pushNewElement(MessageElement elem)
+ {
+ if (recorder != null) {
+ recorder.newElement(elem);
+ }
+
+ elem.setParent(curElement);
+ curElement = elem;
+ }
+
/****************************************************************
* Management of sub-handlers (deserializers)
*/
@@ -384,6 +416,8 @@
}
if (recorder != null)
recorder.endDocument();
+
+ doneParsing = true;
}
/** Record the current set of prefix mappings in the nsMappings table.
@@ -485,12 +519,6 @@
localName + "]");
}
- namespaces.push();
-
- if (recorder != null)
- recorder.startElement(namespace, localName, qName,
- attributes);
-
String prefix = "";
int idx = qName.indexOf(":");
if (idx > 0)
@@ -504,14 +532,24 @@
this);
}
- if (nextHandler == null)
- nextHandler = nullHandler;
+ if (nextHandler == null) {
+ nextHandler = new SOAPHandler();
+ }
pushElementHandler(nextHandler);
-
+
nextHandler.startElement(namespace, localName, qName,
attributes, this);
+ if (recorder != null) {
+ recorder.startElement(namespace, localName, qName,
+ attributes);
+ if (!doneParsing)
+ curElement.setContentsIndex(recorder.getLength());
+ }
+
+ namespaces.push();
+
startOfMappingsPos = -1;
}
@@ -541,6 +579,9 @@
} catch (SAXException e) {
e.printStackTrace();
+ } finally {
+ if (curElement != null)
+ curElement = curElement.getParent();
}
}
}
1.10 +30 -4 xml-axis/java/src/org/apache/axis/encoding/Deserializer.java
Index: Deserializer.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/Deserializer.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- Deserializer.java 2001/07/29 13:43:24 1.9
+++ Deserializer.java 2001/08/14 03:49:18 1.10
@@ -254,6 +254,10 @@
localName,
attributes);
+ if (DEBUG_LOG) {
+ System.out.println("Deser got type : " + type);
+ }
+
// We know we're deserializing, and we can't seem to figure
// out a type... so let's give them a string.
// ??? Is this the right thing to do?
@@ -273,6 +277,14 @@
}
}
+ public SOAPHandler onStartChild(String namespace, String localName,
+ String prefix, Attributes attributes,
+ DeserializationContext context)
+ throws SAXException
+ {
+ return null;
+ }
+
public final void startElement(String namespace, String localName,
String qName, Attributes attributes,
DeserializationContext context)
@@ -294,9 +306,23 @@
}
if (ref instanceof MessageElement) {
+ /*
+ if (this.getClass().equals(Deserializer.class)) {
+ QName type = ((MessageElement)ref).getType();
+ Deserializer dser =
+ context.getTypeMappingRegistry().getDeserializer(type);
+ System.out.println("dser = " + dser);
+ if (dser != null) {
+ dser.copyValueTargets(this);
+ context.replaceElementHandler(dser);
+ }
+ }
+ */
+ context.replaceElementHandler(new EnvelopeHandler(this));
+
SAX2EventRecorder r = context.recorder;
context.recorder = null;
- ((MessageElement)ref).publishContents(context);
+ ((MessageElement)ref).publishToHandler(context);
context.recorder = r;
}
@@ -332,10 +358,10 @@
SerializationContext serContext =
new SerializationContext(writer,
context.getMessageContext());
+ serContext.setSendDecl(false);
SAXOutputter so = new SAXOutputter(serContext);
- context.getRecorder().replay(startIdx + 1,
- endIdx - 1,
- so);
+ context.curElement.publishContents(so);
+
value = writer.getBuffer().toString();
}
}
1.33 +16 -4 xml-axis/java/src/org/apache/axis/encoding/SerializationContext.java
Index: SerializationContext.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/SerializationContext.java,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -r1.32 -r1.33
--- SerializationContext.java 2001/08/09 13:37:59 1.32
+++ SerializationContext.java 2001/08/14 03:49:18 1.33
@@ -141,6 +141,11 @@
doMultiRefs = shouldSendMultiRefs.booleanValue();
}
+ public void setSendDecl(boolean sendDecl)
+ {
+ sendXMLDecl = sendDecl;
+ }
+
public ServiceDescription getServiceDescription()
{
return msgContext.getServiceDescription();
@@ -153,6 +158,11 @@
public String getPrefixForURI(String uri)
{
+ return getPrefixForURI(uri, "ns" + lastPrefixIndex++);
+ }
+
+ public String getPrefixForURI(String uri, String defaultPrefix)
+ {
if ((uri == null) || (uri.equals("")))
return null;
@@ -164,13 +174,13 @@
}
if (prefix == null) {
- prefix = "ns" + lastPrefixIndex++;
+ prefix = defaultPrefix;
registerPrefixForURI(prefix, uri);
}
return prefix;
}
-
+
public void registerPrefixForURI(String prefix, String uri)
{
if (DEBUG_LOG) {
@@ -332,7 +342,7 @@
ArrayList currentMappings = nsStack.peek();
for (int i = 0; i < currentMappings.size(); i++) {
- NSStack.Mapping map = (NSStack.Mapping)currentMappings.get(i);
+ Mapping map = (Mapping)currentMappings.get(i);
buf.append(" xmlns");
if (!map.getPrefix().equals("")) {
buf.append(":" + map.getPrefix());
@@ -424,7 +434,9 @@
for (int i = 0; i < attrMap.getLength(); i++) {
Attr attr = (Attr)attrMap.item(i);
- attributes.addAttribute("", attr.getName(), attr.getName(),
+ attributes.addAttribute(attr.getNamespaceURI(),
+ attr.getName(),
+ attr.getName(),
"CDATA", attr.getValue());
}
}
1.22 +9 -2 xml-axis/java/src/org/apache/axis/encoding/TypeMappingRegistry.java
Index: TypeMappingRegistry.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/TypeMappingRegistry.java,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- TypeMappingRegistry.java 2001/07/29 13:43:25 1.21
+++ TypeMappingRegistry.java 2001/08/14 03:49:18 1.22
@@ -218,8 +218,15 @@
if (attributes != null)
attrs.setAttributes(attributes);
- attrs.addAttribute(Constants.URI_CURRENT_SCHEMA_XSI, "type",
- "xsi:type", "CDATA", context.qName2String(type));
+ String prefix = context.
+ getPrefixForURI(Constants.URI_CURRENT_SCHEMA_XSI,
+ "xsi");
+
+
+ attrs.addAttribute(Constants.URI_CURRENT_SCHEMA_XSI,
+ "type",
+ prefix + ":type",
+ "CDATA", context.qName2String(type));
return attrs;
}
1.5 +14 -3 xml-axis/java/src/org/apache/axis/message/BodyBuilder.java
Index: BodyBuilder.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/BodyBuilder.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- BodyBuilder.java 2001/07/16 17:37:01 1.4
+++ BodyBuilder.java 2001/08/14 03:49:19 1.5
@@ -20,6 +20,13 @@
boolean gotRPCElement = false;
boolean isRPCElement = false;
+ private SOAPEnvelope envelope;
+
+ BodyBuilder(SOAPEnvelope envelope)
+ {
+ this.envelope = envelope;
+ }
+
public SOAPHandler onStartChild(String namespace,
String localName,
String prefix,
@@ -71,13 +78,18 @@
gotRPCElement = true;
element = new RPCElement(namespace, localName, prefix,
attributes, context);
- handler = new RPCHandler((RPCElement)element);
+ //handler = new RPCHandler((RPCElement)element);
} else {
element = new SOAPBodyElement(namespace, localName, prefix,
attributes, context);
if (element.getFixupDeserializer() != null)
handler = element.getFixupDeserializer();
}
+
+ if (handler == null)
+ handler = new SOAPHandler();
+
+ handler.myElement = element;
if (DEBUG_LOG) {
System.err.println("Out BodyBuilder.onStartChild()");
@@ -93,8 +105,7 @@
}
if (element != null) {
- element.setEndIndex(context.getCurrentRecordPos());
- context.envelope.addBodyElement(element);
+ envelope.addBodyElement(element);
element = null;
}
1.5 +23 -7 xml-axis/java/src/org/apache/axis/message/EnvelopeBuilder.java
Index: EnvelopeBuilder.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/EnvelopeBuilder.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- EnvelopeBuilder.java 2001/08/09 20:34:22 1.4
+++ EnvelopeBuilder.java 2001/08/14 03:49:19 1.5
@@ -14,6 +14,7 @@
public class EnvelopeBuilder extends SOAPHandler
{
private MessageElement element;
+ private SOAPEnvelope envelope;
private boolean gotHeader = false;
private boolean gotBody = false;
@@ -23,6 +24,18 @@
private static final QName bodyQName = new QName(Constants.URI_SOAP_ENV,
Constants.ELEM_BODY);
+ public EnvelopeBuilder(String messageType)
+ {
+ envelope = new SOAPEnvelope(false);
+ envelope.setMessageType(messageType);
+ myElement = envelope;
+ }
+
+ public SOAPEnvelope getEnvelope()
+ {
+ return envelope;
+ }
+
public void startElement(String namespace, String localName,
String qName, Attributes attributes,
DeserializationContext context)
@@ -40,8 +53,10 @@
if (idx > 0)
prefix = qName.substring(0, idx);
- context.getEnvelope().setPrefix(prefix);
- context.getEnvelope().setNamespaceURI(namespace);
+ envelope.setPrefix(prefix);
+ envelope.setNamespaceURI(namespace);
+ envelope.setNSMappings(context.getCurrentNSMappings());
+ context.pushNewElement(envelope);
}
public SOAPHandler onStartChild(String namespace,
@@ -57,7 +72,7 @@
throw new SAXException("Only one Header element allowed!");
gotHeader = true;
- return new HeaderBuilder();
+ return new HeaderBuilder(envelope);
}
if (thisQName.equals(bodyQName)) {
@@ -65,18 +80,20 @@
throw new SAXException("Only one Body element allowed!");
gotBody = true;
- return new BodyBuilder();
+ return new BodyBuilder(envelope);
}
if (!gotBody)
throw new SAXException("No custom elements allowed at top level "+
"until after the <Body>");
+ /*
element = new MessageElement(namespace, localName, prefix,
attributes, context);
if (element.getFixupDeserializer() != null)
return element.getFixupDeserializer();
+ */
return null;
}
@@ -85,8 +102,7 @@
DeserializationContext context)
{
if (element != null) {
- element.setEndIndex(context.getCurrentRecordPos());
- context.getEnvelope().addTrailer(element);
+ envelope.addTrailer(element);
}
}
@@ -95,6 +111,6 @@
throws SAXException
{
// Envelope isn't dirty yet by default...
- context.getEnvelope().setDirty(false);
+ envelope.setDirty(false);
}
}
1.4 +12 -4 xml-axis/java/src/org/apache/axis/message/HeaderBuilder.java
Index: HeaderBuilder.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/HeaderBuilder.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- HeaderBuilder.java 2001/08/09 18:47:01 1.3
+++ HeaderBuilder.java 2001/08/14 03:49:19 1.4
@@ -12,7 +12,13 @@
public class HeaderBuilder extends SOAPHandler
{
private SOAPHeader header;
+ private SOAPEnvelope envelope;
+ HeaderBuilder(SOAPEnvelope envelope)
+ {
+ this.envelope = envelope;
+ }
+
public SOAPHandler onStartChild(String namespace,
String localName,
String prefix,
@@ -22,14 +28,16 @@
{
header = new SOAPHeader(namespace, localName, prefix,
attributes, context);
- return null;
+
+ SOAPHandler handler = new SOAPHandler();
+ handler.myElement = header;
+
+ return handler;
}
public void onEndChild(String namespace, String localName,
DeserializationContext context)
{
- header.setEndIndex(context.getCurrentRecordPos());
-
- context.envelope.addHeader(header);
+ envelope.addHeader(header);
}
}
1.43 +73 -3 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/MessageElement.java,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -r1.42 -r1.43
--- MessageElement.java 2001/08/10 16:29:48 1.42
+++ MessageElement.java 2001/08/14 03:49:19 1.43
@@ -68,6 +68,7 @@
import org.apache.axis.encoding.TypeMappingRegistry;
import org.apache.axis.MessageContext;
import org.apache.axis.utils.Debug;
+import org.apache.axis.utils.Mapping;
import org.apache.axis.utils.QName;
import org.apache.axis.utils.XMLUtils;
import java.util.*;
@@ -98,16 +99,20 @@
// Some message representations - as recorded SAX events...
protected SAX2EventRecorder recorder = null;
protected int startEventIndex = 0;
+ protected int startContentsIndex = 0;
protected int endEventIndex = -1;
// ...or as DOM
protected Element elementRep = null;
+ protected MessageElement parent = null;
+ // Do we need links to our children too?
+
public ArrayList namespaces = null;
/** No-arg constructor for building messages?
*/
- MessageElement()
+ public MessageElement()
{
}
@@ -124,7 +129,7 @@
name = elem.getTagName();
}
- MessageElement(String namespace, String localPart, String qName,
+ public MessageElement(String namespace, String localPart, String qName,
Attributes attributes, DeserializationContext context)
{
if (DEBUG_LOG) {
@@ -142,6 +147,9 @@
this.context = context;
this.startEventIndex = context.getStartOfMappingsPos();
+
+ setNSMappings(context.getCurrentNSMappings());
+
this.recorder = context.getRecorder();
if (attributes == null) {
@@ -207,6 +215,68 @@
public SAX2EventRecorder getRecorder() { return recorder; }
public void setRecorder(SAX2EventRecorder rec) { recorder = rec; }
+ public MessageElement getParent() { return parent; }
+ public void setParent(MessageElement parent) { this.parent = parent; }
+
+ public void setContentsIndex(int index)
+ {
+ startContentsIndex = index;
+ }
+
+ public void setNSMappings(ArrayList namespaces)
+ {
+ this.namespaces = namespaces;
+ }
+
+ public String getPrefix(String namespaceURI) {
+ if ((namespaceURI == null) || (namespaceURI.equals("")))
+ return null;
+
+ if (href != null) {
+ return getRealElement().getPrefix(namespaceURI);
+ }
+
+ if (namespaces != null) {
+ for (int i = 0; i < namespaces.size(); i++) {
+ Mapping map = (Mapping)namespaces.get(i);
+ if (map.getNamespaceURI().equals(namespaceURI))
+ return map.getPrefix();
+ }
+ }
+
+ if (parent != null)
+ return parent.getPrefix(namespaceURI);
+
+ return null;
+ }
+
+ public String getNamespaceURI(String prefix) {
+ if (prefix == null)
+ prefix = "";
+
+ if (href != null) {
+ return getRealElement().getNamespaceURI(prefix);
+ }
+
+ if (namespaces != null) {
+ for (int i = 0; i < namespaces.size(); i++) {
+ Mapping map = (Mapping)namespaces.get(i);
+ if (map.getPrefix().equals(prefix)) {
+ return map.getNamespaceURI();
+ }
+ }
+ }
+
+ if (parent != null)
+ return parent.getNamespaceURI(prefix);
+
+ if (DEBUG_LOG) {
+ System.err.println(this + " didn't find prefix '" + prefix + "'");
+ }
+
+ return null;
+ }
+
public Object getValueAsType(QName type) throws Exception
{
if (context == null)
@@ -298,7 +368,7 @@
if (recorder == null)
throw new SAXException("No event recorder inside element");
- recorder.replay(startEventIndex+1, endEventIndex-1, handler);
+ recorder.replay(startContentsIndex, endEventIndex-1, handler);
}
/** This is the public output() method, which will always simply use
1.17 +31 -0 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.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- RPCElement.java 2001/07/18 01:14:50 1.16
+++ RPCElement.java 2001/08/14 03:49:19 1.17
@@ -10,11 +10,15 @@
public class RPCElement extends SOAPBodyElement
{
protected Vector params = new Vector();
+ protected boolean needDeser = false;
public RPCElement(String namespace, String localName, String prefix,
Attributes attributes, DeserializationContext context)
{
super(namespace, localName, prefix, attributes, context);
+
+ // This came from parsing XML, so we need to deserialize it sometime
+ needDeser = true;
}
public RPCElement(String namespace, String methodName,
@@ -52,11 +56,29 @@
return name;
}
+ public void deserialize() throws Exception
+ {
+ context.pushElementHandler(new EnvelopeHandler(new RPCHandler(this)));
+ context.setCurElement(this);
+
+ needDeser = false;
+
+ publishToHandler(context);
+ }
+
/** This gets the FIRST param whose name matches.
* !!! Should it return more in the case of duplicates?
*/
public RPCParam getParam(String name)
{
+ if (needDeser) {
+ try {
+ deserialize();
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
for (int i = 0; i < params.size(); i++) {
RPCParam param = (RPCParam)params.elementAt(i);
if (param.getName().equals(name))
@@ -68,6 +90,15 @@
public Vector getParams()
{
+ if (needDeser) {
+ try {
+ deserialize();
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
return params;
}
1.2 +26 -0 xml-axis/java/src/org/apache/axis/message/SAX2EventRecorder.java
Index: SAX2EventRecorder.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/SAX2EventRecorder.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- SAX2EventRecorder.java 2001/07/15 16:40:09 1.1
+++ SAX2EventRecorder.java 2001/08/14 03:49:19 1.2
@@ -1,8 +1,10 @@
package org.apache.axis.message;
+import java.util.ArrayList;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
+import org.apache.axis.encoding.DeserializationContext;
/**
* This class records SAX2 Events and allows
@@ -21,6 +23,10 @@
private static final byte STATE_IGNORABLE_WHITESPACE = 8;
private static final byte STATE_PROCESSING_INSTRUCTION = 9;
private static final byte STATE_SKIPPED_ENTITY = 10;
+
+ // This is a "custom" event which tells DeserializationContexts
+ // that the current element is moving down the stack...
+ private static final byte STATE_NEWELEMENT = 11;
org.xml.sax.Locator locator;
intArrayVector events = new intArrayVector();
@@ -85,6 +91,18 @@
return events.add(STATE_SKIPPED_ENTITY, st.addSymbol(p1), 0,0,0);
}
+ public int newElement(MessageElement elem)
+ {
+ return events.add(STATE_NEWELEMENT, addElement(elem), 0, 0, 0);
+ }
+
+ ArrayList elements = new ArrayList();
+ private int addElement(MessageElement elem)
+ {
+ elements.add(elem);
+ return elements.size() - 1;
+ }
+
public void replay(ContentHandler handler) throws SAXException {
replay(0, events.getLength() - 1, handler);
}
@@ -147,6 +165,14 @@
break;
case STATE_SKIPPED_ENTITY:
handler.skippedEntity(st.getSymbol(events.get(n,1)));
+ break;
+ case STATE_NEWELEMENT:
+ if (handler instanceof DeserializationContext) {
+ DeserializationContext context =
+ (DeserializationContext)handler;
+ context.setCurElement(
+ (MessageElement)elements.get(events.get(n,1)));
+ }
break;
}
}
1.32 +19 -4 xml-axis/java/src/org/apache/axis/message/SOAPEnvelope.java
Index: SOAPEnvelope.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/SOAPEnvelope.java,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -r1.31 -r1.32
--- SOAPEnvelope.java 2001/08/10 13:08:22 1.31
+++ SOAPEnvelope.java 2001/08/14 03:49:19 1.32
@@ -59,6 +59,7 @@
import java.util.*;
import org.apache.axis.encoding.*;
import org.apache.axis.Constants;
+import org.apache.axis.utils.Mapping;
import org.apache.axis.utils.QName;
import org.apache.axis.AxisFault;
import org.xml.sax.InputSource;
@@ -80,12 +81,26 @@
// This gets passed back into the service description during
// deserialization
public String messageType;
-
+
public SOAPEnvelope()
+ {
+ this(true);
+ }
+
+ public SOAPEnvelope(boolean registerPrefixes)
{
- nsDecls.put(Constants.URI_SOAP_ENV, Constants.NSPREFIX_SOAP_ENV);
- nsDecls.put(Constants.URI_CURRENT_SCHEMA_XSD, Constants.NSPREFIX_SCHEMA_XSD);
- nsDecls.put(Constants.URI_CURRENT_SCHEMA_XSI, Constants.NSPREFIX_SCHEMA_XSI);
+ if (registerPrefixes) {
+ if (namespaces == null)
+ namespaces = new ArrayList();
+
+ namespaces.add(new Mapping(Constants.URI_SOAP_ENV,
+ Constants.NSPREFIX_SOAP_ENV));
+ namespaces.add(new Mapping(Constants.URI_CURRENT_SCHEMA_XSD,
+ Constants.NSPREFIX_SCHEMA_XSD));
+ namespaces.add(new Mapping(Constants.URI_CURRENT_SCHEMA_XSI,
+ Constants.NSPREFIX_SCHEMA_XSI));
+ }
+
setDirty(true);
}
1.3 +13 -9 xml-axis/java/src/org/apache/axis/message/SOAPHandler.java
Index: SOAPHandler.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/SOAPHandler.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- SOAPHandler.java 2001/07/16 17:37:03 1.2
+++ SOAPHandler.java 2001/08/14 03:49:19 1.3
@@ -16,25 +16,28 @@
public class SOAPHandler extends DefaultHandler
{
+ public MessageElement myElement = null;
+
public void startElement(String namespace, String localName,
String qName, Attributes attributes,
DeserializationContext context)
throws SAXException
{
+ // By default, make a new element
+ if (!context.doneParsing) {
+ if (myElement == null)
+ myElement = new MessageElement(namespace, localName,
+ qName, attributes, context);
+ context.pushNewElement(myElement);
+ }
}
public void endElement(String namespace, String localName,
DeserializationContext context)
throws SAXException
- {
- }
-
- public final SOAPHandler onStartChild(String namespace, String localName,
- Attributes attributes,
- DeserializationContext context)
- throws SAXException
{
- return null;
+ if (myElement != null)
+ myElement.setEndIndex(context.getCurrentRecordPos());
}
public SOAPHandler onStartChild(String namespace,
@@ -44,7 +47,8 @@
DeserializationContext context)
throws SAXException
{
- return null;
+ SOAPHandler handler = new SOAPHandler();
+ return handler;
}
public void onEndChild(String namespace, String localName,
1.8 +0 -18 xml-axis/java/src/org/apache/axis/utils/NSStack.java
Index: NSStack.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/utils/NSStack.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- NSStack.java 2001/07/16 17:37:07 1.7
+++ NSStack.java 2001/08/14 03:49:19 1.8
@@ -63,24 +63,6 @@
* @author Glen Daniels (gdaniels@macromedia.com)
*/
public class NSStack {
- public static class Mapping {
- public String namespaceURI;
- public String prefix;
- public Mapping(String namespaceURI, String prefix)
- {
- this.namespaceURI = namespaceURI;
- this.prefix = prefix;
- }
-
- public String getNamespaceURI()
- {
- return namespaceURI;
- }
- public String getPrefix()
- {
- return prefix;
- }
- }
private static final boolean DEBUG_LOG = false;
private static final ArrayList EMPTY = new ArrayList();
1.1 xml-axis/java/src/org/apache/axis/utils/Mapping.java
Index: Mapping.java
===================================================================
package org.apache.axis.utils;
public class Mapping {
public String namespaceURI;
public String prefix;
public Mapping(String namespaceURI, String prefix)
{
this.namespaceURI = namespaceURI;
this.prefix = prefix;
}
public String getNamespaceURI()
{
return namespaceURI;
}
public String getPrefix()
{
return prefix;
}
}
1.20 +1 -6 xml-axis/java/test/RPCDispatch/TestRPC.java
Index: TestRPC.java
===================================================================
RCS file: /home/cvs/xml-axis/java/test/RPCDispatch/TestRPC.java,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- TestRPC.java 2001/07/17 14:08:33 1.19
+++ TestRPC.java 2001/08/14 03:49:19 1.20
@@ -59,8 +59,6 @@
// Create the message context
MessageContext msgContext = new MessageContext(engine);
- DeserializationContext deserContext =
- new DeserializationContext(msgContext, ServiceDescription.REQUEST);
// Set the dispatch either by SOAPAction or methodNS
String methodNS = null;
@@ -69,11 +67,8 @@
// Construct the soap request
SOAPEnvelope envelope = new SOAPEnvelope();
msgContext.setRequestMessage(new Message(envelope));
- RPCElement body = new RPCElement(methodNS, method, "", null, deserContext);
+ RPCElement body = new RPCElement(methodNS, method, parms);
envelope.addBodyElement(body);
- for (int i=0; i<parms.length; i++) {
- body.addParam(new RPCParam("arg"+i, parms[i]));
- }
// Invoke the Axis engine
try {
1.16 +6 -0 xml-axis/java/test/encoding/TestDeser.java
Index: TestDeser.java
===================================================================
RCS file: /home/cvs/xml-axis/java/test/encoding/TestDeser.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- TestDeser.java 2001/08/09 15:05:39 1.15
+++ TestDeser.java 2001/08/14 03:49:19 1.16
@@ -208,4 +208,10 @@
public void testUntyped() throws Exception {
deserialize("<result>10</result>", "10");
}
+
+ public static void main(String [] args) throws Exception
+ {
+ TestDeser tester = new TestDeser("test");
+ tester.testUntyped();
+ }
}
1.11 +6 -36 xml-axis/java/test/encoding/TestHrefs.java
Index: TestHrefs.java
===================================================================
RCS file: /home/cvs/xml-axis/java/test/encoding/TestHrefs.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- TestHrefs.java 2001/08/07 18:58:48 1.10
+++ TestHrefs.java 2001/08/14 03:49:19 1.11
@@ -33,7 +33,7 @@
{
TestHrefs tester = new TestHrefs("me");
try {
- tester.testStringReference();
+ tester.testStringReference2();
} catch (Exception e) {
e.printStackTrace();
}
@@ -91,46 +91,16 @@
assertEquals("case " + pos, expected, result);
}
- public void testStringReference() throws Exception {
+ public void testStringReference1() throws Exception {
String result =
"<result root=\"0\" id=\"1\" xsi:type=\"xsd:string\">abc</result>";
deserialize(result, "abc", 0);
- deserialize(result, "abc", 1);
- }
-
- /*
- public void testBoolean() throws Exception {
- deserialize("<result xsi:type=\"xsd:boolean\">true</result>",
- new Boolean(true));
- }
-
- public void testDouble() throws Exception {
- deserialize("<result xsi:type=\"xsd:double\">3.14</result>",
- new Double(3.14));
- }
-
- public void testFloat() throws Exception {
- deserialize("<result xsi:type=\"xsd:float\">3.14</result>",
- new Float(3.14F));
}
- public void testInt() throws Exception {
- deserialize("<result xsi:type=\"xsd:int\">10</result>",
- new Integer(10));
- }
-
- public void testLong() throws Exception {
- deserialize("<result xsi:type=\"xsd:long\">17</result>",
- new Long(17));
- }
-
- public void testShort() throws Exception {
- deserialize("<result xsi:type=\"xsd:short\">3</result>",
- new Short((short)3));
+ public void testStringReference2() throws Exception {
+ String result =
+ "<result root=\"0\" id=\"1\" xsi:type=\"xsd:string\">abc</result>";
+ deserialize(result, "abc", 1);
}
- public void testUntyped() throws Exception {
- deserialize("<result>10</result>", "10");
- }
- */
}
1.8 +10 -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.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- TestSer.java 2001/07/15 23:38:30 1.7
+++ TestSer.java 2001/08/14 03:49:19 1.8
@@ -17,6 +17,12 @@
public static final String myNS = "urn:myNS";
+ public static void main(String [] args) throws Exception
+ {
+ TestSer tester = new TestSer("TestSer");
+ tester.testData();
+ }
+
public TestSer(String name) {
super(name);
}
@@ -45,6 +51,10 @@
msg.output(context);
String msgString = stringWriter.toString();
+
+ System.out.println("---");
+ System.out.println(msgString);
+ System.out.println("---");
StringReader reader = new StringReader(msgString);