TAO_Notify_Constraint_Visitor Class Reference

#include <Notify_Constraint_Visitors.h>

Collaboration diagram for TAO_Notify_Constraint_Visitor:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 TAO_Notify_Constraint_Visitor (void)
 Constructor.

int bind_structured_event (const CosNotification::StructuredEvent &s_event)
 Put the event data into our hash map.

CORBA::Boolean evaluate_constraint (TAO_ETCL_Constraint *root)
int visit_literal (TAO_ETCL_Literal_Constraint *)
int visit_identifier (TAO_ETCL_Identifier *)
int visit_union_value (TAO_ETCL_Union_Value *)
int visit_union_pos (TAO_ETCL_Union_Pos *)
int visit_component_pos (TAO_ETCL_Component_Pos *)
int visit_component_assoc (TAO_ETCL_Component_Assoc *)
int visit_component_array (TAO_ETCL_Component_Array *)
int visit_special (TAO_ETCL_Special *)
int visit_component (TAO_ETCL_Component *)
int visit_dot (TAO_ETCL_Dot *)
int visit_eval (TAO_ETCL_Eval *)
int visit_default (TAO_ETCL_Default *)
int visit_exist (TAO_ETCL_Exist *)
int visit_unary_expr (TAO_ETCL_Unary_Expr *)
int visit_binary_expr (TAO_ETCL_Binary_Expr *)
int visit_preference (TAO_ETCL_Preference *)

Protected Types

enum  structured_event_field {
  FILTERABLE_DATA, HEADER, FIXED_HEADER, EVENT_TYPE,
  DOMAIN_NAME, TYPE_NAME, EVENT_NAME, VARIABLE_HEADER,
  REMAINDER_OF_BODY, EMPTY
}

Protected Member Functions

int visit_or (TAO_ETCL_Binary_Expr *)
int visit_and (TAO_ETCL_Binary_Expr *)
int visit_twiddle (TAO_ETCL_Binary_Expr *)
int visit_in (TAO_ETCL_Binary_Expr *)
int visit_binary_op (TAO_ETCL_Binary_Expr *binary_expr, int op_type)
CORBA::Boolean sequence_does_contain (const CORBA::Any *any, TAO_ETCL_Literal_Constraint &item)
CORBA::Boolean array_does_contain (const CORBA::Any *any, TAO_ETCL_Literal_Constraint &item)
CORBA::Boolean struct_does_contain (const CORBA::Any *any, TAO_ETCL_Literal_Constraint &item)
CORBA::Boolean union_does_contain (const CORBA::Any *any, TAO_ETCL_Literal_Constraint &item)
CORBA::Boolean any_does_contain (const CORBA::Any *any, TAO_ETCL_Literal_Constraint &item)
CORBA::Boolean simple_type_match (int expr_type, CORBA::TCKind tc_kind)

Protected Attributes

structured_event_field implicit_id_
 Storage for the type of implicit id the component has (if any).

ACE_Hash_Map_Manager< ACE_CString,
structured_event_field, ACE_Null_Mutex
implicit_ids_
ACE_Hash_Map_Manager< ACE_CString,
CORBA::Any, ACE_Null_Mutex
filterable_data_
 Used to lookup names and values in the event's 'filterable_data' field.

ACE_Hash_Map_Manager< ACE_CString,
CORBA::Any, ACE_Null_Mutex
variable_header_
 Used to lookup names and values in the event's 'variable_header' field.

CORBA::String_var domain_name_
CORBA::String_var type_name_
CORBA::String_var event_name_
CORBA::Any remainder_of_body_
 Storage for the structured_event's 'remainder_of_body' field.

ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint > queue_
 The result of a non_boolean operation.

CORBA::Any_var current_value_
CORBA::String_var current_name_

Static Protected Attributes

const size_t implicit_ids_size_ = 27
const size_t filterable_data_size_ = 31
const size_t variable_header_size_ = 31

Member Enumeration Documentation

enum TAO_Notify_Constraint_Visitor::structured_event_field [protected]
 

Enumeration values:
FILTERABLE_DATA 
HEADER 
FIXED_HEADER 
EVENT_TYPE 
DOMAIN_NAME 
TYPE_NAME 
EVENT_NAME 
VARIABLE_HEADER 
REMAINDER_OF_BODY 
EMPTY 

Definition at line 99 of file Notify_Constraint_Visitors.h.

00100     {
00101       FILTERABLE_DATA,
00102       HEADER,
00103       FIXED_HEADER,
00104       EVENT_TYPE,
00105       DOMAIN_NAME,
00106       TYPE_NAME,
00107       EVENT_NAME,
00108       VARIABLE_HEADER,
00109       REMAINDER_OF_BODY,
00110       EMPTY
00111     };


Constructor & Destructor Documentation

TAO_BEGIN_VERSIONED_NAMESPACE_DECL TAO_Notify_Constraint_Visitor::TAO_Notify_Constraint_Visitor void   ) 
 

Constructor.

Definition at line 17 of file Notify_Constraint_Visitors.cpp.

References ACE_CString, ACE_Hash_Map_Manager_Ex< ACE_CString, structured_event_field, ACE_Hash< ACE_CString >, ACE_Equal_To< ACE_CString >, ACE_Null_Mutex >::bind(), DOMAIN_NAME, EVENT_NAME, EVENT_TYPE, FILTERABLE_DATA, FIXED_HEADER, HEADER, implicit_ids_, REMAINDER_OF_BODY, TYPE_NAME, and VARIABLE_HEADER.

00018   : implicit_id_ (TAO_Notify_Constraint_Visitor::EMPTY),
00019     implicit_ids_(implicit_ids_size_),
00020     filterable_data_(filterable_data_size_),
00021     variable_header_(variable_header_size_)
00022 {
00023   (void) this->implicit_ids_.bind (ACE_CString ("filterable_data",
00024     0,
00025     0),
00026     FILTERABLE_DATA);
00027   (void) this->implicit_ids_.bind (ACE_CString ("header",
00028     0,
00029     0),
00030     HEADER);
00031   (void) this->implicit_ids_.bind (ACE_CString ("remainder_of_body",
00032     0,
00033     0),
00034     REMAINDER_OF_BODY);
00035   (void) this->implicit_ids_.bind (ACE_CString ("fixed_header",
00036     0,
00037     0),
00038     FIXED_HEADER);
00039   (void) this->implicit_ids_.bind (ACE_CString ("variable_header",
00040     0,
00041     0),
00042     VARIABLE_HEADER);
00043   (void) this->implicit_ids_.bind (ACE_CString ("event_name",
00044     0,
00045     0),
00046     EVENT_NAME);
00047   (void) this->implicit_ids_.bind (ACE_CString ("event_type",
00048     0,
00049     0),
00050     EVENT_TYPE);
00051   (void) this->implicit_ids_.bind (ACE_CString ("domain_name",
00052     0,
00053     0),
00054     DOMAIN_NAME);
00055   (void) this->implicit_ids_.bind (ACE_CString ("type_name",
00056     0,
00057     0),
00058     TYPE_NAME);
00059 }


Member Function Documentation

CORBA::Boolean TAO_Notify_Constraint_Visitor::any_does_contain const CORBA::Any *  any,
TAO_ETCL_Literal_Constraint &  item
[protected]
 

Definition at line 1410 of file Notify_Constraint_Visitors.cpp.

Referenced by visit_in().

01414 {
01415   const CORBA::Any *result = 0;
01416 
01417   *any >>= result;
01418 
01419   TAO_ETCL_Literal_Constraint element (const_cast<CORBA::Any *>(result));
01420   return item == element;
01421 }

CORBA::Boolean TAO_Notify_Constraint_Visitor::array_does_contain const CORBA::Any *  any,
TAO_ETCL_Literal_Constraint &  item
[protected]
 

Definition at line 1269 of file Notify_Constraint_Visitors.cpp.

References ACE_CATCHANY, ACE_DECLARE_NEW_CORBA_ENV, ACE_ENDTRY, ACE_ENV_ARG_PARAMETER, ACE_ENV_SINGLE_ARG_PARAMETER, ACE_TRY, ACE_TRY_CHECK, and simple_type_match().

Referenced by visit_in().

01271 {
01272   ACE_DECLARE_NEW_CORBA_ENV;
01273   ACE_TRY
01274   {
01275     CORBA::TypeCode_var type = any->type ();
01276     CORBA::TCKind kind = TAO_DynAnyFactory::unalias (type.in ()
01277       ACE_ENV_ARG_PARAMETER);
01278     ACE_TRY_CHECK;
01279 
01280     // The literal and the array elements must be
01281     // of the same simple type.
01282     CORBA::Boolean match = this->simple_type_match (item.expr_type (),
01283       kind);
01284 
01285     if (match == 0)
01286       return 0;
01287 
01288     TAO_DynArray_i dyn_array;
01289     dyn_array.init (*any
01290       ACE_ENV_ARG_PARAMETER);
01291     ACE_TRY_CHECK;
01292 
01293     DynamicAny::AnySeq_var any_seq =
01294       dyn_array.get_elements (ACE_ENV_SINGLE_ARG_PARAMETER);
01295     ACE_TRY_CHECK;
01296 
01297     CORBA::ULong length = any_seq->length ();
01298 
01299     for (CORBA::ULong i = 0; i < length; ++i)
01300     {
01301       TAO_ETCL_Literal_Constraint element (&any_seq[i]);
01302 
01303       if (item == element)
01304         return 1;
01305     }
01306   }
01307   ACE_CATCHANY
01308   {
01309     return 0;
01310   }
01311   ACE_ENDTRY;
01312 
01313   return 0;
01314 }

int TAO_Notify_Constraint_Visitor::bind_structured_event const CosNotification::StructuredEvent s_event  ) 
 

Put the event data into our hash map.

Definition at line 62 of file Notify_Constraint_Visitors.cpp.

References ACE_CString, domain_name_, event_name_, CosNotification::StructuredEvent::filterable_data, filterable_data_, CosNotification::StructuredEvent::header, CosNotification::StructuredEvent::remainder_of_body, remainder_of_body_, CORBA::string_dup(), type_name_, and variable_header_.

Referenced by TAO_Notify_ETCL_Filter::match_structured().

00063 {
00064   // The two sequences contained in a structured event are
00065   // copied into hash tables so iteration is done only once.
00066 
00067   CORBA::ULong length = s_event.filterable_data.length ();
00068   CORBA::ULong index = 0;
00069 
00070   for (index = 0; index < length; ++index)
00071   {
00072     ACE_CString name_str (s_event.filterable_data[index].name, 0, 0);
00073 
00074     int status =
00075       this->filterable_data_.bind (
00076         name_str,
00077         s_event.filterable_data[index].value
00078         );
00079 
00080     if (status != 0)
00081       return -1;
00082   }
00083 
00084   length = s_event.header.variable_header.length ();
00085 
00086   for (index = 0; index < length; ++index)
00087   {
00088     ACE_CString name_str (s_event.header.variable_header[index].name, 0, 0);
00089 
00090     int status =
00091       this->variable_header_.bind (
00092         name_str,
00093         s_event.header.variable_header[index].value
00094         );
00095 
00096     if (status != 0)
00097       return -1;
00098   }
00099 
00100   this->domain_name_ =
00101     CORBA::string_dup (s_event.header.fixed_header.event_type.domain_name);
00102 
00103   this->type_name_ =
00104     CORBA::string_dup (s_event.header.fixed_header.event_type.type_name);
00105 
00106   this->event_name_ =
00107     CORBA::string_dup (s_event.header.fixed_header.event_name);
00108 
00109   this->remainder_of_body_ = s_event.remainder_of_body;
00110 
00111   return 0;
00112 }

CORBA::Boolean TAO_Notify_Constraint_Visitor::evaluate_constraint TAO_ETCL_Constraint *  root  ) 
 

Returns 1 if the event satisfies the constraint represented by the the expression tree rooted at , 0 if it doesn't. If an error occurs during the process, the traversal automatically fails.

Definition at line 115 of file Notify_Constraint_Visitors.cpp.

References ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::dequeue_head(), ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::is_empty(), and ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::reset().

Referenced by TAO_Notify_Constraint_Interpreter::evaluate().

00118 {
00119   CORBA::Boolean result = 0;
00120   this->queue_.reset ();
00121 
00122   // Evaluate the constraint in root_;
00123   if (root != 0)
00124   {
00125     if ((root->accept (this) == 0) &&
00126       (! this->queue_.is_empty ()))
00127     {
00128       TAO_ETCL_Literal_Constraint top;
00129       this->queue_.dequeue_head (top);
00130       result = (CORBA::Boolean) top;
00131     }
00132   }
00133 
00134   // If a property couldn't be evaluated we must return 0.
00135   return result;
00136 }

CORBA::Boolean TAO_Notify_Constraint_Visitor::sequence_does_contain const CORBA::Any *  any,
TAO_ETCL_Literal_Constraint &  item
[protected]
 

Definition at line 1215 of file Notify_Constraint_Visitors.cpp.

References ACE_CATCHANY, ACE_DECLARE_NEW_CORBA_ENV, ACE_ENDTRY, ACE_ENV_ARG_PARAMETER, ACE_ENV_SINGLE_ARG_PARAMETER, ACE_TRY, ACE_TRY_CHECK, and simple_type_match().

Referenced by visit_in().

01217 {
01218   ACE_DECLARE_NEW_CORBA_ENV;
01219   ACE_TRY
01220   {
01221     CORBA::TypeCode_var type = any->type ();
01222     CORBA::TypeCode_var base_type =
01223       TAO_DynAnyFactory::strip_alias (type.in () ACE_ENV_ARG_PARAMETER);
01224     ACE_TRY_CHECK;
01225     CORBA::TypeCode_var content_type =
01226       base_type->content_type (ACE_ENV_SINGLE_ARG_PARAMETER);
01227     ACE_TRY_CHECK;
01228     CORBA::TCKind kind =
01229       TAO_DynAnyFactory::unalias (content_type.in() ACE_ENV_ARG_PARAMETER);
01230     ACE_TRY_CHECK;
01231 
01232     // The literal and the array elements must be
01233     // of the same simple type.
01234     CORBA::Boolean match = this->simple_type_match (item.expr_type (),
01235       kind);
01236 
01237     if (match == 0)
01238       return 0;
01239 
01240     TAO_DynSequence_i dyn_seq;
01241     dyn_seq.init (*any
01242       ACE_ENV_ARG_PARAMETER);
01243     ACE_TRY_CHECK;
01244 
01245     DynamicAny::AnySeq_var any_seq =
01246       dyn_seq.get_elements (ACE_ENV_SINGLE_ARG_PARAMETER);
01247     ACE_TRY_CHECK;
01248 
01249     CORBA::ULong length = any_seq->length ();
01250 
01251     for (CORBA::ULong i = 0; i < length; ++i)
01252     {
01253       TAO_ETCL_Literal_Constraint element (&any_seq[i]);
01254 
01255       if (item == element)
01256         return 1;
01257     }
01258   }
01259   ACE_CATCHANY
01260   {
01261     return 0;
01262   }
01263   ACE_ENDTRY;
01264 
01265   return 0;
01266 }

CORBA::Boolean TAO_Notify_Constraint_Visitor::simple_type_match int  expr_type,
CORBA::TCKind  tc_kind
[protected]
 

Definition at line 1424 of file Notify_Constraint_Visitors.cpp.

Referenced by array_does_contain(), sequence_does_contain(), struct_does_contain(), and union_does_contain().

01426 {
01427   switch (expr_type)
01428   {
01429   case TAO_ETCL_STRING:
01430     if (tc_kind != CORBA::tk_string)
01431       return 0;
01432     break;
01433   case TAO_ETCL_DOUBLE:
01434     if (tc_kind != CORBA::tk_double
01435       && tc_kind != CORBA::tk_float)
01436       return 0;
01437     break;
01438   case TAO_ETCL_INTEGER:
01439   case TAO_ETCL_SIGNED:
01440     if (tc_kind != CORBA::tk_short
01441       && tc_kind != CORBA::tk_long
01442       && tc_kind != CORBA::tk_longlong)
01443       return 0;
01444     break;
01445   case TAO_ETCL_UNSIGNED:
01446     if (tc_kind != CORBA::tk_ushort
01447       && tc_kind != CORBA::tk_ulong
01448       && tc_kind != CORBA::tk_ulonglong)
01449       return 0;
01450     break;
01451   case TAO_ETCL_BOOLEAN:
01452     if (tc_kind != CORBA::tk_boolean)
01453       return 0;
01454     break;
01455   default:
01456     return 0;
01457   }
01458   return 1;
01459 }

CORBA::Boolean TAO_Notify_Constraint_Visitor::struct_does_contain const CORBA::Any *  any,
TAO_ETCL_Literal_Constraint &  item
[protected]
 

Definition at line 1317 of file Notify_Constraint_Visitors.cpp.

References ACE_CATCHANY, ACE_DECLARE_NEW_CORBA_ENV, ACE_ENDTRY, ACE_ENV_ARG_PARAMETER, ACE_ENV_SINGLE_ARG_PARAMETER, ACE_TRY, ACE_TRY_CHECK, and simple_type_match().

Referenced by visit_in().

01319 {
01320   ACE_DECLARE_NEW_CORBA_ENV;
01321   ACE_TRY
01322   {
01323     TAO_DynStruct_i dyn_struct;
01324     dyn_struct.init (*any
01325       ACE_ENV_ARG_PARAMETER);
01326     ACE_TRY_CHECK;
01327 
01328     DynamicAny::NameValuePairSeq_var members =
01329       dyn_struct.get_members (ACE_ENV_SINGLE_ARG_PARAMETER);
01330     ACE_TRY_CHECK;
01331 
01332     CORBA::ULong length = members->length ();
01333     CORBA::TypeCode_var tc;
01334     CORBA::TCKind kind;
01335 
01336     for (CORBA::ULong i = 0; i < length; ++i)
01337     {
01338       tc = members[i].value.type ();
01339       kind = TAO_DynAnyFactory::unalias (tc.in ()
01340         ACE_ENV_ARG_PARAMETER);
01341       ACE_TRY_CHECK;
01342 
01343       // The literal and the struct member must be
01344       // of the same simple type.
01345       CORBA::Boolean match = this->simple_type_match (item.expr_type (),
01346         kind);
01347 
01348       if (match == 0)
01349         continue;
01350 
01351       TAO_ETCL_Literal_Constraint element (&members[i].value);
01352 
01353       if (item == element)
01354         return 1;
01355     }
01356   }
01357   ACE_CATCHANY
01358   {
01359     return 0;
01360   }
01361   ACE_ENDTRY;
01362 
01363   return 0;
01364 }

CORBA::Boolean TAO_Notify_Constraint_Visitor::union_does_contain const CORBA::Any *  any,
TAO_ETCL_Literal_Constraint &  item
[protected]
 

Definition at line 1367 of file Notify_Constraint_Visitors.cpp.

References ACE_CATCHANY, ACE_DECLARE_NEW_CORBA_ENV, ACE_ENDTRY, ACE_ENV_ARG_PARAMETER, ACE_ENV_SINGLE_ARG_PARAMETER, ACE_TRY, ACE_TRY_CHECK, and simple_type_match().

Referenced by visit_in().

01369 {
01370   ACE_DECLARE_NEW_CORBA_ENV;
01371   ACE_TRY
01372   {
01373     TAO_DynUnion_i dyn_union;
01374     dyn_union.init (*any
01375       ACE_ENV_ARG_PARAMETER);
01376     ACE_TRY_CHECK;
01377 
01378     DynamicAny::DynAny_var cc =
01379       dyn_union.current_component (ACE_ENV_SINGLE_ARG_PARAMETER);
01380     ACE_TRY_CHECK;
01381 
01382     CORBA::Any_var member = cc->to_any (ACE_ENV_SINGLE_ARG_PARAMETER);
01383     ACE_TRY_CHECK;
01384 
01385     CORBA::TypeCode_var tc = member->type ();
01386     CORBA::TCKind kind = TAO_DynAnyFactory::unalias (tc.in ()
01387       ACE_ENV_ARG_PARAMETER);
01388     ACE_TRY_CHECK;
01389 
01390     // The literal and the union member must be
01391     // of the same simple type.
01392     CORBA::Boolean match = this->simple_type_match (item.expr_type (),
01393       kind);
01394 
01395     if (match == 0)
01396       return 0;
01397 
01398     TAO_ETCL_Literal_Constraint element (&member.inout ());
01399 
01400     return (item == element);
01401   }
01402   ACE_CATCHANY
01403   {
01404     return 0;
01405   }
01406   ACE_ENDTRY;
01407 }

int TAO_Notify_Constraint_Visitor::visit_and TAO_ETCL_Binary_Expr *   )  [protected]
 

Definition at line 997 of file Notify_Constraint_Visitors.cpp.

References ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::dequeue_head(), and ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head().

Referenced by visit_binary_expr().

00998 {
00999   int return_value = -1;
01000   CORBA::Boolean result = 0;
01001   TAO_ETCL_Constraint *lhs = binary->lhs ();
01002 
01003   if (lhs->accept (this) == 0)
01004   {
01005     TAO_ETCL_Literal_Constraint lhs_result;
01006     this->queue_.dequeue_head (lhs_result);
01007     result = (CORBA::Boolean) lhs_result;
01008 
01009     // Short-circuiting AND.
01010     if (result == 1)
01011     {
01012       TAO_ETCL_Constraint *rhs = binary->rhs ();
01013 
01014       if (rhs->accept (this) == 0)
01015       {
01016         TAO_ETCL_Literal_Constraint rhs_result;
01017         this->queue_.dequeue_head (rhs_result);
01018         result = (CORBA::Boolean) rhs_result;
01019         return_value = 0;
01020       }
01021     }
01022     else
01023       return_value = 0;
01024   }
01025 
01026   if (return_value == 0)
01027     this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
01028 
01029   return return_value;
01030 }

int TAO_Notify_Constraint_Visitor::visit_binary_expr TAO_ETCL_Binary_Expr *   ) 
 

Definition at line 925 of file Notify_Constraint_Visitors.cpp.

References visit_and(), visit_binary_op(), visit_in(), visit_or(), and visit_twiddle().

00928 {
00929   int bin_op_type = binary_expr->type ();
00930 
00931   switch (bin_op_type)
00932   {
00933   case TAO_ETCL_OR:
00934     return this->visit_or (binary_expr);
00935   case TAO_ETCL_AND:
00936     return this->visit_and (binary_expr);
00937   case TAO_ETCL_LT:
00938   case TAO_ETCL_LE:
00939   case TAO_ETCL_GT:
00940   case TAO_ETCL_GE:
00941   case TAO_ETCL_EQ:
00942   case TAO_ETCL_NE:
00943   case TAO_ETCL_PLUS:
00944   case TAO_ETCL_MINUS:
00945   case TAO_ETCL_MULT:
00946   case TAO_ETCL_DIV:
00947     return this->visit_binary_op (binary_expr,
00948       bin_op_type);
00949   case TAO_ETCL_TWIDDLE:
00950     return this->visit_twiddle (binary_expr);
00951   case TAO_ETCL_IN:
00952     return this->visit_in (binary_expr);
00953   default:
00954     return -1;
00955   }
00956 }

int TAO_Notify_Constraint_Visitor::visit_binary_op TAO_ETCL_Binary_Expr *  binary_expr,
int  op_type
[protected]
 

Definition at line 1033 of file Notify_Constraint_Visitors.cpp.

References ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::dequeue_head(), and ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head().

Referenced by visit_binary_expr().

01035 {
01036   int return_value = -1;
01037   TAO_ETCL_Constraint *lhs = binary->lhs ();
01038   CORBA::Boolean result = 0;
01039 
01040   // Perform an operation on the results of evaluating the left and
01041   // right branches of this subtree.
01042   if (lhs->accept (this) == 0)
01043   {
01044     TAO_ETCL_Literal_Constraint left_operand;
01045     this->queue_.dequeue_head (left_operand);
01046     TAO_ETCL_Constraint *rhs = binary->rhs ();
01047 
01048     if (rhs->accept (this) == 0)
01049     {
01050       TAO_ETCL_Literal_Constraint right_operand;
01051       this->queue_.dequeue_head (right_operand);
01052       return_value = 0;
01053 
01054       switch (op_type)
01055       {
01056       case TAO_ETCL_LT:
01057         result = left_operand < right_operand;
01058         this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
01059         break;
01060       case TAO_ETCL_LE:
01061         result = left_operand <= right_operand;
01062         this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
01063         break;
01064       case TAO_ETCL_GT:
01065         result = left_operand > right_operand;
01066         this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
01067         break;
01068       case TAO_ETCL_GE:
01069         result = left_operand >= right_operand;
01070         this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
01071         break;
01072       case TAO_ETCL_EQ:
01073         result = left_operand == right_operand;
01074         this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
01075         break;
01076       case TAO_ETCL_NE:
01077         result = left_operand != right_operand;
01078         this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
01079         break;
01080       case TAO_ETCL_PLUS:
01081         this->queue_.enqueue_head (left_operand + right_operand);
01082         break;
01083       case TAO_ETCL_MINUS:
01084         this->queue_.enqueue_head (left_operand - right_operand);
01085         break;
01086       case TAO_ETCL_MULT:
01087         this->queue_.enqueue_head (left_operand * right_operand);
01088         break;
01089       case TAO_ETCL_DIV:
01090         this->queue_.enqueue_head (left_operand / right_operand);
01091         break;
01092       default:
01093         return_value = -1;
01094       }
01095     }
01096   }
01097 
01098   return return_value;
01099 }

int TAO_Notify_Constraint_Visitor::visit_component TAO_ETCL_Component *   ) 
 

Definition at line 681 of file Notify_Constraint_Visitors.cpp.

References ACE_CString, ACE_NEW_RETURN, current_value_, ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::dequeue_head(), DOMAIN_NAME, EMPTY, ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head(), EVENT_NAME, ACE_Hash_Map_Manager_Ex< ACE_CString, structured_event_field, ACE_Hash< ACE_CString >, ACE_Equal_To< ACE_CString >, ACE_Null_Mutex >::find(), implicit_id_, implicit_ids_, REMAINDER_OF_BODY, and TYPE_NAME.

00684 {
00685   TAO_ETCL_Constraint *nested = component->component ();
00686   TAO_ETCL_Identifier *identifier = component->identifier ();
00687   ACE_CString component_name (identifier->value (),
00688     0,
00689     0);
00690   CORBA::Any *any_ptr = 0;
00691 
00692   if (this->implicit_ids_.find (component_name, this->implicit_id_) != 0)
00693     this->implicit_id_ = TAO_Notify_Constraint_Visitor::EMPTY;
00694 
00695   // If this component has no sub-component, only an identifier, then
00696   // we just visit the identifier, which puts a literal on the queue
00697   // to be handled upon returning from this method call.  If there is
00698   // a sub-component, we store the literal's value in our member _var
00699   // for possible examination at a more nested level, and visit the
00700   // sub-component. If the identifier matches one of the nested field
00701   // names in CosNotification::StructuredEvent, we just visit the
00702   // nested component, if any.
00703   if (this->implicit_id_ == TAO_Notify_Constraint_Visitor::EMPTY)
00704   {
00705     if (nested == 0)
00706     {
00707       // If this is the end of the line, we put the component name
00708       // into current_value_ so visit_exist can use it.
00709       ACE_NEW_RETURN (any_ptr,
00710         CORBA::Any,
00711         -1);
00712       (*any_ptr) <<= component_name.c_str ();
00713       this->current_value_ = any_ptr;
00714       return identifier->accept (this);
00715     }
00716     else
00717     {
00718       int result = identifier->accept (this);
00719 
00720       if (result != 0)
00721         return result;
00722 
00723       TAO_ETCL_Literal_Constraint id;
00724       this->queue_.dequeue_head (id);
00725       ACE_NEW_RETURN (any_ptr,
00726         CORBA::Any (*(const CORBA::Any *) id),
00727         -1);
00728       this->current_value_ = any_ptr;
00729     }
00730   }
00731 
00732   if (nested != 0)
00733     return nested->accept (this);
00734   else
00735   {
00736     switch (this->implicit_id_)
00737     {
00738     case TYPE_NAME:
00739       {
00740         TAO_ETCL_Literal_Constraint tn (this->type_name_.in ());
00741         this->queue_.enqueue_head (tn);
00742         return 0;
00743       }
00744     case EVENT_NAME:
00745       {
00746         TAO_ETCL_Literal_Constraint en (this->event_name_.in ());
00747         this->queue_.enqueue_head (en);
00748         return 0;
00749       }
00750     case DOMAIN_NAME:
00751       {
00752         TAO_ETCL_Literal_Constraint dn (this->domain_name_.in ());
00753         this->queue_.enqueue_head (dn);
00754         return 0;
00755       }
00756     case REMAINDER_OF_BODY:
00757       {
00758         TAO_ETCL_Literal_Constraint rob (&this->remainder_of_body_);
00759         this->queue_.enqueue_head (rob);
00760         return 0;
00761       }
00762       // The above cases are the leaves of the
00763       // CosNotification::StructuredEvent "tree". Anything else and we
00764       // should have a nested component. otherwise, it's an error.
00765     default:
00766       return -1;
00767     }
00768   }
00769 }

int TAO_Notify_Constraint_Visitor::visit_component_array TAO_ETCL_Component_Array *   ) 
 

Definition at line 494 of file Notify_Constraint_Visitors.cpp.

References ACE_CATCHANY, ACE_DECLARE_NEW_CORBA_ENV, ACE_ENDTRY, ACE_ENV_ARG_PARAMETER, ACE_ENV_SINGLE_ARG_PARAMETER, ACE_TRY, ACE_TRY_CHECK, current_value_, and ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head().

00495 {
00496   ACE_DECLARE_NEW_CORBA_ENV;
00497   ACE_TRY
00498   {
00499     // If we are here (from visit_component) the Any containing the
00500     // component as found in filterable_data_ will be in
00501     // current_value_.
00502     CORBA::TypeCode_var tc = this->current_value_->type ();
00503     CORBA::TCKind kind = TAO_DynAnyFactory::unalias (tc.in ()
00504       ACE_ENV_ARG_PARAMETER);
00505     ACE_TRY_CHECK;
00506 
00507     DynamicAny::DynAny_var member;
00508     CORBA::Boolean success = 0;
00509     CORBA::ULong slot = (CORBA::ULong) *array->integer ();
00510 
00511     switch (kind)
00512     {
00513     case CORBA::tk_array:
00514       {
00515         TAO_DynEnum_i dyn_array;
00516         dyn_array.init (this->current_value_.in ()
00517           ACE_ENV_ARG_PARAMETER);
00518         ACE_TRY_CHECK;
00519 
00520         success = dyn_array.seek (slot
00521           ACE_ENV_ARG_PARAMETER);
00522         ACE_TRY_CHECK;
00523 
00524         if (success == 0)
00525           return -1;
00526 
00527         member = dyn_array.current_component (ACE_ENV_SINGLE_ARG_PARAMETER);
00528         ACE_TRY_CHECK;
00529 
00530         break;
00531       }
00532     case CORBA::tk_sequence:
00533       {
00534         TAO_DynStruct_i dyn_sequence;
00535         dyn_sequence.init (this->current_value_.in ()
00536           ACE_ENV_ARG_PARAMETER);
00537         ACE_TRY_CHECK;
00538 
00539         success = dyn_sequence.seek (slot
00540           ACE_ENV_ARG_PARAMETER);
00541         ACE_TRY_CHECK;
00542 
00543         if (success == 0)
00544           return -1;
00545 
00546         member =
00547           dyn_sequence.current_component (ACE_ENV_SINGLE_ARG_PARAMETER);
00548         ACE_TRY_CHECK;
00549 
00550         break;
00551       }
00552       // Enums and sequences are the only two cases handled
00553       // by Component_Array.
00554     default:
00555       return -1;
00556     }
00557 
00558     CORBA::Any_var value = member->to_any (ACE_ENV_SINGLE_ARG_PARAMETER);
00559     ACE_TRY_CHECK;
00560 
00561     TAO_ETCL_Constraint *comp = array->component ();
00562 
00563     if (comp == 0)
00564     {
00565       TAO_ETCL_Literal_Constraint result (value.ptr ());
00566       this->queue_.enqueue_head (result);
00567       return 0;
00568     }
00569     else
00570     {
00571       this->current_value_ = value._retn ();
00572       return comp->accept (this);
00573     }
00574   }
00575   ACE_CATCHANY
00576   {
00577     return -1;
00578   }
00579   ACE_ENDTRY;
00580 }

int TAO_Notify_Constraint_Visitor::visit_component_assoc TAO_ETCL_Component_Assoc *   ) 
 

Definition at line 438 of file Notify_Constraint_Visitors.cpp.

References ACE_CString, ACE_NEW_RETURN, current_value_, ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head(), FILTERABLE_DATA, filterable_data_, implicit_id_, VARIABLE_HEADER, and variable_header_.

00441 {
00442   CORBA::Any any;
00443   ACE_CString name (assoc->identifier ()->value (),
00444     0,
00445     0);
00446 
00447   switch (this->implicit_id_)
00448   {
00449   case FILTERABLE_DATA:
00450     if (this->filterable_data_.find (name, any) != 0
00451       || any.impl() == 0)
00452       return -1;
00453     break;
00454   case VARIABLE_HEADER:
00455     if (this->variable_header_.find (name, any) != 0
00456       || any.impl() == 0)
00457       return -1;
00458     break;
00459     // Only the sequence members of CosNotification::StructuredEvent
00460     // can be treated as associative arrays.
00461   default:
00462     return -1;
00463   }
00464 
00465   TAO_ETCL_Constraint *comp = assoc->component ();
00466   CORBA::Any *any_ptr = 0;
00467 
00468   if (comp == 0)
00469   {
00470     TAO_ETCL_Literal_Constraint result (&any);
00471     this->queue_.enqueue_head (result);
00472 
00473     // If we're at the end of the line, put the name into
00474     // current_value_ so visit_exist can use it.
00475     ACE_NEW_RETURN (any_ptr,
00476       CORBA::Any,
00477       -1);
00478     (*any_ptr) <<= name.c_str ();
00479     this->current_value_ = any_ptr;
00480 
00481     return 0;
00482   }
00483   else
00484   {
00485     ACE_NEW_RETURN (any_ptr,
00486       CORBA::Any (any),
00487       -1);
00488     this->current_value_ = any_ptr;
00489     return comp->accept (this);
00490   }
00491 }

int TAO_Notify_Constraint_Visitor::visit_component_pos TAO_ETCL_Component_Pos *   ) 
 

Definition at line 346 of file Notify_Constraint_Visitors.cpp.

References ACE_CATCHANY, ACE_DECLARE_NEW_CORBA_ENV, ACE_ENDTRY, ACE_ENV_ARG_PARAMETER, ACE_ENV_SINGLE_ARG_PARAMETER, ACE_TRY, ACE_TRY_CHECK, current_value_, and ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head().

00349 {
00350   ACE_DECLARE_NEW_CORBA_ENV;
00351   ACE_TRY
00352   {
00353     // If we are here (from visit_component) the Any containing the
00354     // component as found in filterable_data_ will be in current_value_.
00355     CORBA::TypeCode_var tc = this->current_value_->type ();
00356     CORBA::TCKind kind = TAO_DynAnyFactory::unalias (tc.in ()
00357       ACE_ENV_ARG_PARAMETER);
00358     ACE_TRY_CHECK;
00359 
00360     DynamicAny::DynAny_var member;
00361     CORBA::Boolean success = 0;
00362     CORBA::ULong slot = (CORBA::ULong) *pos->integer ();
00363 
00364     switch (kind)
00365     {
00366     case CORBA::tk_enum:
00367       {
00368         TAO_DynEnum_i dyn_enum;
00369         dyn_enum.init (this->current_value_.in ()
00370           ACE_ENV_ARG_PARAMETER);
00371         ACE_TRY_CHECK;
00372 
00373         success = dyn_enum.seek (slot
00374           ACE_ENV_ARG_PARAMETER);
00375         ACE_TRY_CHECK;
00376 
00377         if (success == 0)
00378           return -1;
00379 
00380         member =
00381           dyn_enum.current_component (ACE_ENV_SINGLE_ARG_PARAMETER);
00382         ACE_TRY_CHECK;
00383 
00384         break;
00385       }
00386     case CORBA::tk_struct:
00387       {
00388         TAO_DynStruct_i dyn_struct;
00389         dyn_struct.init (this->current_value_.in ()
00390           ACE_ENV_ARG_PARAMETER);
00391         ACE_TRY_CHECK;
00392 
00393         success = dyn_struct.seek (slot
00394           ACE_ENV_ARG_PARAMETER);
00395         ACE_TRY_CHECK;
00396 
00397         if (success == 0)
00398           return -1;
00399 
00400         member = dyn_struct.current_component (ACE_ENV_SINGLE_ARG_PARAMETER);
00401         ACE_TRY_CHECK;
00402 
00403         break;
00404       }
00405       // @@@ (JP) I think enums and structs are the only two cases
00406       // handled by Component_Pos, since arrays and sequences are
00407       // handled by Component_Array, and unions are handled by
00408       // Union_Pos.
00409     default:
00410       return -1;
00411     }
00412 
00413     CORBA::Any_var value = member->to_any (ACE_ENV_SINGLE_ARG_PARAMETER);
00414     ACE_TRY_CHECK;
00415 
00416     TAO_ETCL_Constraint *comp = pos->component ();
00417 
00418     if (comp == 0)
00419     {
00420       TAO_ETCL_Literal_Constraint result (value.ptr ());
00421       this->queue_.enqueue_head (result);
00422       return 0;
00423     }
00424     else
00425     {
00426       this->current_value_ = value._retn ();
00427       return comp->accept (this);
00428     }
00429   }
00430   ACE_CATCHANY
00431   {
00432     return -1;
00433   }
00434   ACE_ENDTRY;
00435 }

int TAO_Notify_Constraint_Visitor::visit_default TAO_ETCL_Default *   ) 
 

Definition at line 788 of file Notify_Constraint_Visitors.cpp.

References ACE_CATCHANY, ACE_DECLARE_NEW_CORBA_ENV, ACE_ENDTRY, ACE_ENV_SINGLE_ARG_PARAMETER, ACE_TRY, ACE_TRY_CHECK, current_value_, ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::dequeue_head(), and ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head().

00789 {
00790   TAO_ETCL_Constraint *comp = def->component ();
00791 
00792   if (comp == 0)
00793     return -1;
00794 
00795   if (comp->accept (this) != 0)
00796     return -1;
00797 
00798   ACE_DECLARE_NEW_CORBA_ENV;
00799   ACE_TRY
00800   {
00801     CORBA::TypeCode_var tc = this->current_value_->type ();
00802 
00803     // If the current member is not a union, this call will throw
00804     // BadKind and the catch block will return -1.
00805     CORBA::Long default_index = tc->default_index (ACE_ENV_SINGLE_ARG_PARAMETER);
00806     ACE_TRY_CHECK;
00807 
00808     // No default index.
00809     if (default_index == -1)
00810     {
00811       TAO_ETCL_Literal_Constraint result ((CORBA::Boolean) 0);
00812       this->queue_.enqueue_head (result);
00813       return 0;
00814     }
00815 
00816     // Okay, there's a default index, but is it active?
00817 
00818     TAO_ETCL_Literal_Constraint disc;
00819     this->queue_.dequeue_head (disc);
00820     TAO_ETCL_Literal_Constraint default_index_value (default_index);
00821     return (disc == default_index_value);
00822   }
00823   ACE_CATCHANY
00824   {
00825     return -1;
00826   }
00827   ACE_ENDTRY;
00828 }

int TAO_Notify_Constraint_Visitor::visit_dot TAO_ETCL_Dot *   ) 
 

Definition at line 772 of file Notify_Constraint_Visitors.cpp.

00773 {
00774   // If we are here, we know we're headed for a more nested
00775   // level, so we just visit it, there's nothing else in this
00776   // constraint.
00777   return dot->component ()->accept (this);
00778 }

int TAO_Notify_Constraint_Visitor::visit_eval TAO_ETCL_Eval *   ) 
 

Definition at line 781 of file Notify_Constraint_Visitors.cpp.

00782 {
00783   // Nothing to do but visit the contained component.
00784   return eval->component ()->accept (this);
00785 }

int TAO_Notify_Constraint_Visitor::visit_exist TAO_ETCL_Exist *   ) 
 

Definition at line 831 of file Notify_Constraint_Visitors.cpp.

References ACE_CString, DOMAIN_NAME, domain_name_, ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head(), EVENT_NAME, event_name_, FILTERABLE_DATA, filterable_data_, implicit_id_, CORBA::string_dup(), TYPE_NAME, type_name_, VARIABLE_HEADER, and variable_header_.

00832 {
00833   TAO_ETCL_Constraint *component = exist->component ();
00834 
00835   if (component->accept (this) == 0)
00836   {
00837     const char *value = 0;
00838     CORBA::Boolean result = 0;
00839 
00840     // For the two cases below, we don't want the item at the top of
00841     // the queue, because it's the result of a hash table
00842     // lookup. For an existence test, we want the key value, which
00843     // is stored in the current_value_ member.
00844     if (this->implicit_id_ == FILTERABLE_DATA
00845       || this->implicit_id_ == VARIABLE_HEADER)
00846     {
00847       TAO_ETCL_Literal_Constraint current (&this->current_value_.inout ());
00848       value = CORBA::string_dup ((const char *) current);
00849     }
00850 
00851     switch (this->implicit_id_)
00852     {
00853     case FILTERABLE_DATA:
00854       result =
00855         (this->filterable_data_.find (ACE_CString (value, 0, 0)) == 0);
00856       break;
00857     case VARIABLE_HEADER:
00858       result =
00859         (this->variable_header_.find (ACE_CString (value, 0, 0)) == 0);
00860       break;
00861     case TYPE_NAME:
00862       result = (this->type_name_.in () != 0);
00863       break;
00864     case EVENT_NAME:
00865       result = (this->event_name_.in () != 0);
00866       break;
00867     case DOMAIN_NAME:
00868       result = (this->domain_name_.in () != 0);
00869       break;
00870       // Anything other than the above cases is an error.
00871     default:
00872       return -1;
00873     }
00874 
00875     this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
00876 
00877     return 0;
00878   }
00879 
00880   return -1;
00881 }

int TAO_Notify_Constraint_Visitor::visit_identifier TAO_ETCL_Identifier *   ) 
 

Definition at line 148 of file Notify_Constraint_Visitors.cpp.

References ACE_CString, ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head(), and filterable_data_.

00149 {
00150   int return_value = -1;
00151   const char *name = ident->value ();
00152   ACE_CString key (name, 0, 0);
00153 
00154   CORBA::Any any;
00155 
00156   if (this->filterable_data_.find (key, any) == 0)
00157   {
00158     if (any.impl() != 0)
00159     {
00160       this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (&any));
00161       return_value = 0;
00162     }
00163   }
00164 
00165   return return_value;
00166 }

int TAO_Notify_Constraint_Visitor::visit_in TAO_ETCL_Binary_Expr *   )  [protected]
 

Definition at line 1130 of file Notify_Constraint_Visitors.cpp.

References ACE_CATCHANY, ACE_DECLARE_NEW_CORBA_ENV, ACE_ENDTRY, ACE_ENV_ARG_PARAMETER, ACE_TRY, ACE_TRY_CHECK, any_does_contain(), array_does_contain(), ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::dequeue_head(), ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head(), sequence_does_contain(), struct_does_contain(), and union_does_contain().

Referenced by visit_binary_expr().

01131 {
01132   int return_value = -1;
01133   TAO_ETCL_Constraint *lhs = binary->lhs ();
01134 
01135   // Determine if the left operand is contained in the right.
01136   if (lhs->accept (this) == 0)
01137   {
01138     TAO_ETCL_Literal_Constraint left;
01139     this->queue_.dequeue_head (left);
01140 
01141     TAO_ETCL_Constraint *rhs = binary->rhs ();
01142 
01143     if (rhs->accept (this) == 0)
01144     {
01145       TAO_ETCL_Literal_Constraint bag;
01146       this->queue_.dequeue_head (bag);
01147 
01148       if (bag.expr_type () == TAO_ETCL_COMPONENT)
01149       {
01150         const CORBA::Any *component = (const CORBA::Any *) bag;
01151         CORBA::TCKind kind = CORBA::tk_null;
01152 
01153         ACE_DECLARE_NEW_CORBA_ENV;
01154         ACE_TRY
01155         {
01156           CORBA::TypeCode_var tc = component->type ();
01157           kind = TAO_DynAnyFactory::unalias (tc.in ()
01158             ACE_ENV_ARG_PARAMETER);
01159           ACE_TRY_CHECK;
01160         }
01161         ACE_CATCHANY
01162         {
01163           return return_value;
01164         }
01165         ACE_ENDTRY;
01166 
01167         CORBA::Boolean result = 0;
01168 
01169         switch (kind)
01170         {
01171         case CORBA::tk_sequence:
01172           result = this->sequence_does_contain (component,
01173             left);
01174           break;
01175         case CORBA::tk_array:
01176           result = this->array_does_contain (component,
01177             left);
01178           break;
01179         case CORBA::tk_struct:
01180           result = this->struct_does_contain (component,
01181             left);
01182           break;
01183         case CORBA::tk_union:
01184           result = this->union_does_contain (component,
01185             left);
01186           break;
01187         case CORBA::tk_any:
01188           result = this->any_does_contain (component,
01189             left);
01190           break;
01191         default:
01192           return return_value;
01193         }
01194 
01195         this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
01196         return_value = 0;
01197       }
01198     }
01199   }
01200 
01201   return return_value;
01202 }

int TAO_Notify_Constraint_Visitor::visit_literal TAO_ETCL_Literal_Constraint *   ) 
 

Definition at line 139 of file Notify_Constraint_Visitors.cpp.

References ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head().

00142 {
00143   this->queue_.enqueue_head (*literal);
00144   return 0;
00145 }

int TAO_Notify_Constraint_Visitor::visit_or TAO_ETCL_Binary_Expr *   )  [protected]
 

Definition at line 959 of file Notify_Constraint_Visitors.cpp.

References ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::dequeue_head(), and ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head().

Referenced by visit_binary_expr().

00962 {
00963   int return_value = -1;
00964   CORBA::Boolean result = 0;
00965   TAO_ETCL_Constraint *lhs = binary->lhs ();
00966 
00967   if (lhs->accept (this) == 0)
00968   {
00969     TAO_ETCL_Literal_Constraint lhs_result;
00970     this->queue_.dequeue_head (lhs_result);
00971     result = (CORBA::Boolean) lhs_result;
00972 
00973     // Short-circuiting OR.
00974     if (result == 0)
00975     {
00976       TAO_ETCL_Constraint *rhs = binary->rhs ();
00977 
00978       if (rhs->accept (this) == 0)
00979       {
00980         TAO_ETCL_Literal_Constraint rhs_result;
00981         this->queue_.dequeue_head (rhs_result);
00982         result = (CORBA::Boolean) rhs_result;
00983         return_value = 0;
00984       }
00985     }
00986     else
00987       return_value = 0;
00988   }
00989 
00990   if (return_value == 0)
00991     this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
00992 
00993   return return_value;
00994 }

int TAO_Notify_Constraint_Visitor::visit_preference TAO_ETCL_Preference *   ) 
 

Definition at line 1205 of file Notify_Constraint_Visitors.cpp.

01206 {
01207   // According to OMG 00-06-20 section 2.4.1, the Notification Service
01208   // does not use the preference operators. The method must be here
01209   // because it is called by the ETCL node, which may be used by other
01210   // CORBA services that do use the preference operators.
01211   return -1;
01212 }

int TAO_Notify_Constraint_Visitor::visit_special TAO_ETCL_Special *   ) 
 

Definition at line 583 of file Notify_Constraint_Visitors.cpp.

References ACE_CATCHANY, ACE_DECLARE_NEW_CORBA_ENV, ACE_ENDTRY, ACE_ENV_ARG_PARAMETER, ACE_ENV_SINGLE_ARG_PARAMETER, ACE_TRY, ACE_TRY_CHECK, current_value_, and ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head().

00584 {
00585   ACE_DECLARE_NEW_CORBA_ENV;
00586   ACE_TRY
00587   {
00588     CORBA::TypeCode_var tc = this->current_value_->type ();
00589     tc = TAO_DynAnyFactory::strip_alias (tc.in () ACE_ENV_ARG_PARAMETER);
00590     ACE_TRY_CHECK;
00591 
00592       CORBA::TCKind kind = tc->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
00593       ACE_TRY_CHECK;
00594 
00595     switch (special->type ())
00596     {
00597     case TAO_ETCL_LENGTH:
00598       {
00599         CORBA::ULong length;
00600 
00601             switch (kind)
00602         {
00603         case CORBA::tk_sequence:
00604           {
00605             TAO_DynSequence_i dyn_seq;
00606             dyn_seq.init (current_value_.in()
00607               ACE_ENV_ARG_PARAMETER);
00608             ACE_TRY_CHECK;
00609 
00610             DynamicAny::AnySeq_var any_seq =
00611               dyn_seq.get_elements (ACE_ENV_SINGLE_ARG_PARAMETER);
00612             ACE_TRY_CHECK;
00613 
00614             length = any_seq->length ();
00615           }
00616           break;
00617         case CORBA::tk_array:
00618           {
00619             length = tc->length (ACE_ENV_SINGLE_ARG_PARAMETER);
00620             ACE_TRY_CHECK;
00621           }
00622           break;
00623         default:
00624           return -1;
00625         }
00626 
00627         TAO_ETCL_Literal_Constraint lit (length);
00628         this->queue_.enqueue_head (lit);
00629         return 0;
00630       }
00631     case TAO_ETCL_DISCRIMINANT:
00632       {
00633         // If the TCKind is not a union, the call to init() will
00634         // raise an exception, and the catch block will return -1;
00635         TAO_DynUnion_i dyn_union;
00636         dyn_union.init (this->current_value_.in ()
00637           ACE_ENV_ARG_PARAMETER);
00638         ACE_TRY_CHECK;
00639 
00640         DynamicAny::DynAny_var disc =
00641           dyn_union.get_discriminator (ACE_ENV_SINGLE_ARG_PARAMETER);
00642         ACE_TRY_CHECK;
00643 
00644         CORBA::Any_var disc_any = disc->to_any (ACE_ENV_SINGLE_ARG_PARAMETER);
00645         ACE_TRY_CHECK;
00646 
00647         TAO_ETCL_Literal_Constraint lit (disc_any.ptr ());
00648         this->queue_.enqueue_head (lit);
00649         return 0;
00650       }
00651     case TAO_ETCL_TYPE_ID:
00652       {
00653         const char *name = tc->name (ACE_ENV_SINGLE_ARG_PARAMETER);
00654         ACE_TRY_CHECK;
00655 
00656         TAO_ETCL_Literal_Constraint lit (name);
00657         this->queue_.enqueue_head (lit);
00658         return 0;
00659       }
00660     case TAO_ETCL_REPOS_ID:
00661       {
00662         const char *id = tc->id (ACE_ENV_SINGLE_ARG_PARAMETER);
00663         ACE_TRY_CHECK;
00664 
00665         TAO_ETCL_Literal_Constraint lit (id);
00666         this->queue_.enqueue_head (lit);
00667         return 0;
00668       }
00669     default:
00670       return -1;
00671     }
00672   }
00673   ACE_CATCHANY
00674   {
00675     return -1;
00676   }
00677   ACE_ENDTRY;
00678 }

int TAO_Notify_Constraint_Visitor::visit_twiddle TAO_ETCL_Binary_Expr *   )  [protected]
 

Definition at line 1102 of file Notify_Constraint_Visitors.cpp.

References ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::dequeue_head(), ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head(), and ACE_OS::strstr().

Referenced by visit_binary_expr().

01103 {
01104   int return_value = -1;
01105   TAO_ETCL_Constraint *lhs = binary->lhs ();
01106 
01107   // Determine if the left operand is a substring of the right.
01108   if (lhs->accept (this) == 0)
01109   {
01110     TAO_ETCL_Literal_Constraint left;
01111     this->queue_.dequeue_head (left);
01112     TAO_ETCL_Constraint *rhs = binary->rhs ();
01113 
01114     if (rhs->accept (this) == 0)
01115     {
01116       TAO_ETCL_Literal_Constraint right;
01117       this->queue_.dequeue_head (right);
01118       CORBA::Boolean result =
01119         (ACE_OS::strstr ((const char *) right,
01120         (const char *) left) != 0);
01121       this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
01122       return_value = 0;
01123     }
01124   }
01125 
01126   return return_value;
01127 }

int TAO_Notify_Constraint_Visitor::visit_unary_expr TAO_ETCL_Unary_Expr *   ) 
 

Definition at line 884 of file Notify_Constraint_Visitors.cpp.

References ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::dequeue_head(), and ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head().

00887 {
00888   TAO_ETCL_Constraint *subexpr = unary_expr->subexpr ();
00889 
00890   if (subexpr->accept (this) == 0)
00891   {
00892     TAO_ETCL_Literal_Constraint subexpr_result;
00893     CORBA::Boolean result = 0;
00894     int op_type = unary_expr->type ();
00895 
00896     switch (op_type)
00897     {
00898     case TAO_ETCL_NOT:
00899       this->queue_.dequeue_head (subexpr_result);
00900       result = ! (CORBA::Boolean) subexpr_result;
00901       this->queue_.enqueue_head (TAO_ETCL_Literal_Constraint (result));
00902       return 0;
00903     case TAO_ETCL_MINUS:
00904       // The leading '-' was parsed separately, so we have to pull
00905       // the literal constraint off the queue, apply the class' own
00906       // unary minus operator, and put it back.
00907       this->queue_.dequeue_head (subexpr_result);
00908       this->queue_.enqueue_head (-subexpr_result);
00909       return 0;
00910     case TAO_ETCL_PLUS:
00911       // Leave the literal constraint on the queue. The leading
00912       // '+' was just syntactic sugar - no action is necessary.
00913       return 0;
00914     default:
00915       // The parser should never construct a TAO_ETCL_Unary_Constraint
00916       // behind any operators except the above three.
00917       return -1;
00918     }
00919   }
00920 
00921   return -1;
00922 }

int TAO_Notify_Constraint_Visitor::visit_union_pos TAO_ETCL_Union_Pos *   ) 
 

Definition at line 192 of file Notify_Constraint_Visitors.cpp.

References ACE_CATCHANY, ACE_DECLARE_NEW_CORBA_ENV, ACE_ENDTRY, ACE_ENV_ARG_PARAMETER, ACE_ENV_SINGLE_ARG_PARAMETER, ACE_NEW_RETURN, ACE_TRY, ACE_TRY_CHECK, current_value_, ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::dequeue_head(), ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head(), ACE_OS::strcmp(), and ACE_OutputCDR::write_ulong().

00195 {
00196   ACE_DECLARE_NEW_CORBA_ENV;
00197   ACE_TRY
00198   {
00199     if (union_pos->union_value ()->accept (this) == 0)
00200     {
00201       TAO_ETCL_Literal_Constraint disc_val;
00202       this->queue_.dequeue_head (disc_val);
00203 
00204       TAO_DynUnion_i dyn_union;
00205       dyn_union.init (this->current_value_.in ()
00206         ACE_ENV_ARG_PARAMETER);
00207       ACE_TRY_CHECK;
00208 
00209       CORBA::TypeCode_var tc = this->current_value_->type ();
00210 
00211       switch (disc_val.expr_type ())
00212       {
00213       case TAO_ETCL_INTEGER:
00214       case TAO_ETCL_SIGNED:
00215       case TAO_ETCL_UNSIGNED:
00216         {
00217           CORBA::Any disc_any;
00218           CORBA::TypeCode_var disc_tc =
00219             tc->discriminator_type (ACE_ENV_SINGLE_ARG_PARAMETER);
00220           ACE_TRY_CHECK;
00221           CORBA::TCKind disc_kind =
00222             TAO_DynAnyFactory::unalias (disc_tc.in ()
00223             ACE_ENV_ARG_PARAMETER);
00224           ACE_TRY_CHECK;
00225 
00226           switch (disc_kind)
00227           {
00228           case CORBA::tk_boolean:
00229             disc_any <<= CORBA::Any::from_boolean ((CORBA::Boolean) disc_val);
00230             break;
00231           case CORBA::tk_short:
00232             disc_any <<= (CORBA::Short) ((CORBA::Long) disc_val);
00233             break;
00234           case CORBA::tk_ushort:
00235             disc_any <<= (CORBA::UShort) ((CORBA::ULong) disc_val);
00236             break;
00237           case CORBA::tk_long:
00238             disc_any <<= (CORBA::Long) disc_val;
00239             break;
00240           case CORBA::tk_ulong:
00241             disc_any <<= (CORBA::ULong) disc_val;
00242             break;
00243           case CORBA::tk_enum:
00244             {
00245               TAO_OutputCDR cdr;
00246               cdr.write_ulong ((CORBA::ULong) disc_val);
00247               TAO_InputCDR in_cdr (cdr);
00248               TAO::Unknown_IDL_Type *unk = 0;
00249               ACE_NEW_RETURN (unk,
00250                 TAO::Unknown_IDL_Type (disc_tc.in (),
00251                 in_cdr),
00252                 -1);
00253 
00254               disc_any.replace (unk);
00255               break;
00256             }
00257             // @@@ (JP) I don't think ETCL handles 64-bit
00258             // integers at this point, and I also think that
00259             // chars and/or wchars will just come out in the
00260             // constraint as (w)strings of length 1.
00261           case CORBA::tk_longlong:
00262           case CORBA::tk_ulonglong:
00263           case CORBA::tk_char:
00264           case CORBA::tk_wchar:
00265           default:
00266             return -1;
00267           }
00268 
00269           DynamicAny::DynAny_var dyn_any =
00270             TAO_DynAnyFactory::make_dyn_any (disc_any
00271             ACE_ENV_ARG_PARAMETER);
00272           ACE_TRY_CHECK;
00273           dyn_union.set_discriminator (dyn_any.in ()
00274             ACE_ENV_ARG_PARAMETER);
00275           ACE_TRY_CHECK;
00276           DynamicAny::DynAny_var u_member =
00277             dyn_union.member (ACE_ENV_SINGLE_ARG_PARAMETER);
00278           ACE_TRY_CHECK;
00279           this->current_value_ =
00280             u_member->to_any (ACE_ENV_SINGLE_ARG_PARAMETER);
00281           ACE_TRY_CHECK;
00282 
00283           break;
00284         }
00285       case TAO_ETCL_STRING:
00286         {
00287           const char *name = (const char *) disc_val;
00288           CORBA::ULong count =
00289             tc->member_count (ACE_ENV_SINGLE_ARG_PARAMETER);
00290           ACE_TRY_CHECK;
00291 
00292           const char *member_name = 0;
00293           CORBA::ULong i = 0;
00294 
00295           for (i = 0; i < count; ++i)
00296           {
00297             member_name = tc->member_name (i
00298               ACE_ENV_ARG_PARAMETER);
00299             ACE_TRY_CHECK;
00300 
00301             if (ACE_OS::strcmp (name, member_name) == 0)
00302               break;
00303           }
00304 
00305           // If there's no match, member_label will throw
00306           // CORBA::TypeCode::Bounds and the catch block will
00307           // return -1;
00308           this->current_value_ = tc->member_label (i
00309             ACE_ENV_ARG_PARAMETER);
00310           ACE_TRY_CHECK;
00311 
00312           break;
00313         }
00314         // The TAO_ETCL_Union_Value that was put on the queue
00315         // shouldn't have any other type.
00316       default:
00317         return -1;
00318       }
00319 
00320       TAO_ETCL_Constraint *nested = union_pos->component ();
00321 
00322       // If there's no nested component, then we just want the
00323       // union member value on the queue. Otherwise, we want
00324       // the member value in current_value_ while we visit
00325       // the nested component.
00326       if (nested == 0)
00327       {
00328         TAO_ETCL_Literal_Constraint lit (this->current_value_.ptr ());
00329         this->queue_.enqueue_head (lit);
00330         return 0;
00331       }
00332       else
00333         return nested->accept (this);
00334     }
00335     else
00336       return -1;
00337   }
00338   ACE_CATCHANY
00339   {
00340     return -1;
00341   }
00342   ACE_ENDTRY;
00343 }

int TAO_Notify_Constraint_Visitor::visit_union_value TAO_ETCL_Union_Value *   ) 
 

Definition at line 169 of file Notify_Constraint_Visitors.cpp.

References ACE_Unbounded_Queue< TAO_ETCL_Literal_Constraint >::enqueue_head().

00172 {
00173   switch (union_value->sign ())
00174   {
00175     case 0:
00176       this->queue_.enqueue_head (*union_value->string ());
00177       break;
00178     case -1:
00179       this->queue_.enqueue_head (-(*union_value->integer ()));
00180       break;
00181     case 1:
00182       this->queue_.enqueue_head (*union_value->integer ());
00183       break;
00184     default:
00185       return -1;
00186   }
00187 
00188   return 0;
00189 }


Member Data Documentation

CORBA::String_var TAO_Notify_Constraint_Visitor::current_name_ [protected]
 

Holder for a string name in the event fields fixed_header, variable_header, or filterable_data.

Definition at line 162 of file Notify_Constraint_Visitors.h.

CORBA::Any_var TAO_Notify_Constraint_Visitor::current_value_ [protected]
 

Holder for a value found in the event fields filterable_data, variable_header or remainder_of_body.

Definition at line 158 of file Notify_Constraint_Visitors.h.

Referenced by visit_component(), visit_component_array(), visit_component_assoc(), visit_component_pos(), visit_default(), visit_special(), and visit_union_pos().

CORBA::String_var TAO_Notify_Constraint_Visitor::domain_name_ [protected]
 

Storage for string names under the structured event's 'fixed_header' field.

Definition at line 146 of file Notify_Constraint_Visitors.h.

Referenced by bind_structured_event(), and visit_exist().

CORBA::String_var TAO_Notify_Constraint_Visitor::event_name_ [protected]
 

Definition at line 148 of file Notify_Constraint_Visitors.h.

Referenced by bind_structured_event(), and visit_exist().

ACE_Hash_Map_Manager<ACE_CString, CORBA::Any, ACE_Null_Mutex> TAO_Notify_Constraint_Visitor::filterable_data_ [protected]
 

Used to lookup names and values in the event's 'filterable_data' field.

Definition at line 134 of file Notify_Constraint_Visitors.h.

Referenced by bind_structured_event(), visit_component_assoc(), visit_exist(), and visit_identifier().

const size_t TAO_Notify_Constraint_Visitor::filterable_data_size_ = 31 [static, protected]
 

Size of filterable_data_ hash map. TODO: define inline once VC6 support is deprecated.

Definition at line 1462 of file Notify_Constraint_Visitors.cpp.

structured_event_field TAO_Notify_Constraint_Visitor::implicit_id_ [protected]
 

Storage for the type of implicit id the component has (if any).

Definition at line 114 of file Notify_Constraint_Visitors.h.

Referenced by visit_component(), visit_component_assoc(), and visit_exist().

ACE_Hash_Map_Manager<ACE_CString, structured_event_field, ACE_Null_Mutex> TAO_Notify_Constraint_Visitor::implicit_ids_ [protected]
 

Lookup table for the implicit ids, to avoid string comparisons in derived visitors.

Definition at line 126 of file Notify_Constraint_Visitors.h.

Referenced by TAO_Notify_Constraint_Visitor(), and visit_component().

const size_t TAO_Notify_Constraint_Visitor::implicit_ids_size_ = 27 [static, protected]
 

Size of implicit_ids_ hash map.

Note:
A fixed set of 9 keys are stored in this map. In the absence of a minimal perfect hash, ACE's default hash_pjw() and a hash size of 27 ensures each element is hashed to a unique bucket. TODO: define inline once VC6 support is deprecated.

Definition at line 1461 of file Notify_Constraint_Visitors.cpp.

ACE_Unbounded_Queue<TAO_ETCL_Literal_Constraint> TAO_Notify_Constraint_Visitor::queue_ [protected]
 

The result of a non_boolean operation.

Definition at line 154 of file Notify_Constraint_Visitors.h.

CORBA::Any TAO_Notify_Constraint_Visitor::remainder_of_body_ [protected]
 

Storage for the structured_event's 'remainder_of_body' field.

Definition at line 151 of file Notify_Constraint_Visitors.h.

Referenced by bind_structured_event().

CORBA::String_var TAO_Notify_Constraint_Visitor::type_name_ [protected]
 

Definition at line 147 of file Notify_Constraint_Visitors.h.

Referenced by bind_structured_event(), and visit_exist().

ACE_Hash_Map_Manager<ACE_CString, CORBA::Any, ACE_Null_Mutex> TAO_Notify_Constraint_Visitor::variable_header_ [protected]
 

Used to lookup names and values in the event's 'variable_header' field.

Definition at line 142 of file Notify_Constraint_Visitors.h.

Referenced by bind_structured_event(), visit_component_assoc(), and visit_exist().

const size_t TAO_Notify_Constraint_Visitor::variable_header_size_ = 31 [static, protected]
 

Size of variable_header_ hash map. TODO: define inline once VC6 support is deprecated.

Definition at line 1463 of file Notify_Constraint_Visitors.cpp.


The documentation for this class was generated from the following files:
Generated on Thu Nov 9 13:31:41 2006 for TAO_CosNotification by doxygen 1.3.6