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.
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.