diff options
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/Trader/Service_Type_Repository.h')
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Trader/Service_Type_Repository.h | 276 |
1 files changed, 276 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/Trader/Service_Type_Repository.h b/TAO/orbsvcs/orbsvcs/Trader/Service_Type_Repository.h new file mode 100644 index 00000000000..4c6add58960 --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/Trader/Service_Type_Repository.h @@ -0,0 +1,276 @@ +// -*- C++ -*- + +//============================================================================= +/** + * @file Service_Type_Repository.h + * + * $Id$ + * + * @author Marina Spivak <marina@cs.wustl.edu> + * @author Seth Widoff <sbw1@cs.wustl.edu> + */ +//============================================================================= + + +#ifndef TAO_SERVICE_TYPE_REPOSITORY_H +#define TAO_SERVICE_TYPE_REPOSITORY_H +#include /**/ "ace/pre.h" + +#include "orbsvcs/Trader/Trader.h" +#include "ace/Hash_Map_Manager.h" +#include "ace/Null_Mutex.h" + +TAO_BEGIN_VERSIONED_NAMESPACE_DECL + +/** + * @class TAO_Service_Type_Repository + * + * @brief This class implements CosTradingRepos::ServiceTypeRepository + * IDL interface. + */ +class TAO_Trading_Serv_Export TAO_Service_Type_Repository + : public POA_CosTradingRepos::ServiceTypeRepository +{ +public: + /** + * Parameterize the Service_Type_Repository with a lock to serialize + * access to the type repository map. A reader/writer lock is + * probably best. The Service_Type_Repository assumes control of the + * lock. + */ + TAO_Service_Type_Repository (ACE_Lock *lock = 0); + + ~TAO_Service_Type_Repository (void); + + virtual CosTradingRepos::ServiceTypeRepository::IncarnationNumber + incarnation (void); + + /** + * BEGIN SPEC + * The add_type operation enables the creation of new service types + * in the service type repository. The caller supplies the "name" + * for the new type, the identifier for the interface associated + * with instances of this service type, the properties definitions + * for this service type, and the service type names of the + * immediate super-types to this service type. + */ + virtual CosTradingRepos::ServiceTypeRepository::IncarnationNumber + add_type (const char *name, + const char *if_name, + const CosTradingRepos::ServiceTypeRepository::PropStructSeq &props, + const CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq &super_types); + + // If the type creation is successful, an incarnation number is + // returned as the value of the operation. Incarnation numbers are + // opaque values that are assigned to each modification to the + // repository's state. An incarnation number can be quoted when + // invoking the list_types operation to retrieve all changes to the + // service repository since a particular logical time. (Note: + // IncarnationNumber is currently declared as a struct consisting of + // two unsigned longs; what we really want here is an unsigned hyper + // [64-bit integer]. A future revision task force should modify this + // when CORBA systems support IDL 64-bit integers.) + + // If the "name" parameter is malformed, then the + // CosTrading::IllegalServiceType exception is raised. If the type + // already exists, then the ServiceTypeExists exception is raised. ° + // If the "if_name" parameter is not a sub-type of the interface + // associated with a service type from which this service type is + // derived, such that substitutability would be violated, then the + // InterfaceTypeMismatch exception is raised. If a property name + // supplied in the "props" parameter is malformed, the + // CosTrading::IllegalPropertyName exception is raised. If the + // same property name appears two or more times in the "props" + // parameter, the CosTrading::DuplicatePropertyName exception is + // raised. If a property value type associated with this service + // type illegally modifies the value type of a super-type's + // property, or if two super-types incompatibly declare value types + // for the same property name, then the ValueTypeRedefinition + // exception is raised. If one of the ServiceTypeNames in + // "super_types" is malformed, then the + // CosTrading::IllegalServiceType exception is raised. If one of the + // ServiceTypeNames in "super_types" does not exist, then the + // CosTrading::UnknownServiceType exception is raised. If the same + // service type name is included two or more times in this + // parameter, the DuplicateServiceTypeName exception is raised. + // END SPEC + + /** + * BEGIN SPEC + * The remove_type operation removes the named type from the service + * type repository. If "name" is malformed, then the + * CosTrading::IllegalServiceType exception is raised. If + * "name" does not exist within the repository, then the + * CosTrading::UnknownServiceType exception is raised. If + * "name" has a service type which has been derived from it, then + * the HasSubTypes exception is raised. END SPEC + */ + virtual void remove_type (const char *name); + + virtual CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq * + list_types (const CosTradingRepos::ServiceTypeRepository::SpecifiedServiceTypes &which_types); + + // BEGIN SPEC + // The list_types operation permits a client to obtain the names of + // service types which are in the repository. The "which_types" + // parameter permits the client to specify one of two possible + // values: all types known to the repository all types + // added/modified since a particular incarnation number The names of + // the requested types are returned by the operation for subsequent + // querying via the describe_type or the fully_describe_type + // operation. + // END SPEC + + /** + * BEGIN SPEC + * The describe_type operation permits a client to obtain the + * details for a particular service type. If "name" is malformed, + * then the CosTrading::IllegalServiceType exception is raised. If + * "name" does not exist within the repository, then the + * CosTrading::UnknownServiceType exception is raised. + * END SPEC + */ + virtual CosTradingRepos::ServiceTypeRepository::TypeStruct * + describe_type (const char *name); + + /** + * BEGIN SPEC + * The fully_describe_type operation permits a client to obtain the + * details for a particular service type. The property sequence + * returned in the TypeStruct includes all properties inherited from + * the transitive closure of its super types; the sequence of super + * types in the TypeStruct contains the names of the types in the + * transitive closure of the super type relation. If "name" is + * malformed, then the CosTrading::IllegalServiceType exception is + * raised. If "name" does not exist within the repository, then + * the CosTrading::UnknownServiceType exception is raised. + * END SPEC + */ + virtual CosTradingRepos::ServiceTypeRepository::TypeStruct * + fully_describe_type (const char *name); + + /** + * BEGIN SPEC + * The mask_type operation permits the deprecation of a particular + * type (i.e., after being masked, exporters will no longer be able + * to advertise offers of that particular type). The type continues + * to exist in the service repository due to other service types + * being derived from it. If "name" is malformed, then the + * CosTrading::IllegalServiceType exception is raised. If "name" + * does not exist within the repository, then the + * CosTrading::UnknownServiceType exception is raised. If the type + * is currently in the masked state, then the AlreadyMasked + * exception is raised. + * END SPEC + */ + virtual void mask_type (const char *name); + + /** + * BEGIN SPEC + * The unmask_type undeprecates a type (i.e., after being unmasked, + * exporters will be able to resume advertisement of offers of that + * particular type). If "name" is malformed, then the + * CosTrading::IllegalServiceType exception is raised. If "name" + * does not exist within the repository, then the + * CosTrading::UnknownServiceType exception is raised. If the type + * is not currently in the masked state, then the NotMasked + * exception is raised. + * END SPEC + */ + virtual void unmask_type (const char *name); + +private: + + /** + * @class Type_Info + * + * @brief Storage structure for information pertinent to the type. + */ + class Type_Info + { + public: + /// Standard type info. + CosTradingRepos::ServiceTypeRepository::TypeStruct type_struct_; + + /// Names of subtypes. + CORBA::Boolean has_subtypes_; + }; + + typedef ACE_Hash_Map_Manager_Ex <CORBA::String_var, + CosTradingRepos::ServiceTypeRepository::PropStruct *, + ACE_Hash<CORBA::String_var>, + ACE_Equal_To<CORBA::String_var>, + ACE_Null_Mutex> + Prop_Map; + + typedef ACE_Hash_Map_Manager_Ex <CORBA::String_var, + Type_Info *, + ACE_Hash<CORBA::String_var>, + ACE_Equal_To<CORBA::String_var>, + ACE_Null_Mutex> + Service_Type_Map; + + typedef ACE_Hash_Map_Iterator_Ex<CORBA::String_var, + Type_Info *, + ACE_Hash<CORBA::String_var>, + ACE_Equal_To<CORBA::String_var>, + ACE_Null_Mutex> + Service_Type_Map_Iterator; + + /** + * Build a sequence aggregating the property names from all + * supertypes of the type, and a sequence representing the + * transitive closure of the super type relation. + */ + void fully_describe_type_i (const CosTradingRepos::ServiceTypeRepository::TypeStruct &type_struct, + CosTradingRepos::ServiceTypeRepository::PropStructSeq &props, + CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq &super_types); + + void collect_inheritance_hierarchy (const CosTradingRepos::ServiceTypeRepository::TypeStruct &type_struct, + TAO_String_Queue &target); + + /// Confirm that the properties in props have valid names, and aren't + /// duplicated. Cram those properties into the prop_map. + void validate_properties (Prop_Map &prop_map, + const CosTradingRepos::ServiceTypeRepository::PropStructSeq &props); + + /// Confirm that the each super type exists, and cram them into super_map. + void validate_supertypes (Service_Type_Map &super_map, + const CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq &super_types); + + /// Ensure that properties of a super_type aren't having their types + /// or retstrictions redefined. + void validate_inheritance (Prop_Map &prop_map, + const CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq &super_types); + + /// Update the type map with the information contained in the + /// TypeStruct, prop_map, and super_map. + void update_type_map (const char *name, + const char *if_name, + const CosTradingRepos::ServiceTypeRepository::PropStructSeq &props, + const CosTradingRepos::ServiceTypeRepository::ServiceTypeNameSeq &super_types, + Prop_Map &prop_map, + Service_Type_Map &super_map); + + TAO_Service_Type_Repository (const TAO_Service_Type_Repository &); + TAO_Service_Type_Repository &operator= (const TAO_Service_Type_Repository &); + + /// Lock with which to serialize access to the service type map. + ACE_Lock *lock_; + + /** + * Stores information for each service type in the repository. This + * is a mapping from service type name to a Type_Info struct which + * serves as a storage for various information for the given type. + */ + Service_Type_Map type_map_; + + /// Incarnation number to be used for the next modification to the + /// repository. + CosTradingRepos::ServiceTypeRepository::IncarnationNumber incarnation_; +}; + +TAO_END_VERSIONED_NAMESPACE_DECL + +#include /**/ "ace/post.h" +#endif /* TAO_SERVICE_TYPE_REPOSITORY_H */ |