Source code for nxswriter.DataSourceFactory

#!/usr/bin/env python
#   This file is part of nexdatas - Tango Server for NeXus data writer
#
#    Copyright (C) 2012-2017 DESY, Jan Kotanski <jkotan@mail.desy.de>
#
#    nexdatas is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    nexdatas is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with nexdatas.  If not, see <http://www.gnu.org/licenses/>.
#

""" factory with datasources """

import weakref

from .Element import Element
from .StreamSet import StreamSet
from .DataSources import DataSource


[docs]class DataSourceFactory(Element): """ Data source creator """ def __init__(self, attrs, last, streams=None): """ constructor :param attrs: dictionary with the tag attributes :type attrs: :obj:`dict` <:obj:`str`, :obj:`str`> :param last: the last element on the stack :type last: :class:`nxswriter.Element.Element` :param streams: tango-like steamset class :type streams: :class:`StreamSet` or :class:`tango.LatestDeviceImpl` """ Element.__init__(self, "datasource", attrs, last, streams=streams) #: (:class:`nxswriter.DataSourcePool.DataSourcePool`) datasource pool self.__dsPool = None
[docs] def setDataSources(self, datasources): """ sets the used datasources :param datasources: pool to be set :type datasources: :class:`nxswriter.DataSourcePool.DataSourcePool` """ self.__dsPool = datasources
def __createDSource(self, attrs): """ creates data source :param attrs: dictionary with the tag attributes :type attrs: :obj:`dict` <:obj:`str`, :obj:`str`> """ if "type" in attrs.keys(): if self.__dsPool and self.__dsPool.hasDataSource(attrs["type"]): name = attrs["name"] if "name" in attrs.keys() else None streams = weakref.ref(self._streams) \ if self._streams else (lambda: None) try: self.last.source = self.__dsPool.get(attrs["type"])( streams=StreamSet(streams), name=name) except Exception: self.last.source = self.__dsPool.get(attrs["type"])( streams=StreamSet(streams)) else: if self._streams: self._streams.error( "DataSourceFactory::__createDSource - " "Unknown data source") streams = weakref.ref(self._streams) \ if self._streams else (lambda: None) self.last.source = DataSource( streams=StreamSet(streams)) else: if self._streams: self._streams.error( "DataSourceFactory::__createDSource - " "Typeless data source") streams = weakref.ref(self._streams) \ if self._streams else (lambda: None) self.last.source = DataSource( streams=StreamSet(streams))
[docs] def store(self, xml=None, globalJSON=None): """ sets the datasource form xml string :param xml: input parameter :type xml: :obj:`str` :param globalJSON: global JSON string :type globalJSON: \ : :obj:`dict` <:obj:`str`, :obj:`dict` <:obj:`str`, any>> """ self.__createDSource(self._tagAttrs) jxml = "".join(xml) self.last.source.setup(jxml) if hasattr(self.last.source, "setJSON") and globalJSON: self.last.source.setJSON(globalJSON) if hasattr(self.last.source, "setDataSources"): self.last.source.setDataSources(self.__dsPool) if self.last and hasattr(self.last, "tagAttributes"): self.last.tagAttributes["nexdatas_source"] = ("NX_CHAR", jxml)
[docs] def setDecoders(self, decoders): """ sets the used decoders :param decoders: pool to be set :type decoders: :class:`nxswriter.DecoderPool.DecoderPool` """ if self.last and self.last.source and self.last.source.isValid() \ and hasattr(self.last.source, "setDecoders"): self.last.source.setDecoders(decoders)