Author: mckierna
Date: Mon Jun 23 05:28:53 2008
New Revision: 670538

URL: http://svn.apache.org/viewvc?rev=670538&view=rev
Log:
forbid mixed EPR types on a sequence 
https://issues.apache.org/jira/browse/SANDESHA2-160

Modified:
    
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/client/SandeshaClientConstants.java
    
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/i18n/SandeshaMessageKeys.java
    
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/SandeshaUtil.java
    
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/SequenceManager.java
    
webservices/sandesha/trunk/java/modules/core/src/main/resources/org/apache/sandesha2/i18n/resource.properties

Modified: 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/client/SandeshaClientConstants.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/client/SandeshaClientConstants.java?rev=670538&r1=670537&r2=670538&view=diff
==============================================================================
--- 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/client/SandeshaClientConstants.java
 (original)
+++ 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/client/SandeshaClientConstants.java
 Mon Jun 23 05:28:53 2008
@@ -38,4 +38,5 @@
        public static final String OFFERED_ENDPOINT = "OfferedEndpoint";
        public static final String AVOID_AUTO_TERMINATION = 
"AviodAutoTermination";
        public static final String AUTO_START_NEW_SEQUENCE = 
"AutoStartNewSequence";
+       public static final String FORBID_MIXED_EPRS_ON_SEQUENCE = 
"ForbidMixedEPRsOnSequence";//if true means a sequence will not disallow both 
sync and async clients
 }

Modified: 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/i18n/SandeshaMessageKeys.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/i18n/SandeshaMessageKeys.java?rev=670538&r1=670537&r2=670538&view=diff
==============================================================================
--- 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/i18n/SandeshaMessageKeys.java
 (original)
+++ 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/i18n/SandeshaMessageKeys.java
 Mon Jun 23 05:28:53 2008
@@ -49,6 +49,7 @@
        public static final String 
cannotSendMsgAsSequenceClosed="cannotSendMsgAsSequenceClosed";
        public static final String 
cannotSendMsgAsSequenceTerminated="cannotSendMsgAsSequenceTerminated";
        public static final String 
cannotSendMsgAsSequenceTimedout="cannotSendMsgAsSequenceTimedout";
+       public static final String cannotSendMsgAsEPRWrong = 
"cannotSendMsgAsEPRWrong";
        public static final String noValidSyncResponse="noValidSyncResponse";
        public static final String classLoaderNotFound="classLoaderNotFound";
 

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=670538&r1=670537&r2=670538&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
 Mon Jun 23 05:28:53 2008
@@ -23,6 +23,7 @@
 import org.apache.axiom.soap.SOAPEnvelope;
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.addressing.AddressingConstants;
+import org.apache.axis2.addressing.AddressingHelper;
 import org.apache.axis2.addressing.EndpointReference;
 import org.apache.axis2.addressing.RelatesTo;
 import org.apache.axis2.context.ConfigurationContext;
@@ -169,12 +170,17 @@
                 * side - a derivation of wsaTo & SeequenceKey
                 */
                String internalSequenceId = getSequenceID(rmMsgCtx, serverSide, 
false); //get a sequenceID, possibly pre-existing
+               if (log.isDebugEnabled())
+                       log.debug("Enter: 
ApplicationMsgProcessor::internalSequenceId = " + internalSequenceId);
                
                boolean lastMessage = false;
                if(!serverSide){
                        String lastAppMessage = (String) 
msgContext.getProperty(SandeshaClientConstants.LAST_MESSAGE);
-                       if (lastAppMessage != null && 
"true".equals(lastAppMessage))
+                       if (lastAppMessage != null && 
"true".equals(lastAppMessage)){
                                lastMessage = true;
+                               if (log.isDebugEnabled())
+                                       log.debug("Enter: 
ApplicationMsgProcessor: last message");
+                       }
                }
                
                if (internalSequenceId!=null)
@@ -208,23 +214,44 @@
 
                RMSBean rmsBean = 
SandeshaUtil.getRMSBeanFromInternalSequenceId(storageManager, 
internalSequenceId);
 
-               //see if the sequence is closed
-               if(rmsBean != null && 
-                       (rmsBean.isSequenceClosedClient() || 
rmsBean.isTerminateAdded() || rmsBean.isTimedOut())){
-                       if(SandeshaUtil.isAutoStartNewSequence(msgContext)){
-                               internalSequenceId = getSequenceID(rmMsgCtx, 
serverSide, true); //require a new sequence
-                               
rmMsgCtx.setProperty(Sandesha2Constants.MessageContextProperties.INTERNAL_SEQUENCE_ID,internalSequenceId);
-                       }
-                       else if(rmsBean.isSequenceClosedClient()){
-                               throw new 
SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotSendMsgAsSequenceClosed,
 internalSequenceId));
-                       }
-                       else if(rmsBean.isTerminateAdded()){
-                               throw new 
SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotSendMsgAsSequenceTerminated,
 internalSequenceId));
-                       }
-                       else if(rmsBean.isTimedOut()){
-                               throw new 
SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotSendMsgAsSequenceTimedout,
 internalSequenceId));
+               //if this is an existing sequence then we need to do some 
checks first
+               if(rmsBean != null)
+               {
+                       //see if the sequence is closed
+                       if(rmsBean.isSequenceClosedClient() || 
rmsBean.isTerminateAdded() || rmsBean.isTimedOut()){
+                               
if(SandeshaUtil.isAutoStartNewSequence(msgContext)){
+                                       internalSequenceId = 
getSequenceID(rmMsgCtx, serverSide, true); //require a new sequence
+                                       
rmMsgCtx.setProperty(Sandesha2Constants.MessageContextProperties.INTERNAL_SEQUENCE_ID,internalSequenceId);
+                               }
+                               else if(rmsBean.isSequenceClosedClient()){
+                                       throw new 
SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotSendMsgAsSequenceClosed,
 internalSequenceId));
+                               }
+                               else if(rmsBean.isTerminateAdded()){
+                                       throw new 
SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotSendMsgAsSequenceTerminated,
 internalSequenceId));
+                               }
+                               else if(rmsBean.isTimedOut()){
+                                       throw new 
SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotSendMsgAsSequenceTimedout,
 internalSequenceId));
+                               }
+                       }
+                       else if(!msgContext.isServerSide())
+                       {
+                               //we need to check that any outgoing request 
msg is not using a different MEP than the sequence was established with
+                               //The easiest way to check this is to ensure 
that the request and the replyTo of the RMS bean do not
+                               //differ between non-anonymous and anonymous 
(either MC anonymous or WS-A anonymous)
+                               boolean msgIsAnon = 
!AddressingHelper.isReplyRedirected(msgContext);
+                               boolean isSequenceAnon = 
rmsBean.getReplyToEndpointReference() ==null || 
+                                                                               
        rmsBean.getReplyToEndpointReference().getAddress() ==null || 
+                                                                               
        rmsBean.getReplyToEndpointReference().hasAnonymousAddress();
+                               if(msgIsAnon != isSequenceAnon && 
SandeshaUtil.isForbidMixedEPRsOnSequence(msgContext))
+                               {
+                                       String msg = 
SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotSendMsgAsEPRWrong, 
msgContext.toString(), rmsBean.getSequenceID());
+                                       log.warn(msg);
+                                       throw new SandeshaException(msg);
+                               }                               
                        }
                }
+               if (log.isDebugEnabled())
+                       log.debug("Enter: ApplicationMsgProcessor:: initial 
sequence checks pass");
                
                // If the call application is a 2-way MEP, and uses a anonymous 
replyTo, and the
                // RM 1.1 spec level, then we must have MakeConnection enabled. 
We check that here,
@@ -276,6 +303,8 @@
                        
                        if (rmsBean == null) { 
                                // SENDING THE CREATE SEQUENCE.
+                               if (log.isDebugEnabled())
+                                       log.debug("Enter: 
ApplicationMsgProcessor:: sending createSequence");
                                while (rmsBean == null) {
                                        // There is a timing window where 2 
sending threads can hit this point
                                        // at the same time and both will 
create an RMSBean to the same endpoint
@@ -329,6 +358,9 @@
                        } else { // This is the first message 
(systemMessageNumber = -1)
                                messageNumber = 1;
                        }
+                       
+                       if (log.isDebugEnabled())
+                               log.debug("Enter: 
ApplicationMsgProcessor::message number=" + messageNumber);
        
                        if (serverSide) {
                                // Deciding whether this is the last message. 
We assume it is if it relates to
@@ -357,6 +389,8 @@
                        // saving the used message number, and the expected 
reply count
                        boolean startPolling = false;
                        if (!dummyMessage) {
+                               if (log.isDebugEnabled())
+                                       log.debug("Enter: 
ApplicationMsgProcessor:: not a dummy msg");
                                rmsBean.setNextMessageNumber(messageNumber);
        
                                // Identify the MEP associated with the message.
@@ -457,6 +491,8 @@
                        
                        if (toEPR != null) {
                                // setting default actions.
+                               if (log.isDebugEnabled())
+                                       log.debug("Enter: 
ApplicationMsgProcessor::setting default actions");
                                String to = toEPR.getAddress();
                                String operationName = 
msgContext.getOperationContext().getAxisOperation().getName().getLocalPart();
                                if (msgContext.getWSAAction() == null) {

Modified: 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/SandeshaUtil.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/SandeshaUtil.java?rev=670538&r1=670537&r2=670538&view=diff
==============================================================================
--- 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/SandeshaUtil.java
 (original)
+++ 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/SandeshaUtil.java
 Mon Jun 23 05:28:53 2008
@@ -1131,6 +1131,33 @@
                return newEPR;
        }       
        
+       public static boolean isForbidMixedEPRsOnSequence(MessageContext mc)
+       {
+               if(LoggingControl.isAnyTracingEnabled() && 
log.isDebugEnabled()) log.debug("Entry: 
SandeshaUtil::isForbidMixedEPRsOnSequence");
+               boolean result = false;
+
+               //look at the msg ctx first
+               String auto = (String) 
mc.getProperty(SandeshaClientConstants.FORBID_MIXED_EPRS_ON_SEQUENCE);
+               if ("true".equals(auto)) {
+                       if (log.isDebugEnabled()) log.debug("Mixed EPRs 
forbidden on message context");
+                       result = true;
+               }                       
+               
+               if(!result) {
+                       //look at the operation
+                       if (mc.getAxisOperation() != null) {
+                               Parameter mixedParam = 
mc.getAxisOperation().getParameter(SandeshaClientConstants.FORBID_MIXED_EPRS_ON_SEQUENCE);
+                               if (null != mixedParam && 
"true".equals(mixedParam.getValue())) {
+                                       if (log.isDebugEnabled()) 
log.debug("mixed EPRs forbidden on operation");
+                                       result = true;
+                               }
+                       }
+               }
+               
+               if(LoggingControl.isAnyTracingEnabled() && 
log.isDebugEnabled()) log.debug("Exit: 
SandeshaUtil::isForbidMixedEPRsOnSequence, " + result);
+               return result;                  
+       }
+       
        public static boolean isAutoStartNewSequence(MessageContext mc){
                if(LoggingControl.isAnyTracingEnabled() && 
log.isDebugEnabled()) log.debug("Entry: SandeshaUtil::isAutoStartNewSequence");
                boolean result = false;

Modified: 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/SequenceManager.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/SequenceManager.java?rev=670538&r1=670537&r2=670538&view=diff
==============================================================================
--- 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/SequenceManager.java
 (original)
+++ 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/SequenceManager.java
 Mon Jun 23 05:28:53 2008
@@ -176,6 +176,8 @@
                        inboundSequence = (String) 
firstAplicationMsgCtx.getProperty(Sandesha2Constants.MessageContextProperties.INBOUND_SEQUENCE_ID);
                        if(inboundSequence != null) {
                                inboundBean = 
SandeshaUtil.getRMDBeanFromSequenceId(storageManager, inboundSequence);
+                               if (log.isDebugEnabled())
+                                       log.debug("SequenceManager:: server 
side app msg: inboundBean=" + inboundBean);
                        }
                }
                

Modified: 
webservices/sandesha/trunk/java/modules/core/src/main/resources/org/apache/sandesha2/i18n/resource.properties
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/modules/core/src/main/resources/org/apache/sandesha2/i18n/resource.properties?rev=670538&r1=670537&r2=670538&view=diff
==============================================================================
--- 
webservices/sandesha/trunk/java/modules/core/src/main/resources/org/apache/sandesha2/i18n/resource.properties
 (original)
+++ 
webservices/sandesha/trunk/java/modules/core/src/main/resources/org/apache/sandesha2/i18n/resource.properties
 Mon Jun 23 05:28:53 2008
@@ -64,6 +64,7 @@
 cannotSendMsgAsSequenceClosed=Sandesha2 could not send the message on sequence 
{0} as the sequence has been closed.
 cannotSendMsgAsSequenceTerminated=Sandesha2 could not send the message on 
sequence {0} as the sequence has been terminated.
 cannotSendMsgAsSequenceTimedout=Sandesha2 could not send the message on 
sequence {0} as the sequence has timed out.
+cannotSendMsgAsEPRWrong=Sandesha2 could not send the message {0} on sequence 
{1} as the message exchange pattern does not match that of the sequence: a 
sequence supports either synchronous use or asynchronous use, not both.
 noValidSyncResponse=Sandesha2 sender thread has not received a valid 
synchronous response.
 classLoaderNotFound=Module class loader not found.
 



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

Reply via email to