You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fx-dev@ws.apache.org by ch...@apache.org on 2007/01/23 12:11:14 UTC

svn commit: r498990 - in /webservices/sandesha/trunk/java/src/org/apache/sandesha2: storage/inmemory/InMemoryStorageManager.java util/SandeshaUtil.java

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: sandesha-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: sandesha-dev-help@ws.apache.org