blob: 183e8b3e1c999a57eff008c66e877900bed7bfed [file] [log] [blame]
/*
* 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.msgprocessors;
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.engine.AxisEngine;
import org.apache.axis2.util.Utils;
import org.apache.sandesha2.Sandesha2Constants;
import org.apache.sandesha2.RMMsgContext;
import org.apache.sandesha2.SandeshaException;
import org.apache.sandesha2.storage.StorageManager;
import org.apache.sandesha2.storage.beanmanagers.CreateSeqBeanMgr;
import org.apache.sandesha2.storage.beanmanagers.SequencePropertyBeanMgr;
import org.apache.sandesha2.storage.beans.CreateSeqBean;
import org.apache.sandesha2.storage.beans.SequencePropertyBean;
import org.apache.sandesha2.util.RMMsgCreator;
import org.apache.sandesha2.util.SandeshaUtil;
import org.apache.sandesha2.util.SequenceManager;
import org.apache.sandesha2.wsrm.Accept;
import org.apache.sandesha2.wsrm.CreateSequence;
import org.apache.sandesha2.wsrm.CreateSequenceResponse;
import org.apache.sandesha2.wsrm.SequenceOffer;
/**
* Responsible for processing an incoming Create Sequence message.
*
* @author Chamikara Jayalath <chamikaramj@gmail.com>
*/
public class CreateSeqMsgProcessor implements MsgProcessor {
public void processMessage(RMMsgContext createSeqRMMsg)
throws SandeshaException {
MessageContext createSeqMsg = createSeqRMMsg.getMessageContext();
CreateSequence createSeqPart = (CreateSequence) createSeqRMMsg
.getMessagePart(Sandesha2Constants.MessageParts.CREATE_SEQ);
if (createSeqPart == null)
throw new SandeshaException(
"No create sequence part is present in the create sequence message");
MessageContext outMessage = null;
try {
outMessage = Utils.createOutMessageContext(createSeqMsg);
} catch (AxisFault e) {
throw new SandeshaException(e.getMessage());
}
try {
String newSequenceId = SequenceManager
.setupNewSequence(createSeqRMMsg);
ConfigurationContext context = createSeqRMMsg.getMessageContext()
.getConfigurationContext();
if (newSequenceId == null)
throw new AxisFault(
"Internal error - Generated sequence id is null");
RMMsgContext createSeqResponse = RMMsgCreator
.createCreateSeqResponseMsg(createSeqRMMsg, outMessage,
newSequenceId);
CreateSequenceResponse createSeqResPart = (CreateSequenceResponse) createSeqResponse
.getMessagePart(Sandesha2Constants.MessageParts.CREATE_SEQ_RESPONSE);
//If an offer is accepted do necessary procesing.
Accept accept = createSeqResPart.getAccept();
if (accept != null) {
SequenceOffer offer = createSeqPart.getSequenceOffer();
if (offer == null)
throw new SandeshaException(
"Internal error - no offer for the response message with Accept");
//Setting the CreateSequence table entry.
String incomingSeqId = createSeqResPart.getIdentifier()
.getIdentifier();
String outSequenceId = offer.getIdentifer().getIdentifier();
CreateSeqBean createSeqBean = new CreateSeqBean();
createSeqBean.setSequenceId(outSequenceId);
createSeqBean.setInternalSequenceId(newSequenceId);
createSeqBean.setCreateSeqMsgId(SandeshaUtil.getUUID()); //this
// is a
// dummy
// value.
StorageManager storageManager = SandeshaUtil
.getSandeshaStorageManager(context);
CreateSeqBeanMgr createSeqMgr = storageManager
.getCreateSeqBeanMgr();
//Setting sequence properties.
SequencePropertyBeanMgr seqPropMgr = storageManager
.getSequencePropretyBeanMgr();
SequencePropertyBean outSequenceBean = new SequencePropertyBean();
outSequenceBean
.setName(Sandesha2Constants.SequenceProperties.OUT_SEQUENCE_ID);
outSequenceBean.setValue(outSequenceId);
outSequenceBean.setSequenceId(newSequenceId);
seqPropMgr.insert(outSequenceBean);
//Temp sequence id should be set for the server side.
//If internal sequence id is not set. this implies server side.
SequencePropertyBean internalSeqBean = seqPropMgr.retrieve(
outSequenceId,
Sandesha2Constants.SequenceProperties.INTERNAL_SEQUENCE_ID);
if (internalSeqBean == null) {
SequencePropertyBean internalSequenceBean = new SequencePropertyBean();
internalSequenceBean
.setName(Sandesha2Constants.SequenceProperties.INTERNAL_SEQUENCE_ID);
internalSequenceBean.setSequenceId(outSequenceId);
internalSequenceBean.setValue(newSequenceId);
seqPropMgr.insert(internalSequenceBean);
}
}
CreateSequence createSeq = (CreateSequence) createSeqRMMsg
.getMessagePart(Sandesha2Constants.MessageParts.CREATE_SEQ);
if (createSeq == null)
throw new AxisFault(
"Create sequence part not present in the create sequence message");
EndpointReference acksTo = createSeq.getAcksTo().getAddress()
.getEpr();
if (acksTo == null || acksTo.getAddress() == null
|| acksTo.getAddress() == "")
throw new AxisFault(
"Acks to not present in the create sequence message");
SequencePropertyBean seqPropBean = new SequencePropertyBean(
newSequenceId, Sandesha2Constants.SequenceProperties.ACKS_TO_EPR,
acksTo);
StorageManager storageManager = SandeshaUtil
.getSandeshaStorageManager(context);
SequencePropertyBeanMgr seqPropMgr = storageManager
.getSequencePropretyBeanMgr();
seqPropMgr.insert(seqPropBean);
outMessage.setResponseWritten(true);
Object obj1 = createSeqMsg.getOperationContext().getProperty(
org.apache.axis2.Constants.RESPONSE_WRITTEN);
AxisEngine engine = new AxisEngine(context);
engine.send(outMessage);
Object obj = createSeqMsg.getOperationContext().getProperty(
org.apache.axis2.Constants.RESPONSE_WRITTEN);
if (Sandesha2Constants.WSA.NS_URI_ANONYMOUS.equals(createSeqMsg.getReplyTo()
.getAddress())) {
createSeqMsg.getOperationContext().setProperty(
org.apache.axis2.Constants.RESPONSE_WRITTEN, "true");
} else {
createSeqMsg.getOperationContext().setProperty(
org.apache.axis2.Constants.RESPONSE_WRITTEN, "false");
}
} catch (AxisFault e1) {
throw new SandeshaException(e1.getMessage());
}
createSeqMsg.setPausedTrue(new QName(Sandesha2Constants.IN_HANDLER_NAME));
}
}