diff options
author | vzykov <vzykov@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2007-11-28 10:50:05 +0000 |
---|---|---|
committer | vzykov <vzykov@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2007-11-28 10:50:05 +0000 |
commit | 9dbb80b03e1ed554e29d24d3dbb42e935a586a96 (patch) | |
tree | f963cf9f586381642d0aadeb724a47c969662d85 /TAO/tests/Bug_3154_Regression | |
parent | 3edd80de888c50aa8d255c3249835da9609df3bb (diff) | |
download | ATCD-9dbb80b03e1ed554e29d24d3dbb42e935a586a96.tar.gz |
ChangeLogTag: Wed Nov 28 10:42:20 UTC 2007 Vladimir Zykov <vladimir.zykov@prismtech.com>
Diffstat (limited to 'TAO/tests/Bug_3154_Regression')
-rw-r--r-- | TAO/tests/Bug_3154_Regression/README | 21 | ||||
-rw-r--r-- | TAO/tests/Bug_3154_Regression/orbsvcs/CosNotification.idl | 390 | ||||
-rwxr-xr-x | TAO/tests/Bug_3154_Regression/run_test.pl | 87 | ||||
-rw-r--r-- | TAO/tests/Bug_3154_Regression/test.idl | 316 |
4 files changed, 814 insertions, 0 deletions
diff --git a/TAO/tests/Bug_3154_Regression/README b/TAO/tests/Bug_3154_Regression/README new file mode 100644 index 00000000000..effb1a6fd58 --- /dev/null +++ b/TAO/tests/Bug_3154_Regression/README @@ -0,0 +1,21 @@ +This test uses newly implemented -Se feature of tao_idl. Using this feature +user can prohibit custom endings (e.g. -hs or -hc) for TAO specific include fils. + +__Regression Output__ + +[vzykov@glasgow tao566_regression]$ ./run_test.pl +ERROR: Custom endings are incorrectly applied. + + +__Successful Output__ + +[vzykov@glasgow tao563_regression]$ ./run_test.pl +processing test.idl +INFO: orbsvcs/FT_CORBA_ORBC.h +INFO: orbsvcs/CosNotification_stub.h +INFO: orbsvcs/PortableGroupC.h +INFO: test_stub.h +INFO: orbsvcs/FT_CORBA_ORBC.h +INFO: orbsvcs/CosNotification_skel.h +INFO: orbsvcs/PortableGroupS.h +INFO: Test passed! diff --git a/TAO/tests/Bug_3154_Regression/orbsvcs/CosNotification.idl b/TAO/tests/Bug_3154_Regression/orbsvcs/CosNotification.idl new file mode 100644 index 00000000000..ec1a43547ca --- /dev/null +++ b/TAO/tests/Bug_3154_Regression/orbsvcs/CosNotification.idl @@ -0,0 +1,390 @@ +/** + * @file CosNotification.idl + * + * @brief Define the CosNotification module + * + * CosNotification.idl,v 1.3 2002/07/01 14:13:59 parsons Exp + * + * @author Pradeep Gore <pradeep@cs.wustl.edu> + */ + +#ifndef _COS_NOTIFICATION_IDL_ +#define _COS_NOTIFICATION_IDL_ + +#pragma prefix "omg.org" + +/** + * @namespace CosNotification + * + * @brief Define basic data structures used by the Notification + * Service + */ +module CosNotification +{ + /// Dummy typedef for strings, if the intent was to support I18N + /// strings the spec should have used wstring + typedef string Istring; + + /// Properties are named using a string + typedef Istring PropertyName; + + /// Property values are stored using anys + typedef any PropertyValue; + + /** + * @struct Property + * + * @brief Define a name/value pair. + * + * Events are described using named/value sequences, this structure + * defines the name/value pair. + */ + struct Property { + /// The name + PropertyName name; + /// The value + PropertyValue value; + }; + + /// Define a sequence of properties. + typedef sequence<Property> PropertySeq; + + //@{ + /** + * @name Different kinds of property sequences + * + * @brief The following are all sequences of Property, but + * serve different purposes. + */ + /// Property sequence used for optional header fields + typedef PropertySeq OptionalHeaderFields; + + /// Property sequence used for the event body that can be used + /// in filtering + typedef PropertySeq FilterableEventBody; + + /// Specify quality of service properties + typedef PropertySeq QoSProperties; + + /// Specify administrative properties + typedef PropertySeq AdminProperties; + //@} + + /** + * @struct _EventType + * + * @brief Define event type names. + * + * Different vertical industries (domains) can define well-known + * events (event_types). This structure is used for that purpose + */ + struct _EventType { + /// The name of the vertical industry defining the event type. + string domain_name; + /// The type of event. + string type_name; + }; + /// A sequence of event types + typedef sequence<_EventType> EventTypeSeq; + + /** + * @struct PropertyRange + * + * @brief A structure to define property ranges. + * + */ + struct PropertyRange { + /// Lower end of the range + PropertyValue low_val; + /// High end of the range + PropertyValue high_val; + }; + + /** + * @struct NamedPropertyRange + * + * @brief A named property range + */ + struct NamedPropertyRange { + /// The name + PropertyName name; + /// The range + PropertyRange range; + }; + /// A sequence of named property ranges + typedef sequence<NamedPropertyRange> NamedPropertyRangeSeq; + + /** + * @enum QoSError_code + * + * @brief Describe QoS errors. + */ + enum QoSError_code { + /// The application has requested an unsupported QoS property + UNSUPPORTED_PROPERTY, + /// The application has requested a QoS property that, though + /// supported, cannot be set in the requested scope. + UNAVAILABLE_PROPERTY, + /// The application has requested a QoS property with an + /// unsupported value. + UNSUPPORTED_VALUE, + /// The application has requested a QoS property with a supported + /// value, but unavailable at the requeste scope. + UNAVAILABLE_VALUE, + /// The property name is unknown or not recognized. + BAD_PROPERTY, + /// The value type for the requested property is invalid + BAD_TYPE, + /// The value for the requested property is illegal + BAD_VALUE + }; + + /** + * @struct PropertyError + * + * @brief Describe the problems detected with an application + * requested QoS. + * + * If there are any problems with an application request for QoS the + * problems are raised using an exception that contains all the + * problems, and a description of the valid values (if they apply). + */ + struct PropertyError { + /// Property error description + QoSError_code code; + /// Property name with a problem + PropertyName name; + /// Valid range for that property in the Notification Service + /// implementation + PropertyRange available_range; + }; + /// List of property errors. + typedef sequence<PropertyError> PropertyErrorSeq; + + /** + * @exception UnsupportedQoS + * + * @brief Exception used to describe problems with one or more QoS + * requests + * + */ + exception UnsupportedQoS { + /// Complete description of the properties in error + PropertyErrorSeq qos_err; + }; + + /** + * @exception UnsupportedAdmin + * + * @brief Exception used to describe problems with one or more Admin + * properties + */ + exception UnsupportedAdmin { + /// The complete description of the invalid properties. + PropertyErrorSeq admin_err; + }; + + /** + * @struct FixedEventHeader + * + * @brief Define the 'fixed' part of the event header + */ + struct FixedEventHeader { + /// The event type + _EventType event_type; + /// A (possibly unique) name for the particular event + string event_name; + }; + + /** + * @struct EventHeader + * + * @brief Complete event header + */ + struct EventHeader { + /// The fixed part of the event header + FixedEventHeader fixed_header; + /// The optional part + OptionalHeaderFields variable_header; + }; + + /** + * @struct StructuredEvent + * + * @brief Define structured events + */ + struct StructuredEvent { + /// The header + EventHeader header; + /// The part of the body used for filtering + FilterableEventBody filterable_data; + /// The part of the body not used for filtering + any remainder_of_body; + }; + /// Sequence of events, for batch processing + typedef sequence<StructuredEvent> EventBatch; + + //@{ + /** + * @name Constants for QoS Properties + * + * The following constant declarations define the standard QoS + * property names and the associated values each property can take + * on. The name/value pairs for each standard property are grouped, + * beginning with a string constant defined for the property name, + * followed by the values the property can take on. + */ + + const string EventReliability = "EventReliability"; + const short BestEffort = 0; + const short Persistent = 1; + + /// Can take on the same values as EventReliability + const string ConnectionReliability = "ConnectionReliability"; + + const string Priority = "Priority"; + const short LowestPriority = -32767; + const short HighestPriority = 32767; + const short DefaultPriority = 0; + + /// StartTime takes a value of type TimeBase::UtcT. + const string StartTime = "StartTime"; + + /// StopTime takes a value of type TimeBase::UtcT. + const string StopTime = "StopTime"; + + /// Timeout takes on a value of type TimeBase::TimeT + const string Timeout = "Timeout"; + + const string OrderPolicy = "OrderPolicy"; + const short AnyOrder = 0; + const short FifoOrder = 1; + const short PriorityOrder = 2; + const short DeadlineOrder = 3; + + /// DiscardPolicy takes on the same values as OrderPolicy, plus + const string DiscardPolicy = "DiscardPolicy"; + const short LifoOrder = 4; + + /// MaximumBatchSize takes on a value of type long + const string MaximumBatchSize = "MaximumBatchSize"; + + /// PacingInterval takes on a value of type TimeBase::TimeT + const string PacingInterval = "PacingInterval"; + + /// StartTimeSupported takes on a boolean value + const string StartTimeSupported = "StartTimeSupported"; + + /// StopTimeSupported takes on a boolean value + const string StopTimeSupported = "StopTimeSupported"; + + /// MaxEventsPerConsumer takes on a value of type long + const string MaxEventsPerConsumer = "MaxEventsPerConsumer"; + + //@} + + /** + * @interface QoSAdmin + * + * @brief Interface used to control the QoS properties of an Event + * Service components (Channel, Proxy, etc.) + * + * QoS properties of a channel can be set at different levels, + * including the proxies, the ConsumerAdmin and the SupplierAdmin + * objects. Each one of those components offers this interface to + * allow control over the properties. + */ + interface QoSAdmin { + /// Get the current QoS properties + /** + * The operation returns the properties set: + * - At the level queried + * - Not set at the level queried but set at a higher-level + * - Not set at all but having a default value. + */ + QoSProperties get_qos(); + + /// Set the QoS properties + /** + * @param qos The requested QoS properties + * @throws UnsupportedQoS if the requested QoS cannot be + * implemented or is invalid. The exception contents describe + * the problem(s) in detail. + */ + void set_qos ( in QoSProperties qos) + raises ( UnsupportedQoS ); + + /// Validate a set of QoS properties + /** + * @param required_qos the list of properties requested by the + * application + * @param available_qos If the properties are supported this + * argument returns a list of any other properties that + * could also be set. + * @throws UnsupportedQoS if the requested QoS cannot be + * implemented or is invalid. The exception contents describe + * the problem(s) in detail. + */ + void validate_qos (in QoSProperties required_qos, + out NamedPropertyRangeSeq available_qos ) + raises ( UnsupportedQoS ); + }; + + //@{ + /** + * @name Constants for Admin Properties + * + * Admin properties are defined in similar manner as QoS + * properties. The only difference is that these properties are + * related to channel administration policies, as opposed message + * quality of service + */ + /// MaxQueueLength takes on a value of type long + const string MaxQueueLength = "MaxQueueLength"; + + /// MaxConsumers takes on a value of type long + const string MaxConsumers = "MaxConsumers"; + + /// MaxSuppliers takes on a value of type long + const string MaxSuppliers = "MaxSuppliers"; + + /// RejectNewEvents takes on a value of type Boolean + const string RejectNewEvents = "RejectNewEvents"; + //@} + + /** + * @interface AdminPropertiesAdmin + * + * @brief Define the interface to manipulate the Admin properties of + * a Notification Service components + * + * Several Notification Service components have Admin properties, + * including the Event Channel, its ConsumerAdmin and SupplierAdmin + * objects as well as the proxies. This interface is used to + * control the Admin properties of each one of those components. + */ + interface AdminPropertiesAdmin { + /// Get the Admin properties + /** + * The operation returns the properties set: + * - At the level queried + * - Not set at the level queried but set at a higher-level + * - Not set at all but having a default value. + */ + AdminProperties get_admin(); + + /// Set the Admin properities + /** + * @param admin The list of Admin properties requested + * @throws UnsupportedAdmin if the requested admin properties + * cannot be implemented or are invalid + */ + void set_admin (in AdminProperties admin) + raises ( UnsupportedAdmin); + }; + +}; + +#pragma prefix "" + +#endif /* _COS_NOTIFICATION_IDL_ */ diff --git a/TAO/tests/Bug_3154_Regression/run_test.pl b/TAO/tests/Bug_3154_Regression/run_test.pl new file mode 100755 index 00000000000..73c186cb3d7 --- /dev/null +++ b/TAO/tests/Bug_3154_Regression/run_test.pl @@ -0,0 +1,87 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +# -*- perl -*- + +use lib "$ENV{ACE_ROOT}/bin"; +use PerlACE::Run_Test; + +# The location of the tao_idl utility - depends on O/S +if ($^O eq "MSWin32") +{ + $tao_idl = "../../../bin/tao_idl"; +} +else +{ + $tao_idl = "../../../TAO/TAO_IDL/tao_idl"; +} + +# IDL file names +$idl_file = PerlACE::LocalFile ("test.idl"); + +# The IDL compiler +$TAO_IDL = new PerlACE::Process ("$tao_idl"); + +$TAO_IDL->Arguments ("-Se -hs _skel.h -hc _stub.h test.idl"); +$TAO_IDL->SpawnWaitKill (20); + +$found = 0; + +$stub_h = PerlACE::LocalFile("test_stub.h"); +open (STUB_HANDLE, "<$stub_h"); +while ($line = <STUB_HANDLE>) +{ + # Process the line. + chomp $line; + + if ($line =~ /^\#include \"orbsvcs\/FT_CORBA_ORBC\.h\"$/) { + print "INFO: orbsvcs/FT_CORBA_ORBC.h\n"; + $found++; + } + if ($line =~ /^\#include \"orbsvcs\/CosNotification_stub\.h\"$/) { + print "INFO: orbsvcs/CosNotification_stub.h\n"; + $found++; + } + if ($line =~ /\#include \"orbsvcs\/PortableGroupC\.h\"$/) { + print "INFO: orbsvcs/PortableGroupC.h\n"; + $found++; + } +} +close(STUB_HANDLE); + +$skel_h = PerlACE::LocalFile("test_skel.h"); +open (SKEL_HANDLE, "<$skel_h"); +while ($line = <SKEL_HANDLE>) +{ + # Process the line. + chomp $line; + + if ($line =~ /^\#include \"test_stub\.h\"$/) { + print "INFO: test_stub.h\n"; + $found++; + } + if ($line =~ /^\#include \"orbsvcs\/FT_CORBA_ORBS\.h\"$/) { + print "INFO: orbsvcs/FT_CORBA_ORBC.h\n"; + $found++; + } + if ($line =~ /^\#include \"orbsvcs\/CosNotification_skel\.h\"$/) { + print "INFO: orbsvcs/CosNotification_skel.h\n"; + $found++; + } + if ($line =~ /\#include \"orbsvcs\/PortableGroupS\.h\"$/) { + print "INFO: orbsvcs/PortableGroupS.h\n"; + $found++; + } +} +close(SKEL_HANDLE); + +unlink <*.cpp *.inl *.h>; + +if ($found == 7) { + print "INFO: Test passed!\n"; + exit 0; +} else { + print STDERR "ERROR: Custom endings are incorrectly applied.\n"; + exit 1; +} diff --git a/TAO/tests/Bug_3154_Regression/test.idl b/TAO/tests/Bug_3154_Regression/test.idl new file mode 100644 index 00000000000..d28d52656d4 --- /dev/null +++ b/TAO/tests/Bug_3154_Regression/test.idl @@ -0,0 +1,316 @@ +// The next include is TAO specific. +#include "orbsvcs/FT_CORBA_ORB.idl" + +#include "orbsvcs/CosNotification.idl" +#include "orbsvcs/PortableGroup.idl" + +#pragma prefix "omg.org" + +/** +* This module describes interfaces and data types of the CORBA +* Fault Tolerance service. +*/ + +module FT +{ + /// Specification for the Common Types and Exceptions for + /// ReplicationManager + + /// Forward declarations + interface GenericFactory; + interface FaultNotifier; + + /// Useful typedefs. + typedef CORBA::RepositoryId _TypeId; + typedef Object ObjectGroup; + + typedef any Value; + + /** + * @struct Property + * + * @brief A property name and a value association. + */ + struct Property { + Value val; + }; + + /// Some mor euseful typedefs. + typedef sequence<Property> Properties; + typedef Properties Criteria; + + /** + * @struct FactoryInfo + * + * @brief <@todo> + * + */ + struct FactoryInfo { + GenericFactory the_factory; + Criteria the_criteria; + }; + + typedef sequence<FactoryInfo> FactoryInfos; + + typedef long ReplicationStyleValue; + const ReplicationStyleValue STATELESS = 0; + const ReplicationStyleValue COLD_PASSIVE = 1; + const ReplicationStyleValue WARM_PASSIVE = 2; + const ReplicationStyleValue ACTIVE = 3; + const ReplicationStyleValue ACTIVE_WITH_VOTING = 4; + typedef long MembershipStyleValue; + const MembershipStyleValue MEMB_APP_CTRL = 0; + const MembershipStyleValue MEMB_INF_CTRL = 1; + typedef long ConsistencyStyleValue; + const ConsistencyStyleValue CONS_APP_CTRL = 0; + const ConsistencyStyleValue CONS_INF_CTRL = 1; + typedef long FaultMonitoringStyleValue; + const FaultMonitoringStyleValue PULL = 0; + const FaultMonitoringStyleValue PUSH = 1; + const FaultMonitoringStyleValue NOT_MONITORED = 2; + typedef long FaultMonitoringGranularityValue; + const FaultMonitoringGranularityValue MEMB = 0; + const FaultMonitoringGranularityValue LOC = 1; + const FaultMonitoringGranularityValue LOC_AND_TYPE = 2; + typedef FactoryInfos FactoriesValue; + typedef unsigned short InitialNumberReplicasValue; + typedef unsigned short MinimumNumberReplicasValue; + + typedef TimeBase::TimeT CheckpointIntervalValue; + exception InterfaceNotFound {}; + exception ObjectGroupNotFound {}; + exception MemberNotFound {}; + exception MemberAlreadyPresent {}; + exception BadReplicationStyle {}; + exception ObjectNotCreated {}; + exception ObjectNotAdded {}; + exception PrimaryNotSet {}; + exception UnsupportedProperty { + Value val; + }; + + exception InvalidProperty { + Value val; }; + + exception NoFactory { + _TypeId type_id; }; + + exception InvalidCriteria { + Criteria invalid_criteria; }; + + exception CannotMeetCriteria { + Criteria unmet_criteria; }; + + // Specification of PropertyManager Interface + // which ReplicationManager Inherits + + interface PropertyManager { + + void set_default_properties(in Properties props) + raises (InvalidProperty, UnsupportedProperty); + Properties get_default_properties(); + + void remove_default_properties(in Properties props) + raises (InvalidProperty, UnsupportedProperty); + + void set_type_properties(in _TypeId type_id, + in Properties overrides) + raises (InvalidProperty, UnsupportedProperty); + + Properties get_type_properties(in _TypeId type_id); + + void remove_type_properties(in _TypeId type_id, + in Properties props) + raises (InvalidProperty, UnsupportedProperty); + + void set_properties_dynamically(in ObjectGroup object_group, + in Properties overrides) + raises(ObjectGroupNotFound, InvalidProperty, UnsupportedProperty); + + Properties get_properties(in ObjectGroup object_group) + raises(ObjectGroupNotFound); }; + + // Specification of ObjectGroupManager Interface + // which ReplicationManager Inherits + /** + * This interface provides operations that allow an application to add, remove + * and locate members of an object group and to obtain the current reference and + * identifier for an object group. + * + */ + + interface ObjectGroupManager { + /** + * This operation allows the application to exercise explicit control over the + * creation of a member of an object group, and to determine where the member + * is created. + * + * @param object_group Reference for the object group to which the member is + * to be added. + * @param the_location The physical location. + * @param type_id The repository identifier for the type of the object. + * @param the_criteria Parameters to be passed to the factory, which the factory + * evaluates before creating the object. + * + * @return The object group reference of the object group with the member added. + */ + ObjectGroup create_member(in ObjectGroup object_group, + in _TypeId type_id, + in Criteria the_criteria) + raises(ObjectGroupNotFound, + MemberAlreadyPresent, + NoFactory, + ObjectNotCreated, + InvalidCriteria, + CannotMeetCriteria); + + /** + * This operation allows an application to add an existing object to an object + * group at a particular location. + * + * @param object_group Reference for the object group to which the existing object + * is to be added. + * @param the_location The physical location of the object to be added. + * @param member The reference of the object to be added. + * + * @return The object group reference of the object group with the object added. + */ + ObjectGroup add_member(in ObjectGroup object_group, + in Object member) + raises(ObjectGroupNotFound, + MemberAlreadyPresent, + ObjectNotAdded); + + /** + * This operation allows an application to remove a member from an object + * group at a particular location. + * + * @param object_group Reference for the object group to which the member + * is to be removed. + * @param the_location The physical location of the member to be removed. + * + * @return The object group reference of the member removed. + */ + ObjectGroup remove_member(in ObjectGroup object_group) + raises(ObjectGroupNotFound, + MemberNotFound); + + /** + * This operation allows the application to select the member of the object group + * that is to be the primary. + * + * @param object_group Reference for the object group whose primary is to be + * determined. + * @param the_location The physical location of the member that is to become + * the primary. + * + * @return The object group reference with the primary member at the given + * location. + */ + ObjectGroup set_primary_member(in ObjectGroup object_group) + raises(ObjectGroupNotFound, + MemberNotFound, + PrimaryNotSet, + BadReplicationStyle); + + ObjectGroupId get_object_group_id(in ObjectGroup object_group) + raises(ObjectGroupNotFound); + + ObjectGroup get_object_group_ref(in ObjectGroup object_group) + raises(ObjectGroupNotFound); + + Object get_member_ref(in ObjectGroup object_group) + raises(ObjectGroupNotFound, MemberNotFound); }; + + + // Specification of GenericFactory Interface + // which ReplicationManager Inherits and Application Objects Implement + /** + * This interface allows the creation/deletion of replicated objects (object groups), + * replicas (members of object groups), and unreplicated objects. + */ + interface GenericFactory { + typedef any FactoryCreationId; + + /** + * This operation creates an object or an object group, using the type_id + * parameter to determine which type of object to create and the_criteria + * parameter to determine restrictions on how and where to create the object. + * + * @param type_id The repository identifier of the object to be created by + * the factory. + * + * @param the_criteria Information passed to the factory, which the factory + * evaluates before creating the object. Examples of criteria are initialization + * values, constraints on the object, preferred location of the object, fault + * tolerance properties for an object group, etc. + * + * @param factory_creation_id An identifier that allows the factory to delete + * the object subsequently. + * + * @return The reference to the object created by the GenericFactory. When the + * GenericFactory interface is implemented by the application’s local factory + * object, the create_object() operation returns an object reference as a result. + * When the GenericFactory interface is inherited by the Replication Manager, the + * create_object() operation returns an object group reference as a result. + * + * @exception NoFactory Raised if the factory cannot create an individual object + * of the type_id at the location. + * @exception ObjectNotCreated Raised if the factory cannot create the object. + * @exception InvalidCriteria Raised if the factory does not understand the criteria. + * @exception InvalidProperty Raised if a property passed in as criteria is invalid. + * @exception CannotMeetCriteria Raised if the factory understands the criteria but + * cannot satisfy it. + */ + Object create_object(in _TypeId type_id, + in Criteria the_criteria, + out FactoryCreationId factory_creation_id) + raises (NoFactory, + ObjectNotCreated, + InvalidCriteria, + InvalidProperty, + CannotMeetCriteria); }; + + // Specification of ReplicationManager Interface + interface ReplicationManager : PropertyManager, + ObjectGroupManager, + GenericFactory { + void register_fault_notifier(in FaultNotifier fault_notifier); + FaultNotifier get_fault_notifier() + raises (InterfaceNotFound); }; + + // Specification of FaultNotifier Interface + interface FaultNotifier { + typedef unsigned long long ConsumerId; + + void push_structured_fault( + in CosNotification::StructuredEvent event); + + void push_sequence_fault( + in CosNotification::EventBatch events); + + }; + + // Specifications for Logging and Recovery + typedef sequence<octet> State; + + exception NoStateAvailable {}; + exception InvalidState {}; + + exception NoUpdateAvailable {}; + exception InvalidUpdate {}; + + // Specification of Checkpointable Interface + // which Updateable and Application Objects Inherit + interface Checkpointable { State get_state() + raises(NoStateAvailable); + void set_state(in State s) raises(InvalidState); }; + + // Specification of Updateable Interface + // which Application Objects Inherit + interface Updateable : Checkpointable { State get_update() + raises(NoUpdateAvailable); + void set_update(in State s) raises(InvalidUpdate); + }; + +}; |