You are viewing a plain text version of this content. The canonical link for it is here.
Posted to sandesha-dev@ws.apache.org by ch...@apache.org on 2005/10/19 09:57:03 UTC
svn commit: r326438 -
/webservices/sandesha/trunk/src/org/apache/sandesha2/FaultMgr.java
Author: chamikara
Date: Wed Oct 19 00:56:48 2005
New Revision: 326438
URL: http://svn.apache.org/viewcvs?rev=326438&view=rev
Log:
Applied sanka's patch. This containts the FaultManager which handles RM faults
Added:
webservices/sandesha/trunk/src/org/apache/sandesha2/FaultMgr.java
Added: webservices/sandesha/trunk/src/org/apache/sandesha2/FaultMgr.java
URL: http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/FaultMgr.java?rev=326438&view=auto
==============================================================================
--- webservices/sandesha/trunk/src/org/apache/sandesha2/FaultMgr.java (added)
+++ webservices/sandesha/trunk/src/org/apache/sandesha2/FaultMgr.java Wed Oct 19 00:56:48 2005
@@ -0,0 +1,554 @@
+package org.apache.sandesha2;
+
+import org.apache.sandesha2.wsrm.AckRequested;
+import org.apache.sandesha2.wsrm.CreateSequence;
+import org.apache.sandesha2.wsrm.CreateSequenceResponse;
+import org.apache.sandesha2.wsrm.Sequence;
+import org.apache.sandesha2.wsrm.Identifier;
+import org.apache.sandesha2.wsrm.SequenceAcknowledgement;
+import org.apache.sandesha2.wsrm.SequenceFault;
+import org.apache.sandesha2.wsrm.FaultCode;
+import org.apache.sandesha2.wsrm.TerminateSequence;
+import org.apache.sandesha2.storage.AbstractBeanMgrFactory;
+import org.apache.sandesha2.storage.beanmanagers.NextMsgBeanMgr;
+import org.apache.sandesha2.storage.beanmanagers.RetransmitterBeanMgr;
+import org.apache.sandesha2.storage.beanmanagers.SequencePropertyBeanMgr;
+import org.apache.sandesha2.storage.beanmanagers.StorageMapBeanMgr;
+import org.apache.sandesha2.storage.beans.RetransmitterBean;
+import org.apache.sandesha2.storage.beans.SequencePropertyBean;
+import org.apache.sandesha2.storage.beans.StorageMapBean;
+import org.apache.sandesha2.util.SandeshaUtil;
+import org.apache.axis2.soap.*;
+import org.apache.axis2.soap.impl.llom.SOAPConstants;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.addressing.AddressingConstants;
+import org.apache.axis2.om.OMAttribute;
+import org.apache.axis2.om.OMElement;
+import org.apache.axis2.AxisFault;
+
+import javax.xml.namespace.QName;
+import java.math.BigInteger;
+import java.util.Iterator;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: sanka
+ * Date: Oct 9, 2005
+ * Time: 11:10:07 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class FaultMgr {
+
+ private static final int SEQUENCE_FAULT = 10;
+ private static final String WSA_ACTION_FAULT = "http://schemas.xmlsoap.org/ws/2004/08/addressing/fault";
+
+ private static final int SEQUENCE_TYPE = 22;
+ private static final int NON_SEQUENCE_TYPe = 23;
+
+ public static final int UNKNOWN_SEQUENCE_TYPE = 1;
+ public static final int MESSAGE_NUMBER_ROLLOVER_TYPE = 2;
+ public static final int INVALID_ACKNOWLEDGEMENT_TYPE = 3;
+
+
+ public static final String UNKNOW_SEQUENCE_CODE = "Sender";
+ public static final String UNKNOW_SEQUENCE_SUBCODE
+ = "wsrm:UnknowSequence";
+ public static final String UNKNOW_SEQUENCE_RESON
+ = "The vaule of wsrm:Identifier is not a known Sequence Identifer";
+
+ public static final String MESSAGE_NUMBER_ROLLOVER_CODE = "Sender";
+ public static final String MESSAGE_NUMBER_ROLLOVER_SUBCODE
+ = "wsrm:MessageNumberRollover";
+ public static final String MESSAGE_NUMBER_ROLLOVER_REASON
+ = "The maximum value of wsrm:MessageNumber has been exceeded.";
+
+ public static final String INVALID_ACKNOWLEDGEMENT_CODE = "Sender";
+ public static final String INVALID_ACKNOWLEDGEMENT_SUBCODE
+ = "wsrm:InvalidAcknowledgement";
+ public static final String INVALID_ACKNOWLEDGEMENT_REASON
+ = "The SequenceAcknowledgement violates the cumlative acknowledgement";
+
+ protected class FaultData {
+ int type;
+ String code;
+ String subcode;
+ String reason;
+ MessageContext msgCtx;
+ }
+
+ public FaultMgr() {
+ }
+
+ public RMMsgContext check(MessageContext msgCtx) throws SandeshaException {
+ int msgType = getMessageType(msgCtx);
+
+ switch (msgType) {
+
+ case Constants.MessageTypes.APPLICATION:
+
+ /* Sequence*/
+ return checkSequence(msgCtx);
+
+ case Constants.MessageTypes.ACK:
+
+ /* SequenceAcknowledgement */
+ return checkSequenceAcknowledgement(msgCtx);
+
+
+
+
+
+ }
+ return null;
+ }
+
+ public RMMsgContext checkSequence(MessageContext msgCtx)
+ throws SandeshaException {
+
+ NextMsgBeanMgr mgr =
+ AbstractBeanMgrFactory.getInstance(msgCtx).getNextMsgBeanMgr();
+ SOAPEnvelope envelope = msgCtx.getEnvelope();
+
+ OMElement element = envelope.getHeader().getFirstChildWithName(
+ new QName(Constants.WSRM.NS_URI_RM, Constants.WSRM.SEQUENCE));
+ OMElement identifier = element.getFirstChildWithName(
+ new QName(Constants.WSRM.NS_URI_RM, Constants.WSRM.IDENTIFIER));
+
+ String identifierString = identifier.getText().trim();
+
+ if (mgr.retrieve(identifierString) == null) {
+
+ // should throw an UnknownSequence fault
+ return getFault(FaultMgr.UNKNOWN_SEQUENCE_TYPE, msgCtx);
+ }
+
+ OMElement msgNumber = element.getFirstChildWithName(
+ new QName (Constants.WSRM.NS_URI_RM,Constants.WSRM.MSG_NUMBER));
+
+ BigInteger bigInteger = new BigInteger(msgNumber.getText().trim());
+
+ // throws new MessageNumberRollover fault
+ if (bigInteger.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) == 1) {
+ return getFault(FaultMgr.MESSAGE_NUMBER_ROLLOVER_TYPE,
+ msgCtx);
+ }
+
+ // Phew !! no faults ..
+ return null;
+ }
+
+ public RMMsgContext checkSequenceAcknowledgement(MessageContext msgCtx)
+ throws SandeshaException {
+
+ SOAPEnvelope envelope = msgCtx.getEnvelope();
+
+ OMElement element = envelope.getFirstChildWithName(
+ new QName(Constants.WSRM.NS_URI_RM, Constants.WSRM.SEQUENCE_ACK));
+
+ // this is a SequenceAcknowledgement message
+ OMElement identifierPart = element.getFirstChildWithName(
+ new QName(Constants.WSRM.NS_URI_RM, Constants.WSRM.IDENTIFIER));
+ NextMsgBeanMgr mgr =
+ AbstractBeanMgrFactory.getInstance(msgCtx).getNextMsgBeanMgr();
+ if (mgr.retrieve(identifierPart.getText()) == null) {
+ //throw UnknownSequenceFault
+ return getFault(FaultMgr.UNKNOWN_SEQUENCE_TYPE, msgCtx);
+ }
+
+ String identifierString = identifierPart.getText().trim();
+ StorageMapBeanMgr smgr =
+ AbstractBeanMgrFactory.getInstance(msgCtx).getStorageMapBeanMgr();
+ SequencePropertyBeanMgr propertyBeanMgr =
+ AbstractBeanMgrFactory.getInstance(msgCtx).getSequencePropretyBeanMgr();
+
+ SequencePropertyBean propertyBean =
+ propertyBeanMgr.retrieve(identifierString,
+ Constants.SequenceProperties.TEMP_SEQUENCE_ID);
+
+ //TODO
+ String acksString = ""; //propertyBean.getAcksString();
+
+ String[] msgNumberStrs = acksString.split(",");
+
+ //TODO move this to a util class
+ long[] msgNumbers = new long[msgNumberStrs.length];
+ for (int i=0; i < msgNumbers.length; i++) {
+ msgNumbers[i] = Long.parseLong(msgNumberStrs[i]);
+ }
+
+ Iterator acks = element.getChildrenWithName(new QName(
+ Constants.WSRM.NS_URI_RM, Constants.WSRM.ACK_RANGE));
+ while (acks.hasNext()) {
+ OMElement ack = (OMElement) acks.next();
+
+ OMAttribute lowerAttrib = ack.getAttribute(
+ new QName(Constants.WSRM.LOWER));
+ long lower = Long.parseLong(lowerAttrib.getAttributeValue());
+
+ OMAttribute upperAttrib = ack.getAttribute(
+ new QName(Constants.WSRM.UPPER));
+ long upper = Long.parseLong(upperAttrib.getAttributeValue());
+
+ for (; lower <= upper; lower++) {
+ boolean found = false;
+ for (int j = 0; j < msgNumbers.length; j++) {
+ if (lower == msgNumbers[j]) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ //TODO throw new InvalidAcknowledgement
+ }
+ }
+ }
+
+ Iterator nacks = element.getChildrenWithName(new QName(
+ Constants.WSRM.NS_URI_RM, Constants.WSRM.NACK));
+
+ while (nacks.hasNext()) {
+ OMElement nack = (OMElement) nacks.next();
+ long msgNo = Long.parseLong(nack.getText());
+
+ boolean found = false;
+ for (int j = 0; j < msgNumbers.length; j++) {
+ if (msgNo == msgNumbers[j]) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ //TODO throw new InvalidAcknowledgement
+ }
+ }
+ return null;
+ }
+
+ public RMMsgContext checkSequenceMessage(MessageContext msgCtx)
+ throws SandeshaException {
+
+ SOAPEnvelope envelope = msgCtx.getEnvelope();
+ OMElement element;
+
+ element = envelope.getHeader().getFirstChildWithName(
+ new QName(Constants.WSRM.NS_URI_RM, Constants.WSRM.SEQUENCE));
+
+ if (element != null) {
+ // this is a Sequence message
+ OMElement identifier = element.getFirstChildWithName(
+ new QName(Constants.WSRM.NS_URI_RM, Constants.WSRM.IDENTIFIER));
+
+ String identifierString = identifier.getText().trim();
+ NextMsgBeanMgr mgr =
+ AbstractBeanMgrFactory.getInstance(msgCtx).getNextMsgBeanMgr();
+
+ if (mgr.retrieve(identifierString) == null) {
+ // throws new UnknownSequence fault
+ return getFault(FaultMgr.UNKNOWN_SEQUENCE_TYPE, msgCtx);
+ }
+
+ OMElement msgNumber = element.getFirstChildWithName(
+ new QName (Constants.WSRM.NS_URI_RM,Constants.WSRM.MSG_NUMBER));
+
+ BigInteger bigInteger = new BigInteger(msgNumber.getText().trim());
+
+ // throws new MessageNumberRollover fault
+ if (bigInteger.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) == 1) {
+ return getFault(FaultMgr.MESSAGE_NUMBER_ROLLOVER_TYPE,
+ msgCtx);
+ }
+
+ return null;
+ }
+
+
+ element = envelope.getHeader().getFirstChildWithName(
+ new QName(Constants.WSRM.NS_URI_RM, Constants.WSRM.SEQUENCE_ACK));
+
+ if (element != null) {
+ // this is a SequenceAcknowledgement message
+ OMElement identifierPart = element.getFirstChildWithName(
+ new QName(Constants.WSRM.NS_URI_RM, Constants.WSRM.IDENTIFIER));
+ NextMsgBeanMgr mgr =
+ AbstractBeanMgrFactory.getInstance(msgCtx).getNextMsgBeanMgr();
+ if (mgr.retrieve(identifierPart.getText()) == null) {
+ //throw UnknownSequenceFault
+ return getFault(FaultMgr.UNKNOWN_SEQUENCE_TYPE, msgCtx);
+ }
+
+ String identifierString = identifierPart.getText().trim();
+ StorageMapBeanMgr smgr =
+ AbstractBeanMgrFactory.getInstance(msgCtx).getStorageMapBeanMgr();
+ SequencePropertyBeanMgr propertyBeanMgr =
+ AbstractBeanMgrFactory.getInstance(msgCtx).getSequencePropretyBeanMgr();
+
+ SequencePropertyBean propertyBean =
+ propertyBeanMgr.retrieve(identifierString,
+ Constants.SequenceProperties.TEMP_SEQUENCE_ID);
+
+ //TODO
+ String acksString = ""; //propertyBean.getAcksString();
+
+ String[] msgNumberStrs = acksString.split(",");
+
+ //TODO move this to a util class
+ long[] msgNumbers = new long[msgNumberStrs.length];
+ for (int i=0; i < msgNumbers.length; i++) {
+ msgNumbers[i] = Long.parseLong(msgNumberStrs[i]);
+ }
+
+ Iterator acks = element.getChildrenWithName(new QName(
+ Constants.WSRM.NS_URI_RM, Constants.WSRM.ACK_RANGE));
+ while (acks.hasNext()) {
+ OMElement ack = (OMElement) acks.next();
+
+ OMAttribute lowerAttrib = ack.getAttribute(
+ new QName(Constants.WSRM.LOWER));
+ long lower = Long.parseLong(lowerAttrib.getAttributeValue());
+
+ OMAttribute upperAttrib = ack.getAttribute(
+ new QName(Constants.WSRM.UPPER));
+ long upper = Long.parseLong(upperAttrib.getAttributeValue());
+
+ for (; lower <= upper; lower++) {
+ boolean found = false;
+ for (int j = 0; j < msgNumbers.length; j++) {
+ if (lower == msgNumbers[j]) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ //TODO throw new InvalidAcknowledgement
+ }
+ }
+ }
+
+ Iterator nacks = element.getChildrenWithName(new QName(
+ Constants.WSRM.NS_URI_RM, Constants.WSRM.NACK));
+
+ while (nacks.hasNext()) {
+ OMElement nack = (OMElement) nacks.next();
+ long msgNo = Long.parseLong(nack.getText());
+
+ boolean found = false;
+ for (int j = 0; j < msgNumbers.length; j++) {
+ if (msgNo == msgNumbers[j]) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ //TODO throw new InvalidAcknowledgement
+ }
+ }
+ }
+
+ return null;
+ }
+
+ public RMMsgContext checkInvalidAcknowledge() {
+ return null;
+ }
+
+ public RMMsgContext getFault(int type, MessageContext msgCtx)
+ throws SandeshaException {
+
+ FaultData data = new FaultData();
+
+ switch (type) {
+ case FaultMgr.UNKNOWN_SEQUENCE_TYPE:
+ data.type = FaultMgr.UNKNOWN_SEQUENCE_TYPE;
+ data.code = FaultMgr.UNKNOW_SEQUENCE_CODE;
+ data.subcode = FaultMgr.UNKNOW_SEQUENCE_SUBCODE;
+ data.reason = FaultMgr.UNKNOW_SEQUENCE_RESON;
+ break;
+
+ case FaultMgr.MESSAGE_NUMBER_ROLLOVER_TYPE:
+ data.type = FaultMgr.MESSAGE_NUMBER_ROLLOVER_TYPE;
+ data.code = FaultMgr.MESSAGE_NUMBER_ROLLOVER_CODE;
+ data.subcode = FaultMgr.MESSAGE_NUMBER_ROLLOVER_SUBCODE;
+ data.reason = FaultMgr.MESSAGE_NUMBER_ROLLOVER_REASON;
+ break;
+
+ case FaultMgr.INVALID_ACKNOWLEDGEMENT_TYPE:
+ data.type = FaultMgr.INVALID_ACKNOWLEDGEMENT_TYPE;
+ data.code = FaultMgr.INVALID_ACKNOWLEDGEMENT_CODE;
+ data.subcode = FaultMgr.INVALID_ACKNOWLEDGEMENT_SUBCODE;
+ data.reason = FaultMgr.INVALID_ACKNOWLEDGEMENT_REASON;
+ break;
+ }
+
+ MessageContext newMsgCtx = SandeshaUtil.shallowCopy(msgCtx);
+// newMsgCtx.setServiceGroupContextId(msgCtx.getServiceGroupContextId());
+// newMsgCtx.setServiceContext(msgCtx.getServiceContext());
+ RMMsgContext newRMMsgCtx = new RMMsgContext(newMsgCtx);
+
+ SequenceFault seqFault = new SequenceFault();
+ //seqFault.setSubcode(data.subcode);
+ //seqFault.setReason(data.reason);
+
+ FaultCode faultCode = new FaultCode();
+ //faultCode.setFault(data.code);
+ seqFault.setFaultCode(faultCode);
+
+ //TODO is it SEQUENCE_FAULT or just FAULT
+ //newRMMsgCtx.setMessagePart(SEQUENCE_FAULT, seqFault);
+
+ SOAPEnvelope inMsgEnvelope = msgCtx.getEnvelope();
+
+ if (SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(
+ msgCtx.getEnvelope().getNamespace().getName())) {
+ doSOAP11Encoding(data, newMsgCtx);
+
+ } else if (SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(
+ msgCtx.getEnvelope().getNamespace().getName())) {
+ doSOAP12Encoding(data, newMsgCtx);
+
+ } else {
+ //TODO should I throw an exception ?
+ }
+
+ return newRMMsgCtx;
+ }
+
+
+ public void doSOAP12Encoding(FaultData data, MessageContext msgCtx) {
+ msgCtx.setProperty(AddressingConstants.WSA_ACTION, WSA_ACTION_FAULT);
+
+ SOAPFactory factory =
+ SOAPAbstractFactory.getSOAPFactory(Constants.SOAPVersion.v1_2);
+ SOAPEnvelope envelope = factory.getDefaultFaultEnvelope();
+
+ SOAPFault fault = factory.createSOAPFault(envelope.getBody());
+ SOAPFaultCode faultCode = factory.createSOAPFaultCode(fault);
+ SOAPFaultValue faultValue = factory.createSOAPFaultValue(faultCode);
+ faultValue.setText(data.code);
+ SOAPFaultSubCode faultSubCode = factory.createSOAPFaultSubCode(faultCode);
+ SOAPFaultValue faultValue2 = factory.createSOAPFaultValue(faultSubCode);
+ faultValue2.setText(data.subcode);
+
+ //TODO
+ faultCode.setSubCode(faultSubCode);
+
+ SOAPFaultReason faultReason = factory.createSOAPFaultReason(fault);
+ SOAPFaultText faultText = factory.createSOAPFaultText(faultReason);
+ faultText.setText(data.reason);
+
+ SOAPFaultDetail faultDetail = factory.createSOAPFaultDetail(fault);
+ SOAPHeader header = data.msgCtx.getEnvelope().getHeader();
+ OMElement sequence = header.getFirstChildWithName(
+ new QName(Constants.WSRM.NS_URI_RM, Constants.WSRM.SEQUENCE));
+ OMElement identifier = sequence.getFirstChildWithName(
+ new QName(Constants.WSRM.NS_URI_RM, Constants.WSRM.IDENTIFIER));
+ identifier.detach();
+
+ faultDetail.addChild(identifier);
+
+ }
+
+ public void doSOAP11Encoding(FaultData data, MessageContext msgCtx)
+ throws SandeshaException {
+
+ SOAPFactory factory = SOAPAbstractFactory.getSOAPFactory(Constants.SOAPVersion.v1_1);
+ SOAPEnvelope faultMsgEnvelope = factory.getDefaultFaultEnvelope();
+
+ SOAPFault fault = factory.createSOAPFault(faultMsgEnvelope.getBody());
+ SOAPFaultCode soapFaultCode = factory.createSOAPFaultCode(fault);
+ SOAPFaultValue soapFaultValue =
+ factory.createSOAPFaultValue(soapFaultCode);
+ SOAPFaultReason faultReason = factory.createSOAPFaultReason(fault);
+
+ if (data.type == FaultMgr.UNKNOWN_SEQUENCE_TYPE) {
+ soapFaultValue.setText(data.code);
+
+ } else {
+// TODO sets the attribute xml:lang = "en" ..
+ soapFaultValue.setText(data.subcode);
+ }
+
+ faultReason.setText(data.reason);
+
+ try {
+ msgCtx.setEnvelope(faultMsgEnvelope);
+ } catch (AxisFault axisFault) {
+ throw new SandeshaException(axisFault.getMessage());
+ }
+ }
+
+// public void doSOAP12Encoding(FaultData data, MessageContext msgCtx)
+// throws SandeshaException {
+//
+// SOAPFactory factory =
+// SOAPAbstractFactory.getSOAPFactory(Constants.SOAPVersion.v1_2);
+// SOAPEnvelope faultMsgEnvelope = factory.getDefaultFaultEnvelope();
+//
+// SOAPFault fault = faultMsgEnvelope.getBody().getFault();
+// SOAPFaultCode soapFaultCode = fault.getCode();
+// soapFaultCode.getValue().setText(data.code);
+//
+//
+// SOAPFaultSubCode soapFaultSubCode
+// = factory.createSOAPFaultSubCode(soapFaultCode, soapFaultCode.getBuilder());
+// SOAPFaultValue soapFaultValue = factory.createSOAPFaultValue(soapFaultSubCode);
+// soapFaultValue.setText(data.subcode);
+//
+//
+// fault.getReason().getSOAPText().setText(data.reason);
+// SOAPEnvelope envelope = msgCtx.getEnvelope();
+//
+//
+// try {
+// msgCtx.setEnvelope(faultMsgEnvelope);
+// } catch (AxisFault axisFault) {
+// throw new SandeshaException(axisFault.getMessage());
+// }
+// }
+
+ public int getMessageType(MessageContext msgCtx) {
+
+ SOAPHeader header = msgCtx.getEnvelope().getHeader();
+
+ if (header.getFirstChildWithName(
+ new QName(Constants.WSRM.NS_URI_RM, Constants.WSRM.SEQUENCE))
+ != null) {
+ return Constants.MessageTypes.APPLICATION;
+
+ } else if (header.getFirstChildWithName(
+ new QName(Constants.WSRM.NS_URI_RM, Constants.WSRM.SEQUENCE_ACK))
+ != null) {
+ return Constants.MessageTypes.ACK;
+
+ } else if (header.getFirstChildWithName(
+ new QName(Constants.WSRM.NS_URI_RM, Constants.WSRM.CREATE_SEQUENCE))
+ != null) {
+ return Constants.MessageTypes.CREATE_SEQ;
+
+ } else if (header.getFirstChildWithName(
+ new QName(Constants.WSRM.NS_URI_RM, Constants.WSRM.CREATE_SEQUENCE_RESPONSE))
+ != null) {
+ return Constants.MessageTypes.CREATE_SEQ_RESPONSE;
+
+ } else if (header.getFirstChildWithName(
+ new QName(Constants.WSRM.NS_URI_RM, Constants.WSRM.TERMINATE_SEQUENCE))
+ != null) {
+ return Constants.MessageTypes.TERMINATE_SEQ;
+
+ } else if (header.getFirstChildWithName(
+ new QName(Constants.WSRM.NS_URI_RM, Constants.WSRM.ACK_REQUESTED))
+ != null) {
+ //TODO fix this ..
+ return Constants.MessageTypes.UNKNOWN;
+
+ } else {
+ return Constants.MessageTypes.UNKNOWN;
+ }
+
+
+ }
+
+
+
+
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: sandesha-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: sandesha-dev-help@ws.apache.org