summaryrefslogtreecommitdiff
path: root/trunk/TAO/orbsvcs/orbsvcs/Trader/Constraint_Interpreter.h
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/TAO/orbsvcs/orbsvcs/Trader/Constraint_Interpreter.h')
-rw-r--r--trunk/TAO/orbsvcs/orbsvcs/Trader/Constraint_Interpreter.h166
1 files changed, 166 insertions, 0 deletions
diff --git a/trunk/TAO/orbsvcs/orbsvcs/Trader/Constraint_Interpreter.h b/trunk/TAO/orbsvcs/orbsvcs/Trader/Constraint_Interpreter.h
new file mode 100644
index 00000000000..586f82080e4
--- /dev/null
+++ b/trunk/TAO/orbsvcs/orbsvcs/Trader/Constraint_Interpreter.h
@@ -0,0 +1,166 @@
+/* -*- C++ -*- */
+
+//=============================================================================
+/**
+ * @file Constraint_Interpreter.h
+ *
+ * $Id$
+ *
+ * @author Seth Widoff <sbw1@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_CONSTRAINT_INTERPRETER_H
+#define TAO_CONSTRAINT_INTERPRETER_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Trader/Constraint_Nodes.h"
+#include "orbsvcs/Trader/Constraint_Visitors.h"
+#include "orbsvcs/Trader/Interpreter.h"
+
+#include "orbsvcs/CosTradingS.h"
+#include "orbsvcs/CosTradingReposS.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Constraint_Evaluator;
+class TAO_Constraint_Validator;
+
+/**
+ * @class TAO_Constraint_Interpreter
+ *
+ * @brief TAO_Constraint_Interpreter will, given a constraint string whose
+ * syntax and semantics comply with the trader specification for the
+ * constraint language, determine if a CosTrading::Offer meets the
+ * constraints.
+ *
+ * TAO_Constraint_Interpreter will first build an expression tree
+ * representing the constraint expression using Lex and Yacc. Then,
+ * using a TAO_Constraint_Validator, it will validate the semantic
+ * correctness of the tree. When the evaluate method is invoked with
+ * an Offer, the TAO_Constraint_Interpreter will construct an
+ * EvaluationVisitor, which will evaluate the tree and decide
+ * whether the offer meets the constraints.
+ */
+class TAO_Trading_Serv_Export TAO_Constraint_Interpreter : public TAO_Interpreter
+{
+public:
+ // = Initialization and termination methods.
+ TAO_Constraint_Interpreter (const CosTradingRepos::ServiceTypeRepository::TypeStruct& ts,
+ const char* constraints
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::IllegalConstraint,
+ CORBA::NO_MEMORY));
+
+ /**
+ * This constructor builds an expression tree representing the
+ * constraint specified in <constraints>, and throws an Illegal
+ * Constraint exception if the constraint given has syntax errors or
+ * semantic errors, such as mismatched types.
+ */
+ TAO_Constraint_Interpreter (TAO_Constraint_Validator& validator,
+ const char* constraints
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::IllegalConstraint,
+ CORBA::NO_MEMORY));
+
+ /// Destructor
+ ~TAO_Constraint_Interpreter (void);
+
+ CORBA::Boolean evaluate (CosTrading::Offer* offer);
+
+ CORBA::Boolean evaluate (TAO_Constraint_Evaluator& evaluator);
+
+ // Determine whether an offer fits the constraints with which the
+ // tree was constructed. This method is thread safe (hopefully).
+};
+
+/**
+ * @class TAO_Preference_Interpreter
+ *
+ * @brief The TAO_Preference_Interpreter will, given a valid preference
+ * string and offers, will order the offers based on the offers'
+ * compliance with the preferences.
+ *
+ * Each time the order_offer method is invoked, the
+ * TAO_Preference_Interpreter stores the offer reference in the
+ * order dictated by its evaluation of the preference string. After
+ * the TAO_Preference_Interpreter client has finished ordering all
+ * the offers, it will extract the offers in order using the
+ * remove_offer method.
+ */
+class TAO_Trading_Serv_Export TAO_Preference_Interpreter : public TAO_Interpreter
+{
+public:
+ // = Initialization and termination methods.
+ TAO_Preference_Interpreter (const CosTradingRepos::ServiceTypeRepository::TypeStruct& ts,
+ const char* preference
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::Lookup::IllegalPreference,
+ CORBA::NO_MEMORY));
+
+ /**
+ * Parse the preference string, determining first if it's
+ * valid. Throw an IllegalPreference exception if the preference
+ * doesn't conform to the BNF grammar for preferences.
+ */
+ TAO_Preference_Interpreter (TAO_Constraint_Validator& validator,
+ const char* preference
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CosTrading::Lookup::IllegalPreference,
+ CORBA::NO_MEMORY));
+
+ /// Destructor
+ ~TAO_Preference_Interpreter(void);
+
+ void order_offer (CosTrading::Offer* offer,
+ CosTrading::OfferId offer_id = 0);
+
+ /// Evaluate the offer, and order it internally based on the results
+ /// of the evaluation.
+ void order_offer (TAO_Constraint_Evaluator& evaluator,
+ CosTrading::Offer* offer,
+ CosTrading::OfferId offer_id = 0);
+
+ int remove_offer (CosTrading::Offer*& offer,
+ CosTrading::OfferId& offer_id);
+
+ /// Remove the next offer. The offer returned will be the next in the
+ /// ordering determined by the preference string.
+ int remove_offer (CosTrading::Offer*& offer);
+
+ /// Return the number of offers remaining in the ordering.
+ size_t num_offers (void);
+
+ struct Preference_Info
+ {
+ /// True if the preference evaluation didn't return an error for this offer.
+ CORBA::Boolean evaluated_;
+
+ /// The value of the preference evaluation.
+ TAO_Literal_Constraint value_;
+
+ /// The offer id of this offer.
+ CosTrading::OfferId offer_id_;
+
+ /// A pointer to the offer.
+ CosTrading::Offer* offer_;
+ };
+
+ typedef ACE_Unbounded_Queue<Preference_Info> Ordered_Offers;
+
+private:
+
+ /// Disallow copying.
+ TAO_Preference_Interpreter (const TAO_Preference_Interpreter&);
+ TAO_Preference_Interpreter& operator= (const TAO_Preference_Interpreter&);
+
+ /// The ordered list of offers.
+ Ordered_Offers offers_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+#endif /* TAO_CONSTRAINT_INTERPRETER_H */