nxsconfigserver 2.16.0__tar.gz → 2.17.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/ChangeLog +4 -0
  2. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/NXSConfigServer.xmi +17 -4
  3. {nxsconfigserver-2.16.0/nxsconfigserver.egg-info → nxsconfigserver-2.17.0}/PKG-INFO +1 -1
  4. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/Attributes.html +10 -0
  5. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/FullDocument.html +184 -46
  6. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/Properties.html +6 -0
  7. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/nxsconfigserver/Merger.py +101 -29
  8. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/nxsconfigserver/NXSConfigServer.py +48 -0
  9. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/nxsconfigserver/Release.py +1 -1
  10. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/nxsconfigserver/XMLConfigurator.py +63 -0
  11. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0/nxsconfigserver.egg-info}/PKG-INFO +1 -1
  12. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/test/Merger_test.py +308 -0
  13. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/test/XMLConfigurator_test.py +6 -2
  14. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/.ci/debian10_py2/Dockerfile +0 -0
  15. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/.ci/debian10_py3/Dockerfile +0 -0
  16. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/.ci/debian11_py3/Dockerfile +0 -0
  17. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/.ci/debian8_py2/Dockerfile +0 -0
  18. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/.ci/debian8_py3/Dockerfile +0 -0
  19. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/.ci/debian9_py2/Dockerfile +0 -0
  20. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/.ci/debian9_py3/Dockerfile +0 -0
  21. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/.ci/install.sh +0 -0
  22. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/.ci/run.sh +0 -0
  23. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/.ci/ubuntu16.04_py2/Dockerfile +0 -0
  24. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/.ci/ubuntu16.04_py3/Dockerfile +0 -0
  25. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/.ci/ubuntu18.04_py2/Dockerfile +0 -0
  26. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/.ci/ubuntu18.04_py3/Dockerfile +0 -0
  27. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/.ci/ubuntu20.04_py3/Dockerfile +0 -0
  28. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/.flake8 +0 -0
  29. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/.github/workflows/tests.yml +0 -0
  30. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/.gitignore +0 -0
  31. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/.oldtravis.yml +0 -0
  32. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/COPYRIGHT +0 -0
  33. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/MANIFEST.in +0 -0
  34. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/NXSConfigServer +0 -0
  35. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/README.rst +0 -0
  36. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/conf/my.cnf +0 -0
  37. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/conf/mysql_create.sql +0 -0
  38. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc/Makefile +0 -0
  39. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc/conf.py +0 -0
  40. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc/index.rst +0 -0
  41. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc/make.bat +0 -0
  42. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc/nxsconfigserver.rst +0 -0
  43. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/AttrCanFailDataSources.html +0 -0
  44. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/AttrJSONSettings.html +0 -0
  45. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/AttrLinkDataSources.html +0 -0
  46. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/AttrSTEPDataSources.html +0 -0
  47. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/AttrSelection.html +0 -0
  48. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/AttrVariables.html +0 -0
  49. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/AttrVersion.html +0 -0
  50. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/AttrXMLString.html +0 -0
  51. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/ClassDescription.html +0 -0
  52. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdAvailableComponents.html +0 -0
  53. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdAvailableDataSources.html +0 -0
  54. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdAvailableSelections.html +0 -0
  55. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdClose.html +0 -0
  56. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdComponentDataSources.html +0 -0
  57. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdComponentVariables.html +0 -0
  58. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdComponents.html +0 -0
  59. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdComponentsDataSources.html +0 -0
  60. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdComponentsVariables.html +0 -0
  61. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdCreateConfiguration.html +0 -0
  62. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdDataSources.html +0 -0
  63. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdDeleteComponent.html +0 -0
  64. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdDeleteDataSource.html +0 -0
  65. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdDeleteSelection.html +0 -0
  66. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdDependentComponents.html +0 -0
  67. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdInstantiatedComponents.html +0 -0
  68. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdMandatoryComponents.html +0 -0
  69. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdMerge.html +0 -0
  70. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdOpen.html +0 -0
  71. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdSelections.html +0 -0
  72. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdSetComponentDataSources.html +0 -0
  73. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdSetMandatoryComponents.html +0 -0
  74. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdState.html +0 -0
  75. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdStatus.html +0 -0
  76. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdStoreComponent.html +0 -0
  77. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdStoreDataSource.html +0 -0
  78. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdStoreSelection.html +0 -0
  79. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/CmdUnsetMandatoryComponents.html +0 -0
  80. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/Commands.html +0 -0
  81. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/States.html +0 -0
  82. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/TitleBanner.html +0 -0
  83. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/doc_html/index.html +0 -0
  84. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/man/NXSConfigServer.1 +0 -0
  85. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/nxsconfigserver/ComponentParser.py +0 -0
  86. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/nxsconfigserver/Errors.py +0 -0
  87. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/nxsconfigserver/MYSQLDataBase.py +0 -0
  88. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/nxsconfigserver/StreamSet.py +0 -0
  89. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/nxsconfigserver/__init__.py +0 -0
  90. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/nxsconfigserver.egg-info/SOURCES.txt +0 -0
  91. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/nxsconfigserver.egg-info/dependency_links.txt +0 -0
  92. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/nxsconfigserver.egg-info/not-zip-safe +0 -0
  93. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/nxsconfigserver.egg-info/requires.txt +0 -0
  94. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/nxsconfigserver.egg-info/top_level.txt +0 -0
  95. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/setup.cfg +0 -0
  96. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/setup.py +0 -0
  97. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/test/ComponentHandler_test.py +0 -0
  98. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/test/Errors_test.py +0 -0
  99. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/test/MYSQLDataBase_test.py +0 -0
  100. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/test/NXSConfigServer_test.py +0 -0
  101. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/test/ServerSetUp.py +0 -0
  102. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/test/StreamSet_test.py +0 -0
  103. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/test/__init__.py +0 -0
  104. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/test/__main__.py +0 -0
  105. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/test/checks.py +0 -0
  106. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/test/main.py +0 -0
  107. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/tools/ndts.sql +0 -0
  108. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/tools/setupServer.py +0 -0
  109. {nxsconfigserver-2.16.0 → nxsconfigserver-2.17.0}/tools/simpleClient.py +0 -0
@@ -1,3 +1,7 @@
1
+ 2025-04-15 Jan Kotanski <jankotan@gmail.com>
2
+ * add ExtraLinkDataSources attribute and ExtraLinkPath property(#68)
3
+ * tagged as v2.17.0
4
+
1
5
  2025-04-09 Jan Kotanski <jankotan@gmail.com>
2
6
  * add support for vds tags (#65)
3
7
  * tagged as v2.16.0
@@ -1,7 +1,7 @@
1
1
  <?xml version="1.0" encoding="ASCII"?>
2
- <pogoDsl:PogoSystem xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:pogoDsl="http://www.esrf.fr/tango/pogo/PogoDsl">
3
- <classes name="NXSConfigServer" pogoRevision="9.4">
4
- <description description="NeXuS Configuration Server is a Tango Server with its implementation based&#xA;on a MySQL database. It allows to store XML configuration datasources&#xA;and components. It also gives possibility to select mandatory components&#xA;and perform the process of component merging.&#xA;&#xA;Source code: https://github.com/nexdatas/nxsconfigserver/&#xA;Web page: https://nexdatas.github.io/nxsconfigserver/&#xA;NexDaTaS Web page: https://nexdatas.github.io&#xA;" title="Configuration Server for Nexus Data Writer" sourcePath="/home/jkotan/ndts/nexdatas.configserver" language="Python" filestogenerate="XMI file,Code files,Protected Regions,html Pages" license="GPL" hasMandatoryProperty="false" hasConcreteProperty="true" hasAbstractCommand="false" hasAbstractAttribute="false" descriptionHtmlExists="false">
2
+ <pogoDsl:PogoSystem xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:pogoDsl="http://tango.org/pogo/PogoDsl">
3
+ <classes name="NXSConfigServer" pogoRevision="9.8">
4
+ <description description="NeXuS Configuration Server is a Tango Server with its implementation based&#xA;on a MySQL database. It allows to store XML configuration datasources&#xA;and components. It also gives possibility to select mandatory components&#xA;and perform the process of component merging.&#xA;&#xA;Source code: https://github.com/nexdatas/nxsconfigserver/&#xA;Web page: https://nexdatas.github.io/nxsconfigserver/&#xA;NexDaTaS Web page: https://nexdatas.github.io&#xA;" title="Configuration Server for Nexus Data Writer" sourcePath="/home/jkotan/ndts/nxsconfigserver" language="Python" filestogenerate="XMI file,Protected Regions,html Pages" license="GPL" hasMandatoryProperty="false" hasConcreteProperty="true" hasAbstractCommand="false" hasAbstractAttribute="false" descriptionHtmlExists="false">
5
5
  <inheritances classname="Device_Impl" sourcePath=""/>
6
6
  <identification contact="at desy.de - jan.kotanski" author="jan.kotanski" emailDomain="desy.de" classFamily="Acquisition" siteSpecific="" platform="All Platforms" bus="Not Applicable" manufacturer="DESY" reference=""/>
7
7
  </description>
@@ -10,6 +10,11 @@
10
10
  <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
11
11
  <DefaultPropValue>&quot;XCS&quot;</DefaultPropValue>
12
12
  </deviceProperties>
13
+ <deviceProperties name="ExtraLinkPath" description="extra link path below NXentry, default: instrument:NXinstrument/collection:NXcollection">
14
+ <type xsi:type="pogoDsl:StringType"/>
15
+ <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
16
+ <DefaultPropValue>&quot;instrument:NXinstrument/collection:NXcollection&quot;</DefaultPropValue>
17
+ </deviceProperties>
13
18
  <commands name="State" description="This command gets the device state (stored in its device_state data member) and returns it to the caller." execMethod="dev_state" displayLevel="OPERATOR" polledPeriod="0">
14
19
  <argin description="none">
15
20
  <type xsi:type="pogoDsl:VoidType"/>
@@ -387,6 +392,14 @@
387
392
  <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
388
393
  <properties description="JSON list of datasources to be switched into CanFail mode during creating configuration process" label="Datasources to be switched into CanFail mode" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
389
394
  </attributes>
395
+ <attributes name="ExtraLinkDataSources" attType="Scalar" rwType="READ_WRITE" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="false">
396
+ <dataType xsi:type="pogoDsl:StringType"/>
397
+ <changeEvent fire="false" libCheckCriteria="false"/>
398
+ <archiveEvent fire="false" libCheckCriteria="false"/>
399
+ <dataReadyEvent fire="false" libCheckCriteria="true"/>
400
+ <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
401
+ <properties description="JSON list of datasources to which links will be added" label="Datasources to which extra links will be added" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
402
+ </attributes>
390
403
  <states name="ON" description="Server is ON">
391
404
  <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
392
405
  </states>
@@ -396,6 +409,6 @@
396
409
  <states name="RUNNING" description="Performing a query">
397
410
  <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
398
411
  </states>
399
- <preferences docHome="./doc_html" makefileHome="/usr/share/pogo/preferences"/>
412
+ <preferences docHome="./doc_html" makefileHome="$(TANGO_DIR)/Libraries/cppserver/common"/>
400
413
  </classes>
401
414
  </pogoDsl:PogoSystem>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nxsconfigserver
3
- Version: 2.16.0
3
+ Version: 2.17.0
4
4
  Summary: Configuration Server for Nexus Data Writer
5
5
  Home-page: http://github.com/jkotan/nexdatas/nxsconfigserver
6
6
  Author: Jan Kotanski, Eugen Wintersberger , Halil Pasic
@@ -99,6 +99,16 @@
99
99
  <td> OPERATOR </td>
100
100
  <td> JSON list of datasources to be switched into CanFail mode during creating configuration process </td>
101
101
  </tr>
102
+ <tr>
103
+ <td> <a href="AttrExtraLinkDataSources.html"> ExtraLinkDataSources </a> </td>
104
+ <td> false </td>
105
+ <td> false </td>
106
+ <td> Scalar </td>
107
+ <td> READ_WRITE </td>
108
+ <td> Tango::DEV_STRING </td>
109
+ <td> OPERATOR </td>
110
+ <td> JSON list of datasources to which links will be added </td>
111
+ </tr>
102
112
  </table>
103
113
  <br><br>
104
114
  <hr>
@@ -4,52 +4,6 @@
4
4
  <title> NXSConfigServer Tango Class User&lsquo;s Guide </title>
5
5
  </head>
6
6
  <body text="Black" bgcolor="White" link="Blue" vlink="Purple" alink="Red">
7
- <table border="0" width="100%" cellspacing="0" cellpadding="0" >
8
- <td align="center">
9
- <a href="http://www.esrf.fr/" target=new>
10
- <img src="http://www.esrf.fr/gifs/logo/80.gif" border=0 height="35"></a>
11
- </td>
12
- <td align="center">
13
- <a href="http://www.elettra.trieste.it/" target=new>
14
- <img src="http://www.esrf.fr/computing/cs/tango/elettra_logo.gif" border=0 height="35"></a>
15
- </td>
16
- <td align="center">
17
- <a href="http://www.synchrotron-soleil.fr/" target=new>
18
- <img src="http://www.esrf.fr/computing/cs/tango/soleil_logo.gif" border=0 height="35"></a>
19
- </td>
20
- <td align="center">
21
- <a href="http://www.cells.es/" target=new>
22
- <img src="http://www.esrf.fr/computing/cs/tango/alba.jpg" border=0 height="27"></a>
23
- </td>
24
- <td align="center">
25
- <a href="http://www.tango-controls.org/" target="_top">
26
- <img src="http://www.esrf.fr/computing/cs/tango/tango_logo.jpg" alt="" height="40" /></a>
27
- </td>
28
- <td align="center">
29
- <a href="http://www.desy.de/html/home/index_eng.html" target=new>
30
- <img src="http://www.esrf.fr/computing/cs/tango/desy.gif" border=0 height="26"></a>
31
- </td>
32
- <td align="center">
33
- <a href="http://www.maxlab.lu.se/maxlab/max4/index.html" target=new>
34
- <img src="http://www.esrf.fr/computing/cs/tango/maxlab.gif" border=0 height="21"></a>
35
- </td>
36
- <td align="center">
37
- <a href="http://www.frm2.tum.de/en/index.html" target=new>
38
- <img src="http://www.esrf.fr/computing/cs/tango/frm-2.jpg" border=0 height="24"></a>
39
- </td>
40
- <td align="center">
41
- <a href="http://www.synchrotron.uj.edu.pl/" target=new>
42
- <img src="http://www.esrf.fr/computing/cs/tango/solaris_logo.gif" border=0 height="21"></a>
43
- </td>
44
- <td align="center">
45
- <a href="http://www.anka.kit.edu/english/28.php" target=new>
46
- <img src="http://www.esrf.fr/computing/cs/tango/anka_blau_rot.png" border=0 height="25"></a>
47
- </td>
48
- <td align="center">
49
- <a href="http://www.eli-hu.hu/" target=new>
50
- <img src="http://www.esrf.fr/computing/cs/tango/eli-alps.jpg" border=0 height="32"></a>
51
- </td>
52
- </table>
53
7
  <hr>
54
8
  <br>
55
9
  <center><h2><u><b> NXSConfigServer Tango Python Class </b></u></h2></center> <br><br>
@@ -99,6 +53,7 @@
99
53
  <li> <a href="FullDocument.html#attrSTEPDataSources"> STEPDataSources </a>
100
54
  <li> <a href="FullDocument.html#attrLinkDataSources"> LinkDataSources </a>
101
55
  <li> <a href="FullDocument.html#attrCanFailDataSources"> CanFailDataSources </a>
56
+ <li> <a href="FullDocument.html#attrExtraLinkDataSources"> ExtraLinkDataSources </a>
102
57
  </ul>
103
58
  <li> <a href="FullDocument.html#states"> States </a>
104
59
  </ul>
@@ -188,6 +143,12 @@
188
143
  <td> String </td>
189
144
  <td> &quot;XCS&quot; <br> </td>
190
145
  </tr>
146
+ <tr>
147
+ <td> ExtraLinkPath </td>
148
+ <td> extra link path below NXentry, default: instrument:NXinstrument/collection:NXcollection </td>
149
+ <td> String </td>
150
+ <td> &quot;instrument:NXinstrument/collection:NXcollection&quot; <br> </td>
151
+ </tr>
191
152
  </table>
192
153
  <br><br>
193
154
  <hr>
@@ -1870,6 +1831,16 @@
1870
1831
  <td> OPERATOR </td>
1871
1832
  <td> JSON list of datasources to be switched into CanFail mode during creating configuration process </td>
1872
1833
  </tr>
1834
+ <tr>
1835
+ <td> <a href="AttrExtraLinkDataSources.html"> ExtraLinkDataSources </a> </td>
1836
+ <td> false </td>
1837
+ <td> false </td>
1838
+ <td> Scalar </td>
1839
+ <td> READ_WRITE </td>
1840
+ <td> Tango::DEV_STRING </td>
1841
+ <td> OPERATOR </td>
1842
+ <td> JSON list of datasources to which links will be added </td>
1843
+ </tr>
1873
1844
  </table>
1874
1845
  <br><br>
1875
1846
  <hr>
@@ -3214,6 +3185,173 @@
3214
3185
  </table>
3215
3186
  <br><br>
3216
3187
  <hr>
3188
+ <a name="attrExtraLinkDataSources"> </a>
3189
+ <br><br><br>
3190
+ <font size="+1"><u><b> Attribute ExtraLinkDataSources : </b></u></font>
3191
+ <ul>
3192
+ JSON list of datasources to which links will be added
3193
+ </ul>
3194
+ <br><br><br>
3195
+ <Table Border=0 Cellpadding=0 CELLSPACING=20>
3196
+ <TR>
3197
+ <TD ALIGN="left" VALIGN=top>
3198
+ <Table Border=2 Cellpadding=3 CELLSPACING=0>
3199
+ <tr bgcolor="#CCCCFF" class="TableHeadingColor">
3200
+ <td colspan=0> <font size=+1> <center><b> Attribute Definition </b></font></center></td>
3201
+ </tr>
3202
+ <tr>
3203
+ <td> Attribute Type </td>
3204
+ <td> Scalar </td>
3205
+ </tr>
3206
+ <tr>
3207
+ <td> R/W Type </td>
3208
+ <td> READ_WRITE </td>
3209
+ </tr>
3210
+ <tr>
3211
+ <td> Data Type </td>
3212
+ <td> Tango::DEV_STRING </td>
3213
+ </tr>
3214
+ <tr>
3215
+ <td> Display Level </td>
3216
+ <td> OPERATOR </td>
3217
+ </tr>
3218
+ <tr>
3219
+ <td> Inherited </td>
3220
+ <td> false </td>
3221
+ </tr>
3222
+ <tr>
3223
+ <td> Abstract </td>
3224
+ <td> false </td>
3225
+ </tr>
3226
+ <tr>
3227
+ <td> Polling Period </td>
3228
+ <td> Not polled </td>
3229
+ </tr>
3230
+ <tr>
3231
+ <td> Memorized </td>
3232
+ <td> Not set </td>
3233
+ </tr>
3234
+ <Tr BGCOLOR="#CCCCFF"><Td><Hr></Td><Td><Hr></Td></Tr>
3235
+ <tr>
3236
+ <td> Read allowed for </td>
3237
+ <td> All states </td>
3238
+ </tr>
3239
+ <tr>
3240
+ <td> Write allowed for </td>
3241
+ <td> All states </td>
3242
+ </tr>
3243
+ </table>
3244
+ </td>
3245
+ <TD ALIGN="Center" VALIGN=top>
3246
+ <Table Border=2 Cellpadding=3 CELLSPACING=0>
3247
+ <tr bgcolor="#CCCCFF" class="TableHeadingColor">
3248
+ <td colspan=0> <font size=+1> <center><b> Attribute Properties </b></font></center></td>
3249
+ </tr>
3250
+ <tr>
3251
+ <td> label </td>
3252
+ <td> Datasources to which extra links will be added </td>
3253
+ </tr>
3254
+ <tr>
3255
+ <td> unit </td>
3256
+ <td> </td>
3257
+ </tr>
3258
+ <tr>
3259
+ <td> standard unit </td>
3260
+ <td> </td>
3261
+ </tr>
3262
+ <tr>
3263
+ <td> display unit </td>
3264
+ <td> </td>
3265
+ </tr>
3266
+ <tr>
3267
+ <td> format </td>
3268
+ <td> </td>
3269
+ </tr>
3270
+ <tr>
3271
+ <td> max_value </td>
3272
+ <td> </td>
3273
+ </tr>
3274
+ <tr>
3275
+ <td> min_value </td>
3276
+ <td> </td>
3277
+ </tr>
3278
+ <tr>
3279
+ <td> max_alarm </td>
3280
+ <td> </td>
3281
+ </tr>
3282
+ <tr>
3283
+ <td> min_alarm </td>
3284
+ <td> </td>
3285
+ </tr>
3286
+ <tr>
3287
+ <td> max_warning </td>
3288
+ <td> </td>
3289
+ </tr>
3290
+ <tr>
3291
+ <td> min_warning </td>
3292
+ <td> </td>
3293
+ </tr>
3294
+ <tr>
3295
+ <td> delta_time </td>
3296
+ <td> </td>
3297
+ </tr>
3298
+ <tr>
3299
+ <td> delta_val </td>
3300
+ <td> </td>
3301
+ </tr>
3302
+ </table>
3303
+ </td>
3304
+ <TD ALIGN="Right" VALIGN=top>
3305
+ <Table Border=2 Cellpadding=3 CELLSPACING=0>
3306
+ <tr bgcolor="#CCCCFF" class="TableHeadingColor">
3307
+ <td colspan=0> <font size=+1> <center><b> Attribute Event Criteria </b></font></center></td>
3308
+ </tr>
3309
+ <tr>
3310
+ <td> Periodic </td>
3311
+ <td> Not set </td>
3312
+ </tr>
3313
+ <tr>
3314
+ <td> Relative Change </td>
3315
+ <td> Not set </td>
3316
+ </tr>
3317
+ <tr>
3318
+ <td> Absolute Change </td>
3319
+ <td> Not set </td>
3320
+ </tr>
3321
+ <Tr BGCOLOR="#CCCCFF"><Td><Hr></Td><Td><Hr></Td></Tr>
3322
+ <tr>
3323
+ <td> Archive Periodic </td>
3324
+ <td> Not set </td>
3325
+ </tr>
3326
+ <tr>
3327
+ <td> Archive Relative Change </td>
3328
+ <td> Not set </td>
3329
+ </tr>
3330
+ <tr>
3331
+ <td> Archive Absolute Change </td>
3332
+ <td> Not set </td>
3333
+ </tr>
3334
+ <Tr BGCOLOR="#CCCCFF"><Td><Hr></Td><Td><Hr></Td></Tr>
3335
+ <tr>
3336
+ <td> Push Change event by user code </td>
3337
+ <td> false </td>
3338
+ </tr>
3339
+ <Tr BGCOLOR="#CCCCFF"><Td> </Td><Td> </Td></Tr>
3340
+ <tr>
3341
+ <td> Push Archive event by user code </td>
3342
+ <td> false </td>
3343
+ </tr>
3344
+ <Tr BGCOLOR="#CCCCFF"><Td> </Td><Td> </Td></Tr>
3345
+ <tr>
3346
+ <td> Push DataReady event by user code </td>
3347
+ <td> false </td>
3348
+ </tr>
3349
+ </table>
3350
+ </td>
3351
+ </TR>
3352
+ </table>
3353
+ <br><br>
3354
+ <hr>
3217
3355
  <br><br>
3218
3356
  <hr>
3219
3357
  <a name="states"> </a>
@@ -24,6 +24,12 @@
24
24
  <td> String </td>
25
25
  <td> &quot;XCS&quot; <br> </td>
26
26
  </tr>
27
+ <tr>
28
+ <td> ExtraLinkPath </td>
29
+ <td> extra link path below NXentry, default: instrument:NXinstrument/collection:NXcollection </td>
30
+ <td> String </td>
31
+ <td> &quot;instrument:NXinstrument/collection:NXcollection&quot; <br> </td>
32
+ </tr>
27
33
  </table>
28
34
  </body>
29
35
  </html>
@@ -131,9 +131,18 @@ class Merger(object):
131
131
  #: (:obj:`list` <:obj:`str`> ) aliased to add links
132
132
  self.linkdatasources = []
133
133
 
134
+ #: (:obj:`list` <:obj:`str`> ) aliased to add extralinks
135
+ self.extralinkdatasources = []
136
+
134
137
  #: (:obj:`list` <:obj:`str`> ) aliased to switch to CanFial mode
135
138
  self.canfaildatasources = []
136
139
 
140
+ #: (:obj:`list` <:obj:`str`> ) extra link path
141
+ self.extralinkpath = []
142
+
143
+ #: (:obj:`list` <:obj:`str`> ) data link path
144
+ self.linkpath = [("data", "NXdata")]
145
+
137
146
  #: (:obj:`str`) datasource label
138
147
  self.__dsvars = "$datasources."
139
148
 
@@ -155,6 +164,8 @@ class Merger(object):
155
164
 
156
165
  :param node: dom node
157
166
  :type node: :obj:`xml.etree.ElementTree.Element`
167
+ :param ancestors: list with NeXus path nodes (tag, name, type)
168
+ :type ancestors: :obj:`list`< (:obj:`str`,:obj:`str`,:obj:`str`) >
158
169
  :returns: xml path
159
170
  :rtype: :obj:`str`
160
171
  """
@@ -178,6 +189,8 @@ class Merger(object):
178
189
  :type elem1: :obj:`xml.etree.ElementTree.Element`
179
190
  :param elem2: second element
180
191
  :type elem2: :obj:`xml.etree.ElementTree.Element`
192
+ :param ancestors: list with NeXus path nodes (tag, name, type)
193
+ :type ancestors: :obj:`list`< (:obj:`str`,:obj:`str`,:obj:`str`) >
181
194
  :returns: bool varaible if two elements are mergeable
182
195
  :rtype: :obj:`bool`
183
196
  """
@@ -244,6 +257,8 @@ class Merger(object):
244
257
  :type elem1: :obj:`xml.etree.ElementTree.Element`
245
258
  :param elem2: second element
246
259
  :type elem2: :obj:`xml.etree.ElementTree.Element`
260
+ :param parent: the given parent node
261
+ :type parent: :obj:`xml.etree.ElementTree.Element`
247
262
  """
248
263
  attr2 = elem2.attrib
249
264
  texts = []
@@ -283,11 +298,20 @@ class Merger(object):
283
298
 
284
299
  parent.remove(elem2)
285
300
 
286
- def __mergeChildren(self, node, ancestors, entrynode=None):
301
+ def __mergeChildren(self, node, ancestors, entrynode=None,
302
+ datanode=None, linknode=None):
287
303
  """ merge the given node
288
304
 
289
305
  :param node: the given node
290
306
  :type node: :obj:`xml.etree.ElementTree.Element`
307
+ :param ancestors: list with NeXus path nodes (tag, name, type)
308
+ :type ancestors: :obj:`list`< (:obj:`str`,:obj:`str`,:obj:`str`) >
309
+ :param entrynode: entry node
310
+ :type entrynode: :class:`xml.etree.ElementTree.Element`
311
+ :param datanode: data node
312
+ :type datanode: :class:`xml.etree.ElementTree.Element`
313
+ :param linknode: link node
314
+ :type linknode: :class:`xml.etree.ElementTree.Element`
291
315
  """
292
316
  if node is not None and node.tag != "definition":
293
317
  newancestors = tuple(
@@ -328,11 +352,18 @@ class Merger(object):
328
352
  self.__getAncestors(child, newancestors)),
329
353
  [child])
330
354
 
331
- self.__mergeChildren(child, newancestors, entrynode)
355
+ self.__mergeChildren(child, newancestors, entrynode,
356
+ datanode, linknode)
332
357
  if cName in self.switchable and self.switchdatasources:
333
358
  self.__switch(child)
334
359
  if cName in self.linkable and self.linkdatasources:
335
- self.__addlink(child, newancestors, entrynode)
360
+ datanode = self.__addlink(
361
+ child, newancestors, entrynode, datanode,
362
+ self.linkdatasources, self.linkpath)
363
+ if cName in self.linkable and self.extralinkdatasources:
364
+ linknode = self.__addlink(
365
+ child, newancestors, entrynode, linknode,
366
+ self.extralinkdatasources, self.extralinkpath)
336
367
  if cName in self.switchable and self.canfaildatasources:
337
368
  self.__canfail(child)
338
369
 
@@ -465,27 +496,38 @@ class Merger(object):
465
496
  if stnode is not None and dsnode is not None:
466
497
  stnode.attrib["canfail"] = "true"
467
498
 
468
- def __addlink(self, node, ancestors, entrynode):
499
+ def __addlink(self, node, ancestors, entrynode, linknode, linkdatasources,
500
+ linkpath=None):
469
501
  """ add link in NXdata group
470
502
 
471
503
  :param node: the given node
472
504
  :type node: :obj:`xml.etree.ElementTree.Element`
505
+ :param ancestors: list with NeXus path nodes (tag, name, type)
506
+ :type ancestors: :obj:`list`< (:obj:`str`,:obj:`str`,:obj:`str`) >
507
+ :param entrynode: root node
508
+ :type entrynode: :class:`xml.etree.ElementTree.Element`
509
+ :param linknode: the given link node
510
+ :type linknode: :obj:`xml.etree.ElementTree.Element`
511
+ :param linkpath: list with NeXus path (name, type)
512
+ :type linkpath: :obj:`list` < (:obj:`str`,:obj:`str`) >
513
+ :returns: the current link node
514
+ :rtype: :obj:`xml.etree.ElementTree.Element`
473
515
  """
474
516
  if node is not None:
475
517
  dsname = None
476
518
  dsnode = None
477
519
 
478
520
  dsname, dsnode = self.__getTextDataSource(
479
- node, self.linkdatasources)
521
+ node, linkdatasources)
480
522
  for child in node:
481
523
  cName = unicode(child.tag)
482
524
  if cName == 'datasource':
483
525
  dsname = child.get("name")
484
- if dsname in self.linkdatasources:
526
+ if dsname in linkdatasources:
485
527
  dsnode = child
486
528
  else:
487
529
  dsname, dsnode = self.__getTextDataSource(
488
- child, self.linkdatasources)
530
+ child, linkdatasources)
489
531
  if dsnode is not None:
490
532
  break
491
533
  if dsnode is not None:
@@ -494,46 +536,76 @@ class Merger(object):
494
536
  for anc in reversed(ancestors):
495
537
  path.append((anc[1], anc[2]))
496
538
  linkfound = False
497
- datanode = None
498
539
  if entrynode is not None:
499
- for gchild in entrynode:
500
- if gchild.get("name") == 'data' \
501
- and gchild.get("type") == 'NXdata':
502
- datanode = gchild
503
- for dchild in datanode:
504
- if dchild.get("name") == dsname:
505
- linkfound = True
540
+ if linknode is None:
541
+ # found linknode
542
+ parent = entrynode
543
+ for nm, tp in linkpath:
544
+ node = None
545
+ for gchild in parent:
546
+ if gchild.get("name") == nm \
547
+ and gchild.get("type") == tp:
548
+ node = gchild
506
549
  break
550
+ if node is None:
551
+ break
552
+ else:
553
+ parent = node
554
+ else:
555
+ linknode = parent
556
+
557
+ if linknode is not None:
558
+ for dchild in linknode:
559
+ if dchild.get("name") == dsname:
560
+ linkfound = True
561
+ break
507
562
  if not linkfound:
508
- self.__createLink(entrynode, datanode, path)
563
+ linknode = self.__createLink(
564
+ entrynode, linknode, path, linkpath)
565
+ return linknode
509
566
 
510
- def __createLink(self, entry, data, path):
567
+ def __createLink(self, entrynode, linknode, path, linkpath=None):
511
568
  """ create link on given node
512
569
 
513
- :param root: root node
514
- :type root: :class:`xml.etree.ElementTree.Element`
515
- :param node: the given node
516
- :type node: :obj:`xml.etree.ElementTree.Element`
570
+ :param entrynode: root node
571
+ :type entrynode: :class:`xml.etree.ElementTree.Element`
572
+ :param linknode: the given link node
573
+ :type linknode: :obj:`xml.etree.ElementTree.Element`
517
574
  :param path: list with NeXus path (name, type)
518
- :type node: :obj:`list` < (:obj:`str`,:obj:`str`) >
575
+ :type path: :obj:`list` < (:obj:`str`,:obj:`str`) >
576
+ :param linkpath: list with NeXus path (name, type)
577
+ :type linkpath: :obj:`list` < (:obj:`str`,:obj:`str`) >
578
+ :returns: the current link node
579
+ :rtype: :obj:`xml.etree.ElementTree.Element`
519
580
  """
520
-
521
581
  if path:
522
582
  target, dsname = path[0]
523
583
  if target:
524
- if data is None:
525
- data = etree.Element("group")
526
- entry.append(data)
527
- data.attrib["type"] = "NXdata"
528
- data.attrib["name"] = "data"
584
+ if linknode is None:
585
+ linknode = entrynode
586
+ if linkpath is None:
587
+ linkpath = [("data", "NXdata")]
588
+ for nm, tp in linkpath:
589
+ for gchild in linknode:
590
+ if gchild.get("name") == nm \
591
+ and gchild.get("type") == tp:
592
+ linknode = gchild
593
+ break
594
+ else:
595
+ node = etree.Element("group")
596
+ linknode.append(node)
597
+ linknode = node
598
+ linknode.attrib["type"] = tp
599
+ linknode.attrib["name"] = nm
529
600
  for gname, gtype in path[1:]:
530
601
  target = "%s:%s/" % (gname, gtype) + target
531
602
  target = "/" + target
532
603
  if dsname:
533
604
  link = etree.Element("link")
534
- data.append(link)
605
+ linknode.append(link)
535
606
  link.attrib["target"] = "%s" % target
536
607
  link.attrib["name"] = dsname
608
+ return linknode
537
609
 
538
610
  def collect(self, components):
539
611
  """ collects the given components in one DOM tree
@@ -89,6 +89,7 @@ class NXSConfigServer(tango.LatestDeviceImpl):
89
89
  self.set_state(tango.DevState.ON)
90
90
  self.get_device_properties(self.get_device_class())
91
91
  self.xmlc.versionLabel = self.VersionLabel
92
+ self.xmlc.extraLinkPath = self.ExtraLinkPath
92
93
 
93
94
  def always_executed_hook(self):
94
95
  """ Always excuted hook method
@@ -263,6 +264,39 @@ class NXSConfigServer(tango.LatestDeviceImpl):
263
264
  return False
264
265
  return True
265
266
 
267
+ def read_ExtraLinkDataSources(self, attr):
268
+ """ Read ExtraLinkDataSources attribute
269
+
270
+ :param attr: extra link datasources attribute
271
+ :type attr: :class:`tango.Attribute`
272
+ """
273
+ self.debug_stream("In read_ExtraLinkDataSources()")
274
+ attr.set_value(self.xmlc.extralinkdatasources or "")
275
+
276
+ def write_ExtraLinkDataSources(self, attr):
277
+ """ Write ExtraLinkDataSources attribute
278
+
279
+ :param attr: extra link datasources attribute
280
+ :type attr: :class:`tango.Attribute`
281
+ """
282
+ self.debug_stream("In write_ExtraLinkDataSources()")
283
+ if self.is_ExtraLinkDataSources_write_allowed():
284
+ self.xmlc.extralinkdatasources = attr.get_write_value() or ""
285
+ else:
286
+ self.warn_stream("To change the settings please close the server.")
287
+ raise Exception(
288
+ "To change the settings please close the server.")
289
+
290
+ def is_ExtraLinkDataSources_write_allowed(self):
291
+ """ ExtraLinkDataSources attribute Write State Machine
292
+
293
+ :returns: True if the operation allowed
294
+ :rtype: :obj:`bool`
295
+ """
296
+ if self.get_state() in [tango.DevState.RUNNING]:
297
+ return False
298
+ return True
299
+
266
300
  def read_CanFailDataSources(self, attr):
267
301
  """ Read CanFailDataSources attribute
268
302
 
@@ -1135,6 +1169,11 @@ class NXSConfigServerClass(tango.DeviceClass):
1135
1169
  [tango.DevString,
1136
1170
  "version label",
1137
1171
  ["XCS"]],
1172
+ 'ExtraLinkPath':
1173
+ [tango.DevString,
1174
+ "extra link NeXus path below NXentry. "
1175
+ "Default: instrument:NXinstrument/collection:NXcollection",
1176
+ ["instrument:NXinstrument/collection:NXcollection"]],
1138
1177
  }
1139
1178
 
1140
1179
  #: (:obj:`dict` <:obj:`str`, \
@@ -1299,6 +1338,15 @@ class NXSConfigServerClass(tango.DeviceClass):
1299
1338
  'description': "JSON list of datasources"
1300
1339
  "to which links will be added",
1301
1340
  }],
1341
+ 'ExtraLinkDataSources':
1342
+ [[tango.DevString,
1343
+ tango.SCALAR,
1344
+ tango.READ_WRITE],
1345
+ {
1346
+ 'label': "Datasources to which extra links will be added",
1347
+ 'description': "JSON list of datasources"
1348
+ "to which extra links will be added",
1349
+ }],
1302
1350
  'CanFailDataSources':
1303
1351
  [[tango.DevString,
1304
1352
  tango.SCALAR,