summaryrefslogtreecommitdiff
path: root/ACE/TAO/orbsvcs/FT_ReplicationManager/FT_Property_Validator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/TAO/orbsvcs/FT_ReplicationManager/FT_Property_Validator.cpp')
-rw-r--r--ACE/TAO/orbsvcs/FT_ReplicationManager/FT_Property_Validator.cpp234
1 files changed, 234 insertions, 0 deletions
diff --git a/ACE/TAO/orbsvcs/FT_ReplicationManager/FT_Property_Validator.cpp b/ACE/TAO/orbsvcs/FT_ReplicationManager/FT_Property_Validator.cpp
new file mode 100644
index 00000000000..1d3f14c6732
--- /dev/null
+++ b/ACE/TAO/orbsvcs/FT_ReplicationManager/FT_Property_Validator.cpp
@@ -0,0 +1,234 @@
+#include "FT_Property_Validator.h"
+#include "orbsvcs/PortableGroup/PG_Operators.h"
+#include "orbsvcs/FT_ReplicationManagerC.h"
+
+
+ACE_RCSID (PortableGroup,
+ FT_Property_Validator,
+ "$Id$")
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO::FT_Property_Validator::FT_Property_Validator (void)
+ : replication_style_ (1),
+ membership_style_ (1),
+ consistency_style_ (1),
+ fault_monitoring_style_ (1),
+ fault_monitoring_granularity_ (1),
+ factories_ (1)
+{
+ this->replication_style_.length (1);
+ this->replication_style_[0].id = CORBA::string_dup (::FT::FT_REPLICATION_STYLE);
+
+ this->membership_style_.length (1);
+ this->membership_style_[0].id = CORBA::string_dup (::FT::FT_MEMBERSHIP_STYLE);
+
+ this->consistency_style_.length (1);
+ this->consistency_style_[0].id = CORBA::string_dup (::FT::FT_CONSISTENCY_STYLE);
+
+ this->fault_monitoring_style_.length (1);
+ this->fault_monitoring_style_[0].id = CORBA::string_dup (::FT::FT_FAULT_MONITORING_STYLE);
+
+ this->fault_monitoring_granularity_.length (1);
+ this->fault_monitoring_granularity_[0].id = CORBA::string_dup (::FT::FT_FAULT_MONITORING_GRANULARITY);
+
+ this->factories_.length (1);
+ this->factories_[0].id = CORBA::string_dup (::FT::FT_FACTORIES);
+}
+
+
+TAO::FT_Property_Validator::~FT_Property_Validator (void)
+{
+}
+
+
+void
+TAO::FT_Property_Validator::validate_property (
+ const PortableGroup::Properties & props)
+{
+ const CORBA::ULong len = props.length ();
+
+ for (CORBA::ULong i = 0; i < len; ++i)
+ {
+ const PortableGroup::Property & property = props[i];
+
+ if (property.nam == this->replication_style_)
+ {
+ FT::ReplicationStyleValue value;
+ if (!(property.val >>= value)
+ || (value != FT::STATELESS
+ && value != FT::COLD_PASSIVE
+ && value != FT::WARM_PASSIVE
+ && value != FT::ACTIVE
+ && value != FT::ACTIVE_WITH_VOTING
+ && value != FT::SEMI_ACTIVE))
+ throw PortableGroup::InvalidProperty (property.nam, property.val);
+ }
+ else if (property.nam == this->membership_style_)
+ {
+ PortableGroup::MembershipStyleValue value;
+ if (!(property.val >>= value)
+ || (value != PortableGroup::MEMB_APP_CTRL
+ && value != PortableGroup::MEMB_INF_CTRL))
+ throw PortableGroup::InvalidProperty (property.nam, property.val);
+ }
+ else if (property.nam == this->consistency_style_)
+ {
+ FT::ConsistencyStyleValue value;
+ if (!(property.val >>= value)
+ || (value != FT::CONS_APP_CTRL
+ && value != FT::CONS_INF_CTRL))
+ throw PortableGroup::InvalidProperty (property.nam, property.val);
+ }
+ else if (property.nam == this->fault_monitoring_style_)
+ {
+ FT::FaultMonitoringStyleValue value;
+ if (!(property.val >>= value)
+ || (value != FT::PULL
+ && value != FT::PUSH
+ && value != FT::NOT_MONITORED))
+ throw PortableGroup::InvalidProperty (property.nam, property.val);
+ }
+ else if (property.nam == this->fault_monitoring_granularity_)
+ {
+ FT::FaultMonitoringGranularityValue value;
+ if (!(property.val >>= value)
+ || (value != FT::MEMB
+ && value != FT::LOC
+ && value != FT::LOC_AND_TYPE))
+ throw PortableGroup::InvalidProperty (property.nam, property.val);
+ }
+ else if (property.nam == this->factories_)
+ {
+ const PortableGroup::FactoriesValue * factories;
+ if (!(property.val >>= factories))
+ throw PortableGroup::InvalidProperty (property.nam, property.val);
+ else
+ {
+ const CORBA::ULong flen = factories->length ();
+
+ if (flen == 0)
+ throw PortableGroup::InvalidProperty (
+ property.nam,
+ property.val);
+
+ for (CORBA::ULong j = 0; j < flen; ++j)
+ {
+ const PortableGroup::FactoryInfo & factory_info =
+ (*factories)[j];
+
+ if (CORBA::is_nil (factory_info.the_factory.in ())
+ || factory_info.the_location.length () == 0)
+ throw PortableGroup::InvalidProperty (
+ property.nam,
+ property.val);
+ }
+ }
+ }
+ }
+}
+
+void
+TAO::FT_Property_Validator::validate_criteria (
+ const PortableGroup::Properties & props)
+{
+ const CORBA::ULong len = props.length ();
+ PortableGroup::Criteria invalid_criteria;
+
+ // Optimize for the worst case scenario where all properties are
+ // invalid.
+ invalid_criteria.length (len);
+
+ /// The invalid criteria index.
+ CORBA::ULong p = 0;
+
+ for (CORBA::ULong i = 0; i < len; ++i)
+ {
+ const PortableGroup::Property & property = props[i];
+ CORBA::Long value;
+
+ if (!(property.val >>= value))
+ invalid_criteria[p++] = property;
+ else
+ {
+ if (property.nam == this->replication_style_)
+ {
+ if ( value != FT::STATELESS
+ && value != FT::COLD_PASSIVE
+ && value != FT::WARM_PASSIVE
+ && value != FT::ACTIVE
+ && value != FT::ACTIVE_WITH_VOTING
+ && value != FT::SEMI_ACTIVE )
+ invalid_criteria[p++] = property;
+ }
+ else if (property.nam == this->membership_style_)
+ {
+ if ( value != PortableGroup::MEMB_APP_CTRL
+ && value != PortableGroup::MEMB_INF_CTRL )
+ invalid_criteria[p++] = property;
+ }
+ else if (property.nam == this->consistency_style_)
+ {
+ if ( value != FT::CONS_APP_CTRL
+ && value != FT::CONS_INF_CTRL )
+ invalid_criteria[p++] = property;
+ }
+ else if (property.nam == this->fault_monitoring_style_)
+ {
+ if ( value != FT::PULL
+ && value != FT::PUSH
+ && value != FT::NOT_MONITORED )
+ invalid_criteria[p++] = property;
+ }
+ else if (property.nam == this->fault_monitoring_granularity_)
+ {
+ if ( value != FT::MEMB
+ && value != FT::LOC
+ && value != FT::LOC_AND_TYPE )
+ invalid_criteria[p++] = property;
+ }
+ else if (property.nam == this->factories_)
+ {
+ PortableGroup::FactoriesValue * factories;
+ if (!(property.val >>= factories))
+ invalid_criteria[p++] = property;
+ else
+ {
+ const CORBA::ULong flen = factories->length ();
+
+ if (flen == 0)
+ invalid_criteria[p++] = property;
+ else
+ {
+ for (CORBA::ULong j = 0; j < flen; ++j)
+ {
+ const PortableGroup::FactoryInfo & factory_info =
+ (*factories)[j];
+
+ if (CORBA::is_nil (factory_info.the_factory.in ())
+ || factory_info.the_location.length () == 0)
+ {
+ invalid_criteria[p++] = property;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (p > 0)
+ {
+ // Reduce the length of the invalid criteria sequence in an
+ // effort to optimize the copying that will occur when the below
+ // exception is thrown. Reducing the length is fast since no
+ // deallocations should occur.
+ invalid_criteria.length (p);
+
+ throw PortableGroup::InvalidCriteria (invalid_criteria);
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL