svn commit: r675621 - in /webservices/sandesha/trunk/java/modules: core/src/main/java/org/apache/sandesha2/msgprocessors/ core/src/main/java/org/apache/sandesha2/util/ tests/src/test/java/org/apache/sandesha2/ tests/test-resources/

[email protected]
Newsgroups gmane.comp.apache.webservices.fx.devel
Message-ID <[email protected]>
Author: mckierna
Date: Thu Jul 10 08:56:49 2008
New Revision: 675621

URL: http://svn.apache.org/viewvc?rev=675621&view=rev
Log:
Do not ack if no msgs sent and some serialization tests

Added:
    webservices/sandesha/trunk/java/modules/tests/src/test/java/org/apache/sandesha2/MessageContextSerializationTest.java
    webservices/sandesha/trunk/java/modules/tests/test-resources/MessageContext.dat   (with props)
    webservices/sandesha/trunk/java/modules/tests/test-resources/RMDBean.dat   (with props)
    webservices/sandesha/trunk/java/modules/tests/test-resources/RMSBean.dat   (with props)
Modified:
    webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/msgprocessors/ApplicationMsgProcessor.java
    webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/RMMsgCreator.java
    webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/RangeString.java

Modified: webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/msgprocessors/ApplicationMsgProcessor.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/msgprocessors/ApplicationMsgProcessor.java?rev=675621&r1=675620&r2=675621&view=diff
==============================================================================
--- webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/msgprocessors/ApplicationMsgProcessor.java (original)
+++ webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/msgprocessors/ApplicationMsgProcessor.java Thu Jul 10 08:56:49 2008
@@ -30,6 +30,7 @@
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.context.OperationContext;
 import org.apache.axis2.description.AxisOperation;
+import org.apache.axis2.description.Parameter;
 import org.apache.axis2.wsdl.WSDLConstants;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -90,6 +91,9 @@
 	}
 	
 	private String getSequenceID(RMMsgContext rmMsgCtx, boolean serverSide, boolean forceNewSequence)throws SandeshaException{
+		if (log.isDebugEnabled())
+			log.debug("Enter: ApplicationMsgProcessor::getSequenceID " + rmMsgCtx + ", " + serverSide + ", " + forceNewSequence);
+		
 		MessageContext msgContext = rmMsgCtx.getMessageContext();
 		ConfigurationContext configContext = msgContext.getConfigurationContext();
 		
@@ -114,8 +118,18 @@
 			String to = toEPR.getAddress();
 			String sequenceKey = null;
 			if(forceNewSequence){
-				sequenceKey = SandeshaUtil.getUUID();
-				msgContext.setProperty(SandeshaClientConstants.SEQUENCE_KEY, sequenceKey);
+				//try to set a new sequence key
+				try{
+					sequenceKey = SandeshaUtil.getUUID();
+					msgContext.setProperty(SandeshaClientConstants.SEQUENCE_KEY, sequenceKey);
+					configContext.getAxisConfiguration().addParameter(new Parameter(SandeshaClientConstants.SEQUENCE_KEY, sequenceKey));					
+				}
+				catch(AxisFault e){
+					if (log.isDebugEnabled())
+						log.debug("Enter: ApplicationMsgProcessor::getSequenceID " + e);
+					throw new SandeshaException(e);
+				}
+
 			}
 			else{
 				sequenceKey = (String) msgContext.getProperty(SandeshaClientConstants.SEQUENCE_KEY);
@@ -126,6 +140,8 @@
 			
 			internalSequenceId = SandeshaUtil.getInternalSequenceID(to, sequenceKey);
 		}
+		if (log.isDebugEnabled())
+			log.debug("Exit: ApplicationMsgProcessor::getSequenceID " + internalSequenceId);
 		return internalSequenceId;
 	}
 	
@@ -221,7 +237,11 @@
 			if(rmsBean.isSequenceClosedClient() || rmsBean.isTerminateAdded() || rmsBean.isTimedOut()){
 				if(SandeshaUtil.isAutoStartNewSequence(msgContext)){
 					internalSequenceId = getSequenceID(rmMsgCtx, serverSide, true); //require a new sequence
+					if (log.isDebugEnabled())
+						log.debug("ApplicationMsgProcessor: auto start new sequence " + internalSequenceId + " :: " + rmsBean);
+					//set this new internal sequence ID on the msg
 					rmMsgCtx.setProperty(Sandesha2Constants.MessageContextProperties.INTERNAL_SEQUENCE_ID,internalSequenceId);
+					rmsBean = null;
 				}
 				else if(rmsBean.isSequenceClosedClient()){
 					throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotSendMsgAsSequenceClosed, internalSequenceId));

Modified: webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/RMMsgCreator.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/RMMsgCreator.java?rev=675621&r1=675620&r2=675621&view=diff
==============================================================================
--- webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/RMMsgCreator.java (original)
+++ webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/RMMsgCreator.java Thu Jul 10 08:56:49 2008
@@ -486,50 +486,56 @@
 		
 		String rmVersion = rmdBean.getRMVersion();
 		String rmNamespaceValue = SpecSpecificConstants.getRMNamespaceValue(rmVersion);
-
-		SequenceAcknowledgement sequenceAck = new SequenceAcknowledgement(rmNamespaceValue);
-		Identifier id = new Identifier(rmNamespaceValue);
-		id.setIndentifer(sequenceId);
-		sequenceAck.setIdentifier(id);
-
 		ArrayList ackRangeArrayList = SandeshaUtil.getAckRangeArrayList(rmdBean.getServerCompletedMessages(), rmNamespaceValue);
-		sequenceAck.setAckRanges(ackRangeArrayList);
-
-		if (rmdBean.isClosed()) {
-			// sequence is closed. so add the 'Final' part.
-			if (SpecSpecificConstants.isAckFinalAllowed(rmVersion)) {
-				sequenceAck.setAckFinal(true);
+		if(ackRangeArrayList!=null && ackRangeArrayList.size()!=0){
+			if(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled())
+				log.debug("RMMsgCreator::addAckMessage : there are messages to ack " + ackRangeArrayList);
+			//there are actually messages to ack
+			SequenceAcknowledgement sequenceAck = new SequenceAcknowledgement(rmNamespaceValue);
+			Identifier id = new Identifier(rmNamespaceValue);
+			id.setIndentifer(sequenceId);
+			sequenceAck.setIdentifier(id);
+
+			sequenceAck.setAckRanges(ackRangeArrayList);
+			
+			if (rmdBean.isClosed()) {
+				// sequence is closed. so add the 'Final' part.
+				if(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled())
+					log.debug("RMMsgCreator::addAckMessage : sequence closed");
+				if (SpecSpecificConstants.isAckFinalAllowed(rmVersion)) {
+					sequenceAck.setAckFinal(true);
+				}
 			}
-		}
 
-		applicationMsg.addSequenceAcknowledgement(sequenceAck);
+			applicationMsg.addSequenceAcknowledgement(sequenceAck);
 
-		if (applicationMsg.getWSAAction()==null) {
-			applicationMsg.setAction(SpecSpecificConstants.getSequenceAcknowledgementAction(rmVersion));
-			applicationMsg.setSOAPAction(SpecSpecificConstants.getSequenceAcknowledgementSOAPAction(rmVersion));
-		}
-		if(applicationMsg.getMessageId() == null) {
-			applicationMsg.setMessageId(SandeshaUtil.getUUID());
-		}
-		
-		if(addToEnvelope){
-			// Write the ack into the soap envelope
-			try {
-				applicationMsg.addSOAPEnvelope();
-			} catch(AxisFault e) {
-				if(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled()) log.debug("Caught AxisFault", e);
-				throw new SandeshaException(e.getMessage(), e);
+			if (applicationMsg.getWSAAction()==null) {
+				applicationMsg.setAction(SpecSpecificConstants.getSequenceAcknowledgementAction(rmVersion));
+				applicationMsg.setSOAPAction(SpecSpecificConstants.getSequenceAcknowledgementSOAPAction(rmVersion));
+			}
+			if(applicationMsg.getMessageId() == null) {
+				applicationMsg.setMessageId(SandeshaUtil.getUUID());
 			}
-		}else{
-			// Should use a constant in the final fix.
-			applicationMsg.setProperty(ACK_TO_BE_WRITTEN, Boolean.TRUE);
+			
+			if(addToEnvelope){
+				// Write the ack into the soap envelope
+				try {
+					applicationMsg.addSOAPEnvelope();
+				} catch(AxisFault e) {
+					if(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled()) log.debug("Caught AxisFault", e);
+					throw new SandeshaException(e.getMessage(), e);
+				}
+			}else{
+				// Should use a constant in the final fix.
+				applicationMsg.setProperty(ACK_TO_BE_WRITTEN, Boolean.TRUE);
+			}
+			
+			// Ensure the message also contains the token that needs to be used
+			secureOutboundMessage(rmdBean, applicationMsg.getMessageContext());
 		}
 		
-		// Ensure the message also contains the token that needs to be used
-		secureOutboundMessage(rmdBean, applicationMsg.getMessageContext());
-		
 		if(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled()) 
-			log.debug("Exit: RMMsgCreator::addAckMessage");
+			log.debug("Exit: RMMsgCreator::addAckMessage " + applicationMsg);
 	}
 	
 	

Modified: webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/RangeString.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/RangeString.java?rev=675621&r1=675620&r2=675621&view=diff
==============================================================================
--- webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/RangeString.java (original)
+++ webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/RangeString.java Thu Jul 10 08:56:49 2008
@@ -365,6 +365,27 @@
 		
 	}
 	
+	public boolean equals(Object o){
+		//this method is called by unit tests. It is not generally called in common paths.
+		if(o==null){
+			return false;
+		}
+		else if(o == this){
+			return true; //we know we must be the same since we are the exact same object
+		}
+		else{
+			if(!o.getClass().equals(this.getClass())){
+				//we are two different classes so we interpret that as not equivalent
+				return false;
+			}
+			else{
+				//these are two seperate range strings - if there string form is the same then
+				//they are equivalent
+				return o.toString().equals(this.toString());
+			}
+		}
+	}
+	
 	
 
 }

Added: webservices/sandesha/trunk/java/modules/tests/src/test/java/org/apache/sandesha2/MessageContextSerializationTest.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/modules/tests/src/test/java/org/apache/sandesha2/MessageContextSerializationTest.java?rev=675621&view=auto
==============================================================================
--- webservices/sandesha/trunk/java/modules/tests/src/test/java/org/apache/sandesha2/MessageContextSerializationTest.java (added)
+++ webservices/sandesha/trunk/java/modules/tests/src/test/java/org/apache/sandesha2/MessageContextSerializationTest.java Thu Jul 10 08:56:49 2008
@@ -0,0 +1,220 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sandesha2;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.soap.SOAPEnvelope;
+import org.apache.axis2.addressing.EndpointReference;
+import org.apache.axis2.client.ServiceClient;
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.context.ConfigurationContextFactory;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.context.ServiceContext;
+import org.apache.axis2.description.AxisOperation;
+import org.apache.axis2.description.AxisOperationFactory;
+import org.apache.axis2.description.AxisService;
+import org.apache.axis2.wsdl.WSDLConstants;
+import org.apache.sandesha2.storage.beans.RMDBean;
+import org.apache.sandesha2.storage.beans.RMSBean;
+import org.apache.sandesha2.util.RMMsgCreator;
+import org.apache.sandesha2.util.RangeString;
+
+/**
+ * This class tests the Axis2 Message Context Serialization code.
+ * Since sandesha can, in certain modes, serializae message contexts, it is
+ * important that changes to message context serialization does not break anything.
+ * 
+ * These tests use some pre-produced binary data ".dat" resource files.
+ * These files contain the binary data for certain sandesha data structures.
+ * This test ensures that sandesha is still capable of deserializing previously 
+ * serialized sandesha data.
+ * 
+ */
+public class MessageContextSerializationTest extends SandeshaTestCase{
+	
+	private static final String rmsDatFileName = "RMSBean.dat";
+	private static final String rmdDatFileName = "RMDBean.dat";
+	private static final String msgCtxDatFileName = "MessageContext.dat";
+	
+	private static RMSBean expectedRMSBean;
+	private static RMDBean expectedRMDBean;
+	private static MessageContext expectedMessageContext;
+	
+	private static EndpointReference epr = new EndpointReference("someEPR");
+	
+	
+	
+	public MessageContextSerializationTest(String s)throws Exception
+	{
+		super(s);
+	}
+	
+	public void testMain()throws Exception{
+		
+		//ensure we can deserialize the rms bean
+		{
+			FileInputStream fis = new FileInputStream(resourceDir + File.separator + rmsDatFileName);
+			ObjectInputStream rmsBeanData = new ObjectInputStream(fis);
+			RMSBean bean = (RMSBean)rmsBeanData.readObject();	
+			assertTrue(bean.match(expectedRMSBean));
+		}
+		
+		//ensure we can deserialize the rmd bean
+		{
+			FileInputStream fis = new FileInputStream(resourceDir + File.separator + rmdDatFileName);
+			ObjectInputStream rmdBeanData = new ObjectInputStream(fis);
+			RMDBean bean = (RMDBean)rmdBeanData.readObject();	
+			assertTrue(bean.match(expectedRMDBean));
+		}
+
+		//ensure we can deserialize the msg ctx
+		{
+			FileInputStream fis = new FileInputStream(resourceDir + File.separator + msgCtxDatFileName);
+			ObjectInputStream msgCtxData = new ObjectInputStream(fis);
+			MessageContext msg = (MessageContext)msgCtxData.readObject();	
+			//TODO any extra properties set earlier should be read and verified here
+		}
+	}
+	
+	public void setUp()throws Exception
+	{
+		//setup the RMSBean
+		expectedRMSBean = new RMSBean();
+		expectedRMSBean.setAnonymousUUID("someAnonymousUUID");
+		expectedRMSBean.setAvoidAutoTermination(true);
+		expectedRMSBean.setClientCompletedMessages(new RangeString());
+		expectedRMSBean.setClosed(true);
+		expectedRMSBean.setCreateSeqMsgID("someCSeqMsgId");
+		expectedRMSBean.setCreateSequenceMsgStoreKey("someMsgStoreKey");
+		expectedRMSBean.setExpectedReplies(1);
+		expectedRMSBean.setHighestOutMessageNumber(1);
+		expectedRMSBean.setHighestOutRelatesTo("someRelatesTo");
+		expectedRMSBean.setInternalSequenceID("someInternalSequenceID");
+		expectedRMSBean.setLastActivatedTime(1);
+		expectedRMSBean.setLastOutMessage(1);
+		expectedRMSBean.setLastSendError(new Exception());
+		expectedRMSBean.setLastSendErrorTimestamp(1);
+		expectedRMSBean.setNextMessageNumber(1);
+		expectedRMSBean.setOfferedEndPoint("someEndPoint");
+		expectedRMSBean.setOfferedSequence("offeredSequence");
+		expectedRMSBean.setPollingMode(true);
+		expectedRMSBean.setReferenceMessageStoreKey("someRefMsgStoreKey");
+		expectedRMSBean.setRMVersion(Sandesha2Constants.SPEC_VERSIONS.v1_1);
+		expectedRMSBean.setSecurityTokenData("someSecurityToken");
+		expectedRMSBean.setSequenceClosedClient(true);
+		expectedRMSBean.setSequenceID("someSequenceID");
+		expectedRMSBean.setServiceName("someService");
+		expectedRMSBean.setSoapVersion(1);
+		expectedRMSBean.setTerminateAdded(true);
+		expectedRMSBean.setTerminationPauserForCS(true);
+		expectedRMSBean.setTimedOut(true);
+		expectedRMSBean.setTransaction(null);
+		expectedRMSBean.setTransportTo("transportTo");
+		expectedRMSBean.setToEndpointReference(epr);
+		expectedRMSBean.setReplyToEndpointReference(epr);
+		expectedRMSBean.setAcksToEndpointReference(epr);
+		
+		//setup the RMDBean
+		expectedRMDBean = new RMDBean();
+		expectedRMDBean.setClosed(true);
+		expectedRMDBean.setHighestInMessageId("someMsgId");
+		expectedRMDBean.setLastActivatedTime(1);
+		expectedRMDBean.setNextMsgNoToProcess(1);
+		expectedRMDBean.setOutboundInternalSequence("someSequenceID");
+		expectedRMDBean.setOutOfOrderRanges(new RangeString());
+		expectedRMDBean.setPollingMode(true);
+		expectedRMDBean.setReferenceMessageKey("someRefMsgStoreKey");
+		expectedRMDBean.setRMVersion("someVersion");
+		expectedRMDBean.setSecurityTokenData("someTokenData");
+		expectedRMDBean.setSequenceID("someSequenceID");
+		expectedRMDBean.setServerCompletedMessages(new RangeString());
+		expectedRMDBean.setServiceName("someService");
+		expectedRMDBean.setTerminated(true);
+		expectedRMDBean.setToEndpointReference(epr);
+		expectedRMDBean.setReplyToEndpointReference(epr);
+		expectedRMDBean.setAcksToEndpointReference(epr);
+		
+		//setup a typical message context - for this we will also need a config context
+		String repoPath = "target" + File.separator + "repos" + File.separator + "client";
+		String axis2_xml = "target" + File.separator + "repos" + File.separator + "client" + File.separator + "client_axis2.xml";
+		
+		ConfigurationContext configContext = ConfigurationContextFactory.createConfigurationContextFromFileSystem(repoPath,axis2_xml);
+		expectedMessageContext = configContext.createMessageContext();
+		//TODO this could be improved by adding some RM sequence headers
+	}
+	
+	/**
+	 * If called, this method produces/updates the set of .dat files in the resources directory
+	 * Since the data set is complete, this method should not be called (and the data set should
+	 * not be changed) unless it is due to a considered requirement.
+	 */
+	private void produceDataSet()throws IOException{
+		
+		String resourceDir = new File("test-resources").getAbsolutePath();
+		
+		//write the RMSBean
+		{
+			FileOutputStream fos = new FileOutputStream(resourceDir + File.separator + rmsDatFileName);
+			ObjectOutputStream rmsBeanData = new ObjectOutputStream(fos);
+			rmsBeanData.writeObject(expectedRMSBean);
+			rmsBeanData.flush();
+			fos.flush();
+			rmsBeanData.close();
+			fos.close();			
+		}
+
+		
+		//write the RMDBean
+		{
+			FileOutputStream fos = new FileOutputStream(resourceDir + File.separator + rmdDatFileName);
+			ObjectOutputStream rmdBeanData = new ObjectOutputStream(fos);
+			rmdBeanData.writeObject(expectedRMDBean);
+			rmdBeanData.flush();
+			fos.flush();
+			rmdBeanData.close();
+			fos.close();			
+		}
+
+		//write the msg ctx
+		{
+			FileOutputStream fos = new FileOutputStream(resourceDir + File.separator + msgCtxDatFileName);
+			ObjectOutputStream msgCtxData = new ObjectOutputStream(fos);
+			msgCtxData.writeObject(expectedMessageContext);
+			msgCtxData.flush();
+			fos.flush();
+			msgCtxData.close();
+			fos.close();			
+		}
+	}
+	
+	
+	/**
+	 * This main method, when run, will setup the .dat files that this test expects.
+	 * These files should be checked into SVN when generated/modified
+	 */
+//	public static void main(String[] args)throws Exception{
+//		MessageContextSerializationTest test = new MessageContextSerializationTest("");
+//		test.setUp();
+//		test.produceDataSet();
+//	}
+
+}

Added: webservices/sandesha/trunk/java/modules/tests/test-resources/MessageContext.dat
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/modules/tests/test-resources/MessageContext.dat?rev=675621&view=auto
==============================================================================
Binary file - no diff available.

Propchange: webservices/sandesha/trunk/java/modules/tests/test-resources/MessageContext.dat
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: webservices/sandesha/trunk/java/modules/tests/test-resources/RMDBean.dat
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/modules/tests/test-resources/RMDBean.dat?rev=675621&view=auto
==============================================================================
Binary file - no diff available.

Propchange: webservices/sandesha/trunk/java/modules/tests/test-resources/RMDBean.dat
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: webservices/sandesha/trunk/java/modules/tests/test-resources/RMSBean.dat
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/modules/tests/test-resources/RMSBean.dat?rev=675621&view=auto
==============================================================================
Binary file - no diff available.

Propchange: webservices/sandesha/trunk/java/modules/tests/test-resources/RMSBean.dat
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.