/**
 * This module is taken from the standard CORBA Notification Service
 * 1.1, as described in:
 *
 * https://www.omg.org/spec/NOT/1.1/
 *
 * The idl was extracted from the following PDF:
 * formal/04-10-13
 */

#ifndef _COS_NOTIFY_FILTER_IDL_
#define _COS_NOTIFY_FILTER_IDL_

#include "CosNotifyComm.idl"

#pragma prefix "omg.org"

module CosNotifyFilter {

   typedef long ConstraintID;

   struct ConstraintExp {
      CosNotification::EventTypeSeq event_types;
      string constraint_expr;
   };

   typedef sequence<ConstraintID> ConstraintIDSeq;
   typedef sequence<ConstraintExp> ConstraintExpSeq;

   struct ConstraintInfo {
      ConstraintExp constraint_expression;
      ConstraintID constraint_id;
   };

   typedef sequence<ConstraintInfo> ConstraintInfoSeq;

   struct MappingConstraintPair {
      ConstraintExp constraint_expression;
      any result_to_set;
   };

   typedef sequence<MappingConstraintPair> MappingConstraintPairSeq;

   struct MappingConstraintInfo {
      ConstraintExp constraint_expression;
      ConstraintID constraint_id;
      any value;
   };

   typedef sequence<MappingConstraintInfo> MappingConstraintInfoSeq;

   typedef long CallbackID;
   typedef sequence<CallbackID> CallbackIDSeq;

   exception UnsupportedFilterableData {};
   exception InvalidGrammar {};
   exception InvalidConstraint {ConstraintExp constr;};
   exception DuplicateConstraintID {ConstraintID id;};
   exception ConstraintNotFound {ConstraintID id;};
   
   exception CallbackNotFound {};

   exception InvalidValue {ConstraintExp constr; any value;};

   interface Filter {

      readonly attribute string constraint_grammar;

      ConstraintInfoSeq add_constraints (
            in ConstraintExpSeq constraint_list)
         raises (InvalidConstraint);

      void modify_constraints (
            in ConstraintIDSeq del_list,
            in ConstraintInfoSeq modify_list)
         raises (InvalidConstraint, ConstraintNotFound);

      ConstraintInfoSeq get_constraints(
            in ConstraintIDSeq id_list)
         raises (ConstraintNotFound);

      ConstraintInfoSeq get_all_constraints();

      void remove_all_constraints();

      void destroy();

      boolean match ( in any filterable_data )
         raises (UnsupportedFilterableData);

      boolean match_structured (
            in CosNotification::StructuredEvent filterable_data )
         raises (UnsupportedFilterableData);

      boolean match_typed (
            in CosNotification::PropertySeq filterable_data )
         raises (UnsupportedFilterableData);

      CallbackID attach_callback (
            in CosNotifyComm::NotifySubscribe callback);

      void detach_callback ( in CallbackID callback)
         raises ( CallbackNotFound );

      CallbackIDSeq get_callbacks();

   }; // Filter

   interface MappingFilter {

      readonly attribute string constraint_grammar;

      readonly attribute CORBA::TypeCode value_type;

      readonly attribute any default_value;

      MappingConstraintInfoSeq add_mapping_constraints (
            in MappingConstraintPairSeq pair_list)
         raises (InvalidConstraint, InvalidValue);

      void modify_mapping_constraints (
            in ConstraintIDSeq del_list,
            in MappingConstraintInfoSeq modify_list)
         raises (InvalidConstraint, InvalidValue,
                  ConstraintNotFound);

      MappingConstraintInfoSeq get_mapping_constraints (
            in ConstraintIDSeq id_list)
         raises (ConstraintNotFound);

      MappingConstraintInfoSeq get_all_mapping_constraints();

      void remove_all_mapping_constraints();

      void destroy();

      boolean match (
            in any filterable_data,
            out any result_to_set )
         raises (UnsupportedFilterableData);

      boolean match_structured (
            in CosNotification::StructuredEvent filterable_data,
            out any result_to_set)
         raises (UnsupportedFilterableData);

      boolean match_typed (
            in CosNotification::PropertySeq filterable_data,
            out any result_to_set)
         raises (UnsupportedFilterableData);

   }; // MappingFilter

   interface FilterFactory {

      Filter create_filter ( in string constraint_grammar)
         raises (InvalidGrammar);

      MappingFilter create_mapping_filter (
            in string constraint_grammar,
            in any default_value)
         raises(InvalidGrammar);

   }; // FilterFactory

   typedef long FilterID;
   typedef sequence<FilterID> FilterIDSeq;

   exception FilterNotFound {};

   interface FilterAdmin {

      FilterID add_filter ( in Filter new_filter );

      void remove_filter ( in FilterID filter ) raises ( FilterNotFound );

      Filter get_filter ( in FilterID filter ) raises ( FilterNotFound );

      FilterIDSeq get_all_filters();

      void remove_all_filters();

   }; // FilterAdmin

}; // CosNotifyFilter

#endif /* _COS_NOTIFY_FILTER_IDL_ */
