/**
 * 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
 *
 * XKMSCompoundRequest := Interface for CompoundRequest Messages
 *
 * $Id: XKMSCompoundRequest.hpp 1833340 2018-06-11 15:40:13Z scantor $
 *
 */

#ifndef XKMSCOMPOUNDREQUEST_INCLUDE
#define XKMSCOMPOUNDREQUEST_INCLUDE

// XSEC Includes

#include <xsec/framework/XSECDefs.hpp>

#ifdef XSEC_XKMS_ENABLED

#include <xsec/xkms/XKMSRequestAbstractType.hpp>

class XKMSLocateRequest;
class XKMSValidateRequest;
class XKMSRegisterRequest;
class XKMSRevokeRequest;
class XKMSReissueRequest;
class XKMSRecoverRequest;

/**
 * @ingroup xkms
 */

/**
 * @brief Interface definition for the CompoundRequest elements
 *
 * The \<CompoundRequest\> is used to merge a number of separate requests
 * into a single message.  It is a very simple type - simply a holding
 * Request that has all the sub-requests held within it.
 *
 * The schema definition for CompoundRequest is as follows :
 *
 * \verbatim
   <!-- CompoundRequest -->
   <element name="CompoundRequest" type="xkms:CompoundRequestType"/>
   <complexType name="CompoundRequestType">
      <complexContent>
         <extension base="xkms:RequestAbstractType">
            <choice maxOccurs="unbounded">
               <element ref="xkms:LocateRequest"/>
               <element ref="xkms:ValidateRequest"/>
               <element ref="xkms:RegisterRequest"/>
               <element ref="xkms:ReissueRequest"/>
               <element ref="xkms:RecoverRequest"/>
               <element ref="xkms:RevokeRequest"/>
            </choice>
         </extension>
      </complexContent>
   </complexType>
   <!-- /CompoundRequest -->
\endverbatim
 */

class XSEC_EXPORT XKMSCompoundRequest : public XKMSRequestAbstractType {

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

protected:

	XKMSCompoundRequest() {};

public:

	virtual ~XKMSCompoundRequest() {};

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

	/**
	 * \brief Return the element at the base of the message
	 */

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

	/**
	 * \brief Obtain the number of requests within the compound request
	 *
	 * This class holds a list of requests that can be accessed using the
	 * getRequestListItem method.  This method allows an application to determine
	 * how many request items there are.
	 *
	 * @returns The size of the request list
	 */

	virtual int getRequestListSize(void) = 0;

	/**
	 * \brief Obtain a request item
	 * 
	 * Obtain a particular request from the list of requests held in this
	 * compound object
	 *
	 * @returns The nominated item
	 */
	 
	 virtual XKMSRequestAbstractType * getRequestListItem(int item) = 0;

	//@}

	/** @name Setter Interface Methods */
	//@{

	/** \brief Add a LocateRequest item
	 *
	 * Appends a LocateRequest to the CompoundRequest object and returns the newly
	 * created object
	 *
	 * @param service URI
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
	 * @returns the new XKMSLocateRequest structure
	 */

	virtual XKMSLocateRequest * createLocateRequest(
		const XMLCh * service,
		const XMLCh * id = NULL) = 0;

	/** \brief Add a ValidateRequest item
	 *
	 * Appends a ValidateRequest to the CompoundRequest object and returns the newly
	 * created object
	 *
	 * @param service URI
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
	 * @returns the new XKMSValidateRequest structure
	 */

	virtual XKMSValidateRequest * createValidateRequest(
		const XMLCh * service,
		const XMLCh * id = NULL) = 0;
	 
	/** \brief Add a RegisterRequest item
	 *
	 * Appends a RegisterRequest to the CompoundRequest object and returns the newly
	 * created object
	 *
	 * @param service URI
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
	 * @returns the new XKMSValidateRequest structure
	 */

	virtual XKMSRegisterRequest * createRegisterRequest(
		const XMLCh * service,
		const XMLCh * id = NULL) = 0;

	/** \brief Add a RevokeRequest item
	 *
	 * Appends a RevokeRequest to the CompoundRequest object and returns the newly
	 * created object
	 *
	 * @param service URI
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
	 * @returns the new XKMSRevokeRequest structure
	 */

	virtual XKMSRevokeRequest * createRevokeRequest(
		const XMLCh * service,
		const XMLCh * id = NULL) = 0;

	/** \brief Add a RecoverRequest item
	 *
	 * Appends a RecoverRequest to the CompoundRequest object and returns the newly
	 * created object
	 *
	 * @param service URI
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
	 * @returns the new XKMSRecoverRequest structure
	 */

	virtual XKMSRecoverRequest * createRecoverRequest(
		const XMLCh * service,
		const XMLCh * id = NULL) = 0;

	/** \brief Add a ReissueRequest item
	 *
	 * Appends a ReissueRequest to the CompoundRequest object and returns the newly
	 * created object
	 *
	 * @param service URI
	 * @param id Value to set in the Id field.  If NULL, the library will
	 * generate a new Unique Id value.
	 * @returns the new XKMSReissueRequest structure
	 */

	virtual XKMSReissueRequest * createReissueRequest(
		const XMLCh * service,
		const XMLCh * id = NULL) = 0;

	//@}

private:

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

};

#endif /* XSEC_XKMS_ENABLED */

#endif /* XKMSCOMPOUNDREQUEST_INCLUDE */
