iotagent-node-lib 2.15.1 → 2.19.0

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 (448) hide show
  1. package/.github/workflows/ci.yml +17 -1
  2. package/.readthedocs.yml +7 -0
  3. package/CHANGES_NEXT_RELEASE +0 -1
  4. package/README.md +1 -0
  5. package/doc/Contribution.md +60 -1
  6. package/doc/advanced-topics.md +136 -14
  7. package/doc/api.md +38 -22
  8. package/doc/apiary/iotagent.apib +1 -3
  9. package/doc/architecture.md +2 -2
  10. package/doc/config-basic-example.js +0 -1
  11. package/doc/deprecated.md +2 -2
  12. package/doc/development.md +13 -6
  13. package/doc/expressionLanguage.md +519 -277
  14. package/doc/getting-started.md +0 -1
  15. package/doc/howto.md +13 -17
  16. package/doc/installationguide.md +67 -69
  17. package/doc/usermanual.md +48 -16
  18. package/docker/Mosquitto/Dockerfile +4 -9
  19. package/docker/Mosquitto/README.md +2 -0
  20. package/docker/Mosquitto/startMosquitto.sh +18 -1
  21. package/lib/command/commandLine.js +1 -1
  22. package/lib/commonConfig.js +5 -14
  23. package/lib/errors.js +0 -16
  24. package/lib/fiware-iotagent-lib.js +5 -0
  25. package/lib/jexlTranformsMap.js +71 -0
  26. package/lib/model/Command.js +1 -1
  27. package/lib/model/Device.js +5 -2
  28. package/lib/model/Group.js +20 -2
  29. package/lib/model/dbConn.js +7 -1
  30. package/lib/plugins/attributeAlias.js +6 -13
  31. package/lib/plugins/bidirectionalData.js +2 -27
  32. package/lib/plugins/expressionParser.js +41 -17
  33. package/lib/plugins/expressionPlugin.js +21 -27
  34. package/lib/plugins/jexlParser.js +71 -67
  35. package/lib/plugins/multiEntity.js +68 -147
  36. package/lib/plugins/pluginUtils.js +12 -48
  37. package/lib/plugins/timestampProcessPlugin.js +1 -46
  38. package/lib/request-shim.js +111 -0
  39. package/lib/services/common/domain.js +2 -2
  40. package/lib/services/common/genericMiddleware.js +6 -2
  41. package/lib/services/common/iotManagerService.js +1 -1
  42. package/lib/services/common/securityServiceKeystone.js +1 -1
  43. package/lib/services/common/securityServiceOAuth2.js +3 -2
  44. package/lib/services/devices/deviceRegistryMongoDB.js +29 -22
  45. package/lib/services/devices/deviceService.js +56 -33
  46. package/lib/services/devices/devices-NGSI-LD.js +42 -14
  47. package/lib/services/devices/devices-NGSI-mixed.js +3 -3
  48. package/lib/services/devices/devices-NGSI-v2.js +48 -24
  49. package/lib/services/devices/registrationUtils.js +1 -134
  50. package/lib/services/groups/groupRegistryMemory.js +2 -0
  51. package/lib/services/groups/groupRegistryMongoDB.js +58 -76
  52. package/lib/services/groups/groupService.js +1 -1
  53. package/lib/services/ngsi/entities-NGSI-LD.js +205 -124
  54. package/lib/services/ngsi/entities-NGSI-v2.js +142 -32
  55. package/lib/services/ngsi/ngsiService.js +4 -6
  56. package/lib/services/ngsi/ngsiUtils.js +0 -21
  57. package/lib/services/ngsi/subscription-NGSI-LD.js +14 -5
  58. package/lib/services/ngsi/subscriptionService.js +1 -4
  59. package/lib/services/northBound/contextServer-NGSI-LD.js +7 -2
  60. package/lib/services/northBound/contextServer-NGSI-v2.js +25 -13
  61. package/lib/services/northBound/contextServer.js +1 -4
  62. package/lib/services/northBound/contextServerUtils.js +0 -81
  63. package/lib/services/northBound/deviceProvisioningServer.js +36 -9
  64. package/lib/services/northBound/northboundServer.js +2 -0
  65. package/lib/services/northBound/restUtils.js +2 -39
  66. package/lib/templates/updateDevice.json +4 -0
  67. package/lib/templates/updateDeviceLax.json +4 -0
  68. package/package.json +13 -13
  69. package/test/tools/utils.js +2 -0
  70. package/test/unit/examples/deviceProvisioningRequests/provisionAnotherDevice.json +1 -1
  71. package/test/unit/examples/deviceProvisioningRequests/provisionDeviceMissingParameters.json +1 -1
  72. package/test/unit/examples/deviceProvisioningRequests/provisionDuplicatedDev.json +1 -1
  73. package/test/unit/examples/deviceProvisioningRequests/provisionFullDevice.json +1 -1
  74. package/test/unit/examples/deviceProvisioningRequests/provisionNewDeviceMalformed1.json +1 -1
  75. package/test/unit/examples/groupProvisioningRequests/multipleGroupsCreation.json +1 -1
  76. package/test/unit/examples/iotamRequests/registrationEmpty.json +1 -1
  77. package/test/unit/examples/iotamRequests/registrationWithGroups.json +2 -2
  78. package/test/unit/examples/iotamRequests/registrationWithGroupsWithoutCB.json +2 -2
  79. package/test/unit/examples/iotamRequests/registrationWithStaticGroups.json +2 -2
  80. package/test/unit/expressions/jexlExpression-test.js +119 -0
  81. package/test/unit/general/config-multi-core-test.js +1 -1
  82. package/test/unit/general/contextBrokerKeystoneSecurityAccess-test.js +30 -77
  83. package/test/unit/general/deviceService-test.js +19 -35
  84. package/test/unit/general/loglevel-api_test.js +8 -13
  85. package/test/unit/general/migration-test.js +1 -0
  86. package/test/unit/general/startup-test.js +3 -2
  87. package/test/unit/general/statistics-persistence_test.js +2 -2
  88. package/test/unit/general/statistics-service_test.js +2 -2
  89. package/test/unit/lazyAndCommands/commandRegistry_test.js +18 -18
  90. package/test/unit/memoryRegistry/deviceRegistryMemory_test.js +16 -24
  91. package/test/unit/mongodb/mongodb-connectionoptions-test.js +2 -2
  92. package/test/unit/mongodb/mongodb-group-registry-test.js +11 -11
  93. package/test/unit/mongodb/mongodb-registry-test.js +55 -131
  94. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerIoTAgent1.json +1 -1
  95. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerIoTAgent2.json +1 -1
  96. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerIoTAgent4.json +1 -1
  97. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerIoTAgentCommands.json +1 -1
  98. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerProvisionedDevice.json +1 -1
  99. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerProvisionedDevice2.json +1 -1
  100. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup.json +1 -1
  101. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup2.json +1 -1
  102. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup3.json +1 -1
  103. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/updateCommands1.json +1 -1
  104. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/updateIoTAgent1.json +1 -1
  105. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/updateIoTAgent2.json +1 -1
  106. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/updateIoTAgent3.json +1 -1
  107. package/test/unit/ngsi-ld/examples/contextRequests/createMinimumProvisionedDevice.json +0 -7
  108. package/test/unit/ngsi-ld/examples/contextRequests/createProvisionedDevice.json +0 -7
  109. package/test/unit/ngsi-ld/examples/contextRequests/createProvisionedDeviceMultientity.json +0 -7
  110. package/test/unit/ngsi-ld/examples/contextRequests/createProvisionedDeviceWithGroupAndStatic.json +0 -14
  111. package/test/unit/ngsi-ld/examples/contextRequests/createProvisionedDeviceWithGroupAndStatic2.json +0 -14
  112. package/test/unit/ngsi-ld/examples/contextRequests/createProvisionedDeviceWithGroupAndStatic3.json +1 -15
  113. package/test/unit/ngsi-ld/examples/contextRequests/createTimeInstantMinimumDevice.json +0 -7
  114. package/test/unit/ngsi-ld/examples/contextRequests/updateContextAliasPlugin6.json +0 -7
  115. package/test/unit/ngsi-ld/examples/contextRequests/updateContextAutocast5.json +0 -7
  116. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin12a.json +7 -0
  117. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin13.json +13 -13
  118. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin16.json +0 -7
  119. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin17.json +0 -7
  120. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin1a.json +18 -0
  121. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin29.json +18 -0
  122. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin31.json +15 -0
  123. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin32.json +17 -0
  124. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin33.json +18 -0
  125. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin34.json +17 -0
  126. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin4a.json +36 -0
  127. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin5.json +0 -7
  128. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin7.json +16 -16
  129. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin8a.json +18 -0
  130. package/test/unit/ngsi-ld/examples/contextRequests/updateContextGeoproperties3.json +0 -7
  131. package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityPlugin15.json +25 -0
  132. package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityTimestampPlugin1.json +6 -6
  133. package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityTimestampPlugin2.json +3 -3
  134. package/test/unit/ngsi-ld/examples/contextRequests/updateProvisionActiveAttributes1.json +0 -7
  135. package/test/unit/ngsi-ld/examples/contextRequests/updateProvisionCommands1.json +0 -7
  136. package/test/unit/ngsi-ld/examples/contextRequests/updateProvisionDeviceStatic.json +0 -7
  137. package/test/unit/ngsi-ld/examples/contextRequests/updateProvisionMinimumDevice.json +0 -7
  138. package/test/unit/ngsi-ld/examples/subscriptionRequests/bidirectionalSubscriptionRequest.json +20 -17
  139. package/test/unit/ngsi-ld/examples/subscriptionRequests/simpleSubscriptionRequest.json +18 -15
  140. package/test/unit/ngsi-ld/examples/subscriptionRequests/simpleSubscriptionRequest2.json +18 -15
  141. package/test/unit/ngsi-ld/expressions/expressionBasedTransformations-test.js +21 -21
  142. package/test/unit/ngsi-ld/expressions/jexlBasedTransformations-test.js +1018 -0
  143. package/test/unit/ngsi-ld/general/config-jsonld-contexts-test.js +2 -2
  144. package/test/unit/ngsi-ld/general/contextBrokerOAuthSecurityAccess-test.js +24 -24
  145. package/test/unit/ngsi-ld/general/deviceService-test.js +7 -7
  146. package/test/unit/ngsi-ld/general/https-support-test.js +14 -13
  147. package/test/unit/ngsi-ld/general/iotam-autoregistration-test.js +8 -7
  148. package/test/unit/ngsi-ld/general/startup-test.js +2 -1
  149. package/test/unit/ngsi-ld/lazyAndCommands/active-devices-attribute-update-test.js +10 -8
  150. package/test/unit/ngsi-ld/lazyAndCommands/command-test.js +11 -12
  151. package/test/unit/ngsi-ld/lazyAndCommands/lazy-devices-test.js +25 -29
  152. package/test/unit/ngsi-ld/lazyAndCommands/polling-commands-test.js +16 -15
  153. package/test/unit/ngsi-ld/ngsiService/active-devices-test.js +18 -17
  154. package/test/unit/ngsi-ld/ngsiService/autocast-test.js +13 -12
  155. package/test/unit/ngsi-ld/ngsiService/geoproperties-test.js +10 -9
  156. package/test/unit/ngsi-ld/ngsiService/staticAttributes-test.js +3 -3
  157. package/test/unit/ngsi-ld/ngsiService/subscriptions-test.js +25 -24
  158. package/test/unit/ngsi-ld/plugins/alias-plugin_test.js +13 -12
  159. package/test/unit/ngsi-ld/plugins/bidirectional-plugin_test.js +27 -26
  160. package/test/unit/ngsi-ld/plugins/compress-timestamp-plugin_test.js +5 -5
  161. package/test/unit/ngsi-ld/plugins/event-plugin_test.js +3 -3
  162. package/test/unit/ngsi-ld/plugins/multientity-plugin_test.js +75 -14
  163. package/test/unit/ngsi-ld/plugins/timestamp-processing-plugin_test.js +3 -3
  164. package/test/unit/ngsi-ld/provisioning/device-provisioning-api_test.js +54 -53
  165. package/test/unit/ngsi-ld/provisioning/device-registration_test.js +20 -19
  166. package/test/unit/ngsi-ld/provisioning/device-update-registration_test.js +23 -22
  167. package/test/unit/ngsi-ld/provisioning/listProvisionedDevices-test.js +58 -70
  168. package/test/unit/ngsi-ld/provisioning/provisionDeviceMultientity-test.js +8 -7
  169. package/test/unit/ngsi-ld/provisioning/removeProvisionedDevice-test.js +19 -19
  170. package/test/unit/ngsi-ld/provisioning/singleConfigurationMode-test.js +18 -20
  171. package/test/unit/ngsi-ld/provisioning/updateProvisionedDevices-test.js +43 -49
  172. package/test/unit/ngsi-mixed/provisioning/ngsi-versioning-test.js +16 -14
  173. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerIoTAgent1.json +1 -1
  174. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerIoTAgent2.json +1 -1
  175. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerIoTAgent3.json +19 -0
  176. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerIoTAgent4.json +1 -1
  177. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerIoTAgent5.json +19 -0
  178. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerIoTAgentCommands.json +1 -1
  179. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerProvisionedDevice.json +1 -1
  180. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerProvisionedDevice2.json +1 -1
  181. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup.json +1 -1
  182. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup2.json +1 -1
  183. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup3.json +1 -1
  184. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/updateCommands1.json +3 -3
  185. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/updateIoTAgent1.json +3 -3
  186. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/updateIoTAgent2.json +1 -1
  187. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/updateIoTAgent3.json +1 -1
  188. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin1.json +17 -1
  189. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin11.json +5 -1
  190. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin12.json +2 -2
  191. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin15.json +6 -0
  192. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin16.json +14 -0
  193. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin17.json +14 -0
  194. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin18.json +6 -0
  195. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin19.json +6 -0
  196. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin2.json +13 -1
  197. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin20.json +6 -0
  198. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin21.json +6 -0
  199. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin22.json +6 -0
  200. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin23.json +6 -0
  201. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin24.json +6 -0
  202. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin25.json +6 -0
  203. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin26.json +6 -0
  204. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin27.json +6 -0
  205. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin28.json +6 -0
  206. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin29.json +22 -0
  207. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin3.json +5 -1
  208. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin30.json +6 -0
  209. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin31.json +18 -0
  210. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin32.json +16 -0
  211. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin33.json +22 -0
  212. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin34.json +12 -0
  213. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin4.json +12 -0
  214. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin5.json +5 -1
  215. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin6.json +5 -1
  216. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin7.json +5 -1
  217. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin8.json +17 -1
  218. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin9.json +5 -1
  219. package/test/unit/ngsiv2/examples/contextRequests/updateContextMiddleware1.json +10 -0
  220. package/test/unit/ngsiv2/examples/contextRequests/updateContextMiddleware2.json +10 -0
  221. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin1.json +2 -2
  222. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin10.json +1 -1
  223. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin11.json +13 -0
  224. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin12.json +33 -0
  225. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin13.json +33 -0
  226. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin14.json +33 -0
  227. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin15.json +25 -0
  228. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin16.json +25 -0
  229. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin2.json +2 -2
  230. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin3.json +1 -1
  231. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin4.json +1 -1
  232. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin5.json +1 -1
  233. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin6.json +1 -1
  234. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin7.json +1 -1
  235. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin8.json +2 -2
  236. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin9.json +1 -1
  237. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityTimestampPlugin1.json +8 -8
  238. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityTimestampPlugin2.json +4 -4
  239. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityTimestampPlugin3.json +1 -1
  240. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityTimestampPlugin4.json +2 -2
  241. package/test/unit/ngsiv2/examples/contextRequests/updateProvisionDevice.json +20 -0
  242. package/test/unit/ngsiv2/examples/subscriptionRequests/bidirectionalSubscriptionRequest.json +1 -1
  243. package/test/unit/ngsiv2/examples/subscriptionRequests/simpleSubscriptionRequest.json +1 -1
  244. package/test/unit/ngsiv2/examples/subscriptionRequests/simpleSubscriptionRequest2.json +1 -1
  245. package/test/unit/ngsiv2/expressions/expressionBasedTransformations-test.js +93 -60
  246. package/test/unit/ngsiv2/expressions/expressionCombinedTransformations-test.js +16 -16
  247. package/test/unit/ngsiv2/expressions/jexlBasedTransformations-test.js +548 -164
  248. package/test/unit/ngsiv2/general/contextBrokerOAuthSecurityAccess-test.js +34 -33
  249. package/test/unit/ngsiv2/general/deviceService-test.js +15 -14
  250. package/test/unit/ngsiv2/general/https-support-test.js +14 -13
  251. package/test/unit/ngsiv2/general/iotam-autoregistration-test.js +8 -7
  252. package/test/unit/ngsiv2/general/startup-test.js +2 -1
  253. package/test/unit/ngsiv2/lazyAndCommands/active-devices-attribute-update-test.js +9 -7
  254. package/test/unit/ngsiv2/lazyAndCommands/command-test.js +13 -12
  255. package/test/unit/ngsiv2/lazyAndCommands/lazy-devices-test.js +323 -51
  256. package/test/unit/ngsiv2/lazyAndCommands/polling-commands-test.js +22 -20
  257. package/test/unit/ngsiv2/ngsiService/active-devices-test.js +114 -26
  258. package/test/unit/ngsiv2/ngsiService/autocast-test.js +16 -16
  259. package/test/unit/ngsiv2/ngsiService/geoproperties-test.js +39 -38
  260. package/test/unit/{ngsiService → ngsiv2/ngsiService}/queryDeviceInformationInCb-test.js +25 -54
  261. package/test/unit/ngsiv2/ngsiService/staticAttributes-test.js +5 -5
  262. package/test/unit/ngsiv2/ngsiService/subscriptions-test.js +25 -24
  263. package/test/unit/ngsiv2/plugins/alias-plugin_test.js +22 -22
  264. package/test/unit/ngsiv2/plugins/bidirectional-plugin_test.js +27 -26
  265. package/test/unit/ngsiv2/plugins/compress-timestamp-plugin_test.js +7 -7
  266. package/test/unit/ngsiv2/plugins/event-plugin_test.js +4 -4
  267. package/test/unit/ngsiv2/plugins/multientity-plugin_test.js +549 -24
  268. package/test/unit/ngsiv2/plugins/timestamp-processing-plugin_test.js +4 -4
  269. package/test/unit/{plugins → ngsiv2/plugins}/translation-inPlugins_test.js +25 -25
  270. package/test/unit/{provisioning → ngsiv2/provisioning}/device-group-api-test.js +44 -75
  271. package/test/unit/{provisioning/device-group-utils_test.js → ngsiv2/provisioning/device-group-utils-test.js} +15 -14
  272. package/test/unit/ngsiv2/provisioning/device-provisioning-api_test.js +74 -73
  273. package/test/unit/ngsiv2/provisioning/device-registration_test.js +20 -19
  274. package/test/unit/ngsiv2/provisioning/device-update-registration_test.js +30 -29
  275. package/test/unit/ngsiv2/provisioning/listProvisionedDevices-test.js +58 -69
  276. package/test/unit/ngsiv2/provisioning/provisionDeviceMultientity-test.js +8 -7
  277. package/test/unit/ngsiv2/provisioning/removeProvisionedDevice-test.js +19 -19
  278. package/test/unit/ngsiv2/provisioning/singleConfigurationMode-test.js +18 -19
  279. package/test/unit/ngsiv2/provisioning/updateProvisionedDevices-test.js +49 -52
  280. package/test/unit/plugins/capture-configuration-inPlugins_test.js +6 -4
  281. package/test/unit/plugins/capture-provision-inPlugins_test.js +13 -23
  282. package/.nyc_output/016aca19-69bf-4681-9b41-2835c5131681.json +0 -1
  283. package/.nyc_output/processinfo/016aca19-69bf-4681-9b41-2835c5131681.json +0 -1
  284. package/.nyc_output/processinfo/index.json +0 -1
  285. package/lib/services/devices/devices-NGSI-v1.js +0 -293
  286. package/lib/services/devices/registrationUtils.js_avega +0 -589
  287. package/lib/services/ngsi/entities-NGSI-v1.js +0 -300
  288. package/lib/services/ngsi/subscription-NGSI-v1.js +0 -234
  289. package/lib/services/northBound/contextServer-NGSI-v1.js +0 -526
  290. package/lib/templates/notificationTemplateNgsi1.json +0 -75
  291. package/lib/templates/updateContextNgsi1.json +0 -50
  292. package/test/unit/examples/contextAvailabilityRequests/registerIoTAgent1.json +0 -21
  293. package/test/unit/examples/contextAvailabilityRequests/registerIoTAgent2.json +0 -21
  294. package/test/unit/examples/contextAvailabilityRequests/registerIoTAgent3.json +0 -25
  295. package/test/unit/examples/contextAvailabilityRequests/registerIoTAgent4.json +0 -22
  296. package/test/unit/examples/contextAvailabilityRequests/registerIoTAgentAttributeUpdates.json +0 -16
  297. package/test/unit/examples/contextAvailabilityRequests/registerIoTAgentCommands.json +0 -21
  298. package/test/unit/examples/contextAvailabilityRequests/registerNewDevice1.json +0 -21
  299. package/test/unit/examples/contextAvailabilityRequests/registerNewDevice2.json +0 -21
  300. package/test/unit/examples/contextAvailabilityRequests/registerProvisionedDevice.json +0 -25
  301. package/test/unit/examples/contextAvailabilityRequests/registerProvisionedDevice2.json +0 -21
  302. package/test/unit/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup.json +0 -33
  303. package/test/unit/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup2.json +0 -33
  304. package/test/unit/examples/contextAvailabilityRequests/unregisterDevice1.json +0 -22
  305. package/test/unit/examples/contextAvailabilityRequests/unregisterDevice3.json +0 -26
  306. package/test/unit/examples/contextAvailabilityRequests/unregisterProvisionedDevice.json +0 -26
  307. package/test/unit/examples/contextAvailabilityRequests/updateCommands1.json +0 -22
  308. package/test/unit/examples/contextAvailabilityRequests/updateIoTAgent1.json +0 -22
  309. package/test/unit/examples/contextAvailabilityRequests/updateIoTAgent2.json +0 -26
  310. package/test/unit/examples/contextAvailabilityRequests/updateIoTAgent3.json +0 -22
  311. package/test/unit/examples/contextAvailabilityResponses/registerIoTAgent1Failed.json +0 -8
  312. package/test/unit/examples/contextAvailabilityResponses/registerIoTAgent1Success.json +0 -4
  313. package/test/unit/examples/contextAvailabilityResponses/registerNewDevice1Success.json +0 -4
  314. package/test/unit/examples/contextAvailabilityResponses/registerNewDevice2Success.json +0 -4
  315. package/test/unit/examples/contextAvailabilityResponses/registerProvisionedDeviceSuccess.json +0 -4
  316. package/test/unit/examples/contextAvailabilityResponses/unregisterDevice1Failed.json +0 -8
  317. package/test/unit/examples/contextAvailabilityResponses/unregisterDevice1Success.json +0 -4
  318. package/test/unit/examples/contextAvailabilityResponses/updateCommands1Success.json +0 -4
  319. package/test/unit/examples/contextAvailabilityResponses/updateIoTAgent1Success.json +0 -6
  320. package/test/unit/examples/contextProviderResponses/queryInformationResponse.json +0 -22
  321. package/test/unit/examples/contextProviderResponses/queryInformationResponseEmptyAttributes.json +0 -22
  322. package/test/unit/examples/contextProviderResponses/queryInformationStaticAttributesResponse.json +0 -27
  323. package/test/unit/examples/contextProviderResponses/updateInformationResponse.json +0 -22
  324. package/test/unit/examples/contextProviderResponses/updateInformationResponse2.json +0 -22
  325. package/test/unit/examples/contextRequests/contextSubscriptionRequest.json +0 -20
  326. package/test/unit/examples/contextRequests/contextSubscriptionRequest2.json +0 -20
  327. package/test/unit/examples/contextRequests/createBidirectionalDevice.json +0 -17
  328. package/test/unit/examples/contextRequests/createDatetimeProvisionedDevice.json +0 -17
  329. package/test/unit/examples/contextRequests/createGeopointProvisionedDevice.json +0 -17
  330. package/test/unit/examples/contextRequests/createMinimumProvisionedDevice.json +0 -17
  331. package/test/unit/examples/contextRequests/createProvisionedDevice.json +0 -32
  332. package/test/unit/examples/contextRequests/createProvisionedDeviceMultientity.json +0 -32
  333. package/test/unit/examples/contextRequests/createProvisionedDeviceWithGroup.json +0 -47
  334. package/test/unit/examples/contextRequests/createProvisionedDeviceWithGroupAndStatic.json +0 -52
  335. package/test/unit/examples/contextRequests/createProvisionedDeviceWithGroupAndStatic2.json +0 -52
  336. package/test/unit/examples/contextRequests/createTimeinstantDevice.json +0 -17
  337. package/test/unit/examples/contextRequests/queryContext1.json +0 -13
  338. package/test/unit/examples/contextRequests/queryContext2.json +0 -13
  339. package/test/unit/examples/contextRequests/queryContextAliasPlugin1.json +0 -10
  340. package/test/unit/examples/contextRequests/queryContextCompressTimestamp1.json +0 -13
  341. package/test/unit/examples/contextRequests/updateActiveAttributes.json +0 -11
  342. package/test/unit/examples/contextRequests/updateContext1.json +0 -22
  343. package/test/unit/examples/contextRequests/updateContext2.json +0 -22
  344. package/test/unit/examples/contextRequests/updateContext3.json +0 -17
  345. package/test/unit/examples/contextRequests/updateContext3WithStatic.json +0 -22
  346. package/test/unit/examples/contextRequests/updateContext4.json +0 -22
  347. package/test/unit/examples/contextRequests/updateContext5.json +0 -19
  348. package/test/unit/examples/contextRequests/updateContextAliasPlugin.json +0 -22
  349. package/test/unit/examples/contextRequests/updateContextAliasPlugin2.json +0 -17
  350. package/test/unit/examples/contextRequests/updateContextAppendMode.json +0 -22
  351. package/test/unit/examples/contextRequests/updateContextCommandError.json +0 -22
  352. package/test/unit/examples/contextRequests/updateContextCommandExpired.json +0 -22
  353. package/test/unit/examples/contextRequests/updateContextCommandFinish.json +0 -22
  354. package/test/unit/examples/contextRequests/updateContextCommandStatus.json +0 -17
  355. package/test/unit/examples/contextRequests/updateContextCompressTimestamp1.json +0 -22
  356. package/test/unit/examples/contextRequests/updateContextCompressTimestamp2.json +0 -29
  357. package/test/unit/examples/contextRequests/updateContextExpressionPlugin1.json +0 -17
  358. package/test/unit/examples/contextRequests/updateContextExpressionPlugin2.json +0 -27
  359. package/test/unit/examples/contextRequests/updateContextExpressionPlugin3.json +0 -17
  360. package/test/unit/examples/contextRequests/updateContextExpressionPlugin4.json +0 -17
  361. package/test/unit/examples/contextRequests/updateContextExpressionPlugin5.json +0 -27
  362. package/test/unit/examples/contextRequests/updateContextMiddleware1.json +0 -22
  363. package/test/unit/examples/contextRequests/updateContextMultiEntityPlugin3.json +0 -35
  364. package/test/unit/examples/contextRequests/updateContextMultientityPlugin1.json +0 -30
  365. package/test/unit/examples/contextRequests/updateContextMultientityPlugin2.json +0 -30
  366. package/test/unit/examples/contextRequests/updateContextProcessTimestamp1.json +0 -29
  367. package/test/unit/examples/contextRequests/updateContextStaticAttributes.json +0 -22
  368. package/test/unit/examples/contextRequests/updateContextTimestamp.json +0 -41
  369. package/test/unit/examples/contextRequests/updateContextTimestampOverride.json +0 -22
  370. package/test/unit/examples/contextRequests/updateContextTimestampOverrideWithoutMilis.json +0 -22
  371. package/test/unit/examples/contextRequests/updateContextTimestampTimezone.json +0 -41
  372. package/test/unit/examples/contextRequests/updateProvisionActiveAttributes1.json +0 -17
  373. package/test/unit/examples/contextRequests/updateProvisionCommands1.json +0 -27
  374. package/test/unit/examples/contextRequests/updateProvisionDeviceStatic.json +0 -38
  375. package/test/unit/examples/contextRequests/updateProvisionMinimumDevice.json +0 -17
  376. package/test/unit/examples/contextResponses/contextSubscriptionRequest2Success.json +0 -7
  377. package/test/unit/examples/contextResponses/contextSubscriptionRequestSuccess.json +0 -7
  378. package/test/unit/examples/contextResponses/createBidirectionalDeviceSuccess.json +0 -22
  379. package/test/unit/examples/contextResponses/createDatetimeProvisionedDeviceSuccess.json +0 -22
  380. package/test/unit/examples/contextResponses/createGeopointProvisionedDeviceSuccess.json +0 -22
  381. package/test/unit/examples/contextResponses/createProvisionedDeviceSuccess.json +0 -22
  382. package/test/unit/examples/contextResponses/createTimeinstantSuccess.json +0 -22
  383. package/test/unit/examples/contextResponses/queryContext1Success.json +0 -27
  384. package/test/unit/examples/contextResponses/queryContext2Error.json +0 -7
  385. package/test/unit/examples/contextResponses/queryContext2UnknownError.json +0 -6
  386. package/test/unit/examples/contextResponses/queryContext3Error.json +0 -34
  387. package/test/unit/examples/contextResponses/queryContextAliasPlugin1Success.json +0 -27
  388. package/test/unit/examples/contextResponses/queryContextCompressTimestamp1Success.json +0 -27
  389. package/test/unit/examples/contextResponses/updateActiveAttributesSuccess.json +0 -16
  390. package/test/unit/examples/contextResponses/updateContext1Failed.json +0 -7
  391. package/test/unit/examples/contextResponses/updateContext1Success.json +0 -27
  392. package/test/unit/examples/contextResponses/updateContext2Failed.json +0 -35
  393. package/test/unit/examples/contextResponses/updateContextAliasPlugin2Success.json +0 -27
  394. package/test/unit/examples/contextResponses/updateContextAliasPluginSuccess.json +0 -27
  395. package/test/unit/examples/contextResponses/updateContextCommandFinishSuccess.json +0 -27
  396. package/test/unit/examples/contextResponses/updateContextCommandStatusSuccess.json +0 -22
  397. package/test/unit/examples/contextResponses/updateContextCompressTimestamp1Success.json +0 -27
  398. package/test/unit/examples/contextResponses/updateContextCompressTimestamp2Success.json +0 -34
  399. package/test/unit/examples/contextResponses/updateContextEvents1Success.json +0 -27
  400. package/test/unit/examples/contextResponses/updateContextExpressionPlugin1Success.json +0 -22
  401. package/test/unit/examples/contextResponses/updateContextExpressionPlugin2Success.json +0 -22
  402. package/test/unit/examples/contextResponses/updateContextExpressionPlugin3Success.json +0 -22
  403. package/test/unit/examples/contextResponses/updateContextExpressionPlugin5Success.json +0 -32
  404. package/test/unit/examples/contextResponses/updateContextMultientityPlugin1Success.json +0 -40
  405. package/test/unit/examples/contextResponses/updateContextMultientityPlugin2Success.json +0 -40
  406. package/test/unit/examples/contextResponses/updateContextMultientityPlugin3Success.json +0 -40
  407. package/test/unit/examples/contextResponses/updateContextProcessTimestamp1Success.json +0 -27
  408. package/test/unit/examples/contextResponses/updateProvisionActiveAttributes1Success.json +0 -22
  409. package/test/unit/examples/contextResponses/updateProvisionCommands1Success.json +0 -32
  410. package/test/unit/examples/contextResponses/updateProvisionMinimumDeviceSuccess.json +0 -22
  411. package/test/unit/examples/subscriptionRequests/bidirectionalNotification.json +0 -24
  412. package/test/unit/examples/subscriptionRequests/bidirectionalSubscriptionRemove.json +0 -3
  413. package/test/unit/examples/subscriptionRequests/bidirectionalSubscriptionRequest.json +0 -22
  414. package/test/unit/examples/subscriptionRequests/errorNotification.json +0 -24
  415. package/test/unit/examples/subscriptionRequests/simpleNotification.json +0 -24
  416. package/test/unit/examples/subscriptionRequests/simpleSubscriptionRemove.json +0 -3
  417. package/test/unit/examples/subscriptionRequests/simpleSubscriptionRequest.json +0 -19
  418. package/test/unit/examples/subscriptionRequests/simpleSubscriptionRequest1.json +0 -19
  419. package/test/unit/examples/subscriptionResponses/bidirectionalSubscriptionSuccess.json +0 -6
  420. package/test/unit/examples/subscriptionResponses/simpleSubscriptionSuccess.json +0 -6
  421. package/test/unit/expressions/expressionBasedTransformations-test.js +0 -328
  422. package/test/unit/expressions/expressionCombinedTransformations-test.js +0 -306
  423. package/test/unit/expressions/jexlBasedTransformations-test.js +0 -334
  424. package/test/unit/general/contextBrokerOAuthSecurityAccess-test.js +0 -902
  425. package/test/unit/general/https-support-test.js +0 -286
  426. package/test/unit/general/iotam-autoregistration-test.js +0 -368
  427. package/test/unit/lazyAndCommands/active-devices-attribute-update-test.js +0 -168
  428. package/test/unit/lazyAndCommands/command-test.js +0 -341
  429. package/test/unit/lazyAndCommands/lazy-devices-test.js +0 -878
  430. package/test/unit/lazyAndCommands/polling-commands-test.js +0 -421
  431. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin20.json +0 -25
  432. package/test/unit/ngsiService/active-devices-test.js +0 -692
  433. package/test/unit/ngsiService/staticAttributes-test.js +0 -148
  434. package/test/unit/ngsiService/subscriptions-test.js +0 -345
  435. package/test/unit/plugins/alias-plugin_test.js +0 -158
  436. package/test/unit/plugins/bidirectional-plugin_test.js +0 -564
  437. package/test/unit/plugins/compress-timestamp-plugin_test.js +0 -257
  438. package/test/unit/plugins/event-plugin_test.js +0 -119
  439. package/test/unit/plugins/multientity-plugin_test.js +0 -248
  440. package/test/unit/plugins/timestamp-processing-plugin_test.js +0 -119
  441. package/test/unit/provisioning/device-provisioning-api_test.js +0 -748
  442. package/test/unit/provisioning/device-registration_test.js +0 -432
  443. package/test/unit/provisioning/device-update-registration_test.js +0 -326
  444. package/test/unit/provisioning/listProvisionedDevices-test.js +0 -488
  445. package/test/unit/provisioning/provisionDeviceMultientity-test.js +0 -123
  446. package/test/unit/provisioning/removeProvisionedDevice-test.js +0 -244
  447. package/test/unit/provisioning/singleConfigurationMode-test.js +0 -346
  448. package/test/unit/provisioning/updateProvisionedDevices-test.js +0 -436
@@ -23,6 +23,9 @@
23
23
 
24
24
  const mongoose = require('mongoose');
25
25
  const Schema = mongoose.Schema;
26
+ const Group = require('./Group');
27
+
28
+ mongoose.Schema.Types.ExplicitAttrsType = Group.ExplicitAttrsType;
26
29
 
27
30
  const Device = new Schema({
28
31
  id: String,
@@ -38,7 +41,7 @@ const Device = new Schema({
38
41
  transport: String,
39
42
  staticAttributes: Array,
40
43
  subscriptions: Array,
41
- service: String,
44
+ service: { type: String, lowercase: true },
42
45
  subservice: String,
43
46
  polling: Boolean,
44
47
  timezone: String,
@@ -49,7 +52,7 @@ const Device = new Schema({
49
52
  internalAttributes: Object,
50
53
  autoprovision: Boolean,
51
54
  expressionLanguage: String,
52
- explicitAttrs: Boolean,
55
+ explicitAttrs: Group.ExplicitAttrsType,
53
56
  ngsiVersion: String
54
57
  });
55
58
 
@@ -24,12 +24,29 @@
24
24
  const mongoose = require('mongoose');
25
25
  const Schema = mongoose.Schema;
26
26
 
27
+ class ExplicitAttrsType extends mongoose.SchemaType {
28
+ constructor(key, options) {
29
+ super(key, options, 'ExplicitAttrsType');
30
+ }
31
+ // `cast()` takes a parameter that can be anything. You need to
32
+ // validate the provided `val` and throw a `CastError` if you
33
+ // can't convert it.
34
+ cast(val) {
35
+ if (!(typeof val === 'boolean' || typeof val === 'string')) {
36
+ throw new Error('ExplicitAttrsType: ' + val + ' is not Boolean or String');
37
+ }
38
+ return val;
39
+ }
40
+ }
41
+
42
+ mongoose.Schema.Types.ExplicitAttrsType = ExplicitAttrsType;
43
+
27
44
  const Group = new Schema({
28
45
  url: String,
29
46
  resource: String,
30
47
  apikey: String,
31
48
  type: String,
32
- service: String,
49
+ service: { type: String, lowercase: true },
33
50
  subservice: String,
34
51
  description: String,
35
52
  trust: String,
@@ -43,7 +60,7 @@ const Group = new Schema({
43
60
  internalAttributes: Array,
44
61
  autoprovision: Boolean,
45
62
  expressionLanguage: String,
46
- explicitAttrs: Boolean,
63
+ explicitAttrs: ExplicitAttrsType,
47
64
  defaultEntityNameConjunction: String,
48
65
  ngsiVersion: String
49
66
  });
@@ -55,3 +72,4 @@ function load(db) {
55
72
  }
56
73
 
57
74
  module.exports.load = load;
75
+ module.exports.ExplicitAttrsType = ExplicitAttrsType;
@@ -106,7 +106,13 @@ function init(host, db, port, options, callback) {
106
106
  }
107
107
 
108
108
  function connectionAttempt(url, options, callback) {
109
- logger.info(context, 'Attempting to connect to MongoDB instance. Attempt %d', retries);
109
+ logger.info(
110
+ context,
111
+ 'Attempting to connect to MongoDB instance with url %j and options %j. Attempt %d',
112
+ url,
113
+ options,
114
+ retries
115
+ );
110
116
  options.useNewUrlParser = true;
111
117
  mongoose.set('useCreateIndex', true);
112
118
  /* eslint-disable-next-line no-unused-vars */
@@ -23,7 +23,6 @@
23
23
  * Modified by: Daniel Calvo - ATOS Research & Innovation
24
24
  */
25
25
 
26
- const config = require('../commonConfig');
27
26
  const utils = require('./pluginUtils');
28
27
  /* eslint-disable no-unused-vars */
29
28
  const logger = require('logops');
@@ -73,10 +72,7 @@ function extractAllMappings(typeInformation) {
73
72
  function applyAlias(mappings) {
74
73
  return function aliasApplier(attribute) {
75
74
  if (mappings.direct[attribute.name]) {
76
- if (config.isCurrentNgsi()) {
77
- /*jshint camelcase: false */
78
- attribute.object_id = attribute.name; // inverse not usefull due to collision
79
- }
75
+ attribute.object_id = attribute.name;
80
76
  attribute.metadata = mappings.metadata[attribute.name];
81
77
  attribute.type = mappings.types[attribute.name];
82
78
  attribute.name = mappings.direct[attribute.name];
@@ -93,14 +89,11 @@ function applyAlias(mappings) {
93
89
  */
94
90
  function updateAttribute(entity, typeInformation, callback) {
95
91
  const mappings = extractAllMappings(typeInformation);
96
- if (config.isCurrentNgsi()) {
97
- let attsArray = utils.extractAttributesArrayFromNgsi2Entity(entity);
98
- attsArray = attsArray.map(applyAlias(mappings));
99
- entity = utils.createNgsi2Entity(entity.id, entity.type, attsArray, true);
100
- ngsiUtils.castJsonNativeAttributes(entity);
101
- } else {
102
- entity.contextElements[0].attributes = entity.contextElements[0].attributes.map(applyAlias(mappings));
103
- }
92
+
93
+ let attsArray = utils.extractAttributesArrayFromNgsi2Entity(entity);
94
+ attsArray = attsArray.map(applyAlias(mappings));
95
+ entity = utils.createNgsi2Entity(entity.id, entity.type, attsArray, true);
96
+ ngsiUtils.castJsonNativeAttributes(entity);
104
97
 
105
98
  callback(null, entity, typeInformation);
106
99
  }
@@ -26,15 +26,13 @@
26
26
  const async = require('async');
27
27
  const apply = async.apply;
28
28
  const _ = require('underscore');
29
- const legacyParser = require('./expressionParser');
30
- const jexlParser = require('./jexlParser');
29
+ const parser = require('./expressionParser');
31
30
  const logger = require('logops');
32
31
  const subscriptions = require('../services/ngsi/subscriptionService');
33
32
  const deviceService = require('../services/devices/deviceService');
34
33
  const context = {
35
34
  op: 'IoTAgentNGSI.BidirectionalPlugin'
36
35
  };
37
- const config = require('../commonConfig');
38
36
 
39
37
  /**
40
38
  * Extract a list of all the bidirectional attributes (those containing reverse expressions) from a device object.
@@ -99,21 +97,6 @@ function extractVariables(item) {
99
97
  * @param {Array} attributeList List of active attributes for subscription.
100
98
  */
101
99
  function sendSubscriptions(device, attributeList, callback) {
102
- function sendSingleSubscriptionNgsi1(item, innerCb) {
103
- const variables = extractVariables(item);
104
-
105
- subscriptions.subscribe(device, [item.name], variables, function handleSubscription(error, subId) {
106
- if (error) {
107
- innerCb(error);
108
- } else {
109
- innerCb(null, {
110
- id: subId,
111
- triggers: [item.name]
112
- });
113
- }
114
- });
115
- }
116
-
117
100
  function sendSingleSubscriptionNgsi2(item, innerCb) {
118
101
  const variables = extractVariables(item);
119
102
 
@@ -131,11 +114,7 @@ function sendSubscriptions(device, attributeList, callback) {
131
114
 
132
115
  logger.debug(context, 'Sending bidirectionality subscriptions for device [%s]', device.id);
133
116
 
134
- if (config.isCurrentNgsi()) {
135
- async.map(attributeList, sendSingleSubscriptionNgsi2, callback);
136
- } else {
137
- async.map(attributeList, sendSingleSubscriptionNgsi1, callback);
138
- }
117
+ async.map(attributeList, sendSingleSubscriptionNgsi2, callback);
139
118
  }
140
119
 
141
120
  /**
@@ -208,10 +187,6 @@ function getReverseTransformations(list, values, callback) {
208
187
  */
209
188
  function processTransformations(values, transformations, callback) {
210
189
  let cleanedExpression;
211
- let parser = legacyParser;
212
- // if (checkJexl()) {
213
- // parser = jexlParser;
214
- // }
215
190
  const ctx = parser.extractContext(values);
216
191
  let resultTransformations = [];
217
192
 
@@ -28,16 +28,16 @@
28
28
  const Parser = require('jison').Parser;
29
29
  const errors = require('../errors');
30
30
  const logger = require('logops');
31
- const config = require('../commonConfig');
31
+ const fillService = require('../services/common/domain').fillService;
32
32
  const _ = require('underscore');
33
- const logContext = {
33
+ let logContext = {
34
34
  op: 'IoTAgentNGSI.Expression'
35
35
  };
36
36
  const grammar = {
37
37
  lex: {
38
38
  rules: [
39
39
  ['\\s+', '/* skip whitespace */'],
40
- ['@[a-zA-Z0-9]+\\b', 'return "VARIABLE";'],
40
+ ['@[a-zA-Z0-9_]+\\b', 'return "VARIABLE";'],
41
41
  ['[0-9]+(?:\\.[0-9]+)?\\b', 'return "NUMBER";'],
42
42
  ['\\*', 'return "*";'],
43
43
  ['\\/', 'return "/";'],
@@ -107,6 +107,7 @@ function parse(expression, context, type, callback) {
107
107
 
108
108
  try {
109
109
  result = parser.parse(expression);
110
+ logger.debug(logContext, 'parse expression "[%j]" over "[%j]" result "[%j]" ', expression, context, result);
110
111
  } catch (e) {
111
112
  error = new errors.InvalidExpression(expression);
112
113
 
@@ -129,12 +130,12 @@ function extractContext(attributeList) {
129
130
  const context = {};
130
131
 
131
132
  for (let i = 0; i < attributeList.length; i++) {
132
- if (attributeList[i].name) {
133
- context[attributeList[i].name] = attributeList[i].value;
134
- }
135
- if (attributeList[i].object_id) {
136
- context[attributeList[i].object_id] = attributeList[i].value;
137
- }
133
+ if (attributeList[i].name) {
134
+ context[attributeList[i].name] = attributeList[i].value;
135
+ }
136
+ if (attributeList[i].object_id) {
137
+ context[attributeList[i].object_id] = attributeList[i].value;
138
+ }
138
139
  }
139
140
 
140
141
  return context;
@@ -156,6 +157,7 @@ function processExpression(context) {
156
157
 
157
158
  /* eslint-disable-next-line no-unused-vars */
158
159
  function applyExpression(expression, context, typeInformation) {
160
+ logContext = fillService(logContext, typeInformation);
159
161
  const expressionList = expression.match(/\$\{.*?\}/g) || [];
160
162
  const substitutions = expressionList.map(processExpression(context));
161
163
  let expressionResult = expression;
@@ -163,7 +165,13 @@ function applyExpression(expression, context, typeInformation) {
163
165
  for (let i = 0; i < substitutions.length; i++) {
164
166
  expressionResult = expressionResult.replace(substitutions[i].original, substitutions[i].value);
165
167
  }
166
- logger.debug(logContext, 'applyExpression "[%j]" over "[%j]" result "[%j]" ', expression, context, expressionResult);
168
+ logger.debug(
169
+ logContext,
170
+ 'applyExpression "[%j]" over "[%j]" result "[%j]" ',
171
+ expression,
172
+ context,
173
+ expressionResult
174
+ );
167
175
  return expressionResult;
168
176
  }
169
177
 
@@ -185,7 +193,7 @@ function expressionApplier(context, typeInformation) {
185
193
  };
186
194
 
187
195
  /*jshint camelcase: false */
188
- if (config.isCurrentNgsi() && attribute.object_id) {
196
+ if (attribute.object_id) {
189
197
  newAttribute.object_id = attribute.object_id;
190
198
  }
191
199
 
@@ -206,12 +214,27 @@ function expressionApplier(context, typeInformation) {
206
214
  }
207
215
 
208
216
  function contextAvailable(expression, context) {
209
- const variables = expression.match(/@[a-zA-Z0-9]+/g).map(function (item) {
210
- return item.substr(1);
211
- });
212
- const keys = Object.keys(context);
213
-
214
- return _.difference(variables, keys).length === 0;
217
+ let error;
218
+ try {
219
+ const variablesList = expression.match(/@[a-zA-Z0-9_]+/g) || [];
220
+ const variables = variablesList.map(function (item) {
221
+ return item.substr(1);
222
+ });
223
+ const keys = Object.keys(context);
224
+ let validContext = _.difference(variables, keys).length === 0;
225
+ if (!validContext) {
226
+ logger.info(
227
+ logContext,
228
+ 'For expression "[%s]" context "[%j]" does not have element to match',
229
+ expression,
230
+ context
231
+ );
232
+ }
233
+ return validContext;
234
+ } catch (e) {
235
+ error = new errors.InvalidExpression(expression);
236
+ throw error;
237
+ }
215
238
  }
216
239
 
217
240
  function processExpressionAttributes(typeInformation, list, context) {
@@ -225,4 +248,5 @@ function processExpressionAttributes(typeInformation, list, context) {
225
248
  exports.parse = parse;
226
249
  exports.extractContext = extractContext;
227
250
  exports.processExpressionAttributes = processExpressionAttributes;
251
+ exports.contextAvailable = contextAvailable;
228
252
  exports.applyExpression = applyExpression;
@@ -35,6 +35,13 @@ const context = {
35
35
  };
36
36
  const utils = require('./pluginUtils');
37
37
 
38
+ //set the basic JEXL Transformation SET
39
+ setJEXLTransforms(null);
40
+
41
+ function setJEXLTransforms(transformationMap) {
42
+ jexlParser.setTransforms(transformationMap);
43
+ }
44
+
38
45
  function mergeAttributes(attrList1, attrList2) {
39
46
  const finalCollection = _.clone(attrList1);
40
47
  const additionalItems = [];
@@ -45,11 +52,11 @@ function mergeAttributes(attrList1, attrList2) {
45
52
 
46
53
  for (let j = 0; j < finalCollection.length; j++) {
47
54
  if (finalCollection[j].name === attrList2[i].name && attrList2[i].object_id) {
48
- if(finalCollection[j].object_id === attrList2[i].object_id){
55
+ if (finalCollection[j].object_id === attrList2[i].object_id) {
49
56
  finalCollection[j].value = attrList2[i].value;
50
57
  found = true;
51
58
  }
52
- } else if (finalCollection[j].name === attrList2[i].name && !attrList2[i].object_id){
59
+ } else if (finalCollection[j].name === attrList2[i].name && !attrList2[i].object_id) {
53
60
  finalCollection[j].value = attrList2[i].value;
54
61
  found = true;
55
62
  }
@@ -83,30 +90,19 @@ function update(entity, typeInformation, callback) {
83
90
  return false;
84
91
  }
85
92
 
86
- function processEntityUpdateNgsi1(entity) {
87
- let parser = legacyParser;
88
- if (checkJexl(typeInformation)) {
89
- parser = jexlParser;
90
- }
91
- let expressionAttributes = [];
92
- const ctx = parser.extractContext(entity.attributes);
93
-
94
- if (typeInformation.active) {
95
- expressionAttributes = parser.processExpressionAttributes(typeInformation, typeInformation.active, ctx);
96
- }
97
-
98
- entity.attributes = mergeAttributes(entity.attributes, expressionAttributes);
99
-
100
- return entity;
101
- }
102
-
103
93
  function processEntityUpdateNgsi2(attributes) {
104
94
  let parser = legacyParser;
105
95
  if (checkJexl(typeInformation)) {
106
96
  parser = jexlParser;
107
97
  }
108
98
  let expressionAttributes = [];
109
- const ctx = parser.extractContext(attributes);
99
+ let attributesCtxt = [...attributes]; // just copy
100
+ if (typeInformation.static) {
101
+ typeInformation.static.forEach(function (att) {
102
+ attributesCtxt.push(att);
103
+ });
104
+ }
105
+ const ctx = parser.extractContext(attributesCtxt);
110
106
 
111
107
  if (typeInformation.active) {
112
108
  expressionAttributes = parser.processExpressionAttributes(typeInformation, typeInformation.active, ctx);
@@ -117,13 +113,10 @@ function update(entity, typeInformation, callback) {
117
113
  }
118
114
 
119
115
  try {
120
- if (config.isCurrentNgsi()) {
121
- let attsArray = utils.extractAttributesArrayFromNgsi2Entity(entity);
122
- attsArray = processEntityUpdateNgsi2(attsArray);
123
- entity = utils.createNgsi2Entity(entity.id, entity.type, attsArray, true);
124
- } else {
125
- entity.contextElements = entity.contextElements.map(processEntityUpdateNgsi1);
126
- }
116
+ logger.debug(context, 'expressionPlugin entity %j', entity);
117
+ let attsArray = utils.extractAttributesArrayFromNgsi2Entity(entity);
118
+ attsArray = processEntityUpdateNgsi2(attsArray);
119
+ entity = utils.createNgsi2Entity(entity.id, entity.type, attsArray, true);
127
120
 
128
121
  callback(null, entity, typeInformation);
129
122
  } catch (e) {
@@ -132,3 +125,4 @@ function update(entity, typeInformation, callback) {
132
125
  }
133
126
 
134
127
  exports.update = update;
128
+ exports.setJEXLTransforms = setJEXLTransforms;
@@ -30,22 +30,21 @@
30
30
  const jexl = require('jexl');
31
31
  const errors = require('../errors');
32
32
  const logger = require('logops');
33
+ const fillService = require('../services/common/domain').fillService;
33
34
  const config = require('../commonConfig');
34
- const logContext = {
35
+ const baseTranformsMap = require('../jexlTranformsMap.js').map;
36
+ let logContext = {
35
37
  op: 'IoTAgentNGSI.JEXL'
36
38
  };
37
39
 
38
- jexl.addTransform('indexOf', (val, char) => String(val).indexOf(char));
39
- jexl.addTransform('length', (val) => String(val).length);
40
- jexl.addTransform('trim', (val) => String(val).trim());
41
- jexl.addTransform('substr', (val, int1, int2) => String(val).substr(int1, int2));
42
-
43
40
  function parse(expression, context, callback) {
44
41
  let result;
45
42
  let error;
46
43
 
47
44
  try {
48
45
  result = jexl.evalSync(expression, context);
46
+ //avoid undefined result
47
+ result = result !== undefined ? result : null;
49
48
  logger.debug(logContext, 'parse expression "[%j]" over "[%j]" result "[%j]" ', expression, context, result);
50
49
  } catch (e) {
51
50
  error = new errors.InvalidExpression(expression);
@@ -68,19 +67,21 @@ function extractContext(attributeList) {
68
67
  let value;
69
68
 
70
69
  for (let i = 0; i < attributeList.length; i++) {
71
- if (
72
- !Number.isNaN(Number.parseFloat(attributeList[i].value)) &&
73
- !Number.isInteger(Number.parseFloat(attributeList[i].value))
74
- ) {
75
- value = Number.parseFloat(attributeList[i].value);
76
- } else if (!Number.isNaN(Number.parseInt(attributeList[i].value))) {
77
- value = Number.parseInt(attributeList[i].value);
78
- } else if (String(attributeList[i].value) === 'true') {
79
- value = true;
80
- } else if (String(attributeList[i].value) === 'false') {
81
- value = false;
82
- } else {
70
+ if (isNaN(attributeList[i].value)) {
83
71
  value = attributeList[i].value;
72
+ } else {
73
+ let floatValue = Number.parseFloat(attributeList[i].value);
74
+ if (!Number.isNaN(floatValue) && !Number.isInteger(floatValue)) {
75
+ value = floatValue;
76
+ } else if (!Number.isNaN(Number.parseInt(attributeList[i].value))) {
77
+ value = Number.parseInt(attributeList[i].value);
78
+ } else if (String(attributeList[i].value) === 'true') {
79
+ value = true;
80
+ } else if (String(attributeList[i].value) === 'false') {
81
+ value = false;
82
+ } else {
83
+ value = attributeList[i].value;
84
+ }
84
85
  }
85
86
  if (attributeList[i].name) {
86
87
  context[attributeList[i].name] = value;
@@ -96,9 +97,10 @@ function extractContext(attributeList) {
96
97
  }
97
98
 
98
99
  function applyExpression(expression, context, typeInformation) {
99
- const result = jexl.evalSync(expression, context);
100
+ logContext = fillService(logContext, typeInformation);
101
+ const result = parse(expression, context);
100
102
  logger.debug(logContext, 'applyExpression "[%j]" over "[%j]" result "[%j]" ', expression, context, result);
101
- let expressionResult = result !== undefined ? result : expression;
103
+ const expressionResult = result !== undefined ? result : expression;
102
104
  return expressionResult;
103
105
  }
104
106
 
@@ -120,31 +122,11 @@ function expressionApplier(context, typeInformation) {
120
122
  };
121
123
 
122
124
  /*jshint camelcase: false */
123
- if (config.isCurrentNgsi() && attribute.object_id) {
125
+ if (attribute.object_id) {
124
126
  newAttribute.object_id = attribute.object_id;
125
127
  }
126
128
 
127
129
  newAttribute.value = applyExpression(attribute.expression, context, typeInformation);
128
-
129
- if (attribute.type === 'Number' && isFloat(newAttribute.value)) {
130
- newAttribute.value = Number.parseFloat(newAttribute.value);
131
- } else if (attribute.type === 'Number' && !Number.isNaN(Number.parseInt(newAttribute.value))) {
132
- newAttribute.value = Number.parseInt(newAttribute.value);
133
- } else if (attribute.type === 'Boolean') {
134
- newAttribute.value = newAttribute.value === 'true' || newAttribute.value === '1';
135
- } else if (attribute.type === 'None') {
136
- newAttribute.value = null;
137
- } else if (attribute.type === 'Text' || attribute.type === 'String') {
138
- newAttribute.value = String(newAttribute.value);
139
- } else if (
140
- attribute.type.toLowerCase().includes('structuredvalue') ||
141
- attribute.type.toLowerCase().startsWith('geo') ||
142
- attribute.type.toLowerCase().includes('json')
143
- ) {
144
- newAttribute.value = newAttribute.value;
145
- } else {
146
- newAttribute.value = String(newAttribute.value);
147
- }
148
130
  return newAttribute;
149
131
  };
150
132
  }
@@ -156,32 +138,8 @@ function isTransform(identifier) {
156
138
  function contextAvailable(expression, context) {
157
139
  let error;
158
140
  try {
159
- const lexer = jexl._getLexer();
160
- const identifiers = lexer.tokenize(expression).filter(function (token) {
161
- return token.type === 'identifier';
162
- });
163
- const keys = Object.keys(context);
164
- let validContext = true;
165
- identifiers.some(function (element) {
166
- if (!keys.includes(element.value) && !isTransform(element.value)) {
167
- validContext = false;
168
- logger.warn(
169
- logContext,
170
- 'For expression "[%s]" context does not have element %s',
171
- expression,
172
- element.value
173
- );
174
- }
175
- // FIXME: Workaround to allow keys of JSON geopoints
176
- if (element.value === 'type' || element.value === 'coordinates') {
177
- validContext = true;
178
- }
179
- return validContext === false;
180
- });
181
- if (validContext) {
182
- jexl.evalSync(expression, context);
183
- }
184
- return validContext;
141
+ jexl.evalSync(expression, context);
142
+ return true;
185
143
  } catch (e) {
186
144
  error = new errors.InvalidExpression(expression);
187
145
  throw error;
@@ -196,7 +154,53 @@ function processExpressionAttributes(typeInformation, list, context) {
196
154
  .map(expressionApplier(context, typeInformation));
197
155
  }
198
156
 
157
+ function checkTransformationMap(tranformsMap) {
158
+ let error = null;
159
+ let message = 'No trasformations were added to JEXL Parser';
160
+ let resultMap = {};
161
+
162
+ if (typeof tranformsMap != 'object') {
163
+ error = true;
164
+ } else if (
165
+ tranformsMap === null ||
166
+ (tranformsMap && Object.keys(tranformsMap).length === 0 && tranformsMap.constructor === Object)
167
+ ) {
168
+ //default
169
+ } else {
170
+ //detecting wrong transformations
171
+ let wrongList = [];
172
+ for (var transformation in tranformsMap) {
173
+ if (typeof tranformsMap[transformation] != 'function') {
174
+ wrongList.push(transformation);
175
+ } else {
176
+ resultMap[transformation] = tranformsMap[transformation];
177
+ }
178
+ }
179
+ if (wrongList.length === 0) {
180
+ message = 'Trasformations can be added to JEXL parser';
181
+ } else {
182
+ message = wrongList.toString() + ' must be a function';
183
+ }
184
+ }
185
+ return [error, message, resultMap];
186
+ }
187
+
188
+ function setTransforms(configMap) {
189
+ //Check provided transforms since they are provided by user
190
+ //Note that in case of name conflict, baseTransformsMap would take precedence
191
+ const tranformsMap = { ...configMap, ...baseTranformsMap };
192
+ var [error, message, cleanTranformsMap] = checkTransformationMap(tranformsMap);
193
+ if (!error) {
194
+ //merge baseTransformation with provided map
195
+ jexl.addTransforms(cleanTranformsMap);
196
+ }
197
+ logger.info(logContext, message);
198
+ }
199
+
199
200
  exports.extractContext = extractContext;
200
201
  exports.processExpressionAttributes = processExpressionAttributes;
202
+ exports.contextAvailable = contextAvailable;
201
203
  exports.applyExpression = applyExpression;
202
204
  exports.parse = parse;
205
+ exports.checkTransformationMap = checkTransformationMap;
206
+ exports.setTransforms = setTransforms;