/*
* Copyright(c) 2002 Center for E-Commerce Infrastructure Development, The
* University of Hong Kong (HKU). All Rights Reserved.
*
* This software is licensed under the Academic Free License Version 1.0
*
* Academic Free License
* Version 1.0
*
* This Academic Free License applies to any software and associated
* documentation (the "Software") whose owner (the "Licensor") has placed the
* statement "Licensed under the Academic Free License Version 1.0" immediately
* after the copyright notice that applies to the Software.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of the Software (1) to use, copy, modify, merge, publish, perform,
* distribute, sublicense, and/or sell copies of the Software, and to permit
* persons to whom the Software is furnished to do so, and (2) under patent
* claims owned or controlled by the Licensor that are embodied in the Software
* as furnished by the Licensor, to make, use, sell and offer for sale the
* Software and derivative works thereof, subject to the following conditions:
*
* - Redistributions of the Software in source code form must retain all
* copyright notices in the Software as furnished by the Licensor, this list
* of conditions, and the following disclaimers.
* - Redistributions of the Software in executable form must reproduce all
* copyright notices in the Software as furnished by the Licensor, this list
* of conditions, and the following disclaimers in the documentation and/or
* other materials provided with the distribution.
* - Neither the names of Licensor, nor the names of any contributors to the
* Software, nor any of their trademarks or service marks, may be used to
* endorse or promote products derived from this Software without express
* prior written permission of the Licensor.
*
* DISCLAIMERS: LICENSOR WARRANTS THAT THE COPYRIGHT IN AND TO THE SOFTWARE IS
* OWNED BY THE LICENSOR OR THAT THE SOFTWARE IS DISTRIBUTED BY LICENSOR UNDER
* A VALID CURRENT LICENSE. EXCEPT AS EXPRESSLY STATED IN THE IMMEDIATELY
* PRECEDING SENTENCE, THE SOFTWARE IS PROVIDED BY THE LICENSOR, CONTRIBUTORS
* AND COPYRIGHT OWNERS "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
* LICENSOR, CONTRIBUTORS OR COPYRIGHT OWNERS BE LIABLE FOR ANY CLAIM, DAMAGES
* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE.
*
* This license is Copyright (C) 2002 Lawrence E. Rosen. All rights reserved.
* Permission is hereby granted to copy and distribute this license without
* modification. This license may not be modified without the express written
* permission of its copyright owner.
*/
/* =====
*
* $Header: /home/cvsroot/ebxml-pkg/src/hk/hku/cecid/ebms/pkg/MessageOrder.java,v 1.1 2005/07/28 09:36:24 dcmsze Exp $
*
* Code authored by:
*
* tslam [2002-03-21]
*
* Code reviewed by:
*
* username [YYYY-MM-DD]
*
* Remarks:
*
* =====
*/
package hk.hku.cecid.ebms.pkg;
import hk.hku.cecid.ebms.pkg.validation.EbxmlValidationException;
import hk.hku.cecid.ebms.pkg.validation.SOAPValidationException;
import java.util.Iterator;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
/**
* An ebXML <code>MessageOrder</code> in the SOAP Header of a
* <code>HeaderContainer</code> [ebMSS 9.1].
*
* @author tslam
* @version $Revision: 1.1 $
*/
public class MessageOrder extends HeaderElement {
/** <code>MessageOrder</code> element name */
static final String MESSAGE_ORDER = "MessageOrder";
/* Constants for MessageOrder elements */
/** SequenceNumber element name */
static final String ELEMENT_SEQUENCE_NUMBER = "SequenceNumber";
/** Name of the status attribute */
static final String ATTRIBUTE_STATUS = "status";
/** Name of the "Reset" status */
static final String VALUE_STATUS_RESET = "Reset";
/** Name of the "Continue" status */
static final String VALUE_STATUS_CONTINUE = "Continue";
/** First mesage in conversation / reset the sequence number counter. */
public static final int STATUS_RESET = 0;
/** Subsequent messages in the conversation and the sequence number is not
reset. */
public static final int STATUS_CONTINUE = 1;
private final int sequenceNo;
private final int status;
/**
* Constructs a <code>MessageOrder</code> with the given mandatory
* fields.
*
* @param soapEnvelope <code>SOAPEnvelope</code>, the header container
* of which the <code>MessageOrder</code> is
* attached to.
* @param status Status of the sequence number.
* @param sequenceNo The sequence number in the converstaion.
* @throws SOAPException
*/
MessageOrder(SOAPEnvelope soapEnvelope, int status, int sequenceNo)
throws SOAPException {
super(soapEnvelope, MESSAGE_ORDER);
this.sequenceNo = sequenceNo;
this.status = status;
String statusName;
if (status == STATUS_RESET) {
statusName = VALUE_STATUS_RESET;
}
else {
statusName = VALUE_STATUS_CONTINUE;
}
addChildElement(ELEMENT_SEQUENCE_NUMBER, Integer.toString(sequenceNo))
.addAttribute(ATTRIBUTE_STATUS, statusName);
}
/**
* Constructs an <code>MessageOrder</code> object by parsing the given
* <code>SOAPElement</code>.
*
* @param soapEnvelope <code>SOAPEnvelope</code>, the header container
* of which the <code>MessageOrder</code> is
* attached to.
* @param soapElement <code>SOAPElement</code> containing
* SequenceNumber element.
*
* @throws SOAPException
*/
MessageOrder(SOAPEnvelope soapEnvelope, SOAPElement soapElement)
throws SOAPException {
super(soapEnvelope, soapElement);
Iterator childElements = getChildElements(ELEMENT_SEQUENCE_NUMBER);
if (childElements.hasNext()) {
try {
SOAPElement element = (SOAPElement) childElements.next();
// modify the statement to trim the value in hermes 2 ebms plugin coz new library used
sequenceNo = Integer.parseInt(element.getValue().trim());
String value = element.getAttributeValue(
soapEnvelope.createName(ATTRIBUTE_STATUS,
NAMESPACE_PREFIX_EB, NAMESPACE_URI_EB));
if (value == null || value.equals(VALUE_STATUS_CONTINUE)) {
status = STATUS_CONTINUE;
}
else if (value.equals(VALUE_STATUS_RESET)) {
status = STATUS_RESET;
if (sequenceNo != 0) {
throw new EbxmlValidationException
(EbxmlValidationException.EBXML_ERROR_INCONSISTENT,
EbxmlValidationException.SEVERITY_ERROR,
"MessageOrder element having status \"Reset\" must "
+ "have sequence number equals to 0.");
}
}
else {
throw new EbxmlValidationException
(EbxmlValidationException.EBXML_ERROR_VALUE_NOT_RECOGNIZED,
EbxmlValidationException.SEVERITY_ERROR,
"MessageOrder/SequenceNumber has unrecognized status "
+ "value.");
}
}
catch (NumberFormatException e) {
throw new EbxmlValidationException
(EbxmlValidationException.EBXML_ERROR_VALUE_NOT_RECOGNIZED,
EbxmlValidationException.SEVERITY_ERROR,
"Cannot parse sequence number in MessageOrder element");
}
}
else {
throw new SOAPValidationException
(SOAPValidationException.SOAP_FAULT_CLIENT,
"Missing <" + NAMESPACE_PREFIX_EB + ":"
+ ELEMENT_SEQUENCE_NUMBER + "> in <" + NAMESPACE_PREFIX_EB
+ ":" + MESSAGE_ORDER + ">!");
}
}
/**
* Get the sequence number in the conversation. Note that although the word
* "conversation" is used in the specification, the sequence number is set
* and incremented by one party only. It means that both parties need to
* keep their own sequence numbers for all outgoing messages.
*
* @return sequence number.
*/
public int getSequenceNumber() {
return sequenceNo;
}
/**
* Get the status of the sequence number which can be "Reset" or "Continue".
*
* @return Status of the sequence number.
*/
public int getStatus() {
return status;
}
}