/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you 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.
 */

/*
 * XSEC
 *
 * XKMSRequestAbstractType := Interface for base schema of XKMS Request messages
 *
 * $Id$
 *
 */

#ifndef XKMSREQUESTABSTRACTTYPE_INCLUDE
#define XKMSREQUESTABSTRACTTYPE_INCLUDE

// XSEC Includes

#include <xsec/framework/XSECDefs.hpp>

#ifdef XSEC_XKMS_ENABLED

#include <xsec/xkms/XKMSMessageAbstractType.hpp>

class XKMSRespondWith;
class XKMSResponseMechanism;

/**
 * @ingroup xkms
 */

/**
 * @brief Interface definition for the RequestAbstractType
 *
 * The \<RequestAbstractType\> is an abstract type on which all
 * XKMS Request messages are built.  
 *
 * The schema definition for RequestAbstractType is as follows :
 *
 * \verbatim
   <!-- RequestAbstractType -->
   <complexType name="RequestAbstractType" abstract="true">
      <complexContent>
         <extension base="xkms:MessageAbstractType">
            <sequence>
               <element ref="xkms:ResponseMechanism" minOccurs="0" 
                     maxOccurs="unbounded"/>
               <element ref="xkms:RespondWith" minOccurs="0" 
                     maxOccurs="unbounded"/>
               <element ref="xkms:PendingNotification" minOccurs="0"/>
            </sequence>
            <attribute name="OriginalRequestId" type="NCName" 
                  use="optional"/>
            <attribute name="ResponseLimit" type="integer" use="optional"/>
         </extension>
      </complexContent>
   </complexType>
   <!-- /RequestAbstractType -->
\endverbatim
 */


class XSEC_EXPORT XKMSRequestAbstractType : public XKMSMessageAbstractType {

	/** @name Constructors and Destructors */
	//@{

protected:

	XKMSRequestAbstractType() {};

public:

	virtual ~XKMSRequestAbstractType() {};

	/** @name Getter Interface Methods */
	//@{

	virtual XERCES_CPP_NAMESPACE_QUALIFIER DOMElement * getElement(void) const = 0;

	/**
	 * \brief Get the Original Request Id for the Message
	 *
	 * For transactions that use multipt request/response sessions (e.g.
	 * two stage commit or asyncronous processing), this attribute can be
	 * used to identify the id of the original message that was processed.
	 *
	 * @returns a pointer to the Original Request Id string (owned by the library)
	 */

	virtual const XMLCh * getOriginalRequestId(void) const = 0;

	/**
	 * \brief Get the ResponseLimit size
	 *
	 * A client can limit the number of keys to be returned by the service by
	 * setting this value to the required limit.
	 *
	 * @returns Value of the ResponseLimit within the message.  0 if none was set
	 */

	virtual unsigned int getResponseLimit(void) const = 0;

	//@}

	/** @name Setter interface methods */
	//@{

	/**
	 * \brief Set the Original Reqeust Id for the Message
	 *
	 * Allows a calling application to set a new original request Id for the
	 * message
	 * 
	 * @param id The Id to set as the OriginalRequestId
	 */

	virtual void setOriginalRequestId(const XMLCh * id) = 0;

	/**
	 * \brief Set the ResponseLimit size
	 *
	 * A client can limit the number of keys to be returned by the service by
	 * setting this value to the required limit.
	 *
	 * @param limit Value to set the ResponseLimit within the message
	 */

	virtual void setResponseLimit(unsigned int limit) = 0;

	//@}

	/** @name \<RespondWith\> handling */
	//@{

	/**
	 * \brief Number of RespondWith elements in this Request
	 *
	 * Returns the number of RespondWith elements held within this request
	 *
	 * @returns Number of RespondWith elements
	 */

	virtual int getRespondWithSize(void) = 0;

	/**
	 * \brief Get the nth item in the RespondWith list
	 *
	 * @param item The item to return
	 * @returns the nth item in the RespondWith list.
	 *
	 */

	virtual XKMSRespondWith * getRespondWithItem(int item) = 0;

	/**
	 * \brief Get the string of the nth item in the RespondWith list
	 *
	 * @param item The item whose string is to be returned
	 * @returns the string of the nth item in the RespondWith list.
	 *
	 */

	virtual const XMLCh * getRespondWithItemStr(int item) = 0;

	/**
	 * \brief Append an item to the RespondWith list
	 *
	 * @param item XKMSRespondWith object to append to the list.
	 * @note Once passed in, this item will be owned by the library.
	 */

	virtual void appendRespondWithItem(XKMSRespondWith * item) = 0;

	/**
	 * \brief Shortcut for appending an item to the RespondWith list
	 *
	 * @param item String to create a RespondWith element around and 
	 * append to the list.
	 */

	virtual void appendRespondWithItem(const XMLCh * item) = 0;

	//@}

	/** @name \<ResponseMechanism\> handling */
	//@{

	/**
	 * \brief Number of ResponseMechanism elements in this Request
	 *
	 * Returns the number of ResponseMechanism elements held within this request
	 *
	 * @returns Number of ResponseMechanism elements
	 */

	virtual int getResponseMechanismSize(void) = 0;

	/**
	 * \brief Get the nth item in the ResponseMechanism list
	 *
	 * @param item The item to return
	 * @returns the nth item in the ResponseMechanism list.
	 *
	 */

	virtual XKMSResponseMechanism * getResponseMechanismItem(int item) = 0;

	/**
	 * \brief Get the string of the nth item in the ResponseMechanism list
	 *
	 * @param item The item whose string is to be returned
	 * @returns the string of the nth item in the RespondWith list.
	 *
	 */

	virtual const XMLCh * getResponseMechanismItemStr(int item) = 0;

	/**
	 * \brief Append an item to the ResponseMechanism list
	 *
	 * @param item XKMSResponseMechanism object to append to the list.
	 * @note Once passed in, this item will be owned by the library.
	 */

	virtual void appendResponseMechanismItem(XKMSResponseMechanism * item) = 0;

	/**
	 * \brief Shortcut for appending an item to the ResponseMechanism list
	 *
	 * @param item String to create a ResponseMechanism element around and 
	 * append to the list.
	 */

	virtual void appendResponseMechanismItem(const XMLCh * item) = 0;

	/**
	 * \brief Remove a ResponseMechanism
	 *
	 * Removes the identified ResponseMechanism from the item
	 *
	 * @param item Item to remove
	 */

	virtual void removeResponseMechanismItem(int item) = 0;

	//@}

private:

	// Unimplemented
	XKMSRequestAbstractType(const XKMSRequestAbstractType &);
	XKMSRequestAbstractType & operator = (const XKMSRequestAbstractType &);

};

#endif /* XSEC_XKMS_ENABLED */

#endif /* XKMSREQUESTABSTRACTTYPE_INCLUDE */
