rineholt 2002/09/22 11:27:50
Modified: java/src/org/apache/axis SOAPPart.java
Log:
Preserve processed header elements between getAsBytes and getAsString operations
this use case (i.e. logging) is far too common to just dump them between forms.
More than likely there is a much more elegant way to achieve this.
Revision Changes Path
1.49 +44 -16 xml-axis/java/src/org/apache/axis/SOAPPart.java
Index: SOAPPart.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/SOAPPart.java,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -r1.48 -r1.49
--- SOAPPart.java 18 Sep 2002 16:10:31 -0000 1.48
+++ SOAPPart.java 22 Sep 2002 18:27:50 -0000 1.49
@@ -61,6 +61,7 @@
import org.apache.axis.encoding.SerializationContextImpl;
import org.apache.axis.message.InputStreamBody;
import org.apache.axis.message.SOAPEnvelope;
+import org.apache.axis.message.SOAPHeaderElement;
import org.apache.axis.utils.JavaUtils;
import org.apache.axis.utils.Messages;
import org.apache.axis.utils.SessionUtils;
@@ -84,6 +85,7 @@
import java.io.Writer;
import java.util.Hashtable;
import java.util.Iterator;
+import java.util.Vector;
/**
* The SOAPPart provides access to the root part of the Message which
@@ -138,6 +140,7 @@
// These two fields are used for caching in getAsString and getAsBytes
private String currentMessageAsString = null;
private byte[] currentMessageAsBytes = null;
+ private org.apache.axis.message.SOAPEnvelope currentMessageAsEnvelope= null;
/**
* Message object this part is tied to. Used for serialization settings.
@@ -184,12 +187,6 @@
log.debug("Exit: SOAPPart ctor()");
}
}
- /* This could be rather costly with attachments.
-
- public Object getOriginalMessage() {
- return originalMessage;
- }
- */
/**
@@ -296,12 +293,19 @@
return currentMessage;
}
+ private void setCurrentMessage(Object currMsg, int form) {
+ currentMessageAsString = null; //Get rid of any cached stuff this is new.
+ currentMessageAsBytes = null;
+ currentMessageAsEnvelope= null;
+ setCurrentForm(currMsg, form);
+ }
/**
* Set the current contents of this Part.
* The method name is historical.
* TODO: rename this for clarity to something more like setContents???
*/
- private void setCurrentMessage(Object currMsg, int form) {
+ private void setCurrentForm(Object currMsg, int form) {
+ log.debug("setCurrentForm(" + currMsg + ", " + form);
if (log.isDebugEnabled()) {
String msgStr;
if (currMsg instanceof String) {
@@ -314,6 +318,8 @@
}
currentMessage = currMsg ;
currentForm = form ;
+ if(currentForm == FORM_SOAPENVELOPE)
+ currentMessageAsEnvelope= (org.apache.axis.message.SOAPEnvelope )currMsg;
}
/**
@@ -355,7 +361,7 @@
currentMessage instanceof
org.apache.axis.transport.http.SocketInputStream )
inp.close();
}
- setCurrentMessage( buf, FORM_BYTES );
+ setCurrentForm( buf, FORM_BYTES );
log.debug("Exit: SOAPPart::getAsBytes");
return (byte[])currentMessage;
}
@@ -395,10 +401,10 @@
// Save this message in case it is requested later in getAsString
currentMessageAsString = (String) currentMessage;
try{
- setCurrentMessage( ((String)currentMessage).getBytes("UTF-8"),
+ setCurrentForm( ((String)currentMessage).getBytes("UTF-8"),
FORM_BYTES );
}catch(UnsupportedEncodingException ue){
- setCurrentMessage( ((String)currentMessage).getBytes(),
+ setCurrentForm( ((String)currentMessage).getBytes(),
FORM_BYTES );
}
currentMessageAsBytes = (byte[]) currentMessage;
@@ -446,10 +452,10 @@
// Save this message in case it is requested later in getAsBytes
currentMessageAsBytes = (byte[]) currentMessage;
try{
- setCurrentMessage( new String((byte[]) currentMessage,"UTF-8"),
+ setCurrentForm( new String((byte[]) currentMessage,"UTF-8"),
FORM_STRING );
}catch(UnsupportedEncodingException ue){
- setCurrentMessage( new String((byte[]) currentMessage),
+ setCurrentForm( new String((byte[]) currentMessage),
FORM_STRING );
}
currentMessageAsString = (String) currentMessage;
@@ -468,7 +474,7 @@
log.error(Messages.getMessage("exception00"), e);
return null;
}
- setCurrentMessage(writer.getBuffer().toString(), FORM_STRING);
+ setCurrentForm(writer.getBuffer().toString(), FORM_STRING);
if (log.isDebugEnabled()) {
log.debug("Exit: SOAPPart::getAsString(): " + currentMessage);
}
@@ -483,7 +489,7 @@
} catch (Exception e) {
throw AxisFault.makeFault(e);
}
- setCurrentMessage(writer.getBuffer().toString(), FORM_STRING);
+ setCurrentForm(writer.getBuffer().toString(), FORM_STRING);
if (log.isDebugEnabled()) {
log.debug("Exit: SOAPPart::getAsString(): " + currentMessage);
}
@@ -511,20 +517,24 @@
if ( currentForm == FORM_SOAPENVELOPE )
return (SOAPEnvelope)currentMessage;
+
if (currentForm == FORM_BODYINSTREAM) {
InputStreamBody bodyEl =
new InputStreamBody((InputStream)currentMessage);
SOAPEnvelope env = new SOAPEnvelope();
env.addBodyElement(bodyEl);
- setCurrentMessage(env, FORM_SOAPENVELOPE);
+ setCurrentForm(env, FORM_SOAPENVELOPE);
return env;
}
InputSource is;
+ log.debug("yup533");
if ( currentForm == FORM_INPUTSTREAM ) {
is = new InputSource( (InputStream) currentMessage );
} else {
+ log.debug("yup637");
+
is = new InputSource(new StringReader(getAsString()));
}
DeserializationContext dser = new DeserializationContextImpl(is,
@@ -541,7 +551,25 @@
throw AxisFault.makeFault(real);
}
- setCurrentMessage(dser.getEnvelope(), FORM_SOAPENVELOPE);
+ SOAPEnvelope nse= dser.getEnvelope();
+ if(currentMessageAsEnvelope != null){
+ //Need to synchronize back processed header info.
+ Vector newHeaders= nse.getHeaders();
+ Vector oldHeaders= currentMessageAsEnvelope.getHeaders();
+ if( null != newHeaders && null != oldHeaders){
+ Iterator ohi= oldHeaders.iterator();
+ Iterator nhi= newHeaders.iterator();
+ while( ohi.hasNext() && nhi.hasNext()){
+ SOAPHeaderElement nhe= (SOAPHeaderElement)nhi.next();
+ SOAPHeaderElement ohe= (SOAPHeaderElement)ohi.next();
+
+ if(ohe.isProcessed()) nhe.setProcessed(true);
+ }
+ }
+
+ }
+
+ setCurrentForm(nse, FORM_SOAPENVELOPE);
log.debug("Exit: SOAPPart::getAsSOAPEnvelope");
return (SOAPEnvelope)currentMessage;