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 2006/10/30 16:43:25 UTC
svn commit: r469167 [5/7] - in /webservices/sandesha/trunk/java: config/
interop/conf/ src/org/apache/sandesha2/ src/org/apache/sandesha2/client/
src/org/apache/sandesha2/handlers/ src/org/apache/sandesha2/i18n/
src/org/apache/sandesha2/msgprocessors/ ...
Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/RMMsgCreator.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/RMMsgCreator.java?view=diff&rev=469167&r1=469166&r2=469167
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/RMMsgCreator.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/RMMsgCreator.java Mon Oct 30 07:43:24 2006
@@ -1,769 +1,716 @@
-/*
- * Copyright 1999-2004 The Apache Software Foundation.
- *
- * 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.util;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Map;
-
-import javax.xml.namespace.QName;
-
-import org.apache.axiom.om.OMElement;
-import org.apache.axiom.om.OMNamespace;
-import org.apache.axiom.soap.SOAPEnvelope;
-import org.apache.axiom.soap.SOAPFactory;
-import org.apache.axis2.AxisFault;
-import org.apache.axis2.addressing.AddressingConstants;
-import org.apache.axis2.addressing.EndpointReference;
-import org.apache.axis2.client.Options;
-import org.apache.axis2.context.ConfigurationContext;
-import org.apache.axis2.context.MessageContext;
-import org.apache.axis2.context.OperationContext;
-import org.apache.axis2.description.AxisOperation;
-import org.apache.axis2.description.AxisOperationFactory;
-import org.apache.axis2.description.Parameter;
-import org.apache.axis2.description.TransportInDescription;
-import org.apache.axis2.wsdl.WSDLConstants.WSDL20_2004Constants;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.rampart.RampartMessageData;
-import org.apache.sandesha2.RMMsgContext;
-import org.apache.sandesha2.Sandesha2Constants;
-import org.apache.sandesha2.SandeshaException;
-import org.apache.sandesha2.client.SandeshaClientConstants;
-import org.apache.sandesha2.i18n.SandeshaMessageHelper;
-import org.apache.sandesha2.i18n.SandeshaMessageKeys;
-import org.apache.sandesha2.security.SecurityManager;
-import org.apache.sandesha2.security.SecurityToken;
-import org.apache.sandesha2.storage.StorageManager;
-import org.apache.sandesha2.storage.beanmanagers.SequencePropertyBeanMgr;
-import org.apache.sandesha2.storage.beans.SequencePropertyBean;
-import org.apache.sandesha2.wsrm.Accept;
-import org.apache.sandesha2.wsrm.AckFinal;
-import org.apache.sandesha2.wsrm.AcknowledgementRange;
-import org.apache.sandesha2.wsrm.AcksTo;
-import org.apache.sandesha2.wsrm.Address;
-import org.apache.sandesha2.wsrm.CloseSequence;
-import org.apache.sandesha2.wsrm.CloseSequenceResponse;
-import org.apache.sandesha2.wsrm.CreateSequence;
-import org.apache.sandesha2.wsrm.CreateSequenceResponse;
-import org.apache.sandesha2.wsrm.Endpoint;
-import org.apache.sandesha2.wsrm.IOMRMElement;
-import org.apache.sandesha2.wsrm.Identifier;
-import org.apache.sandesha2.wsrm.MakeConnection;
-import org.apache.sandesha2.wsrm.SequenceAcknowledgement;
-import org.apache.sandesha2.wsrm.SequenceOffer;
-import org.apache.sandesha2.wsrm.TerminateSequence;
-import org.apache.sandesha2.wsrm.TerminateSequenceResponse;
-import org.apache.ws.security.handler.WSHandlerConstants;
-
-/**
- * Used to create new RM messages.
- */
-
-public class RMMsgCreator {
-
- private static Log log = LogFactory.getLog(RMMsgCreator.class);
-
- private static void initializeCreation(MessageContext relatedMessage, MessageContext newMessage)
- throws SandeshaException {
-
- if (relatedMessage.getAxisService() != null && newMessage.getAxisService() != null
- && newMessage.getAxisService() != relatedMessage.getAxisService()) {
-
- Parameter referencePolicyParam = relatedMessage.getAxisService().getParameter(
- Sandesha2Constants.SANDESHA_PROPERTY_BEAN);
- if (referencePolicyParam != null) {
- Parameter newPolicyParam = new Parameter();
- newPolicyParam.setName(Sandesha2Constants.SANDESHA_PROPERTY_BEAN);
- newPolicyParam.setValue(newPolicyParam.getValue());
- }
- }
-
- if (relatedMessage.getAxisOperation() != null && newMessage.getAxisOperation() != null
- && newMessage.getAxisOperation() != relatedMessage.getAxisOperation()) {
-
- Parameter referencePolicyParam = relatedMessage.getAxisOperation().getParameter(
- Sandesha2Constants.SANDESHA_PROPERTY_BEAN);
- if (referencePolicyParam != null) {
- Parameter newPolicyParam = new Parameter();
- newPolicyParam.setName(Sandesha2Constants.SANDESHA_PROPERTY_BEAN);
- newPolicyParam.setValue(newPolicyParam.getValue());
- }
- }
- }
-
- private static void finalizeCreation(MessageContext relatedMessage, MessageContext newMessage)
- throws SandeshaException {
-
- newMessage.setServerSide(relatedMessage.isServerSide());
-
- // adding all parameters from old message to the new one.
- try {
- // axisOperation parameters
- AxisOperation oldAxisOperation = relatedMessage.getAxisOperation();
- if (oldAxisOperation != null) {
- ArrayList axisOpParams = oldAxisOperation.getParameters();
- if (axisOpParams != null) {
- AxisOperation newAxisOperation = newMessage.getAxisOperation();
- Iterator iter = axisOpParams.iterator();
- while (iter.hasNext()) {
- Parameter nextParam = (Parameter) iter.next();
- Parameter newParam = new Parameter();
-
- newParam.setName(nextParam.getName());
- newParam.setValue(nextParam.getValue());
-
- newAxisOperation.addParameter(newParam);
- }
- }
- }
-
- } catch (AxisFault e) {
- String message = SandeshaMessageHelper.getMessage(SandeshaMessageKeys.couldNotCopyParameters, e.getLocalizedMessage());
- log.error(message, e);
- throw new SandeshaException(message, e);
- }
-
- // TODO optimize by cloning the Map rather than copying one by one.
-
- // operationContext properties
- OperationContext oldOpContext = relatedMessage.getOperationContext();
- if (oldOpContext != null) {
- Map oldOpContextProperties = oldOpContext.getProperties();
- if (oldOpContextProperties != null) {
- OperationContext newOpContext = newMessage.getOperationContext();
- Iterator keyIter = oldOpContextProperties.keySet().iterator();
- while (keyIter.hasNext()) {
- String key = (String) keyIter.next();
- newOpContext.setProperty(key, oldOpContextProperties.get(key));
- }
- }
- }
-
- // MessageContext properties
- if (relatedMessage != null && newMessage != null) {
- Map oldMsgContextProperties = relatedMessage.getProperties();
- if (oldMsgContextProperties != null) {
- Iterator keyIter = oldMsgContextProperties.keySet().iterator();
- while (keyIter.hasNext()) {
- String key = (String) keyIter.next();
- newMessage.setProperty(key, oldMsgContextProperties.get(key));
- }
- }
- }
-
- // setting an options with properties copied from the old one.
- Options relatesMessageOptions = relatedMessage.getOptions();
- if (relatesMessageOptions != null) {
- Options newMessageOptions = newMessage.getOptions();
- if (newMessageOptions == null) {
- newMessageOptions = new Options();
- newMessage.setOptions(newMessageOptions);
- }
-
- Map relatedMessageProperties = relatesMessageOptions.getProperties();
- Iterator keys = relatedMessageProperties.keySet().iterator();
- while (keys.hasNext()) {
- String key = (String) keys.next();
- newMessageOptions.setProperty(key, relatedMessageProperties.get(key));
- }
-
- Options relatedMessageParentOptions = relatesMessageOptions.getParent();
- if (relatedMessageParentOptions != null) {
- Map relatedMessageParentProperties = relatedMessageParentOptions.getProperties();
- keys = relatedMessageParentProperties.keySet().iterator();
- while (keys.hasNext()) {
- String key = (String) keys.next();
- newMessageOptions.setProperty(key, relatedMessageParentProperties.get(key));
- }
- }
- }
- }
-
- /**
- * Create a new CreateSeqnence message.
- *
- * @param applicationRMMsg
- * @param internalSequenceId
- * @param acksToEPR
- * @return
- * @throws SandeshaException
- */
- public static RMMsgContext createCreateSeqMsg(RMMsgContext applicationRMMsg, String sequencePropertyKey,
- EndpointReference acksToEPR, StorageManager storageManager) throws AxisFault {
-
- MessageContext applicationMsgContext = applicationRMMsg.getMessageContext();
- if (applicationMsgContext == null)
- throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.appMsgIsNull));
- ConfigurationContext context = applicationMsgContext.getConfigurationContext();
- if (context == null)
- throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.configContextNotSet));
-
- SequencePropertyBeanMgr seqPropMgr = storageManager.getSequencePropertyBeanMgr();
- MessageContext createSeqmsgContext;
- try {
- // creating by copying common contents. (this will not set contexts
- // except for configCtx).
- AxisOperation createSequenceOperation = AxisOperationFactory
- .getAxisOperation(WSDL20_2004Constants.MEP_CONSTANT_OUT_IN);
-
- createSeqmsgContext = SandeshaUtil
- .createNewRelatedMessageContext(applicationRMMsg, createSequenceOperation);
-
- initializeCreation(applicationMsgContext, createSeqmsgContext);
-
- OperationContext createSeqOpCtx = createSeqmsgContext.getOperationContext();
- String createSeqMsgId = SandeshaUtil.getUUID();
- createSeqmsgContext.setMessageID(createSeqMsgId);
- context.registerOperationContext(createSeqMsgId, createSeqOpCtx);
-
- } catch (AxisFault e) {
- throw new SandeshaException(e.getMessage());
- }
-
- AxisOperation appMsgOperationDesc = applicationMsgContext.getAxisOperation();
-
- AxisOperation createSeqOperation = createSeqmsgContext.getAxisOperation();
-
- createSeqOperation.setName(new QName("CreateSequenceOperation"));
- if (appMsgOperationDesc != null) {
- createSeqOperation.setPhasesOutFlow(appMsgOperationDesc.getPhasesOutFlow());
- createSeqOperation.setPhasesOutFaultFlow(appMsgOperationDesc.getPhasesOutFaultFlow());
- createSeqOperation.setPhasesInFaultFlow(appMsgOperationDesc.getPhasesInFaultFlow());
- createSeqOperation.setRemainingPhasesInFlow(appMsgOperationDesc.getRemainingPhasesInFlow());
- }
-
- createSeqmsgContext.setAxisOperation(createSeqOperation);
-
- createSeqmsgContext.setTo(applicationRMMsg.getTo());
-
-// createSeqmsgContext.setReplyTo(applicationRMMsg.getReplyTo());
- //generating a new replyTo address for the CreateSequenceMessage.
- //Otherwise there will be errors when the app msg is InOnly.
-
- QName axisOperationName = createSeqmsgContext.getAxisOperation().getName();
- TransportInDescription transportIn = createSeqmsgContext.getTransportIn();
- QName transportInName = null;
- if (transportIn!=null)
- transportInName = transportIn.getName();
-
- EndpointReference referenceTo = applicationMsgContext.getTo();
- EndpointReference referenceReplyTo = applicationMsgContext.getReplyTo();
-
-
- if (referenceReplyTo!=null) {
- EndpointReference createSeqReplyTo = new EndpointReference (referenceReplyTo.getAddress());
- createSeqmsgContext.setReplyTo(createSeqReplyTo);
- }
-
- RMMsgContext createSeqRMMsg = new RMMsgContext(createSeqmsgContext);
-
- String rmVersion = SandeshaUtil.getRMVersion(sequencePropertyKey, storageManager);
- if (rmVersion == null)
- throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotDecideRMVersion));
-
- String rmNamespaceValue = SpecSpecificConstants.getRMNamespaceValue(rmVersion);
-
- String addressingNamespaceValue = SandeshaUtil.getSequenceProperty(sequencePropertyKey,
- Sandesha2Constants.SequenceProperties.ADDRESSING_NAMESPACE_VALUE, storageManager);
-
- CreateSequence createSequencePart = new CreateSequence(rmNamespaceValue, addressingNamespaceValue);
-
- // Adding sequence offer - if present
- OperationContext operationcontext = applicationMsgContext.getOperationContext();
- if (operationcontext != null) {
- String offeredSequence = (String) applicationMsgContext
- .getProperty(SandeshaClientConstants.OFFERED_SEQUENCE_ID);
- EndpointReference offeredEndpoint = (EndpointReference) applicationMsgContext
- .getProperty(SandeshaClientConstants.OFFERED_ENDPOINT);
-
- if (offeredEndpoint==null)
- offeredEndpoint = applicationMsgContext.getReplyTo(); //using replyTo as the Endpoint if it is not specified
-
- if (offeredSequence != null && !"".equals(offeredSequence)) {
- SequenceOffer offerPart = new SequenceOffer(rmNamespaceValue);
- Identifier identifier = new Identifier(rmNamespaceValue);
- identifier.setIndentifer(offeredSequence);
- offerPart.setIdentifier(identifier);
- createSequencePart.setSequenceOffer(offerPart);
-
- if (Sandesha2Constants.SPEC_2006_08.NS_URI.equals(rmNamespaceValue)) {
- if (offeredEndpoint!=null) {
- Endpoint endpoint = new Endpoint (rmNamespaceValue,addressingNamespaceValue);
- endpoint.setEPR (offeredEndpoint);
- offerPart.setEndpoint(endpoint);
- } else {
- String message = SandeshaMessageHelper.getMessage(
- SandeshaMessageKeys.invalidOfferNoResponseEndpoint);
- throw new SandeshaException (message);
- }
- }
- }
- }
-
- //TODO remove setting addressing values following two beans.
- SequencePropertyBean replyToBean = seqPropMgr.retrieve(sequencePropertyKey,
- Sandesha2Constants.SequenceProperties.REPLY_TO_EPR);
- SequencePropertyBean toBean = seqPropMgr.retrieve(sequencePropertyKey,
- Sandesha2Constants.SequenceProperties.TO_EPR);
-
- if (toBean == null || toBean.getValue() == null)
- throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.toEPRNotValid, null));
-
- EndpointReference toEPR = new EndpointReference(toBean.getValue());
- EndpointReference replyToEPR = null;
-
- String anonymousURI = SpecSpecificConstants.getAddressingAnonymousURI(addressingNamespaceValue);
-
- if (acksToEPR==null || acksToEPR.getAddress() == null || "".equals(acksToEPR.getAddress()))
- acksToEPR = new EndpointReference(anonymousURI);
-
- if (replyToBean != null && replyToBean.getValue() != null)
- replyToEPR = new EndpointReference(replyToBean.getValue());
-
- if (createSeqRMMsg.getTo() == null)
- createSeqRMMsg.setTo(toEPR);
-
- // ReplyTo will be set only if not null.
- if (replyToEPR != null)
- createSeqRMMsg.setReplyTo(replyToEPR);
-
-
- AcksTo acksTo = new AcksTo(acksToEPR,rmNamespaceValue,addressingNamespaceValue);
- createSequencePart.setAcksTo(acksTo);
-
- // Find the token that should be used to secure this new sequence. If there is a token, then we
- // save it in the properties so that the caller can store the token within the create sequence
- // bean.
- SecurityManager secMgr = SandeshaUtil.getSecurityManager(context);
- SecurityToken token = secMgr.getSecurityToken(createSeqmsgContext);
- if(token != null) {
- OMElement str = secMgr.createSecurityTokenReference(token, createSeqmsgContext);
- createSequencePart.setSecurityTokenReference(str);
- createSeqRMMsg.setProperty(Sandesha2Constants.SequenceProperties.SECURITY_TOKEN, token);
-
- //adding the UseSequenceSTR header
- SOAPFactory createSeqFactory = (SOAPFactory) createSeqRMMsg.getSOAPEnvelope().getOMFactory();
- OMNamespace namespace = createSeqFactory.createOMNamespace(Sandesha2Constants.WSRM_COMMON.NS_PREFIX_RM, createSeqRMMsg.getRMNamespaceValue());
- createSeqFactory.createSOAPHeaderBlock(Sandesha2Constants.WSRM_COMMON.USES_SEQUENCE_STR, namespace);
- }
-
- createSeqRMMsg.setMessagePart(Sandesha2Constants.MessageParts.CREATE_SEQ, createSequencePart);
-
- try {
- createSeqRMMsg.addSOAPEnvelope();
- } catch (AxisFault e1) {
- throw new SandeshaException(e1.getMessage());
- }
-
- createSeqRMMsg.setAction(SpecSpecificConstants.getCreateSequenceAction(SandeshaUtil.getRMVersion(
- sequencePropertyKey, storageManager)));
- createSeqRMMsg.setSOAPAction(SpecSpecificConstants.getCreateSequenceSOAPAction(SandeshaUtil.getRMVersion(
- sequencePropertyKey, storageManager)));
-
- finalizeCreation(applicationMsgContext, createSeqmsgContext);
-
- return createSeqRMMsg;
- }
-
- /**
- * Creates a new TerminateSequence message.
- *
- * @param referenceRMMessage
- * @param sequenceId
- * @return
- * @throws SandeshaException
- */
- public static RMMsgContext createTerminateSequenceMessage(RMMsgContext referenceRMMessage, String sequenceId,
- String sequencePropertyKey, StorageManager storageManager) throws AxisFault {
- MessageContext referenceMessage = referenceRMMessage.getMessageContext();
- if (referenceMessage == null)
- throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.msgContextNotSet));
-
- AxisOperation terminateOperation = null;
-
- try {
- terminateOperation = AxisOperationFactory.getAxisOperation(WSDL20_2004Constants.MEP_CONSTANT_OUT_ONLY);
- } catch (AxisFault e1) {
- throw new SandeshaException(e1.getMessage());
- }
-
- if (terminateOperation == null)
- throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.terminateOpperationIsNull));
-
- ConfigurationContext configCtx = referenceMessage.getConfigurationContext();
- if (configCtx == null)
- throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.configContextNotSet));
-
- MessageContext terminateMessage = SandeshaUtil.createNewRelatedMessageContext(referenceRMMessage,
- terminateOperation);
-
- OperationContext operationContext = terminateMessage.getOperationContext();
- configCtx.registerOperationContext(terminateMessage.getMessageID(), operationContext); // to
- // receive
- // terminate
- // sequence
- // response
- // messages
- // correctly.
-
- //using the Sandesha2 RMOutInOperation as the reference operation.
- AxisOperation referenceOperation = referenceMessage.getAxisService()
- .getOperation(new QName (Sandesha2Constants.RM_IN_OUT_OPERATION_NAME));
-
- AxisOperation terminateMsgOperation = terminateMessage.getAxisOperation();
- if (referenceOperation != null) {
- terminateMsgOperation.setPhasesOutFlow(referenceOperation.getPhasesOutFlow());
- terminateMsgOperation.setPhasesOutFaultFlow(referenceOperation.getPhasesOutFaultFlow());
- terminateMsgOperation.setPhasesInFaultFlow(referenceOperation.getPhasesInFaultFlow());
- terminateMsgOperation.setRemainingPhasesInFlow(referenceOperation.getRemainingPhasesInFlow());
- }
-
- String rmVersion = SandeshaUtil.getRMVersion(sequencePropertyKey, storageManager);
- if (rmVersion == null)
- throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotDecideRMVersion));
-
- String rmNamespaceValue = SpecSpecificConstants.getRMNamespaceValue(rmVersion);
-
- initializeCreation(referenceMessage, terminateMessage);
-
- if (!SpecSpecificConstants.isTerminateSequenceResponseRequired(rmVersion)) {
- terminateMessage.setProperty(MessageContext.TRANSPORT_IN, null);
- }
-
- RMMsgContext terminateRMMessage = MsgInitializer.initializeMessage(terminateMessage);
-
- if (terminateMessage == null)
- throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.msgContextNotSet));
-
- // setUpMessage(referenceMessage, terminateMessage);
-
- SOAPFactory factory = SOAPAbstractFactory.getSOAPFactory(SandeshaUtil.getSOAPVersion(referenceMessage
- .getEnvelope()));
-
- terminateMessage.setMessageID(SandeshaUtil.getUUID());
-
- AxisOperation referenceMsgOperation = referenceMessage.getAxisOperation();
- if (referenceMsgOperation != null) {
- ArrayList outPhases = referenceMsgOperation.getPhasesOutFlow();
- if (outPhases != null) {
- terminateOperation.setPhasesOutFlow(outPhases);
- terminateOperation.setPhasesOutFaultFlow(outPhases);
- }
- }
-
- SOAPEnvelope envelope = factory.getDefaultEnvelope();
- terminateRMMessage.setSOAPEnvelop(envelope);
-
- TerminateSequence terminateSequencePart = new TerminateSequence(rmNamespaceValue);
- Identifier identifier = new Identifier(rmNamespaceValue);
- identifier.setIndentifer(sequenceId);
- terminateSequencePart.setIdentifier(identifier);
- terminateRMMessage.setMessagePart(Sandesha2Constants.MessageParts.TERMINATE_SEQ, terminateSequencePart);
-
- finalizeCreation(referenceMessage, terminateMessage);
-
- terminateMessage.setProperty(MessageContext.TRANSPORT_IN, null); // no
- // need
- // for
- // an
- // incoming
- // transport
- // for
- // an
- // terminate
- // message. If this is put, sender will look for an response.
-
- return terminateRMMessage;
- }
-
- /**
- * Create a new CreateSequenceResponse message.
- *
- * @param createSeqMessage
- * @param outMessage
- * @param newSequenceID
- * @return
- * @throws AxisFault
- */
- public static RMMsgContext createCreateSeqResponseMsg(RMMsgContext createSeqMessage, MessageContext outMessage,
- String newSequenceID, StorageManager storageManager) throws AxisFault {
-
- SOAPFactory factory = SOAPAbstractFactory.getSOAPFactory(SandeshaUtil.getSOAPVersion(createSeqMessage
- .getSOAPEnvelope()));
-
- ConfigurationContext configurationContext = createSeqMessage.getMessageContext().getConfigurationContext();
-
- IOMRMElement messagePart = createSeqMessage.getMessagePart(Sandesha2Constants.MessageParts.CREATE_SEQ);
- CreateSequence cs = (CreateSequence) messagePart;
-
- String rmVersion = SandeshaUtil.getRMVersion(newSequenceID, storageManager);
- if (rmVersion == null)
- throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotDecideRMVersion));
-
- String rmNamespaceValue = SpecSpecificConstants.getRMNamespaceValue(rmVersion);
- String addressingNamespaceValue = SandeshaUtil.getSequenceProperty(newSequenceID,
- Sandesha2Constants.SequenceProperties.ADDRESSING_NAMESPACE_VALUE, storageManager);
-
- CreateSequenceResponse response = new CreateSequenceResponse(rmNamespaceValue,
- addressingNamespaceValue);
-
- Identifier identifier = new Identifier(rmNamespaceValue);
- identifier.setIndentifer(newSequenceID);
-
- response.setIdentifier(identifier);
-
- SequenceOffer offer = cs.getSequenceOffer();
- if (offer != null) {
- String outSequenceId = offer.getIdentifer().getIdentifier();
-
- if (outSequenceId != null && !"".equals(outSequenceId)) {
-
- Accept accept = new Accept(rmNamespaceValue, addressingNamespaceValue);
- EndpointReference acksToEPR = createSeqMessage.getTo();
-
- //putting the To EPR as the AcksTo for the response sequence.
- AcksTo acksTo = new AcksTo(acksToEPR,rmNamespaceValue, addressingNamespaceValue);
- accept.setAcksTo(acksTo);
- response.setAccept(accept);
- }
-
- }
-
- SOAPEnvelope envelope = factory.getDefaultEnvelope();
- response.toOMElement(envelope.getBody());
- outMessage.setWSAAction(SpecSpecificConstants.getCreateSequenceResponseAction(SandeshaUtil.getRMVersion(
- newSequenceID, storageManager)));
- outMessage.setSoapAction(SpecSpecificConstants.getCreateSequenceResponseSOAPAction(SandeshaUtil.getRMVersion(
- newSequenceID, storageManager)));
- outMessage.setProperty(AddressingConstants.WS_ADDRESSING_VERSION, addressingNamespaceValue);
-
- String newMessageId = SandeshaUtil.getUUID();
- outMessage.setMessageID(newMessageId);
-
- outMessage.setEnvelope(envelope);
-
- initializeCreation(createSeqMessage.getMessageContext(), outMessage);
-
- RMMsgContext createSeqResponse = null;
- try {
- createSeqResponse = MsgInitializer.initializeMessage(outMessage);
- } catch (SandeshaException ex) {
- throw new AxisFault(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotInnitMessage), ex);
- }
-
- createSeqResponse.setMessagePart(Sandesha2Constants.MessageParts.CREATE_SEQ_RESPONSE, response);
-
- finalizeCreation(createSeqMessage.getMessageContext(), outMessage);
-
- createSeqMessage.getMessageContext().setServerSide(true);
- return createSeqResponse;
- }
-
- public static RMMsgContext createTerminateSeqResponseMsg(RMMsgContext terminateSeqRMMsg, MessageContext outMessage,
- StorageManager storageManager) throws AxisFault {
-
- RMMsgContext terminateSeqResponseRMMsg = new RMMsgContext(outMessage);
-
- SOAPFactory factory = SOAPAbstractFactory.getSOAPFactory(SandeshaUtil.getSOAPVersion(terminateSeqRMMsg
- .getSOAPEnvelope()));
-
- TerminateSequence terminateSequence = (TerminateSequence) terminateSeqRMMsg
- .getMessagePart(Sandesha2Constants.MessageParts.TERMINATE_SEQ);
- String sequenceID = terminateSequence.getIdentifier().getIdentifier();
-
- String namespace = terminateSeqRMMsg.getRMNamespaceValue();
- terminateSeqResponseRMMsg.setRMNamespaceValue(namespace);
-
- TerminateSequenceResponse terminateSequenceResponse = new TerminateSequenceResponse(namespace);
- Identifier identifier = new Identifier(namespace);
- identifier.setIndentifer(sequenceID);
- terminateSequenceResponse.setIdentifier(identifier);
-
- SOAPEnvelope envelope = factory.getDefaultEnvelope();
- terminateSeqResponseRMMsg.setSOAPEnvelop(envelope);
- terminateSeqResponseRMMsg.setMessagePart(Sandesha2Constants.MessageParts.TERMINATE_SEQ_RESPONSE,
- terminateSequenceResponse);
-
- outMessage.setWSAAction(SpecSpecificConstants.getTerminateSequenceResponseAction(SandeshaUtil.getRMVersion(
- sequenceID, storageManager)));
- outMessage.setSoapAction(SpecSpecificConstants.getTerminateSequenceResponseAction(SandeshaUtil.getRMVersion(
- sequenceID, storageManager)));
-
- initializeCreation(terminateSeqRMMsg.getMessageContext(), outMessage);
-
- terminateSeqResponseRMMsg.addSOAPEnvelope();
-
- finalizeCreation(terminateSeqRMMsg.getMessageContext(), outMessage);
-
-// terminateSeqResponseRMMsg.getMessageContext().setServerSide(true);
- return terminateSeqResponseRMMsg;
- }
-
- public static RMMsgContext createCloseSeqResponseMsg(RMMsgContext closeSeqRMMsg, MessageContext outMessage,
- StorageManager storageManager) throws AxisFault {
-
- RMMsgContext closeSeqResponseRMMsg = new RMMsgContext(outMessage);
- ConfigurationContext configurationContext = closeSeqRMMsg.getMessageContext().getConfigurationContext();
-
- SOAPFactory factory = SOAPAbstractFactory.getSOAPFactory(SandeshaUtil.getSOAPVersion(closeSeqRMMsg
- .getSOAPEnvelope()));
-
- CloseSequence closeSequence = (CloseSequence) closeSeqRMMsg
- .getMessagePart(Sandesha2Constants.MessageParts.CLOSE_SEQUENCE);
- String sequenceID = closeSequence.getIdentifier().getIdentifier();
-
- String namespace = closeSeqRMMsg.getRMNamespaceValue();
- closeSeqResponseRMMsg.setRMNamespaceValue(namespace);
-
- CloseSequenceResponse closeSequenceResponse = new CloseSequenceResponse(namespace);
- Identifier identifier = new Identifier(namespace);
- identifier.setIndentifer(sequenceID);
- closeSequenceResponse.setIdentifier(identifier);
-
- SOAPEnvelope envelope = factory.getDefaultEnvelope();
- closeSeqResponseRMMsg.setSOAPEnvelop(envelope);
- closeSeqResponseRMMsg.setMessagePart(Sandesha2Constants.MessageParts.CLOSE_SEQUENCE_RESPONSE,
- closeSequenceResponse);
-
- outMessage.setWSAAction(SpecSpecificConstants.getCloseSequenceResponseAction(SandeshaUtil.getRMVersion(
- sequenceID, storageManager)));
- outMessage.setSoapAction(SpecSpecificConstants.getCloseSequenceResponseAction(SandeshaUtil.getRMVersion(
- sequenceID, storageManager)));
-
- initializeCreation(closeSeqRMMsg.getMessageContext(), outMessage);
-
- closeSeqResponseRMMsg.addSOAPEnvelope();
-
- finalizeCreation(closeSeqRMMsg.getMessageContext(), outMessage);
- closeSeqResponseRMMsg.getMessageContext().setServerSide(true);
- return closeSeqResponseRMMsg;
- }
-
- /**
- * Adds an ack message to the given application message.
- *
- * @param applicationMsg
- * @param sequenceId
- * @throws SandeshaException
- */
- public static void addAckMessage(RMMsgContext applicationMsg, String sequencePropertyKey ,String sequenceId, StorageManager storageManager)
- throws AxisFault {
-
- SOAPFactory factory = null;
- SOAPEnvelope envelope = applicationMsg.getSOAPEnvelope();
- factory = (SOAPFactory) envelope.getOMFactory();
-
- envelope = applicationMsg.getSOAPEnvelope();
-
- ConfigurationContext ctx = applicationMsg.getMessageContext().getConfigurationContext();
-
- String rmVersion = SandeshaUtil.getRMVersion(sequencePropertyKey, storageManager);
- if (rmVersion == null)
- throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotDecideRMVersion));
-
- String rmNamespaceValue = SpecSpecificConstants.getRMNamespaceValue(rmVersion);
-
- SequenceAcknowledgement sequenceAck = new SequenceAcknowledgement(rmNamespaceValue);
- Identifier id = new Identifier(rmNamespaceValue);
- id.setIndentifer(sequenceId);
- sequenceAck.setIdentifier(id);
-
- SequencePropertyBeanMgr seqPropMgr = storageManager.getSequencePropertyBeanMgr();
-
- SequencePropertyBean seqBean = seqPropMgr.retrieve(sequencePropertyKey,
- Sandesha2Constants.SequenceProperties.SERVER_COMPLETED_MESSAGES);
- String msgNoList = (String) seqBean.getValue();
-
- ArrayList ackRangeArrayList = SandeshaUtil.getAckRangeArrayList(msgNoList, factory, rmNamespaceValue);
- Iterator iterator = ackRangeArrayList.iterator();
- while (iterator.hasNext()) {
- AcknowledgementRange ackRange = (AcknowledgementRange) iterator.next();
- sequenceAck.addAcknowledgementRanges(ackRange);
- }
-
- SequencePropertyBean sequenceClosedBean = seqPropMgr.retrieve(sequencePropertyKey,
- Sandesha2Constants.SequenceProperties.SEQUENCE_CLOSED);
-
- if (sequenceClosedBean != null && Sandesha2Constants.VALUE_TRUE.equals(sequenceClosedBean.getValue())) {
- // sequence is closed. so add the 'Final' part.
- if (SpecSpecificConstants.isAckFinalAllowed(rmVersion)) {
- AckFinal ackFinal = new AckFinal(rmNamespaceValue);
- sequenceAck.setAckFinal(ackFinal);
- }
- }
-
- applicationMsg.setMessagePart(Sandesha2Constants.MessageParts.SEQ_ACKNOWLEDGEMENT, sequenceAck);
-
- sequenceAck.toOMElement(envelope.getHeader());
-
- if (applicationMsg.getWSAAction()==null) {
- applicationMsg.setAction(SpecSpecificConstants.getSequenceAcknowledgementAction(SandeshaUtil.getRMVersion(
- sequenceId, storageManager)));
- applicationMsg.setSOAPAction(SpecSpecificConstants.getSequenceAcknowledgementSOAPAction(SandeshaUtil
- .getRMVersion(sequenceId, storageManager)));
- }
-
- applicationMsg.setMessageId(SandeshaUtil.getUUID());
-
- //generating the SOAP envelope.
- applicationMsg.addSOAPEnvelope();
- }
-
- public static RMMsgContext createMakeConnectionMessage (RMMsgContext referenceRMMessage, String makeConnectionSeqId,
- String makeConnectionAnonURI, StorageManager storageManager) throws AxisFault {
-
- MessageContext referenceMessage = referenceRMMessage.getMessageContext();
- String rmNamespaceValue = referenceRMMessage.getRMNamespaceValue();
- String rmVersion = referenceRMMessage.getRMSpecVersion();
-
- AxisOperation makeConnectionOperation = AxisOperationFactory.getAxisOperation(
- WSDL20_2004Constants.MEP_CONSTANT_OUT_IN);
-
- MessageContext makeConnectionMessageCtx = SandeshaUtil.createNewRelatedMessageContext(referenceRMMessage,makeConnectionOperation);
- RMMsgContext makeConnectionRMMessageCtx = MsgInitializer.initializeMessage(makeConnectionMessageCtx);
-
- MakeConnection makeConnection = new MakeConnection (rmNamespaceValue);
- if (makeConnectionSeqId!=null) {
- Identifier identifier = new Identifier (rmNamespaceValue);
- identifier.setIndentifer(makeConnectionSeqId);
- makeConnection.setIdentifier(identifier);
- }
-
- if (makeConnectionAnonURI!=null) {
- Address address = new Address (rmNamespaceValue);
- address.setAddress (makeConnectionAnonURI);
- makeConnection.setAddress(address);
- }
-
- //setting the addressing properties
- makeConnectionMessageCtx.setTo(new EndpointReference (referenceMessage.getTo().getAddress()));
- makeConnectionMessageCtx.setWSAAction(SpecSpecificConstants.getMakeConnectionAction(rmVersion));
- makeConnectionMessageCtx.setMessageID(SandeshaUtil.getUUID());
-
- makeConnectionRMMessageCtx.setMessagePart(Sandesha2Constants.MessageParts.MAKE_CONNECTION,
- makeConnection);
-
- //generating the SOAP Envelope.
- makeConnectionRMMessageCtx.addSOAPEnvelope();
-
- return makeConnectionRMMessageCtx;
- }
-
-}
+/*
+ * Copyright 1999-2004 The Apache Software Foundation.
+ *
+ * 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.util;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMNamespace;
+import org.apache.axiom.soap.SOAPEnvelope;
+import org.apache.axiom.soap.SOAPFactory;
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.addressing.AddressingConstants;
+import org.apache.axis2.addressing.EndpointReference;
+import org.apache.axis2.client.Options;
+import org.apache.axis2.context.ConfigurationContext;
+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.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.sandesha2.RMMsgContext;
+import org.apache.sandesha2.Sandesha2Constants;
+import org.apache.sandesha2.SandeshaException;
+import org.apache.sandesha2.client.SandeshaClientConstants;
+import org.apache.sandesha2.i18n.SandeshaMessageHelper;
+import org.apache.sandesha2.i18n.SandeshaMessageKeys;
+import org.apache.sandesha2.security.SecurityManager;
+import org.apache.sandesha2.security.SecurityToken;
+import org.apache.sandesha2.storage.StorageManager;
+import org.apache.sandesha2.storage.beanmanagers.SequencePropertyBeanMgr;
+import org.apache.sandesha2.storage.beans.SequencePropertyBean;
+import org.apache.sandesha2.wsrm.Accept;
+import org.apache.sandesha2.wsrm.AckFinal;
+import org.apache.sandesha2.wsrm.AcknowledgementRange;
+import org.apache.sandesha2.wsrm.AcksTo;
+import org.apache.sandesha2.wsrm.Address;
+import org.apache.sandesha2.wsrm.CloseSequence;
+import org.apache.sandesha2.wsrm.CloseSequenceResponse;
+import org.apache.sandesha2.wsrm.CreateSequence;
+import org.apache.sandesha2.wsrm.CreateSequenceResponse;
+import org.apache.sandesha2.wsrm.Endpoint;
+import org.apache.sandesha2.wsrm.IOMRMElement;
+import org.apache.sandesha2.wsrm.Identifier;
+import org.apache.sandesha2.wsrm.MakeConnection;
+import org.apache.sandesha2.wsrm.SequenceAcknowledgement;
+import org.apache.sandesha2.wsrm.SequenceOffer;
+import org.apache.sandesha2.wsrm.TerminateSequence;
+import org.apache.sandesha2.wsrm.TerminateSequenceResponse;
+
+/**
+ * Used to create new RM messages.
+ */
+
+public class RMMsgCreator {
+
+ private static Log log = LogFactory.getLog(RMMsgCreator.class);
+
+ private static void initializeCreation(MessageContext relatedMessage, MessageContext newMessage)
+ throws SandeshaException {
+
+ if (relatedMessage.getAxisService() != null && newMessage.getAxisService() != null
+ && newMessage.getAxisService() != relatedMessage.getAxisService()) {
+
+ Parameter referencePolicyParam = relatedMessage.getAxisService().getParameter(
+ Sandesha2Constants.SANDESHA_PROPERTY_BEAN);
+ if (referencePolicyParam != null) {
+ Parameter newPolicyParam = new Parameter();
+ newPolicyParam.setName(Sandesha2Constants.SANDESHA_PROPERTY_BEAN);
+ newPolicyParam.setValue(newPolicyParam.getValue());
+ }
+ }
+
+ if (relatedMessage.getAxisOperation() != null && newMessage.getAxisOperation() != null
+ && newMessage.getAxisOperation() != relatedMessage.getAxisOperation()) {
+
+ Parameter referencePolicyParam = relatedMessage.getAxisOperation().getParameter(
+ Sandesha2Constants.SANDESHA_PROPERTY_BEAN);
+ if (referencePolicyParam != null) {
+ Parameter newPolicyParam = new Parameter();
+ newPolicyParam.setName(Sandesha2Constants.SANDESHA_PROPERTY_BEAN);
+ newPolicyParam.setValue(newPolicyParam.getValue());
+ }
+ }
+ }
+
+ private static void finalizeCreation(MessageContext relatedMessage, MessageContext newMessage)
+ throws SandeshaException {
+
+ newMessage.setServerSide(relatedMessage.isServerSide());
+
+ // adding all parameters from old message to the new one.
+ try {
+ // axisOperation parameters
+ AxisOperation oldAxisOperation = relatedMessage.getAxisOperation();
+ if (oldAxisOperation != null) {
+ ArrayList axisOpParams = oldAxisOperation.getParameters();
+ if (axisOpParams != null) {
+ AxisOperation newAxisOperation = newMessage.getAxisOperation();
+ Iterator iter = axisOpParams.iterator();
+ while (iter.hasNext()) {
+ Parameter nextParam = (Parameter) iter.next();
+ Parameter newParam = new Parameter();
+
+ newParam.setName(nextParam.getName());
+ newParam.setValue(nextParam.getValue());
+
+ newAxisOperation.addParameter(newParam);
+ }
+ }
+ }
+
+ } catch (AxisFault e) {
+ String message = SandeshaMessageHelper.getMessage(SandeshaMessageKeys.couldNotCopyParameters, e.getLocalizedMessage());
+ log.error(message, e);
+ throw new SandeshaException(message, e);
+ }
+
+ // TODO optimize by cloning the Map rather than copying one by one.
+
+ // operationContext properties
+ OperationContext oldOpContext = relatedMessage.getOperationContext();
+ if (oldOpContext != null) {
+ Map oldOpContextProperties = oldOpContext.getProperties();
+ if (oldOpContextProperties != null) {
+ OperationContext newOpContext = newMessage.getOperationContext();
+ Iterator keyIter = oldOpContextProperties.keySet().iterator();
+ while (keyIter.hasNext()) {
+ String key = (String) keyIter.next();
+ newOpContext.setProperty(key, oldOpContextProperties.get(key));
+ }
+ }
+ }
+
+ // MessageContext properties
+ if (relatedMessage != null && newMessage != null) {
+ Map oldMsgContextProperties = relatedMessage.getProperties();
+ if (oldMsgContextProperties != null) {
+ Iterator keyIter = oldMsgContextProperties.keySet().iterator();
+ while (keyIter.hasNext()) {
+ String key = (String) keyIter.next();
+ newMessage.setProperty(key, oldMsgContextProperties.get(key));
+ }
+ }
+ }
+
+ // setting an options with properties copied from the old one.
+ Options relatesMessageOptions = relatedMessage.getOptions();
+ if (relatesMessageOptions != null) {
+ Options newMessageOptions = newMessage.getOptions();
+ if (newMessageOptions == null) {
+ newMessageOptions = new Options();
+ newMessage.setOptions(newMessageOptions);
+ }
+
+ Map relatedMessageProperties = relatesMessageOptions.getProperties();
+ Iterator keys = relatedMessageProperties.keySet().iterator();
+ while (keys.hasNext()) {
+ String key = (String) keys.next();
+ newMessageOptions.setProperty(key, relatedMessageProperties.get(key));
+ }
+
+ Options relatedMessageParentOptions = relatesMessageOptions.getParent();
+ if (relatedMessageParentOptions != null) {
+ Map relatedMessageParentProperties = relatedMessageParentOptions.getProperties();
+ keys = relatedMessageParentProperties.keySet().iterator();
+ while (keys.hasNext()) {
+ String key = (String) keys.next();
+ newMessageOptions.setProperty(key, relatedMessageParentProperties.get(key));
+ }
+ }
+ }
+ }
+
+ /**
+ * Create a new CreateSeqnence message.
+ *
+ * @param applicationRMMsg
+ * @param internalSequenceId
+ * @param acksToEPR
+ * @return
+ * @throws SandeshaException
+ */
+ public static RMMsgContext createCreateSeqMsg(RMMsgContext applicationRMMsg, String sequencePropertyKey,
+ EndpointReference acksToEPR, StorageManager storageManager) throws AxisFault {
+
+ MessageContext applicationMsgContext = applicationRMMsg.getMessageContext();
+ if (applicationMsgContext == null)
+ throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.appMsgIsNull));
+ ConfigurationContext context = applicationMsgContext.getConfigurationContext();
+ if (context == null)
+ throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.configContextNotSet));
+
+ SequencePropertyBeanMgr seqPropMgr = storageManager.getSequencePropertyBeanMgr();
+ MessageContext createSeqmsgContext;
+ try {
+ // creating by copying common contents. (this will not set contexts
+ // except for configCtx).
+ AxisOperation createSequenceOperation = SpecSpecificConstants.getWSRMOperation(
+ Sandesha2Constants.MessageTypes.CREATE_SEQ,
+ SandeshaUtil.getRMVersion(sequencePropertyKey, storageManager),
+ applicationMsgContext.getAxisService());
+
+ createSeqmsgContext = SandeshaUtil
+ .createNewRelatedMessageContext(applicationRMMsg, createSequenceOperation);
+
+ initializeCreation(applicationMsgContext, createSeqmsgContext);
+
+ OperationContext createSeqOpCtx = createSeqmsgContext.getOperationContext();
+ String createSeqMsgId = SandeshaUtil.getUUID();
+ createSeqmsgContext.setMessageID(createSeqMsgId);
+ context.registerOperationContext(createSeqMsgId, createSeqOpCtx);
+
+ } catch (AxisFault e) {
+ throw new SandeshaException(e.getMessage());
+ }
+
+ createSeqmsgContext.setTo(applicationRMMsg.getTo());
+ EndpointReference referenceReplyTo = applicationMsgContext.getReplyTo();
+
+ if (referenceReplyTo!=null) {
+ EndpointReference createSeqReplyTo = new EndpointReference (referenceReplyTo.getAddress());
+ createSeqmsgContext.setReplyTo(createSeqReplyTo);
+ }
+
+ RMMsgContext createSeqRMMsg = new RMMsgContext(createSeqmsgContext);
+
+ String rmVersion = SandeshaUtil.getRMVersion(sequencePropertyKey, storageManager);
+ if (rmVersion == null)
+ throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotDecideRMVersion));
+
+ String rmNamespaceValue = SpecSpecificConstants.getRMNamespaceValue(rmVersion);
+
+ String addressingNamespaceValue = SandeshaUtil.getSequenceProperty(sequencePropertyKey,
+ Sandesha2Constants.SequenceProperties.ADDRESSING_NAMESPACE_VALUE, storageManager);
+
+ CreateSequence createSequencePart = new CreateSequence(rmNamespaceValue, addressingNamespaceValue);
+
+ // Adding sequence offer - if present
+ OperationContext operationcontext = applicationMsgContext.getOperationContext();
+ if (operationcontext != null) {
+ String offeredSequence = (String) applicationMsgContext
+ .getProperty(SandeshaClientConstants.OFFERED_SEQUENCE_ID);
+ EndpointReference offeredEndpoint = (EndpointReference) applicationMsgContext
+ .getProperty(SandeshaClientConstants.OFFERED_ENDPOINT);
+
+ if (offeredEndpoint==null)
+ offeredEndpoint = applicationMsgContext.getReplyTo(); //using replyTo as the Endpoint if it is not specified
+
+ if (offeredSequence != null && !"".equals(offeredSequence)) {
+ SequenceOffer offerPart = new SequenceOffer(rmNamespaceValue);
+ Identifier identifier = new Identifier(rmNamespaceValue);
+ identifier.setIndentifer(offeredSequence);
+ offerPart.setIdentifier(identifier);
+ createSequencePart.setSequenceOffer(offerPart);
+
+ if (Sandesha2Constants.SPEC_2006_08.NS_URI.equals(rmNamespaceValue)) {
+ if (offeredEndpoint!=null) {
+ Endpoint endpoint = new Endpoint (rmNamespaceValue,addressingNamespaceValue);
+ endpoint.setEPR (offeredEndpoint);
+ offerPart.setEndpoint(endpoint);
+ } else {
+ String message = SandeshaMessageHelper.getMessage(
+ SandeshaMessageKeys.invalidOfferNoResponseEndpoint);
+ throw new SandeshaException (message);
+ }
+ }
+ }
+ }
+
+ //TODO remove setting addressing values following two beans.
+ SequencePropertyBean replyToBean = seqPropMgr.retrieve(sequencePropertyKey,
+ Sandesha2Constants.SequenceProperties.REPLY_TO_EPR);
+ SequencePropertyBean toBean = seqPropMgr.retrieve(sequencePropertyKey,
+ Sandesha2Constants.SequenceProperties.TO_EPR);
+
+ if (toBean == null || toBean.getValue() == null)
+ throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.toEPRNotValid, null));
+
+ EndpointReference toEPR = new EndpointReference(toBean.getValue());
+ EndpointReference replyToEPR = null;
+
+ String anonymousURI = SpecSpecificConstants.getAddressingAnonymousURI(addressingNamespaceValue);
+
+ if (acksToEPR==null || acksToEPR.getAddress() == null || "".equals(acksToEPR.getAddress()))
+ acksToEPR = new EndpointReference(anonymousURI);
+
+ if (replyToBean != null && replyToBean.getValue() != null)
+ replyToEPR = new EndpointReference(replyToBean.getValue());
+
+ if (createSeqRMMsg.getTo() == null)
+ createSeqRMMsg.setTo(toEPR);
+
+ // ReplyTo will be set only if not null.
+ if (replyToEPR != null)
+ createSeqRMMsg.setReplyTo(replyToEPR);
+
+
+ AcksTo acksTo = new AcksTo(acksToEPR,rmNamespaceValue,addressingNamespaceValue);
+ createSequencePart.setAcksTo(acksTo);
+
+ // Find the token that should be used to secure this new sequence. If there is a token, then we
+ // save it in the properties so that the caller can store the token within the create sequence
+ // bean.
+ SecurityManager secMgr = SandeshaUtil.getSecurityManager(context);
+ SecurityToken token = secMgr.getSecurityToken(createSeqmsgContext);
+ if(token != null) {
+ OMElement str = secMgr.createSecurityTokenReference(token, createSeqmsgContext);
+ createSequencePart.setSecurityTokenReference(str);
+ createSeqRMMsg.setProperty(Sandesha2Constants.SequenceProperties.SECURITY_TOKEN, token);
+
+ //adding the UseSequenceSTR header
+ SOAPFactory createSeqFactory = (SOAPFactory) createSeqRMMsg.getSOAPEnvelope().getOMFactory();
+ OMNamespace namespace = createSeqFactory.createOMNamespace(Sandesha2Constants.WSRM_COMMON.NS_PREFIX_RM, createSeqRMMsg.getRMNamespaceValue());
+ createSeqFactory.createSOAPHeaderBlock(Sandesha2Constants.WSRM_COMMON.USES_SEQUENCE_STR, namespace);
+ }
+
+ createSeqRMMsg.setMessagePart(Sandesha2Constants.MessageParts.CREATE_SEQ, createSequencePart);
+
+ try {
+ createSeqRMMsg.addSOAPEnvelope();
+ } catch (AxisFault e1) {
+ throw new SandeshaException(e1.getMessage());
+ }
+
+ createSeqRMMsg.setAction(SpecSpecificConstants.getCreateSequenceAction(SandeshaUtil.getRMVersion(
+ sequencePropertyKey, storageManager)));
+ createSeqRMMsg.setSOAPAction(SpecSpecificConstants.getCreateSequenceSOAPAction(SandeshaUtil.getRMVersion(
+ sequencePropertyKey, storageManager)));
+
+ finalizeCreation(applicationMsgContext, createSeqmsgContext);
+
+ return createSeqRMMsg;
+ }
+
+ /**
+ * Creates a new TerminateSequence message.
+ *
+ * @param referenceRMMessage
+ * @param sequenceId
+ * @return
+ * @throws SandeshaException
+ */
+ public static RMMsgContext createTerminateSequenceMessage(RMMsgContext referenceRMMessage, String sequenceId,
+ String sequencePropertyKey, StorageManager storageManager) throws AxisFault {
+ MessageContext referenceMessage = referenceRMMessage.getMessageContext();
+ if (referenceMessage == null)
+ throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.msgContextNotSet));
+
+ AxisOperation terminateOperation = SpecSpecificConstants.getWSRMOperation(
+ Sandesha2Constants.MessageTypes.TERMINATE_SEQ,
+ SandeshaUtil.getRMVersion(sequencePropertyKey, storageManager),
+ referenceMessage.getAxisService());
+
+ ConfigurationContext configCtx = referenceMessage.getConfigurationContext();
+ if (configCtx == null)
+ throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.configContextNotSet));
+
+ MessageContext terminateMessage = SandeshaUtil.createNewRelatedMessageContext(referenceRMMessage,
+ terminateOperation);
+
+ OperationContext operationContext = terminateMessage.getOperationContext();
+ configCtx.registerOperationContext(terminateMessage.getMessageID(), operationContext); // to
+ // receive
+ // terminate
+ // sequence
+ // response
+ // messages
+ // correctly.
+
+ String rmVersion = SandeshaUtil.getRMVersion(sequencePropertyKey, storageManager);
+ if (rmVersion == null)
+ throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotDecideRMVersion));
+
+ String rmNamespaceValue = SpecSpecificConstants.getRMNamespaceValue(rmVersion);
+
+ initializeCreation(referenceMessage, terminateMessage);
+
+ if (!SpecSpecificConstants.isTerminateSequenceResponseRequired(rmVersion)) {
+ terminateMessage.setProperty(MessageContext.TRANSPORT_IN, null);
+ }
+
+ RMMsgContext terminateRMMessage = MsgInitializer.initializeMessage(terminateMessage);
+
+ if (terminateMessage == null)
+ throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.msgContextNotSet));
+
+ // setUpMessage(referenceMessage, terminateMessage);
+
+ SOAPFactory factory = SOAPAbstractFactory.getSOAPFactory(SandeshaUtil.getSOAPVersion(referenceMessage
+ .getEnvelope()));
+
+ terminateMessage.setMessageID(SandeshaUtil.getUUID());
+
+ AxisOperation referenceMsgOperation = referenceMessage.getAxisOperation();
+ if (referenceMsgOperation != null) {
+ ArrayList outPhases = referenceMsgOperation.getPhasesOutFlow();
+ if (outPhases != null) {
+ terminateOperation.setPhasesOutFlow(outPhases);
+ terminateOperation.setPhasesOutFaultFlow(outPhases);
+ }
+ }
+
+ SOAPEnvelope envelope = factory.getDefaultEnvelope();
+ terminateRMMessage.setSOAPEnvelop(envelope);
+
+ TerminateSequence terminateSequencePart = new TerminateSequence(rmNamespaceValue);
+ Identifier identifier = new Identifier(rmNamespaceValue);
+ identifier.setIndentifer(sequenceId);
+ terminateSequencePart.setIdentifier(identifier);
+ terminateRMMessage.setMessagePart(Sandesha2Constants.MessageParts.TERMINATE_SEQ, terminateSequencePart);
+
+ finalizeCreation(referenceMessage, terminateMessage);
+
+ terminateMessage.setProperty(MessageContext.TRANSPORT_IN, null); // no
+ // need
+ // for
+ // an
+ // incoming
+ // transport
+ // for
+ // an
+ // terminate
+ // message. If this is put, sender will look for an response.
+
+ return terminateRMMessage;
+ }
+
+ /**
+ * Create a new CreateSequenceResponse message.
+ *
+ * @param createSeqMessage
+ * @param outMessage
+ * @param newSequenceID
+ * @return
+ * @throws AxisFault
+ */
+ public static RMMsgContext createCreateSeqResponseMsg(RMMsgContext createSeqMessage, MessageContext outMessage,
+ String newSequenceID, StorageManager storageManager) throws AxisFault {
+
+ SOAPFactory factory = SOAPAbstractFactory.getSOAPFactory(SandeshaUtil.getSOAPVersion(createSeqMessage
+ .getSOAPEnvelope()));
+
+ IOMRMElement messagePart = createSeqMessage.getMessagePart(Sandesha2Constants.MessageParts.CREATE_SEQ);
+ CreateSequence cs = (CreateSequence) messagePart;
+
+ String rmVersion = SandeshaUtil.getRMVersion(newSequenceID, storageManager);
+ if (rmVersion == null)
+ throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotDecideRMVersion));
+
+ String rmNamespaceValue = SpecSpecificConstants.getRMNamespaceValue(rmVersion);
+ String addressingNamespaceValue = SandeshaUtil.getSequenceProperty(newSequenceID,
+ Sandesha2Constants.SequenceProperties.ADDRESSING_NAMESPACE_VALUE, storageManager);
+
+ CreateSequenceResponse response = new CreateSequenceResponse(rmNamespaceValue,
+ addressingNamespaceValue);
+
+ Identifier identifier = new Identifier(rmNamespaceValue);
+ identifier.setIndentifer(newSequenceID);
+
+ response.setIdentifier(identifier);
+
+ SequenceOffer offer = cs.getSequenceOffer();
+ if (offer != null) {
+ String outSequenceId = offer.getIdentifer().getIdentifier();
+
+ if (outSequenceId != null && !"".equals(outSequenceId)) {
+
+ Accept accept = new Accept(rmNamespaceValue, addressingNamespaceValue);
+ EndpointReference acksToEPR = createSeqMessage.getTo();
+
+ //putting the To EPR as the AcksTo for the response sequence.
+ AcksTo acksTo = new AcksTo(acksToEPR,rmNamespaceValue, addressingNamespaceValue);
+ accept.setAcksTo(acksTo);
+ response.setAccept(accept);
+ }
+
+ }
+
+ SOAPEnvelope envelope = factory.getDefaultEnvelope();
+ response.toOMElement(envelope.getBody());
+ outMessage.setWSAAction(SpecSpecificConstants.getCreateSequenceResponseAction(SandeshaUtil.getRMVersion(
+ newSequenceID, storageManager)));
+ outMessage.setSoapAction(SpecSpecificConstants.getCreateSequenceResponseSOAPAction(SandeshaUtil.getRMVersion(
+ newSequenceID, storageManager)));
+ outMessage.setProperty(AddressingConstants.WS_ADDRESSING_VERSION, addressingNamespaceValue);
+
+ String newMessageId = SandeshaUtil.getUUID();
+ outMessage.setMessageID(newMessageId);
+
+ outMessage.setEnvelope(envelope);
+
+ initializeCreation(createSeqMessage.getMessageContext(), outMessage);
+
+ RMMsgContext createSeqResponse = null;
+ try {
+ createSeqResponse = MsgInitializer.initializeMessage(outMessage);
+ } catch (SandeshaException ex) {
+ throw new AxisFault(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotInnitMessage), ex);
+ }
+
+ createSeqResponse.setMessagePart(Sandesha2Constants.MessageParts.CREATE_SEQ_RESPONSE, response);
+
+ finalizeCreation(createSeqMessage.getMessageContext(), outMessage);
+
+ createSeqMessage.getMessageContext().setServerSide(true);
+ return createSeqResponse;
+ }
+
+ public static RMMsgContext createTerminateSeqResponseMsg(RMMsgContext terminateSeqRMMsg, MessageContext outMessage,
+ StorageManager storageManager) throws AxisFault {
+
+ RMMsgContext terminateSeqResponseRMMsg = new RMMsgContext(outMessage);
+
+ SOAPFactory factory = SOAPAbstractFactory.getSOAPFactory(SandeshaUtil.getSOAPVersion(terminateSeqRMMsg
+ .getSOAPEnvelope()));
+
+ TerminateSequence terminateSequence = (TerminateSequence) terminateSeqRMMsg
+ .getMessagePart(Sandesha2Constants.MessageParts.TERMINATE_SEQ);
+ String sequenceID = terminateSequence.getIdentifier().getIdentifier();
+
+ String namespace = terminateSeqRMMsg.getRMNamespaceValue();
+ terminateSeqResponseRMMsg.setRMNamespaceValue(namespace);
+
+ TerminateSequenceResponse terminateSequenceResponse = new TerminateSequenceResponse(namespace);
+ Identifier identifier = new Identifier(namespace);
+ identifier.setIndentifer(sequenceID);
+ terminateSequenceResponse.setIdentifier(identifier);
+
+ SOAPEnvelope envelope = factory.getDefaultEnvelope();
+ terminateSeqResponseRMMsg.setSOAPEnvelop(envelope);
+ terminateSeqResponseRMMsg.setMessagePart(Sandesha2Constants.MessageParts.TERMINATE_SEQ_RESPONSE,
+ terminateSequenceResponse);
+
+ outMessage.setWSAAction(SpecSpecificConstants.getTerminateSequenceResponseAction(SandeshaUtil.getRMVersion(
+ sequenceID, storageManager)));
+ outMessage.setSoapAction(SpecSpecificConstants.getTerminateSequenceResponseAction(SandeshaUtil.getRMVersion(
+ sequenceID, storageManager)));
+
+ initializeCreation(terminateSeqRMMsg.getMessageContext(), outMessage);
+
+ terminateSeqResponseRMMsg.addSOAPEnvelope();
+
+ finalizeCreation(terminateSeqRMMsg.getMessageContext(), outMessage);
+
+ terminateSeqResponseRMMsg.getMessageContext().setServerSide(true);
+ return terminateSeqResponseRMMsg;
+ }
+
+ public static RMMsgContext createCloseSeqResponseMsg(RMMsgContext closeSeqRMMsg, MessageContext outMessage,
+ StorageManager storageManager) throws AxisFault {
+
+ RMMsgContext closeSeqResponseRMMsg = new RMMsgContext(outMessage);
+
+ SOAPFactory factory = SOAPAbstractFactory.getSOAPFactory(SandeshaUtil.getSOAPVersion(closeSeqRMMsg
+ .getSOAPEnvelope()));
+
+ CloseSequence closeSequence = (CloseSequence) closeSeqRMMsg
+ .getMessagePart(Sandesha2Constants.MessageParts.CLOSE_SEQUENCE);
+ String sequenceID = closeSequence.getIdentifier().getIdentifier();
+
+ String namespace = closeSeqRMMsg.getRMNamespaceValue();
+ closeSeqResponseRMMsg.setRMNamespaceValue(namespace);
+
+ CloseSequenceResponse closeSequenceResponse = new CloseSequenceResponse(namespace);
+ Identifier identifier = new Identifier(namespace);
+ identifier.setIndentifer(sequenceID);
+ closeSequenceResponse.setIdentifier(identifier);
+
+ SOAPEnvelope envelope = factory.getDefaultEnvelope();
+ closeSeqResponseRMMsg.setSOAPEnvelop(envelope);
+ closeSeqResponseRMMsg.setMessagePart(Sandesha2Constants.MessageParts.CLOSE_SEQUENCE_RESPONSE,
+ closeSequenceResponse);
+
+ outMessage.setWSAAction(SpecSpecificConstants.getCloseSequenceResponseAction(SandeshaUtil.getRMVersion(
+ sequenceID, storageManager)));
+ outMessage.setSoapAction(SpecSpecificConstants.getCloseSequenceResponseAction(SandeshaUtil.getRMVersion(
+ sequenceID, storageManager)));
+
+ initializeCreation(closeSeqRMMsg.getMessageContext(), outMessage);
+
+ closeSeqResponseRMMsg.addSOAPEnvelope();
+
+ finalizeCreation(closeSeqRMMsg.getMessageContext(), outMessage);
+ closeSeqResponseRMMsg.getMessageContext().setServerSide(true);
+ return closeSeqResponseRMMsg;
+ }
+
+ /**
+ * Adds an ack message to the given application message.
+ *
+ * @param applicationMsg
+ * @param sequenceId
+ * @throws SandeshaException
+ */
+ public static void addAckMessage(RMMsgContext applicationMsg, String sequencePropertyKey ,String sequenceId, StorageManager storageManager)
+ throws AxisFault {
+
+ SOAPFactory factory = null;
+ SOAPEnvelope envelope = applicationMsg.getSOAPEnvelope();
+ factory = (SOAPFactory) envelope.getOMFactory();
+
+ envelope = applicationMsg.getSOAPEnvelope();
+
+ String rmVersion = SandeshaUtil.getRMVersion(sequencePropertyKey, storageManager);
+ if (rmVersion == null)
+ throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotDecideRMVersion));
+
+ String rmNamespaceValue = SpecSpecificConstants.getRMNamespaceValue(rmVersion);
+
+ SequenceAcknowledgement sequenceAck = new SequenceAcknowledgement(rmNamespaceValue);
+ Identifier id = new Identifier(rmNamespaceValue);
+ id.setIndentifer(sequenceId);
+ sequenceAck.setIdentifier(id);
+
+ SequencePropertyBeanMgr seqPropMgr = storageManager.getSequencePropertyBeanMgr();
+
+ SequencePropertyBean seqBean = seqPropMgr.retrieve(sequencePropertyKey,
+ Sandesha2Constants.SequenceProperties.SERVER_COMPLETED_MESSAGES);
+ String msgNoList = (String) seqBean.getValue();
+
+ ArrayList ackRangeArrayList = SandeshaUtil.getAckRangeArrayList(msgNoList, factory, rmNamespaceValue);
+ Iterator iterator = ackRangeArrayList.iterator();
+ while (iterator.hasNext()) {
+ AcknowledgementRange ackRange = (AcknowledgementRange) iterator.next();
+ sequenceAck.addAcknowledgementRanges(ackRange);
+ }
+
+ SequencePropertyBean sequenceClosedBean = seqPropMgr.retrieve(sequencePropertyKey,
+ Sandesha2Constants.SequenceProperties.SEQUENCE_CLOSED);
+
+ if (sequenceClosedBean != null && Sandesha2Constants.VALUE_TRUE.equals(sequenceClosedBean.getValue())) {
+ // sequence is closed. so add the 'Final' part.
+ if (SpecSpecificConstants.isAckFinalAllowed(rmVersion)) {
+ AckFinal ackFinal = new AckFinal(rmNamespaceValue);
+ sequenceAck.setAckFinal(ackFinal);
+ }
+ }
+
+ applicationMsg.setMessagePart(Sandesha2Constants.MessageParts.SEQ_ACKNOWLEDGEMENT, sequenceAck);
+
+ sequenceAck.toOMElement(envelope.getHeader());
+
+ if (applicationMsg.getWSAAction()==null) {
+ applicationMsg.setAction(SpecSpecificConstants.getSequenceAcknowledgementAction(SandeshaUtil.getRMVersion(
+ sequenceId, storageManager)));
+ applicationMsg.setSOAPAction(SpecSpecificConstants.getSequenceAcknowledgementSOAPAction(SandeshaUtil
+ .getRMVersion(sequenceId, storageManager)));
+ }
+
+ applicationMsg.setMessageId(SandeshaUtil.getUUID());
+
+ //generating the SOAP envelope.
+ applicationMsg.addSOAPEnvelope();
+ }
+
+ public static RMMsgContext createMakeConnectionMessage (RMMsgContext referenceRMMessage, String makeConnectionSeqId,
+ String makeConnectionAnonURI, StorageManager storageManager) throws AxisFault {
+
+ MessageContext referenceMessage = referenceRMMessage.getMessageContext();
+ String rmNamespaceValue = referenceRMMessage.getRMNamespaceValue();
+ String rmVersion = referenceRMMessage.getRMSpecVersion();
+
+ AxisOperation makeConnectionOperation = SpecSpecificConstants.getWSRMOperation(
+ Sandesha2Constants.MessageTypes.MAKE_CONNECTION_MSG,
+ rmVersion,
+ referenceMessage.getAxisService());
+
+ MessageContext makeConnectionMessageCtx = SandeshaUtil.createNewRelatedMessageContext(referenceRMMessage,makeConnectionOperation);
+ RMMsgContext makeConnectionRMMessageCtx = MsgInitializer.initializeMessage(makeConnectionMessageCtx);
+
+ MakeConnection makeConnection = new MakeConnection (rmNamespaceValue);
+ if (makeConnectionSeqId!=null) {
+ Identifier identifier = new Identifier (rmNamespaceValue);
+ identifier.setIndentifer(makeConnectionSeqId);
+ makeConnection.setIdentifier(identifier);
+ }
+
+ if (makeConnectionAnonURI!=null) {
+ Address address = new Address (rmNamespaceValue);
+ address.setAddress (makeConnectionAnonURI);
+ makeConnection.setAddress(address);
+ }
+
+ //setting the addressing properties
+ makeConnectionMessageCtx.setTo(new EndpointReference (referenceMessage.getTo().getAddress()));
+ makeConnectionMessageCtx.setWSAAction(SpecSpecificConstants.getMakeConnectionAction(rmVersion));
+ makeConnectionMessageCtx.setMessageID(SandeshaUtil.getUUID());
+
+ makeConnectionRMMessageCtx.setMessagePart(Sandesha2Constants.MessageParts.MAKE_CONNECTION,
+ makeConnection);
+
+ //generating the SOAP Envelope.
+ makeConnectionRMMessageCtx.addSOAPEnvelope();
+
+ return makeConnectionRMMessageCtx;
+ }
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: sandesha-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: sandesha-dev-help@ws.apache.org