110 likes | 260 Views
Motivation and Random Thoughts. Need to share objects between different AIDA implementations. Two kinds of changes to track: “Tree change” – AIDA Objects created, deleted, copied, etc. “Object change” – change in internal state of AIDA object. Mainly data updates. Main Ideas.
E N D
Motivation and Random Thoughts • Need to share objects between different AIDA implementations. • Two kinds of changes to track: • “Tree change” – AIDA Objects created, deleted, copied, etc. • “Object change” – change in internal state of AIDA object. Mainly data updates.
Main Ideas • Use CORBA for interoperability. • Remote AIDA Tree is a copy of the Server AIDA tree. • Objects in the Client tree are created as “Read-Only”. • Any updates in the Server tree are propagated to the Client tree by means of events: • Event ID: node added, node removed, node updated, … • Node path in the tree • Node type • Data that node contains are copied to Client tree by a separate request. Have to define IDL data structures for all types of AIDA objects, based on AIDA XLM: • IHistogram1D, IDataPointSet, etc. • ITuple and complex structures have to be treated differently.
JAIDA CORBA Example • AIDA Remote Clients connect to AIDA Server tree through the main Server – one Server per tree. • Server/Client can work in two modes: • “Pull” – Assume that Client asks for updates. • “Push” or “Duplex” – Client is notified about updates. This is more effective, but more complex to implement and operate. • For each AIDA Client that connects, main Server creates a separate Servant. Until Client disconnects, it handles all updates through the Servant.
AIDA CORBA Tree Options • Create options: • ior=iorString or iorFileURL=URL_for_file_with_IOR_String • ServerName=Name_of_AIDA_server_in_CORBA_Name_Service • Server=true or Client=true (default) • To connect to Sever Tree: ITree clientTree = treeFactory.create(“Name", "corba", true, false, "iorFileURL=file:///C:/Temp/TreeServer.ior, duplex=false");
IDL: AIDA Update Event // Specify what kind of change happened in ITree enum EventID { NODE_UPDATED, NODE_ADDED, NODE_DELETED }; // Specify if IManagedObject or Directory has been changed enum EventFlags { OBJECT_MASK, FOLDER_MASK }; // EventStruct is passed to the TreeClient to notify it about changes in ITree struct EventStruct { EventID id; string path; string nodeType; EventFlags flags; }; typedef sequence<EventStruct> EventList;
IDL: DataPointSetData struct MeasurementData { double value; double errorPlus; double errorMinus; }; typedef sequence<MeasurementData> MeasurementDataList; struct DataPointData { long dimension; MeasurementDataList measurements; }; typedef sequence<DataPointData> DataPointDataList; struct DataPointSetData { string name; long dimension; Annotation annotation; DataPointDataList points; };
IDL: AIDA Tree Server interface TreeServer { // Return the name of the ITree it is connected to. string treeName(); // Returns "true" if this TreeServer/TreeServant implementation // support "Duplex Mode". boolean supportDuplexMode(); // connect/disconnect methods for TreeClient that does not support "Duplex" Mode. TreeServant connectNonDuplex(in string clientID); boolean disconnectNonDuplex(in string clientID); // connect/disconnect methods for TreeClient that does support "Duplex" Mode. // Here reference to instance of TreeClient serves as a unique client ID. TreeServant connectDuplex(in TreeClient client); boolean disconnectDuplex(in TreeClient client); };
IDL: AIDA Tree Client interface TreeClient { // This method can be called by the TreeServant to notify TreeClient about // updates in the server-side ITree. If "Duplex Mode" is not used, TreeClient // has to call updates() method of TreeServant to get a list of current updates. void stateChanged(in EventList events); // Return true if TreeClient is already connected to the AidaTreeServer boolean isConnected(); // Make initial connection to the TreeServer. boolean connect(); // Disconnect from the TreeServer and free all resources associated with it. boolean disconnect(); };
IDL: AIDA Tree Servant interface TreeServant { StringList listObjectNames(in string path); StringList listObjectTypes(in string path); // Get the IManagedObject, wrapped in "Any" CORBA object, at a given path in the // ITree.The path is an absolute path from the ITree root. any find(in string path); // This method can be called by TreeClient to tell TreeServant that it is ready to // receive information about changes/updates of IManagedObjects at "nodePaths". void setValid(in StringList nodePaths); // This method can be called by TreeClient to get list of current updates. // This method also cleans-up/invalidetes all updates included in the EventList. EventList updates(); };
Conclusion • We have working CORBA prototype in JAIDA. (So far for IHistogram1D and DataPointSet only). • Demo • Maybe need more in AIDA infrastructure, like notification mechanism: • IObservable, IListener, IEvent ?