66# ==============================================================================
77import logging
88import shelve
9+ from uuid import UUID
910
1011from .csapi4py .default_api_helpers import APIHelper
11- from .resource_datamodels import DatastreamResource
12- from .datasource import DataStream , MessageWrapper
12+ from .datasource import MessageWrapper
1313from .datastore import DataStore
14+ from .resource_datamodels import DatastreamResource
1415from .streamableresource import Node , System , SessionManager , Datastream
1516from .styling import Styling
1617from .timemanagement import TemporalModes , TimeManagement , TimePeriod
@@ -25,7 +26,7 @@ class OSHConnect:
2526 _systems : list [System ] = []
2627 _cs_api_builder : APIHelper = None
2728 # _datasource_handler: DataStreamHandler = None
28- _datastreams : list [DataStream ] = []
29+ _datastreams : list [Datastream ] = []
2930 _datataskers : list [DataStore ] = []
3031 _datagroups : list = []
3132 _tasks : list = []
@@ -38,15 +39,6 @@ def __init__(self, name: str, **kwargs):
3839 :param kwargs:
3940 """
4041 self ._name = name
41- # if 'nodes' in kwargs:
42- # self._nodes = kwargs['nodes']
43- # self._playback_mode = kwargs['playback_mode']
44- # self._datasource_handler.set_playback_mode(self._playback_mode)
45- # self._datasource_handler = DataStreamHandler()
46- # if 'playback_mode' in kwargs:
47- # self._playback_mode = kwargs['playback_mode']
48- # self._datasource_handler.set_playback_mode(self._playback_mode)
49-
5042 logging .info (f"OSHConnect instance { name } created" )
5143 self ._session_manager = SessionManager ()
5244
@@ -116,48 +108,20 @@ def select_temporal_mode(self, mode: str):
116108 """
117109 pass
118110
119- async def playback_streams (self , stream_ids : list = None ):
120- """
121- Begins playback of the datastreams that have been connected to the app. The method of playback is determined
122- by the temporal mode that has been set.
123- :param stream_ids:
124- :return:
125- """
126- if stream_ids is None :
127- await self ._datasource_handler .connect_all (
128- self .timestream .get_time_range ())
129- else :
130- for stream_id in stream_ids :
131- await self ._datasource_handler .connect_ds (stream_id )
132-
133111 def visualize_streams (self , streams : list ):
134112 pass
135113
136114 # Second Level Use Cases
137115 def get_visualization_recommendations (self , streams : list ):
138116 pass
139117
140- def dep_discover_datastreams (self ):
141- """
142- Discover datastreams of the current systems of the OSHConnect instance and create objects for them that are
143- stored in the DataSourceHandler.
144- :return:
145- """
146- # NOTE: This will need to check to prevent dupes in the future
147- for system in self ._systems :
148- res_datastreams = system .discover_datastreams ()
149- # create DataSource(s)
150- new_datasource = [
151- DataStream (name = ds .name , datastream = ds , parent_system = system .get_system_resource ())
152- for ds in
153- res_datastreams ]
154- self ._datastreams .extend (new_datasource )
155- list (map (self ._datasource_handler .add_datasource , new_datasource ))
156-
157118 def discover_datastreams (self ):
158119 for system in self ._systems :
159120 res_datastreams = system .discover_datastreams ()
160- datastreams = list (map (lambda ds : Datastream (parent_node = system .get_parent_node (), id = ds .ds_id , datastream_resource = ds ), res_datastreams ))
121+ datastreams = list (
122+ map (lambda ds : Datastream (parent_node = system .get_parent_node (), id = ds .ds_id , datastream_resource = ds ),
123+ res_datastreams ))
124+ datastreams = [ds .set_parent_resource_id (system .get_underlying_resource ().system_id ) for ds in datastreams ]
161125 self ._datastreams .extend (datastreams )
162126
163127 def discover_systems (self , nodes : list [str ] = None ):
@@ -279,13 +243,54 @@ def remove_system(self, system_id: str):
279243 pass
280244
281245 # DataStream Helpers
282- def get_datastreams (self ) -> list [DataStream ]:
246+ def get_datastreams (self ) -> list [Datastream ]:
283247 return self ._datastreams
284248
249+ def get_datastream_ids (self ) -> list [UUID ]:
250+ return [ds .get_internal_id () for ds in self ._datastreams ]
251+
285252 def connect_session_streams (self , session_id : str ):
286253 """
287254 Connects all datastreams that are associated with the given session ID.
288255 :param session_id:
289256 :return:
290257 """
291258 self ._session_manager .start_session_streams (session_id )
259+
260+ def get_resource_group (self , resource_ids : list [UUID ]) -> tuple [list [System ], list [Datastream ]]:
261+ """
262+ Get a group of resources by their IDs. Can be any mix of systems, datastreams, and controlstreams.
263+ :param resource_ids: list of resource IDs (internal UUID)
264+ """
265+ systems = [system for system in self ._systems if system .get_internal_id () in resource_ids ]
266+ datastreams = [ds for ds in self ._datastreams if ds .get_internal_id () in resource_ids ]
267+ return systems , datastreams
268+
269+ def initialize_resource_groups (self , resource_ids : list = None ):
270+ """
271+ Initializes the datastreams that are specified.
272+ """
273+ systems , datastreams = self .get_resource_group (resource_ids )
274+
275+ if systems :
276+ for system in systems :
277+ system .initialize ()
278+ if datastreams :
279+ for ds in datastreams :
280+ ds .initialize ()
281+
282+ def start_datastreams (self , dsid_list : list = None ):
283+ """
284+ Starts the datastreams that are specified.
285+ """
286+ datastreams = self .get_resource_group (dsid_list )[1 ]
287+ for ds in datastreams :
288+ ds .start ()
289+
290+ def start_systems (self , sysid_list : list = None ):
291+ """
292+ Starts the systems that are specified.
293+ """
294+ systems = self .get_resource_group (sysid_list )[0 ]
295+ for system in systems :
296+ system .start ()
0 commit comments