Author: chamikara
Date: Tue Jan 23 03:11:12 2007
New Revision: 498990

URL: http://svn.apache.org/viewvc?view=rev&rev=498990
Log:
Moved the clone method to SandeshaUtil.
Added logic to preserve the 'processed' state of header blocks.

Modified:
    
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryStorageManager.java
    
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SandeshaUtil.java

Modified: 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryStorageManager.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryStorageManager.java?view=diff&rev=498990&r1=498989&r2=498990
==============================================================================
--- 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryStorageManager.java
 (original)
+++ 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/inmemory/InMemoryStorageManager.java
 Tue Jan 23 03:11:12 2007
@@ -186,10 +186,8 @@
                
                //Now clone the env and set it in the message context
                if (envelope!=null) {
-                       
-                       XMLStreamReader streamReader = 
envelope.cloneOMElement().getXMLStreamReader();
-                       SOAPEnvelope clonedEnvelope = new 
StAXSOAPModelBuilder(streamReader, null).getSOAPEnvelope();
                        try {
+                               SOAPEnvelope clonedEnvelope = 
SandeshaUtil.cloneEnvelope(envelope);
                                messageContext.setEnvelope(clonedEnvelope);
                        } catch (AxisFault e) {
                                throw new SandeshaStorageException (e);
@@ -223,12 +221,10 @@
                }
                
                SOAPEnvelope envelope = msgContext.getEnvelope();
-               //storing a cloned version of the envelope in the Map.
-               if (envelope!=null) {                   
-                       XMLStreamReader streamReader = 
envelope.cloneOMElement().getXMLStreamReader();
-                       SOAPEnvelope clonedEnvelope = new 
StAXSOAPModelBuilder(streamReader, null).getSOAPEnvelope();
-                       envMap.put(key, clonedEnvelope);
-               }
+
+               //We are storing the original envelope here.
+               //Storing a cloned version will caus HeaderBlocks to loose 
their setProcessed information.
+               envMap.put(key, envelope);
                
                if(log.isDebugEnabled()) log.debug("Exit: 
InMemoryStorageManager::storeMessageContext, key: " + key);
        }

Modified: 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SandeshaUtil.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SandeshaUtil.java?view=diff&rev=498990&r1=498989&r2=498990
==============================================================================
--- 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SandeshaUtil.java 
(original)
+++ 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SandeshaUtil.java 
Tue Jan 23 03:11:12 2007
@@ -29,6 +29,7 @@
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
 
 import org.apache.axiom.om.OMElement;
@@ -37,6 +38,7 @@
 import org.apache.axiom.soap.SOAPEnvelope;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPHeader;
+import org.apache.axiom.soap.SOAPHeaderBlock;
 import org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder;
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.Constants;
@@ -1125,5 +1127,40 @@
                
                if(log.isDebugEnabled()) log.debug("Exit: 
SandeshaUtil::isMessageUnreliable, " + result);
                return result;
+       }
+       
+       
+       public static SOAPEnvelope cloneEnvelope(SOAPEnvelope envelope) throws 
SandeshaException {
+               
+               // Now clone the env and set it in the message context
+               XMLStreamReader streamReader = 
envelope.cloneOMElement().getXMLStreamReader();
+               SOAPEnvelope clonedEnvelope = new 
StAXSOAPModelBuilder(streamReader, null).getSOAPEnvelope();
+
+               // you have to explicitely set the 'processed' attribute for 
header
+               // blocks, since it get lost in the above read from the stream.
+
+               SOAPHeader header = envelope.getHeader();
+               if (header != null) {
+                       Iterator childrenOfOldEnv = header.getChildElements();
+                       Iterator childrenOfNewEnv = 
clonedEnvelope.getHeader().getChildElements();
+                       while (childrenOfOldEnv.hasNext()) {
+                               
+                               SOAPHeaderBlock oldEnvHeaderBlock = 
(SOAPHeaderBlock) childrenOfOldEnv.next();
+                               SOAPHeaderBlock newEnvHeaderBlock = 
(SOAPHeaderBlock) childrenOfNewEnv.next();
+
+                               QName oldEnvHeaderBlockQName = 
oldEnvHeaderBlock.getQName();
+                               if (oldEnvHeaderBlockQName != null) {
+                                       if 
(oldEnvHeaderBlockQName.equals(newEnvHeaderBlock.getQName())) {
+                                               if 
(oldEnvHeaderBlock.isProcessed())
+                                                       
newEnvHeaderBlock.setProcessed();
+                                       } else {
+                                               String message = "The elements 
of the original and cloned SOAP Envelopes do not match";
+                                               throw new 
SandeshaException(message);
+                                       }
+                               }
+                       }
+               }
+               
+               return clonedEnvelope;
        }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to