glyn 02/05/16 05:54:36
Modified: java TODO.txt
java/src/org/apache/axis/client Call.java
java/src/org/apache/axis/encoding
DeserializationContextImpl.java
java/src/org/apache/axis/message BodyBuilder.java
HeaderBuilder.java MessageElement.java
SOAPBodyElement.java SOAPEnvelope.java
SOAPHeader.java SOAPHeaderElement.java
java/src/org/apache/axis/utils resources.properties
Added: java/src/org/apache/axis/message SOAPBody.java
Log:
JAXM plumbing continued.
Introduce SOAPBody into the parse tree.
SOAPBodyElement.setParentElement now issues a warning if a SOAPEnvelope
is passed to it rather than a SOAPBody. However, the main use of this
was in Call and could be deleted since SOAPEnvelope.addBodyElement establishes
the parent-child relationship automatically.
Revision Changes Path
1.48 +1 -1 xml-axis/java/TODO.txt
Index: TODO.txt
===================================================================
RCS file: /home/cvs/xml-axis/java/TODO.txt,v
retrieving revision 1.47
retrieving revision 1.48
diff -u -r1.47 -r1.48
--- TODO.txt 26 Apr 2002 13:01:08 -0000 1.47
+++ TODO.txt 16 May 2002 12:54:36 -0000 1.48
@@ -49,7 +49,7 @@
JAXM COMPATIBILITY
------------------
* <Glyn> Implement javax.xml.soap interfaces in message subsystem.
-! <> Implement javax.xml.messaging.
+ (Not forgetting: SOAPBody.addFault/getFault/hasFault)
SOAP 1.2 SUPPORT
----------------
1.122 +0 -1 xml-axis/java/src/org/apache/axis/client/Call.java
Index: Call.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/client/Call.java,v
retrieving revision 1.121
retrieving revision 1.122
diff -u -r1.121 -r1.122
--- Call.java 13 May 2002 14:49:00 -0000 1.121
+++ Call.java 16 May 2002 12:54:36 -0000 1.122
@@ -1684,7 +1684,6 @@
setRequestMessage(reqMsg);
reqEnv.addBodyElement(body);
- body.setParentElement(reqEnv);
reqEnv.setMessageType(Message.REQUEST);
invoke();
1.28 +2 -2
xml-axis/java/src/org/apache/axis/encoding/DeserializationContextImpl.java
Index: DeserializationContextImpl.java
===================================================================
RCS file:
/home/cvs/xml-axis/java/src/org/apache/axis/encoding/DeserializationContextImpl.java,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -r1.27 -r1.28
--- DeserializationContextImpl.java 9 May 2002 18:29:37 -0000 1.27
+++ DeserializationContextImpl.java 16 May 2002 12:54:36 -0000 1.28
@@ -647,9 +647,9 @@
/*
* The only checked exception that may be thrown from setParent
* occurs if the parent already has an explicit object value,
- * which should never occur during deserialization. An error
- * has already been logged, so no-op.
+ * which should never occur during deserialization.
*/
+ log.fatal(JavaUtils.getMessage("exception00"), e);
}
curElement = elem;
1.28 +17 -0 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.27
retrieving revision 1.28
diff -u -r1.27 -r1.28
--- BodyBuilder.java 9 May 2002 18:25:17 -0000 1.27
+++ BodyBuilder.java 16 May 2002 12:54:36 -0000 1.28
@@ -71,6 +71,7 @@
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
+import javax.xml.soap.SOAPException;
import javax.xml.rpc.namespace.QName;
public class BodyBuilder extends SOAPHandler
@@ -88,6 +89,22 @@
this.envelope = envelope;
}
+ public void startElement(String namespace, String localName,
+ String qName, Attributes attributes,
+ DeserializationContext context)
+ throws SAXException
+ {
+ if (!context.isDoneParsing()) {
+ if (myElement == null) {
+ myElement = new SOAPBody(namespace, localName, qName,
+ attributes, context,
+ envelope.getSOAPConstants());
+ envelope.setBody((SOAPBody)myElement);
+ }
+ context.pushNewElement(myElement);
+ }
+ }
+
public SOAPHandler onStartChild(String namespace,
String localName,
String prefix,
1.10 +24 -0 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.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- HeaderBuilder.java 12 Apr 2002 09:46:36 -0000 1.9
+++ HeaderBuilder.java 16 May 2002 12:54:36 -0000 1.10
@@ -61,11 +61,19 @@
*/
import org.apache.axis.encoding.DeserializationContext;
+import org.apache.axis.utils.JavaUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
+import javax.xml.soap.SOAPException;
+
public class HeaderBuilder extends SOAPHandler
{
+ protected static Log log =
+ LogFactory.getLog(HeaderBuilder.class.getName());
+
private SOAPHeaderElement header;
private SOAPEnvelope envelope;
@@ -74,6 +82,22 @@
this.envelope = envelope;
}
+ public void startElement(String namespace, String localName,
+ String qName, Attributes attributes,
+ DeserializationContext context)
+ throws SAXException
+ {
+ if (!context.isDoneParsing()) {
+ if (myElement == null) {
+ myElement = new SOAPHeader(namespace, localName, qName,
+ attributes, context,
+ envelope.getSOAPConstants());
+ envelope.setHeader((SOAPHeader)myElement);
+ }
+ context.pushNewElement(myElement);
+ }
+ }
+
public SOAPHandler onStartChild(String namespace,
String localName,
String prefix,
1.94 +6 -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/MessageElement.java,v
retrieving revision 1.93
retrieving revision 1.94
diff -u -r1.93 -r1.94
--- MessageElement.java 9 Apr 2002 23:44:48 -0000 1.93
+++ MessageElement.java 16 May 2002 12:54:36 -0000 1.94
@@ -144,6 +144,12 @@
name = localPart;
}
+ MessageElement(Name eltName)
+ {
+ this(eltName.getURI(), eltName.getLocalName());
+ prefix = eltName.getPrefix();
+ }
+
MessageElement(String namespace, String localPart, Object value)
{
this(namespace, localPart);
1.15 +36 -2 xml-axis/java/src/org/apache/axis/message/SOAPBodyElement.java
Index: SOAPBodyElement.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/SOAPBodyElement.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- SOAPBodyElement.java 26 Mar 2002 09:45:45 -0000 1.14
+++ SOAPBodyElement.java 16 May 2002 12:54:36 -0000 1.15
@@ -56,17 +56,27 @@
import org.apache.axis.encoding.DeserializationContext;
import org.apache.axis.utils.XMLUtils;
+import org.apache.axis.utils.JavaUtils;
import org.w3c.dom.Element;
import org.xml.sax.Attributes;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.xml.soap.SOAPElement;
+import javax.xml.soap.SOAPException;
+import javax.xml.soap.Name;
import java.io.InputStream;
-/** A Body element.
- *
+/**
+ * A Body element.
*/
public class SOAPBodyElement extends MessageElement
implements javax.xml.soap.SOAPBodyElement
{
+ private static Log log = LogFactory.getLog(SOAPBodyElement.class.
+ getName());
+
public SOAPBodyElement(String namespace,
String localPart,
String prefix,
@@ -75,6 +85,11 @@
{
super(namespace, localPart, prefix, attributes, context);
}
+
+ public SOAPBodyElement(Name name)
+ {
+ super(name);
+ }
public SOAPBodyElement(Element elem)
{
@@ -88,5 +103,24 @@
public SOAPBodyElement(InputStream input)
{
super( XMLUtils.newDocument(input).getDocumentElement() );
+ }
+
+ public void setParentElement(SOAPElement parent) throws SOAPException {
+ // migration aid
+ if (parent instanceof SOAPEnvelope) {
+ log.warn(JavaUtils.getMessage("bodyElementParent"));
+ parent = ((SOAPEnvelope)parent).getBody();
+ }
+ try {
+ // cast to force exception if wrong type
+ super.setParentElement((SOAPBody)parent);
+ } catch (Throwable t) {
+ throw new SOAPException(t);
+ }
+ }
+
+ public void detachNode() {
+ ((SOAPBody)parent).removeBodyElement(this);
+ super.detachNode();
}
}
1.65 +102 -57 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.64
retrieving revision 1.65
diff -u -r1.64 -r1.65
--- SOAPEnvelope.java 12 Apr 2002 09:46:36 -0000 1.64
+++ SOAPEnvelope.java 16 May 2002 12:54:36 -0000 1.65
@@ -74,6 +74,7 @@
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
+import javax.xml.soap.SOAPException;
import javax.xml.rpc.namespace.QName;
import java.io.InputStream;
@@ -83,13 +84,14 @@
import java.util.Vector;
public class SOAPEnvelope extends MessageElement
+ implements javax.xml.soap.SOAPEnvelope
{
protected static Log log =
LogFactory.getLog(SOAPEnvelope.class.getName());
private SOAPHeader header;
+ private SOAPBody body;
- public Vector bodyElements = new Vector();
public Vector trailers = new Vector();
private SOAPConstants soapConstants;
@@ -154,7 +156,11 @@
public Vector getBodyElements() throws AxisFault
{
- return bodyElements;
+ if (body != null) {
+ return body.getBodyElements();
+ } else {
+ return new Vector();
+ }
}
public Vector getTrailers()
@@ -164,10 +170,11 @@
public SOAPBodyElement getFirstBody() throws AxisFault
{
- if (bodyElements.isEmpty())
+ if (body == null) {
return null;
-
- return (SOAPBodyElement)bodyElements.elementAt(0);
+ } else {
+ return body.getFirstBody();
+ }
}
public Vector getHeaders() throws AxisFault
@@ -203,10 +210,11 @@
public void addBodyElement(SOAPBodyElement element)
{
- if (log.isDebugEnabled())
- log.debug(JavaUtils.getMessage("addBody00"));
+ if (body == null) {
+ body = new SOAPBody(this, soapConstants);
+ }
element.setEnvelope(this);
- bodyElements.addElement(element);
+ body.addBodyElement(element);
_isDirty = true;
}
@@ -214,7 +222,17 @@
public void removeHeaders() {
header = null;
}
-
+
+ public void setHeader(SOAPHeader hdr) {
+ header = hdr;
+ try {
+ header.setParentElement(this);
+ } catch (SOAPException ex) {
+ // class cast should never fail when parent is a SOAPEnvelope
+ log.fatal(JavaUtils.getMessage("exception00"), ex);
+ }
+ }
+
public void removeHeader(SOAPHeaderElement hdr)
{
if (header != null) {
@@ -223,12 +241,26 @@
}
}
+ public void removeBody() {
+ body = null;
+ }
+
+ public void setBody(SOAPBody body) {
+ this.body = body;
+ try {
+ body.setParentElement(this);
+ } catch (SOAPException ex) {
+ // class cast should never fail when parent is a SOAPEnvelope
+ log.fatal(JavaUtils.getMessage("exception00"), ex);
+ }
+ }
+
public void removeBodyElement(SOAPBodyElement element)
{
- if (log.isDebugEnabled())
- log.debug(JavaUtils.getMessage("removeBody00"));
- bodyElements.removeElement(element);
- _isDirty = true;
+ if (body != null) {
+ body.removeBodyElement(element);
+ _isDirty = true;
+ }
}
public void removeTrailer(MessageElement element)
@@ -241,9 +273,10 @@
public void clearBody()
{
- if (!bodyElements.isEmpty())
- bodyElements.removeAllElements();
- _isDirty = true;
+ if (body != null) {
+ body.clearBody();
+ _isDirty = true;
+ }
}
public void addTrailer(MessageElement element)
@@ -287,27 +320,11 @@
public SOAPBodyElement getBodyByName(String namespace, String localPart)
throws AxisFault
{
- return (SOAPBodyElement)findElement(bodyElements,
- namespace,
- localPart);
- }
-
- protected MessageElement findElement(Vector vec, String namespace,
- String localPart)
- {
- if (vec.isEmpty())
+ if (body == null) {
return null;
-
- Enumeration e = vec.elements();
- MessageElement element;
- while (e.hasMoreElements()) {
- element = (MessageElement)e.nextElement();
- if (element.getNamespaceURI().equals(namespace) &&
- element.getName().equals(localPart))
- return element;
+ } else {
+ return body.getBodyByName(namespace, localPart);
}
-
- return null;
}
public Enumeration getHeadersByName(String namespace, String localPart)
@@ -361,34 +378,17 @@
// Output <SOAP-ENV:Envelope>
context.startElement(new QName(soapConstants.getEnvelopeURI(),
Constants.ELEM_ENVELOPE), attributes);
-
+
+ // Output headers
if (header != null) {
header.outputImpl(context);
}
- if (bodyElements.isEmpty()) {
- // This is a problem.
- // throw new Exception("No body elements!");
- // If there are no body elements just return - it's ok that
- // the body is empty
+ // Output body
+ if (body != null) {
+ body.outputImpl(context);
}
- // Output <SOAP-ENV:Body>
- context.startElement(new QName(soapConstants.getEnvelopeURI(),
- Constants.ELEM_BODY), null);
- enum = bodyElements.elements();
- while (enum.hasMoreElements()) {
- SOAPBodyElement body = (SOAPBodyElement)enum.nextElement();
- body.output(context);
- // Output this body element.
- }
-
- // Output multi-refs
- context.outputMultiRefs();
-
- // Output </SOAP-ENV:Body>
- context.endElement();
-
// Output trailers
enum = trailers.elements();
while (enum.hasMoreElements()) {
@@ -401,5 +401,50 @@
context.endElement();
context.setPretty(oldPretty);
+ }
+
+ SOAPConstants getSOAPConstants() {
+ return soapConstants;
+ }
+
+ // JAXM methods
+
+ public javax.xml.soap.SOAPBody addBody() throws SOAPException {
+ if (body == null) {
+ body = new SOAPBody(this, soapConstants);
+ return body;
+ } else {
+ throw new SOAPException(JavaUtils.getMessage("bodyPresent"));
+ }
+ }
+
+ public javax.xml.soap.SOAPHeader addHeader() throws SOAPException {
+ if (header == null) {
+ header = new SOAPHeader(this, soapConstants);
+ return header;
+ } else {
+ throw new SOAPException(JavaUtils.getMessage("headerPresent"));
+ }
+ }
+
+ public javax.xml.soap.Name createName(String localName)
+ throws SOAPException {
+ // Ok to use the SOAP envelope's namespace URI and prefix?
+ return new PrefixedQName(namespaceURI, localName, prefix);
+ }
+
+ public javax.xml.soap.Name createName(String localName,
+ String prefix,
+ String uri)
+ throws SOAPException {
+ return new PrefixedQName(uri, localName, prefix);
+ }
+
+ public javax.xml.soap.SOAPBody getBody() throws SOAPException {
+ return body;
+ }
+
+ public javax.xml.soap.SOAPHeader getHeader() throws SOAPException {
+ return header;
}
}
1.41 +34 -2 xml-axis/java/src/org/apache/axis/message/SOAPHeader.java
Index: SOAPHeader.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/SOAPHeader.java,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -r1.40 -r1.41
--- SOAPHeader.java 12 Apr 2002 09:46:36 -0000 1.40
+++ SOAPHeader.java 16 May 2002 12:54:36 -0000 1.41
@@ -59,12 +59,15 @@
import org.apache.axis.Message;
import org.apache.axis.MessageContext;
import org.apache.axis.soap.SOAPConstants;
+import org.apache.axis.encoding.DeserializationContext;
import org.apache.axis.encoding.SerializationContext;
import org.apache.axis.utils.JavaUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.xml.sax.Attributes;
+
import javax.xml.soap.SOAPElement;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPException;
@@ -99,6 +102,13 @@
}
}
+ public SOAPHeader(String namespace, String localPart, String qName,
+ Attributes attributes, DeserializationContext context,
+ SOAPConstants soapConsts) {
+ super(namespace, localPart, qName, attributes, context);
+ soapConstants = soapConsts;
+ }
+
public void setParentElement(SOAPElement parent) throws SOAPException {
try {
// cast to force exception if wrong type
@@ -115,11 +125,27 @@
public javax.xml.soap.SOAPHeaderElement addHeaderElement(Name name)
throws SOAPException {
- return null; // to be implemented
+ SOAPHeaderElement headerElement = new SOAPHeaderElement(name);
+ addHeader(headerElement);
+ return headerElement;
}
public Iterator examineHeaderElements(String actor) {
- return null; // to be implemented
+ Vector results = new Vector();
+ Iterator i = headers.iterator();
+
+ while (i.hasNext()) {
+ SOAPHeaderElement header = (SOAPHeaderElement)i.next();
+ String headerActor = header.getActor();
+ // Allow NEXT's and any headers with matching actor
+ if (Constants.ACTOR_NEXT.equals(headerActor) ||
+ (actor == headerActor) ||
+ (actor != null && actor.equals(headerActor))) {
+ results.add(header);
+ }
+ }
+
+ return results.iterator();
}
public Iterator extractHeaderElements(String actor) {
@@ -158,6 +184,12 @@
if (log.isDebugEnabled())
log.debug(JavaUtils.getMessage("addHeader00"));
headers.addElement(header);
+ try {
+ header.setParentElement(this);
+ } catch (SOAPException ex) {
+ // class cast should never fail when parent is a SOAPHeader
+ log.fatal(JavaUtils.getMessage("exception00"), ex);
+ }
}
void removeHeader(SOAPHeaderElement header) {
1.2 +22 -0 xml-axis/java/src/org/apache/axis/message/SOAPHeaderElement.java
Index: SOAPHeaderElement.java
===================================================================
RCS file:
/home/cvs/xml-axis/java/src/org/apache/axis/message/SOAPHeaderElement.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- SOAPHeaderElement.java 26 Mar 2002 16:40:35 -0000 1.1
+++ SOAPHeaderElement.java 16 May 2002 12:54:36 -0000 1.2
@@ -62,7 +62,10 @@
import org.xml.sax.Attributes;
import org.xml.sax.helpers.AttributesImpl;
+import javax.xml.soap.SOAPElement;
+import javax.xml.soap.SOAPException;
import javax.xml.rpc.namespace.QName;
+import javax.xml.soap.Name;
/**
* A simple header element abstraction. Extends MessageElement with
@@ -87,6 +90,11 @@
super(namespace, localPart);
}
+ public SOAPHeaderElement(Name name)
+ {
+ super(name);
+ }
+
public SOAPHeaderElement(String namespace, String localPart, Object value)
{
super(namespace, localPart, value);
@@ -101,6 +109,20 @@
actor = elem.getAttributeNS(Constants.URI_SOAP_ENV,
Constants.ATTR_ACTOR);
+ }
+
+ public void setParentElement(SOAPElement parent) throws SOAPException {
+ try {
+ // cast to force exception if wrong type
+ super.setParentElement((SOAPHeader)parent);
+ } catch (Throwable t) {
+ throw new SOAPException(t);
+ }
+ }
+
+ public void detachNode() {
+ ((SOAPHeader)parent).removeHeader(this);
+ super.detachNode();
}
public SOAPHeaderElement(String namespace, String localPart, String prefix,
1.16 +185 -35 xml-axis/java/src/org/apache/axis/message/SOAPBody.java
1.98 +3 -0 xml-axis/java/src/org/apache/axis/utils/resources.properties
Index: resources.properties
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/utils/resources.properties,v
retrieving revision 1.97
retrieving revision 1.98
diff -u -r1.97 -r1.98
--- resources.properties 9 May 2002 18:31:22 -0000 1.97
+++ resources.properties 16 May 2002 12:54:36 -0000 1.98
@@ -68,8 +68,10 @@
badTypeNamespace00=Found languageSpecificType namespace ''{0}'', expected ''{1}''
badWSDDElem00=Invalid WSDD Element
beanSerConfigFail00=Exception configuring bean serialization for {0}
+bodyElementParent=Warning: SOAPBodyElement.setParentElement should take a SOAPBody
parameter instead of a SOAPEnvelope (but need not be called after
SOAPBody.addBodyElement)
bodyElems00=There are {0} body elements.
bodyIs00=body is {0}
+bodyPresent=Body already present
buildChain00={0} building chain ''{1}''
cantAuth00=User ''{0}'' not authenticated (unknown user)
cantAuth01=User ''{0}'' not authenticated
@@ -221,6 +223,7 @@
gotType00={0} got type {1}
gotValue00={0} got value {1}
headers00=headers
+headerPresent=Header already present
# NOTE: in httpPassword00, do not translate HTTP
httpPassword00=HTTP password: {0}