diff options
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/Trader/Offer_Iterators.h')
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Trader/Offer_Iterators.h | 298 |
1 files changed, 298 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Offer_Iterators.h b/TAO/orbsvcs/orbsvcs/Trader/Offer_Iterators.h new file mode 100644 index 00000000000..247664b6f77 --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/Trader/Offer_Iterators.h @@ -0,0 +1,298 @@ +// -*- C++ -*- + +//============================================================================= +/** + * @file Offer_Iterators.h + * + * $Id$ + * + * @author Marina Spivak <marina@cs.wustl.edu> + * @author Seth Widoff <sbw1@cs.wustl.edu> + */ +//============================================================================= + + +#ifndef TAO_OFFER_ITERATORS_H +#define TAO_OFFER_ITERATORS_H +#include /**/ "ace/pre.h" + +#include "orbsvcs/Trader/Trader_Utils.h" + +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable:4250) +#endif /* _MSC_VER */ + +TAO_BEGIN_VERSIONED_NAMESPACE_DECL + + // ************************************************************* + // TAO_Offer_Iterator + // ************************************************************* + +class TAO_Offer_Iterator + : public virtual POA_CosTrading::OfferIterator +{ + // = TITLE + // This class implements CosTrading::OfferIterator IDL + // interface. + + // = DESCRIPTION + // This is an abstract base class to allow for different + // implementations of OfferIterator. + // BEGIN SPEC + // The OfferIterator interface is used to return a set of service + // offers from the query operation by enabling the service offers + // to be extracted by successive operations on the OfferIterator + // interface. + // END SPEC +public: + // = Initialization and termination methods. + + TAO_Offer_Iterator (const TAO_Property_Filter& property_filter); + + virtual ~TAO_Offer_Iterator (void); + + /** + * BEGIN SPEC + * The destroy operation destroys the iterator. No further + * operations can be invoked on an iterator after it has been + * destroyed. + * END SPEC + */ + virtual void destroy (ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Add an offer to the collection of offers the iterator will + /// iterate over. + virtual void add_offer (CosTrading::OfferId offer_id, + const CosTrading::Offer* offer) = 0; + + virtual CORBA::ULong max_left (ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + CosTrading::UnknownMaxLeft)) = 0; + + // BEGIN SPEC + // The max_left operation returns the number of service offers + // remaining in the iterator. The exception UnknownMaxLeft is raised + // if the iterator cannot determine the remaining number of service + // offers (e.g., if the iterator determines its set of service + // offers through lazy evaluation). + // END SPEC + + /** + * BEGIN SPEC + * The next_n operation returns a set of service offers in the + * output parameter "offers." The operation returns n service offers + * if there are at least n service offers remaining in the + * iterator. If there are fewer than n service offers in the + * iterator, then all remaining service offers are returned. The + * actual number of service offers returned can be determined from + * the length of the "offers" sequence. The next_n operation returns + * TRUE if there are further service offers to be extracted from the + * iterator. It returns FALSE if there are no further service offers + * to be extracted. + * END SPEC + */ + virtual CORBA::Boolean next_n (CORBA::ULong n, + CosTrading::OfferSeq_out offers + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) = 0; + protected: + + TAO_Offer_Iterator& operator=(const TAO_Offer_Iterator&); + + /// The filter through which each returned offer must pass. Used to + /// strip offers of undesirable properties. + TAO_Property_Filter pfilter_; +}; + + // ************************************************************* + // TAO_Query_Only_Offer_Iterator + // ************************************************************* + +class TAO_Query_Only_Offer_Iterator + : public TAO_Offer_Iterator + // = TITLE + // An implementation of the CosTrading::OfferIterator IDL + // interface that takes advantage of the fact that the trader is + // Query Only, and therefore its service offers are not being + // changed or removed. + // + // = DESCRIPTION + // The iterator stores pointers to Offers to be iterated over, + // and later accesses the Offers directly through the pointers. + // +{ +public: + // = Initialization and termination methods. + + TAO_Query_Only_Offer_Iterator (const TAO_Property_Filter& pfilter); + + virtual ~TAO_Query_Only_Offer_Iterator (void); + + /// Deposit at maximum n offers into the return sequence and return 1, + /// or return 0 if the iterator is done and no offers are returned. + virtual CORBA::Boolean next_n (CORBA::ULong n, + CosTrading::OfferSeq_out offers + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Return the number of items left in the iterator. + virtual CORBA::ULong max_left (ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + CosTrading::UnknownMaxLeft)); + + /// Add an offer the iterator should iterate over. + void add_offer (CosTrading::OfferId offer_id, + const CosTrading::Offer* offer); + +private: + + TAO_Query_Only_Offer_Iterator (const TAO_Query_Only_Offer_Iterator&); + TAO_Query_Only_Offer_Iterator& operator=(const TAO_Query_Only_Offer_Iterator&); + + /// Structure that stores pointers to offers + /// to iterate over. + ACE_Unbounded_Queue <CosTrading::Offer *> offers_; +}; + + // ************************************************************* + // TAO_Offer_Iterator_Collection + // ************************************************************* + +class TAO_Offer_Iterator_Collection : + public virtual POA_CosTrading::OfferIterator +// = TITLE +// A collection of offer iterator to query in turn. +// +// = DESCRIPTION +// Since a query could conceivable query several other traders, it +// needs a way to merge the results into a single set of results +// suitable for being returned to the user. And since all the query +// method can return to the user is a sequence and an iterator, and +// the size of the sequence is constrained, there needs to be some +// way to collect all the returned offer_iterators into a single +// offer_iterator. This is that collection. The results of +// collecting all the iterators in this way is a distributed tree of +// iterators, which could conceivably become hugely inefficient if +// the trader graph is deep enough. +{ +public: + + // = Constructors. + + TAO_Offer_Iterator_Collection (void); + + virtual ~TAO_Offer_Iterator_Collection (void); + + /// Retrieve n offers from the set of iterators. + virtual CORBA::Boolean next_n (CORBA::ULong n, + CosTrading::OfferSeq_out offers + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Destroy the collection of iterators. + virtual void destroy (ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Determine how many offers are left in the collection. + virtual CORBA::ULong max_left (ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + CosTrading::UnknownMaxLeft)); + + /// Add an iterator to the collection. + void add_offer_iterator (CosTrading::OfferIterator_ptr offer_iter); + +private: + + TAO_Offer_Iterator_Collection (const TAO_Offer_Iterator_Collection&); + TAO_Offer_Iterator_Collection& operator= (const TAO_Offer_Iterator_Collection&); + + typedef ACE_Unbounded_Queue <CosTrading::OfferIterator*> Offer_Iters; + + /// The iterator collection. + Offer_Iters iters_; +}; + + // ************************************************************* + // TAO_Offer_Id_Iterator + // ************************************************************* + +class TAO_Offer_Id_Iterator : + public virtual POA_CosTrading::OfferIdIterator +// = TITLE +// Silly little iterator that contains the overflow of offer ids +// from the Admin list_offers method. +// +// = DESCRIPTION +// +// BEGIN SPEC +// The OfferIdIterator interface is used to return a set of offer +// identifiers from the list_offers operation and the list_proxies +// operation in the Admin interface by enabling the offer identifiers +// to be extracted by successive operations on the OfferIdIterator +// interface. +// END SPEC +{ + public: + + /// No op constructor + TAO_Offer_Id_Iterator(void); + + ~TAO_Offer_Id_Iterator (void); + + /** + * The max_left operation returns the number of offer identifiers + * remaining in the iterator. The exception UnknownMaxLeft is raised + * if the iterator cannot determine the remaining number of offer + * identifiers (e.g., if the iterator determines its set of offer + * identifiers through lazy evaluation). + */ + virtual CORBA::ULong max_left(ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + CosTrading::UnknownMaxLeft)); + + /** + * The destroy operation destroys the iterator. No further + * operations can be invoked on an iterator after it has been + * destroyed. + */ + virtual void destroy(ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /** + * The next_n operation returns a set of offer identifiers in the + * output parameter "ids." The operation returns n offer identifiers + * if there are at least n offer identifiers remaining in the + * iterator. If there are fewer than n offer identifiers in the + * iterator, then all remaining offer identifiers are returned. The + * actual number of offer identifiers returned can be determined + * from the length of the "ids" sequence. The next_n operation + * returns TRUE if there are further offer identifiers to be + * extracted from the iterator. It returns FALSE if there are no + * further offer identifiers to be extracted. + */ + virtual CORBA::Boolean next_n(CORBA::ULong _n, + CosTrading::OfferIdSeq_out _ids + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Insert a <new_id> into the contents of the iterator. + void insert_id(CosTrading::OfferId new_id); + + private: + + TAO_Offer_Id_Iterator (const TAO_Offer_Id_Iterator&); + TAO_Offer_Id_Iterator& operator= (TAO_Offer_Id_Iterator&); + + TAO_String_Queue ids_; +}; + +TAO_END_VERSIONED_NAMESPACE_DECL + +#if defined(_MSC_VER) +#pragma warning(pop) +#endif /* _MSC_VER */ + +#include /**/ "ace/post.h" +#endif /* TAO_OFFER_ITERATOR */ |