diff --git a/application/src/main/data/json/demo/dashboards/gateways.json b/application/src/main/data/json/demo/dashboards/gateways.json
deleted file mode 100644
index f4eb275c3c..0000000000
--- a/application/src/main/data/json/demo/dashboards/gateways.json
+++ /dev/null
@@ -1,1315 +0,0 @@
-{
- "title": "Gateways",
- "image": null,
- "mobileHide": false,
- "mobileOrder": null,
- "configuration": {
- "widgets": {
- "94715984-ae74-76e4-20b7-2f956b01ed80": {
- "type": "latest",
- "sizeX": 24,
- "sizeY": 12,
- "config": {
- "timewindow": {
- "displayValue": "",
- "selectedTab": 0,
- "realtime": {
- "realtimeType": 1,
- "interval": 1000,
- "timewindowMs": 86400000,
- "quickInterval": "CURRENT_DAY"
- },
- "history": {
- "historyType": 0,
- "interval": 1000,
- "timewindowMs": 60000,
- "fixedTimewindow": {
- "startTimeMs": 1694085270425,
- "endTimeMs": 1694171670425
- },
- "quickInterval": "CURRENT_DAY"
- },
- "aggregation": {
- "type": "NONE",
- "limit": 200
- }
- },
- "showTitle": true,
- "backgroundColor": "rgb(255, 255, 255)",
- "color": "rgba(0, 0, 0, 0.87)",
- "padding": "4px",
- "settings": {
- "enableSearch": true,
- "displayPagination": true,
- "defaultPageSize": 10,
- "defaultSortOrder": "entityName",
- "displayEntityName": true,
- "displayEntityType": false,
- "entitiesTitle": "List of gateways",
- "enableSelectColumnDisplay": true,
- "displayEntityLabel": false,
- "entityNameColumnTitle": "Gateway Name"
- },
- "title": "Devices gateway table",
- "dropShadow": true,
- "enableFullscreen": true,
- "titleStyle": {
- "fontSize": "16px",
- "fontWeight": 400,
- "padding": "5px 10px 5px 10px"
- },
- "useDashboardTimewindow": false,
- "showLegend": false,
- "datasources": [
- {
- "type": "entity",
- "dataKeys": [
- {
- "name": "active",
- "type": "attribute",
- "label": "Active",
- "color": "#2196f3",
- "settings": {
- "columnWidth": "0px",
- "useCellStyleFunction": true,
- "useCellContentFunction": true,
- "cellContentFunction": "value = '⬤';\nreturn value;",
- "cellStyleFunction": "var color;\nif (value == 'false') {\n color = '#EB5757';\n} else {\n color = '#27AE60';\n}\nreturn {\n color: color,\n fontSize: '18px'\n};"
- },
- "_hash": 0.3646047595211721
- },
- {
- "name": "eventsSent",
- "type": "timeseries",
- "label": "Sent",
- "color": "#4caf50",
- "settings": {
- "columnWidth": "0px",
- "useCellStyleFunction": false,
- "useCellContentFunction": false
- },
- "_hash": 0.7235710720767985
- },
- {
- "name": "eventsProduced",
- "type": "timeseries",
- "label": "Events",
- "color": "#f44336",
- "settings": {
- "columnWidth": "0px",
- "useCellStyleFunction": false,
- "useCellContentFunction": false
- },
- "_hash": 0.5085933386303254
- },
- {
- "name": "LOGS",
- "type": "timeseries",
- "label": "Latest log",
- "color": "#ffc107",
- "settings": {
- "columnWidth": "0px",
- "useCellStyleFunction": false,
- "useCellContentFunction": false
- },
- "_hash": 0.3504240371585048,
- "postFuncBody": "if(value) {\n return value.substring(0, 31) + \"...\";\n} else {\n return '';\n}"
- },
- {
- "name": "RemoteLoggingLevel",
- "type": "attribute",
- "label": "Log level",
- "color": "#607d8b",
- "settings": {
- "columnWidth": "0px",
- "useCellStyleFunction": false,
- "useCellContentFunction": false
- },
- "_hash": 0.9785994222542516
- }
- ],
- "entityAliasId": "3e0f533a-0db1-3292-184f-06e73535061a"
- }
- ],
- "showTitleIcon": true,
- "titleIcon": "list",
- "iconColor": "rgba(0, 0, 0, 0.87)",
- "iconSize": "24px",
- "titleTooltip": "List device",
- "widgetStyle": {},
- "displayTimewindow": true,
- "actions": {
- "headerButton": [
- {
- "name": "Add device",
- "icon": "add",
- "type": "customPretty",
- "customHtml": "
\n",
- "customCss": "",
- "customFunction": "let $injector = widgetContext.$scope.$injector;\nlet customDialog = $injector.get(widgetContext.servicesMap.get('customDialog'));\nlet deviceService = $injector.get(widgetContext.servicesMap.get('deviceService'));\nlet attributeService = $injector.get(widgetContext.servicesMap.get('attributeService'));\n\nopenAddDeviceDialog();\n\nfunction openAddDeviceDialog() {\n customDialog.customDialog(htmlTemplate, AddDeviceDialogController).subscribe();\n}\n\nfunction AddDeviceDialogController(instance) {\n let vm = instance;\n \n vm.addDeviceFormGroup = vm.fb.group({\n deviceName: ['', [vm.validators.required]],\n deviceLabel: [''],\n attributes: vm.fb.group({\n latitude: [null],\n longitude: [null]\n }) \n });\n \n vm.cancel = function() {\n vm.dialogRef.close(null);\n };\n \n vm.save = function() {\n vm.addDeviceFormGroup.markAsPristine();\n let device = {\n additionalInfo: {gateway: true},\n name: vm.addDeviceFormGroup.get('deviceName').value,\n type: 'gateway',\n label: vm.addDeviceFormGroup.get('deviceLabel').value\n };\n deviceService.saveDevice(device).subscribe(\n function (device) {\n saveAttributes(device.id).subscribe(\n function () {\n widgetContext.updateAliases();\n vm.dialogRef.close(null);\n }\n );\n }\n );\n };\n \n function saveAttributes(entityId) {\n let attributes = vm.addDeviceFormGroup.get('attributes').value;\n let attributesArray = [];\n for (let key in attributes) {\n attributesArray.push({key: key, value: attributes[key]});\n }\n if (attributesArray.length > 0) {\n return attributeService.saveEntityAttributes(entityId, \"SERVER_SCOPE\", attributesArray);\n } else {\n return widgetContext.rxjs.of([]);\n }\n }\n}\n",
- "customResources": [],
- "id": "70837a9d-c3de-a9a7-03c5-dccd14998758"
- }
- ],
- "actionCellButton": [
- {
- "id": "78845501-234e-a452-6819-82b5b776e99f",
- "name": "Configuration",
- "icon": "settings",
- "type": "openDashboardState",
- "targetDashboardStateId": "__entityname__config",
- "openRightLayout": false,
- "setEntityId": true
- },
- {
- "id": "f6ffdba8-e40f-2b8d-851b-f5ecaf18606b",
- "name": "Graphs",
- "icon": "show_chart",
- "type": "openDashboardState",
- "targetDashboardStateId": "__entityname_grafic",
- "setEntityId": true
- },
- {
- "name": "Edit device",
- "icon": "edit",
- "type": "customPretty",
- "customHtml": "\n",
- "customCss": "/*=======================================================================*/\n/*========== There are two examples: for edit and add entity ==========*/\n/*=======================================================================*/\n/*======================== Edit entity example ========================*/\n/*=======================================================================*/\n/*\n.edit-entity-form md-input-container {\n padding-right: 10px;\n}\n\n.edit-entity-form .boolean-value-input {\n padding-left: 5px;\n}\n\n.edit-entity-form .boolean-value-input .checkbox-label {\n margin-bottom: 8px;\n color: rgba(0,0,0,0.54);\n font-size: 12px;\n}\n\n.relations-list .header {\n padding-right: 5px;\n padding-bottom: 5px;\n padding-left: 5px;\n}\n\n.relations-list .header .cell {\n padding-right: 5px;\n padding-left: 5px;\n font-size: 12px;\n font-weight: 700;\n color: rgba(0, 0, 0, .54);\n white-space: nowrap;\n}\n\n.relations-list .body {\n padding-right: 5px;\n padding-bottom: 15px;\n padding-left: 5px;\n}\n\n.relations-list .body .row {\n padding-top: 5px;\n}\n\n.relations-list .body .cell {\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.relations-list .body md-autocomplete-wrap md-input-container {\n height: 30px;\n}\n\n.relations-list .body .md-button {\n margin: 0;\n}\n\n.relations-list.old-relations tb-entity-select tb-entity-autocomplete button {\n display: none;\n} \n*/\n/*========================================================================*/\n/*========================= Add entity example =========================*/\n/*========================================================================*/\n/*\n.add-entity-form md-input-container {\n padding-right: 10px;\n}\n\n.add-entity-form .boolean-value-input {\n padding-left: 5px;\n}\n\n.add-entity-form .boolean-value-input .checkbox-label {\n margin-bottom: 8px;\n color: rgba(0,0,0,0.54);\n font-size: 12px;\n}\n\n.relations-list .header {\n padding-right: 5px;\n padding-bottom: 5px;\n padding-left: 5px;\n}\n\n.relations-list .header .cell {\n padding-right: 5px;\n padding-left: 5px;\n font-size: 12px;\n font-weight: 700;\n color: rgba(0, 0, 0, .54);\n white-space: nowrap;\n}\n\n.relations-list .body {\n padding-right: 5px;\n padding-bottom: 15px;\n padding-left: 5px;\n}\n\n.relations-list .body .row {\n padding-top: 5px;\n}\n\n.relations-list .body .cell {\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.relations-list .body md-autocomplete-wrap md-input-container {\n height: 30px;\n}\n\n.relations-list .body .md-button {\n margin: 0;\n}\n*/\n",
- "customFunction": "let $injector = widgetContext.$scope.$injector;\nlet customDialog = $injector.get(widgetContext.servicesMap.get('customDialog'));\nlet deviceService = $injector.get(widgetContext.servicesMap.get('deviceService'));\nlet attributeService = $injector.get(widgetContext.servicesMap.get('attributeService'));\n\nopenEditDeviceDialog();\n\nfunction openEditDeviceDialog() {\n customDialog.customDialog(htmlTemplate, EditDeviceDialogController).subscribe();\n}\n\nfunction EditDeviceDialogController(instance) {\n let vm = instance;\n \n vm.device = null;\n vm.attributes = {};\n \n vm.editDeviceFormGroup = vm.fb.group({\n deviceName: ['', [vm.validators.required]],\n deviceLabel: [''],\n attributes: vm.fb.group({\n latitude: [null],\n longitude: [null]\n }) \n });\n \n vm.cancel = function() {\n vm.dialogRef.close(null);\n };\n \n vm.save = function() {\n vm.editDeviceFormGroup.markAsPristine();\n vm.device.name = vm.editDeviceFormGroup.get('deviceName').value;\n vm.device.label = vm.editDeviceFormGroup.get('deviceLabel').value;\n deviceService.saveDevice(vm.device).subscribe(\n function () {\n saveAttributes().subscribe(\n function () {\n widgetContext.updateAliases();\n vm.dialogRef.close(null);\n }\n );\n }\n );\n };\n \n getEntityInfo();\n \n function getEntityInfo() {\n deviceService.getDevice(entityId.id).subscribe(\n function (device) {\n attributeService.getEntityAttributes(entityId, 'SERVER_SCOPE',\n ['latitude', 'longitude']).subscribe(\n function (attributes) {\n for (let i = 0; i < attributes.length; i++) {\n vm.attributes[attributes[i].key] = attributes[i].value; \n }\n vm.device = device;\n vm.editDeviceFormGroup.patchValue(\n {\n deviceName: vm.device.name,\n deviceLabel: vm.device.label,\n attributes: {\n latitude: vm.attributes.latitude,\n longitude: vm.attributes.longitude\n }\n }, {emitEvent: false}\n );\n } \n );\n }\n ); \n }\n \n function saveAttributes() {\n let attributes = vm.editDeviceFormGroup.get('attributes').value;\n let attributesArray = [];\n for (let key in attributes) {\n attributesArray.push({key: key, value: attributes[key]});\n }\n if (attributesArray.length > 0) {\n return attributeService.saveEntityAttributes(entityId, 'SERVER_SCOPE', attributesArray);\n } else {\n return widgetContext.rxjs.of([]);\n }\n }\n}\n",
- "customResources": [],
- "id": "242671f3-76c6-6982-7acc-6f12addf0ccc"
- },
- {
- "name": "Delete device",
- "icon": "delete",
- "type": "custom",
- "customFunction": "let $injector = widgetContext.$scope.$injector;\nlet dialogs = $injector.get(widgetContext.servicesMap.get('dialogs'));\nlet deviceService = $injector.get(widgetContext.servicesMap.get('deviceService'));\n\nopenDeleteDeviceDialog();\n\nfunction openDeleteDeviceDialog() {\n let title = \"Are you sure you want to delete the device \" + entityName + \"?\";\n let content = \"Be careful, after the confirmation, the device and all related data will become unrecoverable!\";\n dialogs.confirm(title, content, 'Cancel', 'Delete').subscribe(\n function (result) {\n if (result) {\n deleteDevice();\n }\n }\n );\n}\n\nfunction deleteDevice() {\n deviceService.deleteDevice(entityId.id).subscribe(\n function () {\n widgetContext.updateAliases();\n }\n );\n}\n",
- "id": "862ec2b7-fbcf-376e-f85f-b77c07f36efa"
- }
- ],
- "rowClick": [
- {
- "id": "ad5fc7e1-5e60-e056-6940-a75a383466a1",
- "name": "to_entityname__config",
- "icon": "more_horiz",
- "type": "openDashboardState",
- "targetDashboardStateId": "__entityname__config",
- "setEntityId": true,
- "stateEntityParamName": ""
- }
- ]
- }
- },
- "id": "94715984-ae74-76e4-20b7-2f956b01ed80",
- "typeFullFqn": "system.entity_admin_widgets.device_admin_table"
- },
- "eadabbc7-519e-76fc-ba10-b3fe8c18da10": {
- "type": "timeseries",
- "sizeX": 14,
- "sizeY": 13,
- "config": {
- "datasources": [
- {
- "type": "entity",
- "dataKeys": [
- {
- "name": "LOGS",
- "type": "timeseries",
- "label": "LOGS",
- "color": "#2196f3",
- "settings": {
- "useCellStyleFunction": false,
- "useCellContentFunction": false
- },
- "_hash": 0.3496649158709739,
- "postFuncBody": "return value.replace(/ - (.*) - \\[/gi, ' - $1 - [');"
- }
- ],
- "entityAliasId": "b2487e75-2fa4-f211-142c-434dfd50c70c"
- }
- ],
- "timewindow": {
- "realtime": {
- "interval": 1000,
- "timewindowMs": 2592000000
- },
- "aggregation": {
- "type": "NONE",
- "limit": 200
- }
- },
- "showTitle": true,
- "backgroundColor": "rgb(255, 255, 255)",
- "color": "rgba(0, 0, 0, 0.87)",
- "padding": "8px",
- "settings": {
- "showTimestamp": true,
- "displayPagination": true,
- "defaultPageSize": 10
- },
- "title": "Debug events (logs)",
- "dropShadow": true,
- "enableFullscreen": true,
- "titleStyle": {
- "fontSize": "16px",
- "fontWeight": 400
- },
- "useDashboardTimewindow": false,
- "showLegend": false,
- "widgetStyle": {},
- "actions": {},
- "showTitleIcon": false,
- "titleIcon": null,
- "iconColor": "rgba(0, 0, 0, 0.87)",
- "iconSize": "24px",
- "titleTooltip": "",
- "displayTimewindow": true
- },
- "id": "eadabbc7-519e-76fc-ba10-b3fe8c18da10",
- "typeFullFqn": "system.cards.timeseries_table"
- },
- "f928afc4-30d1-8d0c-e3cf-777f9f9d1155": {
- "type": "timeseries",
- "sizeX": 17,
- "sizeY": 4,
- "config": {
- "datasources": [
- {
- "type": "entity",
- "dataKeys": [
- {
- "name": "opcuaEventsProduced",
- "type": "timeseries",
- "label": "opcuaEventsProduced",
- "color": "#2196f3",
- "settings": {
- "excludeFromStacking": false,
- "hideDataByDefault": false,
- "disableDataHiding": false,
- "removeFromLegend": false,
- "showLines": true,
- "fillLines": false,
- "showPoints": false,
- "showPointShape": "circle",
- "pointShapeFormatter": "var size = radius * Math.sqrt(Math.PI) / 2;\nctx.moveTo(x - size, y - size);\nctx.lineTo(x + size, y + size);\nctx.moveTo(x - size, y + size);\nctx.lineTo(x + size, y - size);",
- "showPointsLineWidth": 5,
- "showPointsRadius": 3,
- "tooltipValueFormatter": "",
- "showSeparateAxis": false,
- "axisTitle": "",
- "axisPosition": "left",
- "axisTicksFormatter": "",
- "comparisonSettings": {
- "showValuesForComparison": true,
- "comparisonValuesLabel": "",
- "color": ""
- }
- },
- "_hash": 0.1477920581839779
- },
- {
- "name": "opcuaEventsSent",
- "type": "timeseries",
- "label": "opcuaEventsSent",
- "color": "#4caf50",
- "settings": {
- "excludeFromStacking": false,
- "hideDataByDefault": false,
- "disableDataHiding": false,
- "removeFromLegend": false,
- "showLines": true,
- "fillLines": false,
- "showPoints": false,
- "showPointShape": "circle",
- "pointShapeFormatter": "var size = radius * Math.sqrt(Math.PI) / 2;\nctx.moveTo(x - size, y - size);\nctx.lineTo(x + size, y + size);\nctx.moveTo(x - size, y + size);\nctx.lineTo(x + size, y - size);",
- "showPointsLineWidth": 5,
- "showPointsRadius": 3,
- "tooltipValueFormatter": "",
- "showSeparateAxis": false,
- "axisTitle": "",
- "axisPosition": "left",
- "axisTicksFormatter": "",
- "comparisonSettings": {
- "showValuesForComparison": true,
- "comparisonValuesLabel": "",
- "color": ""
- }
- },
- "_hash": 0.6500957113784758
- }
- ],
- "entityAliasId": "b2487e75-2fa4-f211-142c-434dfd50c70c"
- }
- ],
- "timewindow": {
- "realtime": {
- "interval": 1000,
- "timewindowMs": 120000
- },
- "aggregation": {
- "type": "NONE",
- "limit": 25000
- },
- "hideInterval": false,
- "hideAggregation": false
- },
- "showTitle": true,
- "backgroundColor": "#fff",
- "color": "rgba(0, 0, 0, 0.87)",
- "padding": "8px",
- "settings": {
- "shadowSize": 4,
- "fontColor": "#545454",
- "fontSize": 10,
- "xaxis": {
- "showLabels": true,
- "color": "#545454"
- },
- "yaxis": {
- "showLabels": true,
- "color": "#545454"
- },
- "grid": {
- "color": "#545454",
- "tickColor": "#DDDDDD",
- "verticalLines": true,
- "horizontalLines": true,
- "outlineWidth": 1
- },
- "stack": false,
- "tooltipIndividual": false,
- "timeForComparison": "months",
- "xaxisSecond": {
- "axisPosition": "top",
- "showLabels": true
- },
- "showLegend": true,
- "legendConfig": {
- "direction": "column",
- "position": "right",
- "showMin": true,
- "showMax": true,
- "showAvg": true,
- "showTotal": true
- }
- },
- "title": "Real time information",
- "dropShadow": true,
- "enableFullscreen": true,
- "titleStyle": {
- "fontSize": "16px",
- "fontWeight": 400
- },
- "mobileHeight": null,
- "showTitleIcon": false,
- "titleIcon": null,
- "iconColor": "rgba(0, 0, 0, 0.87)",
- "iconSize": "24px",
- "titleTooltip": "",
- "widgetStyle": {},
- "useDashboardTimewindow": false,
- "displayTimewindow": true,
- "actions": {}
- },
- "id": "f928afc4-30d1-8d0c-e3cf-777f9f9d1155",
- "typeFullFqn": "system.charts.basic_timeseries"
- },
- "2a95b473-042d-59d0-2da2-40d0cccb6c8a": {
- "type": "timeseries",
- "sizeX": 7,
- "sizeY": 7,
- "config": {
- "datasources": [
- {
- "type": "entity",
- "dataKeys": [
- {
- "name": "eventsSent",
- "type": "timeseries",
- "label": "Events",
- "color": "#2196f3",
- "settings": {
- "useCellStyleFunction": false,
- "useCellContentFunction": false
- },
- "_hash": 0.8156044798125357
- },
- {
- "name": "eventsProduced",
- "type": "timeseries",
- "label": "Produced",
- "color": "#4caf50",
- "settings": {
- "useCellStyleFunction": false,
- "useCellContentFunction": false
- },
- "_hash": 0.6538259344015449
- }
- ],
- "entityAliasId": "b2487e75-2fa4-f211-142c-434dfd50c70c"
- }
- ],
- "timewindow": {
- "realtime": {
- "interval": 1000,
- "timewindowMs": 604800000
- },
- "aggregation": {
- "type": "NONE",
- "limit": 200
- }
- },
- "showTitle": true,
- "backgroundColor": "rgb(255, 255, 255)",
- "color": "rgba(0, 0, 0, 0.87)",
- "padding": "8px",
- "settings": {
- "showTimestamp": true,
- "displayPagination": true,
- "defaultPageSize": 6,
- "hideEmptyLines": true
- },
- "title": "Total Messages",
- "dropShadow": true,
- "enableFullscreen": true,
- "titleStyle": {
- "fontSize": "16px",
- "fontWeight": 400
- },
- "useDashboardTimewindow": false,
- "showLegend": false,
- "widgetStyle": {},
- "actions": {},
- "showTitleIcon": false,
- "titleIcon": null,
- "iconColor": "rgba(0, 0, 0, 0.87)",
- "iconSize": "24px",
- "titleTooltip": "",
- "displayTimewindow": true,
- "legendConfig": {
- "direction": "column",
- "position": "bottom",
- "showMin": false,
- "showMax": false,
- "showAvg": true,
- "showTotal": false
- }
- },
- "id": "2a95b473-042d-59d0-2da2-40d0cccb6c8a",
- "typeFullFqn": "system.cards.timeseries_table"
- },
- "aaa69366-aacc-9028-65aa-645c0f8533ec": {
- "type": "timeseries",
- "sizeX": 17,
- "sizeY": 4,
- "config": {
- "datasources": [
- {
- "type": "entity",
- "dataKeys": [
- {
- "name": "eventsSent",
- "type": "timeseries",
- "label": "eventsSent",
- "color": "#2196f3",
- "settings": {
- "excludeFromStacking": false,
- "hideDataByDefault": false,
- "disableDataHiding": false,
- "removeFromLegend": false,
- "showLines": true,
- "fillLines": false,
- "showPoints": false,
- "showPointShape": "circle",
- "pointShapeFormatter": "var size = radius * Math.sqrt(Math.PI) / 2;\nctx.moveTo(x - size, y - size);\nctx.lineTo(x + size, y + size);\nctx.moveTo(x - size, y + size);\nctx.lineTo(x + size, y - size);",
- "showPointsLineWidth": 5,
- "showPointsRadius": 3,
- "tooltipValueFormatter": "",
- "showSeparateAxis": false,
- "axisTitle": "",
- "axisPosition": "left",
- "axisTicksFormatter": "",
- "comparisonSettings": {
- "showValuesForComparison": true,
- "comparisonValuesLabel": "",
- "color": ""
- }
- },
- "_hash": 0.41414001784591314
- },
- {
- "name": "eventsProduced",
- "type": "timeseries",
- "label": "eventsProduced",
- "color": "#4caf50",
- "settings": {
- "excludeFromStacking": false,
- "hideDataByDefault": false,
- "disableDataHiding": false,
- "removeFromLegend": false,
- "showLines": true,
- "fillLines": false,
- "showPoints": false,
- "showPointShape": "circle",
- "pointShapeFormatter": "var size = radius * Math.sqrt(Math.PI) / 2;\nctx.moveTo(x - size, y - size);\nctx.lineTo(x + size, y + size);\nctx.moveTo(x - size, y + size);\nctx.lineTo(x + size, y - size);",
- "showPointsLineWidth": 5,
- "showPointsRadius": 3,
- "tooltipValueFormatter": "",
- "showSeparateAxis": false,
- "axisTitle": "",
- "axisPosition": "left",
- "axisTicksFormatter": "",
- "comparisonSettings": {
- "showValuesForComparison": true,
- "comparisonValuesLabel": "",
- "color": ""
- }
- },
- "_hash": 0.7819101846284422
- }
- ],
- "entityAliasId": "b2487e75-2fa4-f211-142c-434dfd50c70c"
- }
- ],
- "timewindow": {
- "realtime": {
- "timewindowMs": 60000
- }
- },
- "showTitle": true,
- "backgroundColor": "#fff",
- "color": "rgba(0, 0, 0, 0.87)",
- "padding": "8px",
- "settings": {
- "shadowSize": 4,
- "fontColor": "#545454",
- "fontSize": 10,
- "xaxis": {
- "showLabels": true,
- "color": "#545454"
- },
- "yaxis": {
- "showLabels": true,
- "color": "#545454"
- },
- "grid": {
- "color": "#545454",
- "tickColor": "#DDDDDD",
- "verticalLines": true,
- "horizontalLines": true,
- "outlineWidth": 1
- },
- "stack": false,
- "tooltipIndividual": false,
- "timeForComparison": "months",
- "xaxisSecond": {
- "axisPosition": "top",
- "showLabels": true
- },
- "showLegend": true,
- "legendConfig": {
- "direction": "column",
- "position": "right",
- "showMin": true,
- "showMax": true,
- "showAvg": true,
- "showTotal": true
- }
- },
- "title": "History information",
- "dropShadow": true,
- "enableFullscreen": true,
- "titleStyle": {
- "fontSize": "16px",
- "fontWeight": 400
- },
- "mobileHeight": null,
- "showTitleIcon": false,
- "titleIcon": null,
- "iconColor": "rgba(0, 0, 0, 0.87)",
- "iconSize": "24px",
- "titleTooltip": "",
- "widgetStyle": {},
- "useDashboardTimewindow": true,
- "displayTimewindow": true,
- "actions": {}
- },
- "id": "aaa69366-aacc-9028-65aa-645c0f8533ec",
- "typeFullFqn": "system.charts.basic_timeseries"
- },
- "ce5c7d01-a3ef-5cf0-4578-8505135c23a0": {
- "type": "timeseries",
- "sizeX": 17,
- "sizeY": 4,
- "config": {
- "datasources": [
- {
- "type": "entity",
- "dataKeys": [
- {
- "name": "bleEventsProduced",
- "type": "timeseries",
- "label": "bleEventsProduced",
- "color": "#2196f3",
- "settings": {
- "excludeFromStacking": false,
- "hideDataByDefault": false,
- "disableDataHiding": false,
- "removeFromLegend": false,
- "showLines": true,
- "fillLines": false,
- "showPoints": false,
- "showPointShape": "circle",
- "pointShapeFormatter": "var size = radius * Math.sqrt(Math.PI) / 2;\nctx.moveTo(x - size, y - size);\nctx.lineTo(x + size, y + size);\nctx.moveTo(x - size, y + size);\nctx.lineTo(x + size, y - size);",
- "showPointsLineWidth": 5,
- "showPointsRadius": 3,
- "tooltipValueFormatter": "",
- "showSeparateAxis": false,
- "axisTitle": "",
- "axisPosition": "left",
- "axisTicksFormatter": "",
- "comparisonSettings": {
- "showValuesForComparison": true,
- "comparisonValuesLabel": "",
- "color": ""
- }
- },
- "_hash": 0.5625165504526104
- },
- {
- "name": "bleEventsSent",
- "type": "timeseries",
- "label": "bleEventsSent",
- "color": "#4caf50",
- "settings": {
- "excludeFromStacking": false,
- "hideDataByDefault": false,
- "disableDataHiding": false,
- "removeFromLegend": false,
- "showLines": true,
- "fillLines": false,
- "showPoints": false,
- "showPointShape": "circle",
- "pointShapeFormatter": "var size = radius * Math.sqrt(Math.PI) / 2;\nctx.moveTo(x - size, y - size);\nctx.lineTo(x + size, y + size);\nctx.moveTo(x - size, y + size);\nctx.lineTo(x + size, y - size);",
- "showPointsLineWidth": 5,
- "showPointsRadius": 3,
- "tooltipValueFormatter": "",
- "showSeparateAxis": false,
- "axisTitle": "",
- "axisPosition": "left",
- "axisTicksFormatter": "",
- "comparisonSettings": {
- "showValuesForComparison": true,
- "comparisonValuesLabel": "",
- "color": ""
- }
- },
- "_hash": 0.6817950080745288
- }
- ],
- "entityAliasId": "b2487e75-2fa4-f211-142c-434dfd50c70c"
- }
- ],
- "timewindow": {
- "realtime": {
- "interval": 5000,
- "timewindowMs": 120000
- },
- "aggregation": {
- "type": "AVG",
- "limit": 25000
- }
- },
- "showTitle": true,
- "backgroundColor": "#fff",
- "color": "rgba(0, 0, 0, 0.87)",
- "padding": "8px",
- "settings": {
- "shadowSize": 4,
- "fontColor": "#545454",
- "fontSize": 10,
- "xaxis": {
- "showLabels": true,
- "color": "#545454"
- },
- "yaxis": {
- "showLabels": true,
- "color": "#545454"
- },
- "grid": {
- "color": "#545454",
- "tickColor": "#DDDDDD",
- "verticalLines": true,
- "horizontalLines": true,
- "outlineWidth": 1
- },
- "stack": false,
- "tooltipIndividual": false,
- "timeForComparison": "months",
- "xaxisSecond": {
- "axisPosition": "top",
- "showLabels": true
- },
- "showLegend": true,
- "legendConfig": {
- "direction": "column",
- "position": "right",
- "showMin": true,
- "showMax": true,
- "showAvg": true,
- "showTotal": true
- }
- },
- "title": "Real time information",
- "dropShadow": true,
- "enableFullscreen": true,
- "titleStyle": {
- "fontSize": "16px",
- "fontWeight": 400
- },
- "mobileHeight": null,
- "showTitleIcon": false,
- "titleIcon": null,
- "iconColor": "rgba(0, 0, 0, 0.87)",
- "iconSize": "24px",
- "titleTooltip": "",
- "widgetStyle": {},
- "useDashboardTimewindow": false,
- "displayTimewindow": true,
- "actions": {}
- },
- "id": "ce5c7d01-a3ef-5cf0-4578-8505135c23a0",
- "typeFullFqn": "system.charts.basic_timeseries"
- },
- "466f046d-6005-a168-b107-60fcb2469cd5": {
- "type": "latest",
- "sizeX": 7,
- "sizeY": 5,
- "config": {
- "datasources": [
- {
- "type": "entity",
- "dataKeys": [],
- "entityAliasId": "b2487e75-2fa4-f211-142c-434dfd50c70c"
- }
- ],
- "timewindow": {
- "displayValue": "",
- "selectedTab": 0,
- "realtime": {
- "realtimeType": 1,
- "interval": 1000,
- "timewindowMs": 60000,
- "quickInterval": "CURRENT_DAY"
- },
- "history": {
- "historyType": 0,
- "interval": 1000,
- "timewindowMs": 60000,
- "fixedTimewindow": {
- "startTimeMs": 1694085270425,
- "endTimeMs": 1694171670425
- },
- "quickInterval": "CURRENT_DAY"
- },
- "aggregation": {
- "type": "AVG",
- "limit": 25000
- }
- },
- "showTitle": true,
- "backgroundColor": "#fff",
- "color": "rgba(0, 0, 0, 0.87)",
- "padding": "8px",
- "settings": {
- "eventsTitle": "Gateway Events Form",
- "eventsReg": [
- "EventsProduced",
- "EventsSent"
- ]
- },
- "title": "Gateway events",
- "showTitleIcon": false,
- "titleIcon": null,
- "iconColor": "rgba(0, 0, 0, 0.87)",
- "iconSize": "24px",
- "titleTooltip": "",
- "dropShadow": true,
- "enableFullscreen": true,
- "widgetStyle": {},
- "titleStyle": {
- "fontSize": "16px",
- "fontWeight": 400
- },
- "useDashboardTimewindow": true,
- "displayTimewindow": true,
- "showLegend": false,
- "actions": {}
- },
- "id": "466f046d-6005-a168-b107-60fcb2469cd5",
- "typeFullFqn": "system.gateway_widgets.attributes_card"
- },
- "8fc32225-164f-3258-73f7-e6b6d959cf0b": {
- "type": "latest",
- "sizeX": 10,
- "sizeY": 9,
- "config": {
- "datasources": [
- {
- "type": "entity",
- "dataKeys": [],
- "entityAliasId": "b2487e75-2fa4-f211-142c-434dfd50c70c"
- }
- ],
- "timewindow": {
- "displayValue": "",
- "selectedTab": 0,
- "realtime": {
- "realtimeType": 1,
- "interval": 1000,
- "timewindowMs": 60000,
- "quickInterval": "CURRENT_DAY"
- },
- "history": {
- "historyType": 0,
- "interval": 1000,
- "timewindowMs": 60000,
- "fixedTimewindow": {
- "startTimeMs": 1694085270425,
- "endTimeMs": 1694171670425
- },
- "quickInterval": "CURRENT_DAY"
- },
- "aggregation": {
- "type": "AVG",
- "limit": 25000
- }
- },
- "showTitle": true,
- "backgroundColor": "#fff",
- "color": "rgba(0, 0, 0, 0.87)",
- "padding": "8px",
- "settings": {
- "gatewayTitle": "Gateway configuration (Single device)",
- "readOnly": false
- },
- "title": "New Gateway configuration (Single device)",
- "showTitleIcon": false,
- "titleIcon": null,
- "iconColor": "rgba(0, 0, 0, 0.87)",
- "iconSize": "24px",
- "titleTooltip": "",
- "dropShadow": true,
- "enableFullscreen": true,
- "widgetStyle": {},
- "titleStyle": {
- "fontSize": "16px",
- "fontWeight": 400
- },
- "useDashboardTimewindow": true,
- "displayTimewindow": true,
- "showLegend": false,
- "actions": {}
- },
- "id": "8fc32225-164f-3258-73f7-e6b6d959cf0b",
- "typeFullFqn": "system.gateway_widgets.config_form_latest"
- },
- "063fc179-c9fd-f952-e714-f24e9c43c05c": {
- "type": "rpc",
- "sizeX": 4,
- "sizeY": 2,
- "config": {
- "targetDeviceAliases": [],
- "showTitle": false,
- "backgroundColor": "#e6e7e8",
- "color": "rgba(0, 0, 0, 0.87)",
- "padding": "0px",
- "settings": {
- "requestTimeout": 5000,
- "oneWayElseTwoWay": true,
- "styleButton": {
- "isRaised": true,
- "isPrimary": false
- },
- "methodParams": "{}",
- "methodName": "gateway_reboot",
- "buttonText": "GATEWAY REBOOT"
- },
- "title": "New RPC Button",
- "dropShadow": true,
- "enableFullscreen": false,
- "widgetStyle": {},
- "titleStyle": {
- "fontSize": "16px",
- "fontWeight": 400
- },
- "useDashboardTimewindow": true,
- "showLegend": false,
- "actions": {},
- "datasources": [],
- "showTitleIcon": false,
- "titleIcon": null,
- "iconColor": "rgba(0, 0, 0, 0.87)",
- "iconSize": "24px",
- "titleTooltip": "",
- "displayTimewindow": true,
- "targetDeviceAliasIds": [
- "b2487e75-2fa4-f211-142c-434dfd50c70c"
- ]
- },
- "id": "063fc179-c9fd-f952-e714-f24e9c43c05c",
- "typeFullFqn": "system.control_widgets.rpcbutton"
- },
- "3c2134cc-27a0-93e1-dbe1-2fa7c1ce16b7": {
- "type": "rpc",
- "sizeX": 4,
- "sizeY": 2,
- "config": {
- "targetDeviceAliases": [],
- "showTitle": false,
- "backgroundColor": "#e6e7e8",
- "color": "rgba(0, 0, 0, 0.87)",
- "padding": "0px",
- "settings": {
- "requestTimeout": 5000,
- "oneWayElseTwoWay": true,
- "styleButton": {
- "isRaised": true,
- "isPrimary": false
- },
- "methodName": "gateway_restart",
- "methodParams": "{}",
- "buttonText": "GATEWAY RESTART"
- },
- "title": "New RPC Button",
- "dropShadow": true,
- "enableFullscreen": false,
- "widgetStyle": {},
- "titleStyle": {
- "fontSize": "16px",
- "fontWeight": 400
- },
- "useDashboardTimewindow": true,
- "showLegend": false,
- "actions": {},
- "datasources": [],
- "showTitleIcon": false,
- "titleIcon": null,
- "iconColor": "rgba(0, 0, 0, 0.87)",
- "iconSize": "24px",
- "titleTooltip": "",
- "displayTimewindow": true,
- "targetDeviceAliasIds": [
- "b2487e75-2fa4-f211-142c-434dfd50c70c"
- ]
- },
- "id": "3c2134cc-27a0-93e1-dbe1-2fa7c1ce16b7",
- "typeFullFqn": "system.control_widgets.rpcbutton"
- },
- "6770b6ba-eff8-df05-75f8-c1f9326d4842": {
- "type": "latest",
- "sizeX": 6,
- "sizeY": 4,
- "config": {
- "datasources": [
- {
- "type": "entity",
- "dataKeys": [
- {
- "name": "latitude",
- "type": "attribute",
- "label": "latitude",
- "color": "#2196f3",
- "settings": {},
- "_hash": 0.9743324774725604
- },
- {
- "name": "longitude",
- "type": "attribute",
- "label": "longitude",
- "color": "#4caf50",
- "settings": {},
- "_hash": 0.5530093635101525
- }
- ],
- "entityAliasId": "b2487e75-2fa4-f211-142c-434dfd50c70c"
- }
- ],
- "timewindow": {
- "displayValue": "",
- "selectedTab": 0,
- "realtime": {
- "realtimeType": 1,
- "interval": 1000,
- "timewindowMs": 60000,
- "quickInterval": "CURRENT_DAY"
- },
- "history": {
- "historyType": 0,
- "interval": 1000,
- "timewindowMs": 60000,
- "fixedTimewindow": {
- "startTimeMs": 1694085270425,
- "endTimeMs": 1694171670425
- },
- "quickInterval": "CURRENT_DAY"
- },
- "aggregation": {
- "type": "AVG",
- "limit": 25000
- }
- },
- "showTitle": false,
- "backgroundColor": "#fff",
- "color": "rgba(0, 0, 0, 0.87)",
- "padding": "8px",
- "settings": {
- "fitMapBounds": true,
- "latKeyName": "latitude",
- "lngKeyName": "longitude",
- "showLabel": true,
- "label": "${entityName}",
- "tooltipPattern": "${entityName}
Latitude: ${latitude:7}
Longitude: ${longitude:7}
Delete",
- "markerImageSize": 34,
- "useColorFunction": false,
- "markerImages": [],
- "useMarkerImageFunction": false,
- "color": "#fe7569",
- "mapProvider": "OpenStreetMap.Mapnik",
- "showTooltip": true,
- "autocloseTooltip": true,
- "defaultCenterPosition": [
- 0,
- 0
- ],
- "customProviderTileUrl": "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
- "showTooltipAction": "click",
- "polygonKeyName": "coordinates",
- "polygonOpacity": 0.5,
- "polygonStrokeOpacity": 1,
- "polygonStrokeWeight": 1,
- "zoomOnClick": true,
- "showCoverageOnHover": true,
- "animate": true,
- "maxClusterRadius": 80,
- "removeOutsideVisibleBounds": true,
- "defaultZoomLevel": 5
- },
- "title": "Gateway Location",
- "dropShadow": true,
- "enableFullscreen": false,
- "titleStyle": {
- "fontSize": "16px",
- "fontWeight": 400
- },
- "useDashboardTimewindow": true,
- "showLegend": false,
- "widgetStyle": {},
- "actions": {
- "tooltipAction": [
- {
- "id": "54c293c4-9ca6-e34f-dc6a-0271944c1c66",
- "name": "delete",
- "icon": "more_horiz",
- "type": "custom",
- "customFunction": "var $rootScope = widgetContext.$scope.$injector.get('$rootScope');\nvar entityDatasource = widgetContext.map.subscription.datasources.filter(\n function(entity) {\n return entity.entityId === entityId.id\n });\n\nwidgetContext.map.saveMarkerLocation(entityDatasource[0],\n widgetContext.map.locations[0], {\n \"lat\": null,\n \"lng\": null\n }).then(function succes() {\n $rootScope.$broadcast('widgetForceReInit');\n });"
- }
- ]
- },
- "showTitleIcon": false,
- "titleIcon": null,
- "iconColor": "rgba(0, 0, 0, 0.87)",
- "iconSize": "24px",
- "titleTooltip": "",
- "displayTimewindow": true
- },
- "id": "6770b6ba-eff8-df05-75f8-c1f9326d4842",
- "typeFullFqn": "system.input_widgets.markers_placement_openstreetmap"
- }
- },
- "states": {
- "main_gateway": {
- "name": "Gateways",
- "root": true,
- "layouts": {
- "main": {
- "widgets": {
- "94715984-ae74-76e4-20b7-2f956b01ed80": {
- "sizeX": 24,
- "sizeY": 12,
- "row": 0,
- "col": 0
- }
- },
- "gridSettings": {
- "backgroundColor": "#eeeeee",
- "color": "rgba(0,0,0,0.870588)",
- "columns": 24,
- "backgroundSizeMode": "100%",
- "autoFillHeight": true,
- "mobileAutoFillHeight": false,
- "mobileRowHeight": 70,
- "margin": 10,
- "outerMargin": true
- }
- }
- }
- },
- "__entityname__config": {
- "name": "${entityName} Configuration",
- "root": false,
- "layouts": {
- "main": {
- "widgets": {
- "eadabbc7-519e-76fc-ba10-b3fe8c18da10": {
- "sizeX": 14,
- "sizeY": 13,
- "row": 0,
- "col": 10
- },
- "8fc32225-164f-3258-73f7-e6b6d959cf0b": {
- "sizeX": 10,
- "sizeY": 9,
- "row": 0,
- "col": 0
- },
- "063fc179-c9fd-f952-e714-f24e9c43c05c": {
- "sizeX": 4,
- "sizeY": 2,
- "row": 9,
- "col": 0
- },
- "3c2134cc-27a0-93e1-dbe1-2fa7c1ce16b7": {
- "sizeX": 4,
- "sizeY": 2,
- "row": 11,
- "col": 0
- },
- "6770b6ba-eff8-df05-75f8-c1f9326d4842": {
- "sizeX": 6,
- "sizeY": 4,
- "row": 9,
- "col": 4
- }
- },
- "gridSettings": {
- "backgroundColor": "#eeeeee",
- "color": "rgba(0,0,0,0.870588)",
- "columns": 24,
- "backgroundSizeMode": "100%",
- "autoFillHeight": true,
- "mobileAutoFillHeight": false,
- "mobileRowHeight": 70,
- "margin": 10,
- "outerMargin": true
- }
- }
- }
- },
- "__entityname_grafic": {
- "name": "${entityName} Details",
- "root": false,
- "layouts": {
- "main": {
- "widgets": {
- "f928afc4-30d1-8d0c-e3cf-777f9f9d1155": {
- "sizeX": 17,
- "sizeY": 4,
- "mobileHeight": null,
- "row": 4,
- "col": 7
- },
- "2a95b473-042d-59d0-2da2-40d0cccb6c8a": {
- "sizeX": 7,
- "sizeY": 7,
- "row": 5,
- "col": 0
- },
- "aaa69366-aacc-9028-65aa-645c0f8533ec": {
- "sizeX": 17,
- "sizeY": 4,
- "mobileHeight": null,
- "row": 0,
- "col": 7
- },
- "ce5c7d01-a3ef-5cf0-4578-8505135c23a0": {
- "sizeX": 17,
- "sizeY": 4,
- "mobileHeight": null,
- "row": 8,
- "col": 7
- },
- "466f046d-6005-a168-b107-60fcb2469cd5": {
- "sizeX": 7,
- "sizeY": 5,
- "row": 0,
- "col": 0
- }
- },
- "gridSettings": {
- "backgroundColor": "#eeeeee",
- "color": "rgba(0,0,0,0.870588)",
- "columns": 24,
- "backgroundSizeMode": "auto 100%",
- "autoFillHeight": true,
- "mobileAutoFillHeight": true,
- "mobileRowHeight": 70,
- "margin": 10,
- "outerMargin": true
- }
- }
- }
- }
- },
- "entityAliases": {
- "3e0f533a-0db1-3292-184f-06e73535061a": {
- "id": "3e0f533a-0db1-3292-184f-06e73535061a",
- "alias": "Gateways",
- "filter": {
- "type": "deviceType",
- "resolveMultiple": true,
- "deviceNameFilter": "",
- "deviceTypes": [
- "gateway"
- ]
- }
- },
- "b2487e75-2fa4-f211-142c-434dfd50c70c": {
- "id": "b2487e75-2fa4-f211-142c-434dfd50c70c",
- "alias": "Current Gateway",
- "filter": {
- "type": "stateEntity",
- "resolveMultiple": false,
- "stateEntityParamName": "",
- "defaultStateEntity": null
- }
- }
- },
- "timewindow": {
- "realtime": {
- "interval": 1000,
- "timewindowMs": 86400000
- },
- "aggregation": {
- "type": "NONE",
- "limit": 25000
- },
- "hideInterval": false,
- "hideAggregation": false,
- "hideAggInterval": false
- },
- "settings": {
- "stateControllerId": "entity",
- "showTitle": true,
- "showDashboardsSelect": true,
- "showEntitiesSelect": true,
- "showDashboardTimewindow": true,
- "showDashboardExport": true,
- "toolbarAlwaysOpen": true,
- "titleColor": "rgba(0,0,0,0.870588)"
- },
- "filters": {}
- },
- "externalId": null,
- "name": "Gateways"
-}
\ No newline at end of file
diff --git a/application/src/main/data/json/edge/instructions/install/docker/instructions.md b/application/src/main/data/json/edge/instructions/install/docker/instructions.md
index cbfe5f8c4c..b07b128062 100644
--- a/application/src/main/data/json/edge/instructions/install/docker/instructions.md
+++ b/application/src/main/data/json/edge/instructions/install/docker/instructions.md
@@ -51,7 +51,7 @@ services:
- ~/.mytb-edge-logs:/var/log/tb-edge
postgres:
restart: always
- image: "postgres:12"
+ image: "postgres:15"
ports:
- "5432"
environment:
diff --git a/application/src/main/data/json/demo/dashboards/gateway.json b/application/src/main/data/json/tenant/dashboards/gateways.json
similarity index 99%
rename from application/src/main/data/json/demo/dashboards/gateway.json
rename to application/src/main/data/json/tenant/dashboards/gateways.json
index b35b480ef2..972aed299f 100644
--- a/application/src/main/data/json/demo/dashboards/gateway.json
+++ b/application/src/main/data/json/tenant/dashboards/gateways.json
@@ -1,5 +1,5 @@
{
- "title": "Gateway",
+ "title": "ThingsBoard IoT Gateways",
"image": null,
"mobileHide": false,
"mobileOrder": null,
@@ -40,7 +40,7 @@
"color": "rgba(0, 0, 0, 0.87)",
"padding": "4px",
"settings": {
- "entitiesTitle": "Gateway list",
+ "entitiesTitle": "Gateways list",
"enableSearch": true,
"enableSelectColumnDisplay": false,
"enableStickyHeader": true,
@@ -55,7 +55,7 @@
"defaultSortOrder": "entityName",
"useRowStyleFunction": false
},
- "title": "New Entities table",
+ "title": "Gateways list",
"dropShadow": true,
"enableFullscreen": false,
"titleStyle": {
@@ -571,11 +571,11 @@
"padding": "8px",
"settings": {
"useMarkdownTextFunction": true,
- "markdownTextFunction": "var blockData = '';\nvar connectorsIndex = ctx.actionsApi.getActionDescriptors('elementClick').findIndex(action=>action.name==\"Connecotrs\");\nvar logsIndex = ctx.actionsApi.getActionDescriptors('elementClick').findIndex(action=>action.name==\"Logs\");\nfunction generateMatHeader(index) {\n if( index !== undefined && index > -1) {\n return ``\n } else {\n return \"\" \n }\n}\nfunction createDataBlock(value, label, dividerStyle, mobile, index) {\n blockData += `\n \n \n \n ${generateMatHeader(index)}\n ${label}\n \n ${value}\n `;\n}\ncreateDataBlock(data[0].Status, \"Status\", data[0].Status === \"Active\"? 'divider-green' : 'divider-red');\ncreateDataBlock(data[0].Name, \"Gateway Name\", '', ctx.isMobile);\ncreateDataBlock(data[0].Type, \"Gateway Type\", '');\ncreateDataBlock(\n `${(data[1]?data[1].count:0)} `\n + \" | \" + \n `${(data[2]?data[2][\"count 2\"]:0)} `\n , \"Devices (Active | Inactive)\", '');\ncreateDataBlock(\n `${(data[0].active_connectors?JSON.parse(data[0].active_connectors).length:0)} `\n + \" | \" + \n `${(data[0].inactive_connectors?JSON.parse(data[0].inactive_connectors).length:0)} `\n , \"Connectors (Active | Inactive)\", '', '', connectorsIndex);\ncreateDataBlock(data[0].ALL_ERRORS_COUNT || 0, \"Errors\", (data[0].ALL_ERRORS_COUNT || 0) === 0 ? 'divider-green' : 'divider-red', '', logsIndex);\nreturn `${blockData}
`;",
+ "markdownTextFunction": "var blockData = '';\nvar connectorsIndex = ctx.actionsApi.getActionDescriptors('elementClick').findIndex(action=>action.name==\"Connectors\");\nvar logsIndex = ctx.actionsApi.getActionDescriptors('elementClick').findIndex(action=>action.name==\"Logs\");\nfunction generateMatHeader(index) {\n if( index !== undefined && index > -1) {\n return ``\n } else {\n return \"\" \n }\n}\nfunction createDataBlock(value, label, dividerStyle, mobile, index) {\n blockData += `\n \n \n \n ${generateMatHeader(index)}\n ${label}\n \n ${value}\n `;\n}\ncreateDataBlock(data[0].Status, \"Status\", data[0].Status === \"Active\"? 'divider-green' : 'divider-red');\ncreateDataBlock(data[0].Name, \"Gateway Name\", '', ctx.isMobile);\ncreateDataBlock(data[0].Type, \"Gateway Type\", '');\ncreateDataBlock(\n `${(data[1]?data[1].count:0)} `\n + \" | \" + \n `${(data[2]?data[2][\"count 2\"]:0)} `\n , \"Devices (Active | Inactive)\", '');\ncreateDataBlock(\n `${(data[0].active_connectors?JSON.parse(data[0].active_connectors).length:0)} `\n + \" | \" + \n `${(data[0].inactive_connectors?JSON.parse(data[0].inactive_connectors).length:0)} `\n , \"Connectors (Active | Inactive)\", '', '', connectorsIndex);\ncreateDataBlock(data[0].ALL_ERRORS_COUNT || 0, \"Errors\", (data[0].ALL_ERRORS_COUNT || 0) === 0 ? 'divider-green' : 'divider-red', '', logsIndex);\nreturn `${blockData}
`;",
"applyDefaultMarkdownStyle": false,
"markdownCss": ".divider {\n position: absolute;\n width: 3px;\n top: 8px;\n border-radius: 2px;\n bottom: 8px;\n border: 1px solid rgba(31, 70, 144, 1);\n background-color: rgba(31, 70, 144, 1);\n left: 10px;\n}\n.divider-green .divider {\n border: 1px solid rgb(25,128,56);\n background-color: rgb(25,128,56);\n}\n\n.divider-green .mat-mdc-card-content {\n color: rgb(25,128,56);\n}\n\n.divider-red .divider {\n border: 1px solid rgb(203,37,48);\n background-color: rgb(203,37,48);\n}\n\n.divider-red .mat-mdc-card-content {\n color: rgb(203,37,48);\n}\n\n.mdc-card {\n position: relative;\n padding-left: 10px;\n margin-bottom: 1px;\n}\n\n.mat-mdc-card-subtitle {\n font-weight: 400;\n font-size: 12px;\n}\n\n.mat-mdc-card-header {\n padding: 8px 16px 0;\n}\n\n.mat-mdc-card-content:last-child {\n padding-bottom: 8px;\n font-size: 16px;\n}\n\n.cards-container {\n height: calc(100% - 1px);\n justify-content: stretch;\n align-items: center;\n margin-bottom: 1px;\n}\n\n::ng-deep.tb-home-widget-link > div {\n flex-grow: 1;\n cursor: pointer;\n}\n\n .tb-home-widget-link {\n width: 100%;\n }\n\n .tb-home-widget-link:hover::after{\n color: inherit;\n }\n \n .tb-home-widget-link::after{\n content: 'arrow_forward';\n display: inline-block;\n transform: rotate(315deg);\n font-family: 'Material Icons';\n font-weight: normal;\n font-style: normal;\n font-size: 18px;\n color: rgba(0, 0, 0, 0.12);\n vertical-align: bottom;\n margin-left: 6px;\n}"
},
- "title": "New Markdown/HTML Card",
+ "title": "Connectors",
"showTitleIcon": false,
"iconColor": "rgba(0, 0, 0, 0.87)",
"iconSize": "24px",
@@ -599,7 +599,7 @@
"actions": {
"elementClick": [
{
- "name": "Connecotrs",
+ "name": "Connectors",
"icon": "more_horiz",
"useShowWidgetActionFunction": null,
"showWidgetActionFunction": "return true;",
@@ -680,7 +680,7 @@
"defaultSortOrder": "-createdTime",
"useRowStyleFunction": false
},
- "title": "New Alarms table",
+ "title": "Alarms",
"dropShadow": true,
"enableFullscreen": false,
"titleStyle": {
@@ -1074,7 +1074,7 @@
}
]
},
- "title": "New RPC remote shell",
+ "title": "RPC remote shell",
"dropShadow": true,
"enableFullscreen": true,
"widgetStyle": {
@@ -1485,7 +1485,7 @@
}
]
},
- "title": "New RPC debug terminal",
+ "title": "RPC debug terminal",
"dropShadow": true,
"enableFullscreen": true,
"widgetStyle": {},
@@ -1868,7 +1868,7 @@
"applyDefaultMarkdownStyle": false,
"markdownCss": ".action-buttons-container {\r\n display: flex;\r\n flex-wrap: wrap;\r\n flex-direction: row;\r\n height: 100%;\r\n width: 100%;\r\n align-content: center;\r\n}\r\n\r\nbutton {\r\n flex-grow: 1;\r\n margin: 10px;\r\n min-width: 150px;\r\n height: auto;\r\n}"
},
- "title": "New Markdown/HTML Card",
+ "title": "Service command",
"showTitleIcon": false,
"iconColor": "rgba(0, 0, 0, 0.87)",
"iconSize": "24px",
@@ -1980,7 +1980,7 @@
"applyDefaultMarkdownStyle": false,
"markdownCss": ".action-buttons-container {\r\n display: flex;\r\n flex-wrap: wrap;\r\n flex-direction: row;\r\n height: 100%;\r\n width: 100%;\r\n align-content: start;\r\n}\r\n\r\nbutton {\r\n flex-grow: 1;\r\n margin: 10px;\r\n min-width: 150px;\r\n height: auto;\r\n}"
},
- "title": "New Markdown/HTML Card",
+ "title": "General configuration",
"showTitleIcon": false,
"iconColor": "rgba(0, 0, 0, 0.87)",
"iconSize": "24px",
@@ -2145,7 +2145,7 @@
"applyDefaultMarkdownStyle": true,
"markdownCss": ".mat-mdc-form-field-subscript-wrapper {\n display: none !important;\n}"
},
- "title": "New Markdown/HTML Card",
+ "title": "Gateway devices",
"showTitleIcon": false,
"iconColor": "rgba(0, 0, 0, 0.87)",
"iconSize": "24px",
@@ -4939,7 +4939,7 @@
"applyDefaultMarkdownStyle": false,
"markdownCss": ".action-container {\r\n display: flex;\r\n flex-wrap: wrap;\r\n flex-direction: row;\r\n height: 100%;\r\n width: 100%;\r\n}\r\n\r\nbutton {\r\n flex-grow: 1;\r\n margin: 10px;\r\n min-width: 150px;\r\n height: auto;\r\n}"
},
- "title": "New Markdown/HTML Card",
+ "title": "Gateway commands",
"showTitleIcon": false,
"iconColor": "rgba(0, 0, 0, 0.87)",
"iconSize": "24px",
diff --git a/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java b/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java
index 3d4340f6c9..607d5d8791 100644
--- a/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java
+++ b/application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java
@@ -29,6 +29,7 @@ import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.thingsboard.common.util.JacksonUtil;
+import org.thingsboard.server.service.executors.PubSubRuleNodeExecutorProvider;
import org.thingsboard.rule.engine.api.MailService;
import org.thingsboard.rule.engine.api.NotificationCenter;
import org.thingsboard.rule.engine.api.SmsService;
@@ -322,6 +323,11 @@ public class ActorSystemContext {
@Getter
private NotificationExecutorService notificationExecutor;
+ @Lazy
+ @Autowired
+ @Getter
+ private PubSubRuleNodeExecutorProvider pubSubRuleNodeExecutorProvider;
+
@Autowired
@Getter
private SharedEventLoopGroupService sharedEventLoopGroupService;
diff --git a/application/src/main/java/org/thingsboard/server/actors/device/DeviceActor.java b/application/src/main/java/org/thingsboard/server/actors/device/DeviceActor.java
index 48425d58db..d69b9aec0b 100644
--- a/application/src/main/java/org/thingsboard/server/actors/device/DeviceActor.java
+++ b/application/src/main/java/org/thingsboard/server/actors/device/DeviceActor.java
@@ -64,6 +64,9 @@ public class DeviceActor extends ContextAwareActor {
case DEVICE_ATTRIBUTES_UPDATE_TO_DEVICE_ACTOR_MSG:
processor.processAttributesUpdate((DeviceAttributesEventNotificationMsg) msg);
break;
+ case DEVICE_DELETE_TO_DEVICE_ACTOR_MSG:
+ ctx.stop(ctx.getSelf());
+ break;
case DEVICE_CREDENTIALS_UPDATE_TO_DEVICE_ACTOR_MSG:
processor.processCredentialsUpdate(msg);
break;
diff --git a/application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java b/application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java
index ca1d174322..28963b383a 100644
--- a/application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java
+++ b/application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java
@@ -104,6 +104,7 @@ import org.thingsboard.server.dao.widget.WidgetsBundleService;
import org.thingsboard.server.gen.transport.TransportProtos;
import org.thingsboard.server.queue.TbQueueCallback;
import org.thingsboard.server.queue.TbQueueMsgMetadata;
+import org.thingsboard.server.service.executors.PubSubRuleNodeExecutorProvider;
import org.thingsboard.server.service.script.RuleNodeJsScriptEngine;
import org.thingsboard.server.service.script.RuleNodeTbelScriptEngine;
@@ -538,6 +539,11 @@ class DefaultTbContext implements TbContext {
return mainCtx.getNotificationExecutor();
}
+ @Override
+ public PubSubRuleNodeExecutorProvider getPubSubRuleNodeExecutorProvider() {
+ return mainCtx.getPubSubRuleNodeExecutorProvider();
+ }
+
@Override
@Deprecated
public ScriptEngine createJsScriptEngine(String script, String... argNames) {
diff --git a/application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java b/application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java
index c9f5448df3..86f338e89d 100644
--- a/application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java
+++ b/application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java
@@ -53,10 +53,13 @@ import org.thingsboard.server.common.msg.queue.PartitionChangeMsg;
import org.thingsboard.server.common.msg.queue.QueueToRuleEngineMsg;
import org.thingsboard.server.common.msg.queue.RuleEngineException;
import org.thingsboard.server.common.msg.queue.ServiceType;
+import org.thingsboard.server.common.msg.rule.engine.DeviceDeleteMsg;
import org.thingsboard.server.service.edge.rpc.EdgeRpcService;
import org.thingsboard.server.service.transport.msg.TransportToDeviceActorMsgWrapper;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
@Slf4j
public class TenantActor extends RuleChainManagerActor {
@@ -65,8 +68,11 @@ public class TenantActor extends RuleChainManagerActor {
private boolean isCore;
private ApiUsageState apiUsageState;
+ private Set deletedDevices;
+
private TenantActor(ActorSystemContext systemContext, TenantId tenantId) {
super(systemContext, tenantId);
+ this.deletedDevices = new HashSet<>();
}
boolean cantFindTenant = false;
@@ -221,6 +227,10 @@ public class TenantActor extends RuleChainManagerActor {
if (!isCore) {
log.warn("RECEIVED INVALID MESSAGE: {}", msg);
}
+ if (deletedDevices.contains(msg.getDeviceId())) {
+ log.debug("RECEIVED MESSAGE FOR DELETED DEVICE: {}", msg);
+ return;
+ }
TbActorRef deviceActor = getOrCreateDeviceActor(msg.getDeviceId());
if (priority) {
deviceActor.tellWithHighPriority(msg);
@@ -240,7 +250,8 @@ public class TenantActor extends RuleChainManagerActor {
log.info("[{}] Received API state update. Going to ENABLE Rule Engine execution.", tenantId);
initRuleChains();
}
- } else if (msg.getEntityId().getEntityType() == EntityType.EDGE) {
+ }
+ if (msg.getEntityId().getEntityType() == EntityType.EDGE) {
EdgeId edgeId = new EdgeId(msg.getEntityId().getId());
EdgeRpcService edgeRpcService = systemContext.getEdgeRpcService();
if (msg.getEvent() == ComponentLifecycleEvent.DELETED) {
@@ -249,7 +260,13 @@ public class TenantActor extends RuleChainManagerActor {
Edge edge = systemContext.getEdgeService().findEdgeById(tenantId, edgeId);
edgeRpcService.updateEdge(tenantId, edge);
}
- } else if (isRuleEngine) {
+ }
+ if (msg.getEntityId().getEntityType() == EntityType.DEVICE && ComponentLifecycleEvent.DELETED == msg.getEvent()) {
+ DeviceId deviceId = (DeviceId) msg.getEntityId();
+ onToDeviceActorMsg(new DeviceDeleteMsg(tenantId, deviceId), true);
+ deletedDevices.add(deviceId);
+ }
+ if (isRuleEngine) {
TbActorRef target = getEntityActorRef(msg.getEntityId());
if (target != null) {
if (msg.getEntityId().getEntityType() == EntityType.RULE_CHAIN) {
diff --git a/application/src/main/java/org/thingsboard/server/config/CustomOAuth2AuthorizationRequestResolver.java b/application/src/main/java/org/thingsboard/server/config/CustomOAuth2AuthorizationRequestResolver.java
index 4d227345b1..e0d5d3e04e 100644
--- a/application/src/main/java/org/thingsboard/server/config/CustomOAuth2AuthorizationRequestResolver.java
+++ b/application/src/main/java/org/thingsboard/server/config/CustomOAuth2AuthorizationRequestResolver.java
@@ -38,6 +38,7 @@ import org.springframework.web.util.UriComponentsBuilder;
import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.dao.oauth2.OAuth2Configuration;
import org.thingsboard.server.dao.oauth2.OAuth2Service;
+import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.security.auth.oauth2.TbOAuth2ParameterNames;
import org.thingsboard.server.service.security.model.token.OAuth2AppTokenFactory;
import org.thingsboard.server.utils.MiscUtils;
@@ -51,6 +52,7 @@ import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
+@TbCoreComponent
@Service
@Slf4j
public class CustomOAuth2AuthorizationRequestResolver implements OAuth2AuthorizationRequestResolver {
diff --git a/application/src/main/java/org/thingsboard/server/config/TbRuleEngineSecurityConfiguration.java b/application/src/main/java/org/thingsboard/server/config/TbRuleEngineSecurityConfiguration.java
new file mode 100644
index 0000000000..7b3a752f57
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/config/TbRuleEngineSecurityConfiguration.java
@@ -0,0 +1,44 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.config;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
+import org.springframework.boot.autoconfigure.security.SecurityProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.Order;
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.web.SecurityFilterChain;
+
+@Configuration
+@EnableWebSecurity
+@EnableGlobalMethodSecurity(prePostEnabled = true)
+@Order(SecurityProperties.BASIC_AUTH_ORDER)
+@ConditionalOnExpression("'${service.type:null}'=='tb-rule-engine'")
+public class TbRuleEngineSecurityConfiguration {
+
+ @Bean
+ SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
+ http.headers().cacheControl().and().frameOptions().disable()
+ .and().cors().and().csrf().disable()
+ .authorizeRequests()
+ .antMatchers("/actuator/prometheus").permitAll()
+ .anyRequest().authenticated();
+ return http.build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/controller/DeviceConnectivityController.java b/application/src/main/java/org/thingsboard/server/controller/DeviceConnectivityController.java
index 83d4d16034..dca113621c 100644
--- a/application/src/main/java/org/thingsboard/server/controller/DeviceConnectivityController.java
+++ b/application/src/main/java/org/thingsboard/server/controller/DeviceConnectivityController.java
@@ -106,7 +106,7 @@ public class DeviceConnectivityController extends BaseController {
@RequestMapping(value = "/device-connectivity/gateway-launch/{deviceId}", method = RequestMethod.GET)
@ResponseBody
public JsonNode getGatewayLaunchCommands(@ApiParam(value = DEVICE_ID_PARAM_DESCRIPTION)
- @PathVariable(DEVICE_ID) String strDeviceId, HttpServletRequest request) throws ThingsboardException, URISyntaxException {
+ @PathVariable(DEVICE_ID) String strDeviceId, HttpServletRequest request) throws ThingsboardException, URISyntaxException {
checkParameter(DEVICE_ID, strDeviceId);
DeviceId deviceId = new DeviceId(toUUID(strDeviceId));
Device device = checkDeviceId(deviceId, Operation.READ_CREDENTIALS);
diff --git a/application/src/main/java/org/thingsboard/server/controller/TelemetryController.java b/application/src/main/java/org/thingsboard/server/controller/TelemetryController.java
index 5f88752ff4..55f4f3afbd 100644
--- a/application/src/main/java/org/thingsboard/server/controller/TelemetryController.java
+++ b/application/src/main/java/org/thingsboard/server/controller/TelemetryController.java
@@ -74,7 +74,7 @@ import org.thingsboard.server.common.data.kv.ReadTsKvQuery;
import org.thingsboard.server.common.data.kv.StringDataEntry;
import org.thingsboard.server.common.data.kv.TsKvEntry;
import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration;
-import org.thingsboard.server.common.transport.adaptor.JsonConverter;
+import org.thingsboard.server.common.adaptor.JsonConverter;
import org.thingsboard.server.dao.timeseries.TimeseriesService;
import org.thingsboard.server.exception.InvalidParametersException;
import org.thingsboard.server.exception.UncheckedApiException;
diff --git a/application/src/main/java/org/thingsboard/server/controller/WidgetTypeController.java b/application/src/main/java/org/thingsboard/server/controller/WidgetTypeController.java
index f90a196edf..0109a327e8 100644
--- a/application/src/main/java/org/thingsboard/server/controller/WidgetTypeController.java
+++ b/application/src/main/java/org/thingsboard/server/controller/WidgetTypeController.java
@@ -216,7 +216,7 @@ public class WidgetTypeController extends AutoCommitController {
@ApiOperation(value = "Get all Widget types for specified Bundle (getBundleWidgetTypes)",
notes = "Returns an array of Widget Type objects that belong to specified Widget Bundle." + WIDGET_TYPE_DESCRIPTION + " " + SYSTEM_OR_TENANT_AUTHORITY_PARAGRAPH)
- @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
+ @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
@RequestMapping(value = "/widgetTypes", params = {"widgetsBundleId"}, method = RequestMethod.GET)
@ResponseBody
public List getBundleWidgetTypes(
@@ -248,7 +248,7 @@ public class WidgetTypeController extends AutoCommitController {
@ApiOperation(value = "Get all Widget types details for specified Bundle (getBundleWidgetTypes)",
notes = "Returns an array of Widget Type Details objects that belong to specified Widget Bundle." + WIDGET_TYPE_DETAILS_DESCRIPTION + " " + SYSTEM_OR_TENANT_AUTHORITY_PARAGRAPH)
- @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
+ @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
@RequestMapping(value = "/widgetTypesDetails", params = {"widgetsBundleId"}, method = RequestMethod.GET)
@ResponseBody
public List getBundleWidgetTypesDetails(
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/EdgeContextComponent.java b/application/src/main/java/org/thingsboard/server/service/edge/EdgeContextComponent.java
index 0d2b6675c9..c62bd81242 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/EdgeContextComponent.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/EdgeContextComponent.java
@@ -42,7 +42,7 @@ import org.thingsboard.server.dao.widget.WidgetTypeService;
import org.thingsboard.server.dao.widget.WidgetsBundleService;
import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.edge.rpc.EdgeEventStorageSettings;
-import org.thingsboard.server.service.edge.rpc.constructor.EdgeMsgConstructor;
+import org.thingsboard.server.service.edge.rpc.constructor.edge.EdgeMsgConstructor;
import org.thingsboard.server.service.edge.rpc.processor.alarm.AlarmEdgeProcessor;
import org.thingsboard.server.service.edge.rpc.processor.asset.AssetEdgeProcessor;
import org.thingsboard.server.service.edge.rpc.processor.asset.AssetProfileEdgeProcessor;
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java
index 4593384594..3971e9bdf1 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java
@@ -624,37 +624,37 @@ public final class EdgeGrpcSession implements Closeable {
case ASSET:
return ctx.getAssetProcessor().convertAssetEventToDownlink(edgeEvent, this.edge.getId(), this.edgeVersion);
case ENTITY_VIEW:
- return ctx.getEntityViewProcessor().convertEntityViewEventToDownlink(edgeEvent);
+ return ctx.getEntityViewProcessor().convertEntityViewEventToDownlink(edgeEvent, this.edgeVersion);
case DASHBOARD:
- return ctx.getDashboardProcessor().convertDashboardEventToDownlink(edgeEvent);
+ return ctx.getDashboardProcessor().convertDashboardEventToDownlink(edgeEvent, this.edgeVersion);
case CUSTOMER:
- return ctx.getCustomerProcessor().convertCustomerEventToDownlink(edgeEvent);
+ return ctx.getCustomerProcessor().convertCustomerEventToDownlink(edgeEvent, this.edgeVersion);
case RULE_CHAIN:
- return ctx.getRuleChainProcessor().convertRuleChainEventToDownlink(edgeEvent);
+ return ctx.getRuleChainProcessor().convertRuleChainEventToDownlink(edgeEvent, this.edgeVersion);
case RULE_CHAIN_METADATA:
return ctx.getRuleChainProcessor().convertRuleChainMetadataEventToDownlink(edgeEvent, this.edgeVersion);
case ALARM:
- return ctx.getAlarmProcessor().convertAlarmEventToDownlink(edgeEvent);
+ return ctx.getAlarmProcessor().convertAlarmEventToDownlink(edgeEvent, this.edgeVersion);
case USER:
- return ctx.getUserProcessor().convertUserEventToDownlink(edgeEvent);
+ return ctx.getUserProcessor().convertUserEventToDownlink(edgeEvent, this.edgeVersion);
case RELATION:
- return ctx.getRelationProcessor().convertRelationEventToDownlink(edgeEvent);
+ return ctx.getRelationProcessor().convertRelationEventToDownlink(edgeEvent, this.edgeVersion);
case WIDGETS_BUNDLE:
- return ctx.getWidgetBundleProcessor().convertWidgetsBundleEventToDownlink(edgeEvent);
+ return ctx.getWidgetBundleProcessor().convertWidgetsBundleEventToDownlink(edgeEvent, this.edgeVersion);
case WIDGET_TYPE:
return ctx.getWidgetTypeProcessor().convertWidgetTypeEventToDownlink(edgeEvent, this.edgeVersion);
case ADMIN_SETTINGS:
- return ctx.getAdminSettingsProcessor().convertAdminSettingsEventToDownlink(edgeEvent);
+ return ctx.getAdminSettingsProcessor().convertAdminSettingsEventToDownlink(edgeEvent, this.edgeVersion);
case OTA_PACKAGE:
- return ctx.getOtaPackageEdgeProcessor().convertOtaPackageEventToDownlink(edgeEvent);
+ return ctx.getOtaPackageEdgeProcessor().convertOtaPackageEventToDownlink(edgeEvent, this.edgeVersion);
case TB_RESOURCE:
- return ctx.getResourceEdgeProcessor().convertResourceEventToDownlink(edgeEvent);
+ return ctx.getResourceEdgeProcessor().convertResourceEventToDownlink(edgeEvent, this.edgeVersion);
case QUEUE:
- return ctx.getQueueEdgeProcessor().convertQueueEventToDownlink(edgeEvent);
+ return ctx.getQueueEdgeProcessor().convertQueueEventToDownlink(edgeEvent, this.edgeVersion);
case TENANT:
- return ctx.getTenantEdgeProcessor().convertTenantEventToDownlink(edgeEvent, this.getEdgeVersion());
+ return ctx.getTenantEdgeProcessor().convertTenantEventToDownlink(edgeEvent, this.edgeVersion);
case TENANT_PROFILE:
- return ctx.getTenantProfileEdgeProcessor().convertTenantProfileEventToDownlink(edgeEvent, this.getEdgeVersion());
+ return ctx.getTenantProfileEdgeProcessor().convertTenantProfileEventToDownlink(edgeEvent, this.edgeVersion);
default:
log.warn("[{}] Unsupported edge event type [{}]", this.tenantId, edgeEvent);
return null;
@@ -671,52 +671,52 @@ public final class EdgeGrpcSession implements Closeable {
}
if (uplinkMsg.getDeviceProfileUpdateMsgCount() > 0) {
for (DeviceProfileUpdateMsg deviceProfileUpdateMsg : uplinkMsg.getDeviceProfileUpdateMsgList()) {
- result.add(ctx.getDeviceProfileProcessor().processDeviceProfileMsgFromEdge(edge.getTenantId(), edge, deviceProfileUpdateMsg));
+ result.add(ctx.getDeviceProfileProcessor().processDeviceProfileMsgFromEdge(edge.getTenantId(), edge, deviceProfileUpdateMsg, this.edgeVersion));
}
}
if (uplinkMsg.getDeviceUpdateMsgCount() > 0) {
for (DeviceUpdateMsg deviceUpdateMsg : uplinkMsg.getDeviceUpdateMsgList()) {
- result.add(ctx.getDeviceProcessor().processDeviceMsgFromEdge(edge.getTenantId(), edge, deviceUpdateMsg));
+ result.add(ctx.getDeviceProcessor().processDeviceMsgFromEdge(edge.getTenantId(), edge, deviceUpdateMsg, this.edgeVersion));
}
}
if (uplinkMsg.getDeviceCredentialsUpdateMsgCount() > 0) {
for (DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg : uplinkMsg.getDeviceCredentialsUpdateMsgList()) {
- result.add(ctx.getDeviceProcessor().processDeviceCredentialsMsgFromEdge(edge.getTenantId(), edge.getId(), deviceCredentialsUpdateMsg));
+ result.add(ctx.getDeviceProcessor().processDeviceCredentialsMsgFromEdge(edge.getTenantId(), edge.getId(), deviceCredentialsUpdateMsg, this.edgeVersion));
}
}
if (uplinkMsg.getAssetProfileUpdateMsgCount() > 0) {
for (AssetProfileUpdateMsg assetProfileUpdateMsg : uplinkMsg.getAssetProfileUpdateMsgList()) {
- result.add(ctx.getAssetProfileProcessor().processAssetProfileMsgFromEdge(edge.getTenantId(), edge, assetProfileUpdateMsg));
+ result.add(ctx.getAssetProfileProcessor().processAssetProfileMsgFromEdge(edge.getTenantId(), edge, assetProfileUpdateMsg, this.edgeVersion));
}
}
if (uplinkMsg.getAssetUpdateMsgCount() > 0) {
for (AssetUpdateMsg assetUpdateMsg : uplinkMsg.getAssetUpdateMsgList()) {
- result.add(ctx.getAssetProcessor().processAssetMsgFromEdge(edge.getTenantId(), edge, assetUpdateMsg));
+ result.add(ctx.getAssetProcessor().processAssetMsgFromEdge(edge.getTenantId(), edge, assetUpdateMsg, this.edgeVersion));
}
}
if (uplinkMsg.getAlarmUpdateMsgCount() > 0) {
for (AlarmUpdateMsg alarmUpdateMsg : uplinkMsg.getAlarmUpdateMsgList()) {
- result.add(ctx.getAlarmProcessor().processAlarmMsgFromEdge(edge.getTenantId(), edge.getId(), alarmUpdateMsg));
+ result.add(ctx.getAlarmProcessor().processAlarmMsgFromEdge(edge.getTenantId(), edge.getId(), alarmUpdateMsg, this.edgeVersion));
}
}
if (uplinkMsg.getEntityViewUpdateMsgCount() > 0) {
for (EntityViewUpdateMsg entityViewUpdateMsg : uplinkMsg.getEntityViewUpdateMsgList()) {
- result.add(ctx.getEntityViewProcessor().processEntityViewMsgFromEdge(edge.getTenantId(), edge, entityViewUpdateMsg));
+ result.add(ctx.getEntityViewProcessor().processEntityViewMsgFromEdge(edge.getTenantId(), edge, entityViewUpdateMsg, this.edgeVersion));
}
}
if (uplinkMsg.getRelationUpdateMsgCount() > 0) {
for (RelationUpdateMsg relationUpdateMsg : uplinkMsg.getRelationUpdateMsgList()) {
- result.add(ctx.getRelationProcessor().processRelationMsgFromEdge(edge.getTenantId(), edge, relationUpdateMsg));
+ result.add(ctx.getRelationProcessor().processRelationMsgFromEdge(edge.getTenantId(), edge, relationUpdateMsg, this.edgeVersion));
}
}
if (uplinkMsg.getDashboardUpdateMsgCount() > 0) {
for (DashboardUpdateMsg dashboardUpdateMsg : uplinkMsg.getDashboardUpdateMsgList()) {
- result.add(ctx.getDashboardProcessor().processDashboardMsgFromEdge(edge.getTenantId(), edge, dashboardUpdateMsg));
+ result.add(ctx.getDashboardProcessor().processDashboardMsgFromEdge(edge.getTenantId(), edge, dashboardUpdateMsg, this.edgeVersion));
}
}
if (uplinkMsg.getResourceUpdateMsgCount() > 0) {
for (ResourceUpdateMsg resourceUpdateMsg : uplinkMsg.getResourceUpdateMsgList()) {
- result.add(ctx.getResourceEdgeProcessor().processResourceMsgFromEdge(edge.getTenantId(), edge, resourceUpdateMsg));
+ result.add(ctx.getResourceEdgeProcessor().processResourceMsgFromEdge(edge.getTenantId(), edge, resourceUpdateMsg, this.edgeVersion));
}
}
if (uplinkMsg.getRuleChainMetadataRequestMsgCount() > 0) {
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/AssetMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/AssetMsgConstructor.java
deleted file mode 100644
index 86ffc6dd5c..0000000000
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/AssetMsgConstructor.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * Copyright © 2016-2023 The Thingsboard Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.thingsboard.server.service.edge.rpc.constructor;
-
-import org.springframework.stereotype.Component;
-import org.thingsboard.common.util.JacksonUtil;
-import org.thingsboard.server.common.data.asset.Asset;
-import org.thingsboard.server.common.data.id.AssetId;
-import org.thingsboard.server.gen.edge.v1.AssetUpdateMsg;
-import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
-import org.thingsboard.server.queue.util.TbCoreComponent;
-
-@Component
-@TbCoreComponent
-public class AssetMsgConstructor {
-
- public AssetUpdateMsg constructAssetUpdatedMsg(UpdateMsgType msgType, Asset asset) {
- AssetUpdateMsg.Builder builder = AssetUpdateMsg.newBuilder()
- .setMsgType(msgType)
- .setIdMSB(asset.getUuidId().getMostSignificantBits())
- .setIdLSB(asset.getUuidId().getLeastSignificantBits())
- .setName(asset.getName())
- .setType(asset.getType());
- if (asset.getLabel() != null) {
- builder.setLabel(asset.getLabel());
- }
- if (asset.getCustomerId() != null) {
- builder.setCustomerIdMSB(asset.getCustomerId().getId().getMostSignificantBits());
- builder.setCustomerIdLSB(asset.getCustomerId().getId().getLeastSignificantBits());
- }
- if (asset.getAssetProfileId() != null) {
- builder.setAssetProfileIdMSB(asset.getAssetProfileId().getId().getMostSignificantBits());
- builder.setAssetProfileIdLSB(asset.getAssetProfileId().getId().getLeastSignificantBits());
- }
- if (asset.getAdditionalInfo() != null) {
- builder.setAdditionalInfo(JacksonUtil.toString(asset.getAdditionalInfo()));
- }
- return builder.build();
- }
-
- public AssetUpdateMsg constructAssetDeleteMsg(AssetId assetId) {
- return AssetUpdateMsg.newBuilder()
- .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
- .setIdMSB(assetId.getId().getMostSignificantBits())
- .setIdLSB(assetId.getId().getLeastSignificantBits()).build();
- }
-}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceProfileMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceProfileMsgConstructor.java
deleted file mode 100644
index d8e19ee854..0000000000
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceProfileMsgConstructor.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- * Copyright © 2016-2023 The Thingsboard Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.thingsboard.server.service.edge.rpc.constructor;
-
-import com.google.protobuf.ByteString;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-import org.thingsboard.server.common.data.DeviceProfile;
-import org.thingsboard.server.common.data.id.DeviceProfileId;
-import org.thingsboard.server.gen.edge.v1.DeviceProfileUpdateMsg;
-import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
-import org.thingsboard.server.queue.util.DataDecodingEncodingService;
-import org.thingsboard.server.queue.util.TbCoreComponent;
-
-import java.nio.charset.StandardCharsets;
-
-@Component
-@TbCoreComponent
-public class DeviceProfileMsgConstructor {
-
- @Autowired
- private DataDecodingEncodingService dataDecodingEncodingService;
-
- public DeviceProfileUpdateMsg constructDeviceProfileUpdatedMsg(UpdateMsgType msgType, DeviceProfile deviceProfile) {
- DeviceProfileUpdateMsg.Builder builder = DeviceProfileUpdateMsg.newBuilder()
- .setMsgType(msgType)
- .setIdMSB(deviceProfile.getId().getId().getMostSignificantBits())
- .setIdLSB(deviceProfile.getId().getId().getLeastSignificantBits())
- .setName(deviceProfile.getName())
- .setDefault(deviceProfile.isDefault())
- .setType(deviceProfile.getType().name())
- .setProfileDataBytes(ByteString.copyFrom(dataDecodingEncodingService.encode(deviceProfile.getProfileData())));
- if (deviceProfile.getDefaultQueueName() != null) {
- builder.setDefaultQueueName(deviceProfile.getDefaultQueueName());
- }
- if (deviceProfile.getDescription() != null) {
- builder.setDescription(deviceProfile.getDescription());
- }
- if (deviceProfile.getTransportType() != null) {
- builder.setTransportType(deviceProfile.getTransportType().name());
- }
- if (deviceProfile.getProvisionType() != null) {
- builder.setProvisionType(deviceProfile.getProvisionType().name());
- }
- if (deviceProfile.getProvisionDeviceKey() != null) {
- builder.setProvisionDeviceKey(deviceProfile.getProvisionDeviceKey());
- }
- if (deviceProfile.getImage() != null) {
- builder.setImage(ByteString.copyFrom(deviceProfile.getImage().getBytes(StandardCharsets.UTF_8)));
- }
- if (deviceProfile.getFirmwareId() != null) {
- builder.setFirmwareIdMSB(deviceProfile.getFirmwareId().getId().getMostSignificantBits())
- .setFirmwareIdLSB(deviceProfile.getFirmwareId().getId().getLeastSignificantBits());
- }
- if (deviceProfile.getSoftwareId() != null) {
- builder.setSoftwareIdMSB(deviceProfile.getSoftwareId().getId().getMostSignificantBits())
- .setSoftwareIdLSB(deviceProfile.getSoftwareId().getId().getLeastSignificantBits());
- }
- if (deviceProfile.getDefaultEdgeRuleChainId() != null) {
- builder.setDefaultRuleChainIdMSB(deviceProfile.getDefaultEdgeRuleChainId().getId().getMostSignificantBits())
- .setDefaultRuleChainIdLSB(deviceProfile.getDefaultEdgeRuleChainId().getId().getLeastSignificantBits());
- }
- if (deviceProfile.getDefaultDashboardId() != null) {
- builder.setDefaultDashboardIdMSB(deviceProfile.getDefaultDashboardId().getId().getMostSignificantBits())
- .setDefaultDashboardIdLSB(deviceProfile.getDefaultDashboardId().getId().getLeastSignificantBits());
- }
- return builder.build();
- }
-
- public DeviceProfileUpdateMsg constructDeviceProfileDeleteMsg(DeviceProfileId deviceProfileId) {
- return DeviceProfileUpdateMsg.newBuilder()
- .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
- .setIdMSB(deviceProfileId.getId().getMostSignificantBits())
- .setIdLSB(deviceProfileId.getId().getLeastSignificantBits()).build();
- }
-
-}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/MsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/MsgConstructor.java
new file mode 100644
index 0000000000..071f2bc25d
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/MsgConstructor.java
@@ -0,0 +1,20 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor;
+
+public interface MsgConstructor {
+
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/MsgConstructorFactory.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/MsgConstructorFactory.java
new file mode 100644
index 0000000000..93f08c27ca
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/MsgConstructorFactory.java
@@ -0,0 +1,46 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+
+@Component
+@TbCoreComponent
+public abstract class MsgConstructorFactory {
+
+ @Autowired
+ protected T v1Constructor;
+
+ @Autowired
+ protected U v2Constructor;
+
+ public MsgConstructor getMsgConstructorByEdgeVersion(EdgeVersion edgeVersion) {
+ switch (edgeVersion) {
+ case V_3_3_0:
+ case V_3_3_3:
+ case V_3_4_0:
+ case V_3_6_0:
+ case V_3_6_1:
+ return v1Constructor;
+ case V_3_6_2:
+ default:
+ return v2Constructor;
+ }
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/TenantProfileMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/TenantProfileMsgConstructor.java
deleted file mode 100644
index 9fdb1bf069..0000000000
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/TenantProfileMsgConstructor.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * Copyright © 2016-2023 The Thingsboard Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.thingsboard.server.service.edge.rpc.constructor;
-
-import com.google.protobuf.ByteString;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-import org.thingsboard.server.common.data.TenantProfile;
-import org.thingsboard.server.gen.edge.v1.EdgeVersion;
-import org.thingsboard.server.gen.edge.v1.TenantProfileUpdateMsg;
-import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
-import org.thingsboard.server.queue.util.DataDecodingEncodingService;
-import org.thingsboard.server.queue.util.TbCoreComponent;
-import org.thingsboard.server.service.edge.rpc.utils.EdgeVersionUtils;
-
-@Component
-@TbCoreComponent
-public class TenantProfileMsgConstructor {
-
- @Autowired
- private DataDecodingEncodingService dataDecodingEncodingService;
-
- public TenantProfileUpdateMsg constructTenantProfileUpdateMsg(UpdateMsgType msgType, TenantProfile tenantProfile, EdgeVersion edgeVersion) {
- ByteString profileData = EdgeVersionUtils.isEdgeVersionOlderThan(edgeVersion, EdgeVersion.V_3_6_1) ?
- ByteString.empty() : ByteString.copyFrom(dataDecodingEncodingService.encode(tenantProfile.getProfileData()));
- TenantProfileUpdateMsg.Builder builder = TenantProfileUpdateMsg.newBuilder()
- .setMsgType(msgType)
- .setIdMSB(tenantProfile.getId().getId().getMostSignificantBits())
- .setIdLSB(tenantProfile.getId().getId().getLeastSignificantBits())
- .setName(tenantProfile.getName())
- .setDefault(tenantProfile.isDefault())
- .setIsolatedRuleChain(tenantProfile.isIsolatedTbRuleEngine())
- .setProfileDataBytes(profileData);
- if (tenantProfile.getDescription() != null) {
- builder.setDescription(tenantProfile.getDescription());
- }
- return builder.build();
- }
-}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/WidgetsBundleMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/WidgetsBundleMsgConstructor.java
deleted file mode 100644
index 5b615ca9f8..0000000000
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/WidgetsBundleMsgConstructor.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * Copyright © 2016-2023 The Thingsboard Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.thingsboard.server.service.edge.rpc.constructor;
-
-import com.google.protobuf.ByteString;
-import org.springframework.stereotype.Component;
-import org.thingsboard.common.util.JacksonUtil;
-import org.thingsboard.server.common.data.id.TenantId;
-import org.thingsboard.server.common.data.id.WidgetsBundleId;
-import org.thingsboard.server.common.data.widget.WidgetsBundle;
-import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
-import org.thingsboard.server.gen.edge.v1.WidgetsBundleUpdateMsg;
-import org.thingsboard.server.queue.util.TbCoreComponent;
-
-import java.nio.charset.StandardCharsets;
-import java.util.List;
-
-@Component
-@TbCoreComponent
-public class WidgetsBundleMsgConstructor {
-
- public WidgetsBundleUpdateMsg constructWidgetsBundleUpdateMsg(UpdateMsgType msgType, WidgetsBundle widgetsBundle, List widgets) {
- WidgetsBundleUpdateMsg.Builder builder = WidgetsBundleUpdateMsg.newBuilder()
- .setMsgType(msgType)
- .setIdMSB(widgetsBundle.getId().getId().getMostSignificantBits())
- .setIdLSB(widgetsBundle.getId().getId().getLeastSignificantBits())
- .setTitle(widgetsBundle.getTitle())
- .setAlias(widgetsBundle.getAlias());
- if (widgetsBundle.getImage() != null) {
- builder.setImage(ByteString.copyFrom(widgetsBundle.getImage().getBytes(StandardCharsets.UTF_8)));
- }
- if (widgetsBundle.getDescription() != null) {
- builder.setDescription(widgetsBundle.getDescription());
- }
- if (widgetsBundle.getOrder() != null) {
- builder.setOrder(widgetsBundle.getOrder());
- }
- if (widgetsBundle.getTenantId().equals(TenantId.SYS_TENANT_ID)) {
- builder.setIsSystem(true);
- }
- builder.setWidgets(JacksonUtil.toString(widgets));
- return builder.build();
- }
-
- public WidgetsBundleUpdateMsg constructWidgetsBundleDeleteMsg(WidgetsBundleId widgetsBundleId) {
- return WidgetsBundleUpdateMsg.newBuilder()
- .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
- .setIdMSB(widgetsBundleId.getId().getMostSignificantBits())
- .setIdLSB(widgetsBundleId.getId().getLeastSignificantBits())
- .build();
- }
-}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/alarm/AlarmMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/alarm/AlarmMsgConstructor.java
new file mode 100644
index 0000000000..fd3b4ef95d
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/alarm/AlarmMsgConstructor.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.alarm;
+
+import org.thingsboard.server.common.data.alarm.Alarm;
+import org.thingsboard.server.gen.edge.v1.AlarmUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructor;
+
+public interface AlarmMsgConstructor extends MsgConstructor {
+
+ AlarmUpdateMsg constructAlarmUpdatedMsg(UpdateMsgType msgType, Alarm alarm, String entityName);
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/alarm/AlarmMsgConstructorFactory.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/alarm/AlarmMsgConstructorFactory.java
new file mode 100644
index 0000000000..6d7e7ebd5c
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/alarm/AlarmMsgConstructorFactory.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.alarm;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructorFactory;
+
+@Component
+@TbCoreComponent
+public class AlarmMsgConstructorFactory extends MsgConstructorFactory {
+
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/AlarmMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/alarm/AlarmMsgConstructorV1.java
similarity index 90%
rename from application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/AlarmMsgConstructor.java
rename to application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/alarm/AlarmMsgConstructorV1.java
index 15d7c27ff6..b1294f5904 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/AlarmMsgConstructor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/alarm/AlarmMsgConstructorV1.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.thingsboard.server.service.edge.rpc.constructor;
+package org.thingsboard.server.service.edge.rpc.constructor.alarm;
import org.springframework.stereotype.Component;
import org.thingsboard.common.util.JacksonUtil;
@@ -24,10 +24,11 @@ import org.thingsboard.server.queue.util.TbCoreComponent;
@Component
@TbCoreComponent
-public class AlarmMsgConstructor {
+public class AlarmMsgConstructorV1 implements AlarmMsgConstructor {
+ @Override
public AlarmUpdateMsg constructAlarmUpdatedMsg(UpdateMsgType msgType, Alarm alarm, String entityName) {
- AlarmUpdateMsg.Builder builder = AlarmUpdateMsg.newBuilder()
+ return AlarmUpdateMsg.newBuilder()
.setMsgType(msgType)
.setIdMSB(alarm.getId().getId().getMostSignificantBits())
.setIdLSB(alarm.getId().getId().getLeastSignificantBits())
@@ -44,8 +45,6 @@ public class AlarmMsgConstructor {
.setDetails(JacksonUtil.toString(alarm.getDetails()))
.setPropagate(alarm.isPropagate())
.setPropagateToOwner(alarm.isPropagateToOwner())
- .setPropagateToTenant(alarm.isPropagateToTenant());
- return builder.build();
+ .setPropagateToTenant(alarm.isPropagateToTenant()).build();
}
-
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/alarm/AlarmMsgConstructorV2.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/alarm/AlarmMsgConstructorV2.java
new file mode 100644
index 0000000000..9034755db6
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/alarm/AlarmMsgConstructorV2.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.alarm;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.common.util.JacksonUtil;
+import org.thingsboard.server.common.data.alarm.Alarm;
+import org.thingsboard.server.gen.edge.v1.AlarmUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+
+@Component
+@TbCoreComponent
+public class AlarmMsgConstructorV2 implements AlarmMsgConstructor {
+
+ @Override
+ public AlarmUpdateMsg constructAlarmUpdatedMsg(UpdateMsgType msgType, Alarm alarm, String entityName) {
+ return AlarmUpdateMsg.newBuilder().setMsgType(msgType)
+ .setEntity(JacksonUtil.toString(alarm))
+ .setIdMSB(alarm.getId().getId().getMostSignificantBits())
+ .setIdLSB(alarm.getId().getId().getLeastSignificantBits()).build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/asset/AssetMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/asset/AssetMsgConstructor.java
new file mode 100644
index 0000000000..338375ac37
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/asset/AssetMsgConstructor.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.asset;
+
+import org.thingsboard.server.common.data.asset.Asset;
+import org.thingsboard.server.common.data.asset.AssetProfile;
+import org.thingsboard.server.common.data.id.AssetId;
+import org.thingsboard.server.common.data.id.AssetProfileId;
+import org.thingsboard.server.gen.edge.v1.AssetProfileUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.AssetUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructor;
+
+public interface AssetMsgConstructor extends MsgConstructor {
+
+ AssetUpdateMsg constructAssetUpdatedMsg(UpdateMsgType msgType, Asset asset);
+
+ AssetUpdateMsg constructAssetDeleteMsg(AssetId assetId);
+
+ AssetProfileUpdateMsg constructAssetProfileUpdatedMsg(UpdateMsgType msgType, AssetProfile assetProfile);
+
+ AssetProfileUpdateMsg constructAssetProfileDeleteMsg(AssetProfileId assetProfileId);
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/asset/AssetMsgConstructorFactory.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/asset/AssetMsgConstructorFactory.java
new file mode 100644
index 0000000000..880beb446c
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/asset/AssetMsgConstructorFactory.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.asset;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructorFactory;
+
+@Component
+@TbCoreComponent
+public class AssetMsgConstructorFactory extends MsgConstructorFactory {
+
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/AssetProfileMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/asset/AssetMsgConstructorV1.java
similarity index 63%
rename from application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/AssetProfileMsgConstructor.java
rename to application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/asset/AssetMsgConstructorV1.java
index f5b921a32b..95e1e0e597 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/AssetProfileMsgConstructor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/asset/AssetMsgConstructorV1.java
@@ -13,13 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.thingsboard.server.service.edge.rpc.constructor;
+package org.thingsboard.server.service.edge.rpc.constructor.asset;
import com.google.protobuf.ByteString;
import org.springframework.stereotype.Component;
+import org.thingsboard.common.util.JacksonUtil;
+import org.thingsboard.server.common.data.asset.Asset;
import org.thingsboard.server.common.data.asset.AssetProfile;
-import org.thingsboard.server.common.data.id.AssetProfileId;
import org.thingsboard.server.gen.edge.v1.AssetProfileUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.AssetUpdateMsg;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.queue.util.TbCoreComponent;
@@ -27,8 +29,34 @@ import java.nio.charset.StandardCharsets;
@Component
@TbCoreComponent
-public class AssetProfileMsgConstructor {
+public class AssetMsgConstructorV1 extends BaseAssetMsgConstructor {
+ @Override
+ public AssetUpdateMsg constructAssetUpdatedMsg(UpdateMsgType msgType, Asset asset) {
+ AssetUpdateMsg.Builder builder = AssetUpdateMsg.newBuilder()
+ .setMsgType(msgType)
+ .setIdMSB(asset.getUuidId().getMostSignificantBits())
+ .setIdLSB(asset.getUuidId().getLeastSignificantBits())
+ .setName(asset.getName())
+ .setType(asset.getType());
+ if (asset.getLabel() != null) {
+ builder.setLabel(asset.getLabel());
+ }
+ if (asset.getCustomerId() != null) {
+ builder.setCustomerIdMSB(asset.getCustomerId().getId().getMostSignificantBits());
+ builder.setCustomerIdLSB(asset.getCustomerId().getId().getLeastSignificantBits());
+ }
+ if (asset.getAssetProfileId() != null) {
+ builder.setAssetProfileIdMSB(asset.getAssetProfileId().getId().getMostSignificantBits());
+ builder.setAssetProfileIdLSB(asset.getAssetProfileId().getId().getLeastSignificantBits());
+ }
+ if (asset.getAdditionalInfo() != null) {
+ builder.setAdditionalInfo(JacksonUtil.toString(asset.getAdditionalInfo()));
+ }
+ return builder.build();
+ }
+
+ @Override
public AssetProfileUpdateMsg constructAssetProfileUpdatedMsg(UpdateMsgType msgType, AssetProfile assetProfile) {
AssetProfileUpdateMsg.Builder builder = AssetProfileUpdateMsg.newBuilder()
.setMsgType(msgType)
@@ -55,12 +83,4 @@ public class AssetProfileMsgConstructor {
}
return builder.build();
}
-
- public AssetProfileUpdateMsg constructAssetProfileDeleteMsg(AssetProfileId assetProfileId) {
- return AssetProfileUpdateMsg.newBuilder()
- .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
- .setIdMSB(assetProfileId.getId().getMostSignificantBits())
- .setIdLSB(assetProfileId.getId().getLeastSignificantBits()).build();
- }
-
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/asset/AssetMsgConstructorV2.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/asset/AssetMsgConstructorV2.java
new file mode 100644
index 0000000000..b7e00473b5
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/asset/AssetMsgConstructorV2.java
@@ -0,0 +1,44 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.asset;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.common.util.JacksonUtil;
+import org.thingsboard.server.common.data.asset.Asset;
+import org.thingsboard.server.common.data.asset.AssetProfile;
+import org.thingsboard.server.gen.edge.v1.AssetProfileUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.AssetUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+
+@Component
+@TbCoreComponent
+public class AssetMsgConstructorV2 extends BaseAssetMsgConstructor {
+
+ @Override
+ public AssetUpdateMsg constructAssetUpdatedMsg(UpdateMsgType msgType, Asset asset) {
+ return AssetUpdateMsg.newBuilder().setMsgType(msgType).setEntity(JacksonUtil.toString(asset))
+ .setIdMSB(asset.getUuidId().getMostSignificantBits())
+ .setIdLSB(asset.getUuidId().getLeastSignificantBits()).build();
+ }
+
+ @Override
+ public AssetProfileUpdateMsg constructAssetProfileUpdatedMsg(UpdateMsgType msgType, AssetProfile assetProfile) {
+ return AssetProfileUpdateMsg.newBuilder().setMsgType(msgType).setEntity(JacksonUtil.toString(assetProfile))
+ .setIdMSB(assetProfile.getId().getId().getMostSignificantBits())
+ .setIdLSB(assetProfile.getId().getId().getLeastSignificantBits()).build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/asset/BaseAssetMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/asset/BaseAssetMsgConstructor.java
new file mode 100644
index 0000000000..b8fe8ad870
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/asset/BaseAssetMsgConstructor.java
@@ -0,0 +1,41 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.asset;
+
+import org.thingsboard.server.common.data.id.AssetId;
+import org.thingsboard.server.common.data.id.AssetProfileId;
+import org.thingsboard.server.gen.edge.v1.AssetProfileUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.AssetUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+
+public abstract class BaseAssetMsgConstructor implements AssetMsgConstructor {
+
+ @Override
+ public AssetUpdateMsg constructAssetDeleteMsg(AssetId assetId) {
+ return AssetUpdateMsg.newBuilder()
+ .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
+ .setIdMSB(assetId.getId().getMostSignificantBits())
+ .setIdLSB(assetId.getId().getLeastSignificantBits()).build();
+ }
+
+ @Override
+ public AssetProfileUpdateMsg constructAssetProfileDeleteMsg(AssetProfileId assetProfileId) {
+ return AssetProfileUpdateMsg.newBuilder()
+ .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
+ .setIdMSB(assetProfileId.getId().getMostSignificantBits())
+ .setIdLSB(assetProfileId.getId().getLeastSignificantBits()).build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/customer/BaseCustomerMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/customer/BaseCustomerMsgConstructor.java
new file mode 100644
index 0000000000..6d532a5e1c
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/customer/BaseCustomerMsgConstructor.java
@@ -0,0 +1,31 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.customer;
+
+import org.thingsboard.server.common.data.id.CustomerId;
+import org.thingsboard.server.gen.edge.v1.CustomerUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+
+public abstract class BaseCustomerMsgConstructor implements CustomerMsgConstructor {
+
+ @Override
+ public CustomerUpdateMsg constructCustomerDeleteMsg(CustomerId customerId) {
+ return CustomerUpdateMsg.newBuilder()
+ .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
+ .setIdMSB(customerId.getId().getMostSignificantBits())
+ .setIdLSB(customerId.getId().getLeastSignificantBits()).build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/customer/CustomerMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/customer/CustomerMsgConstructor.java
new file mode 100644
index 0000000000..7351822a3f
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/customer/CustomerMsgConstructor.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.customer;
+
+import org.thingsboard.server.common.data.Customer;
+import org.thingsboard.server.common.data.id.CustomerId;
+import org.thingsboard.server.gen.edge.v1.CustomerUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructor;
+
+public interface CustomerMsgConstructor extends MsgConstructor {
+
+ CustomerUpdateMsg constructCustomerUpdatedMsg(UpdateMsgType msgType, Customer customer);
+
+ CustomerUpdateMsg constructCustomerDeleteMsg(CustomerId customerId);
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/customer/CustomerMsgConstructorFactory.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/customer/CustomerMsgConstructorFactory.java
new file mode 100644
index 0000000000..3e84fba57f
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/customer/CustomerMsgConstructorFactory.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.customer;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructorFactory;
+
+@Component
+@TbCoreComponent
+public class CustomerMsgConstructorFactory extends MsgConstructorFactory {
+
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/CustomerMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/customer/CustomerMsgConstructorV1.java
similarity index 82%
rename from application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/CustomerMsgConstructor.java
rename to application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/customer/CustomerMsgConstructorV1.java
index 0465dd5a94..e6bb95defa 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/CustomerMsgConstructor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/customer/CustomerMsgConstructorV1.java
@@ -13,20 +13,20 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.thingsboard.server.service.edge.rpc.constructor;
+package org.thingsboard.server.service.edge.rpc.constructor.customer;
import org.springframework.stereotype.Component;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Customer;
-import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.gen.edge.v1.CustomerUpdateMsg;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.queue.util.TbCoreComponent;
@Component
@TbCoreComponent
-public class CustomerMsgConstructor {
+public class CustomerMsgConstructorV1 extends BaseCustomerMsgConstructor {
+ @Override
public CustomerUpdateMsg constructCustomerUpdatedMsg(UpdateMsgType msgType, Customer customer) {
CustomerUpdateMsg.Builder builder = CustomerUpdateMsg.newBuilder()
.setMsgType(msgType)
@@ -62,11 +62,4 @@ public class CustomerMsgConstructor {
}
return builder.build();
}
-
- public CustomerUpdateMsg constructCustomerDeleteMsg(CustomerId customerId) {
- return CustomerUpdateMsg.newBuilder()
- .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
- .setIdMSB(customerId.getId().getMostSignificantBits())
- .setIdLSB(customerId.getId().getLeastSignificantBits()).build();
- }
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/customer/CustomerMsgConstructorV2.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/customer/CustomerMsgConstructorV2.java
new file mode 100644
index 0000000000..94764e1178
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/customer/CustomerMsgConstructorV2.java
@@ -0,0 +1,35 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.customer;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.common.util.JacksonUtil;
+import org.thingsboard.server.common.data.Customer;
+import org.thingsboard.server.gen.edge.v1.CustomerUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+
+@Component
+@TbCoreComponent
+public class CustomerMsgConstructorV2 extends BaseCustomerMsgConstructor {
+
+ @Override
+ public CustomerUpdateMsg constructCustomerUpdatedMsg(UpdateMsgType msgType, Customer customer) {
+ return CustomerUpdateMsg.newBuilder().setMsgType(msgType).setEntity(JacksonUtil.toString(customer))
+ .setIdMSB(customer.getId().getId().getMostSignificantBits())
+ .setIdLSB(customer.getId().getId().getLeastSignificantBits()).build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/dashboard/BaseDashboardMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/dashboard/BaseDashboardMsgConstructor.java
new file mode 100644
index 0000000000..f8e42c1461
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/dashboard/BaseDashboardMsgConstructor.java
@@ -0,0 +1,31 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.dashboard;
+
+import org.thingsboard.server.common.data.id.DashboardId;
+import org.thingsboard.server.gen.edge.v1.DashboardUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+
+public abstract class BaseDashboardMsgConstructor implements DashboardMsgConstructor {
+
+ @Override
+ public DashboardUpdateMsg constructDashboardDeleteMsg(DashboardId dashboardId) {
+ return DashboardUpdateMsg.newBuilder()
+ .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
+ .setIdMSB(dashboardId.getId().getMostSignificantBits())
+ .setIdLSB(dashboardId.getId().getLeastSignificantBits()).build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/dashboard/DashboardMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/dashboard/DashboardMsgConstructor.java
new file mode 100644
index 0000000000..96504e5036
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/dashboard/DashboardMsgConstructor.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.dashboard;
+
+import org.thingsboard.server.common.data.Dashboard;
+import org.thingsboard.server.common.data.id.DashboardId;
+import org.thingsboard.server.gen.edge.v1.DashboardUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructor;
+
+public interface DashboardMsgConstructor extends MsgConstructor {
+
+ DashboardUpdateMsg constructDashboardUpdatedMsg(UpdateMsgType msgType, Dashboard dashboard);
+
+ DashboardUpdateMsg constructDashboardDeleteMsg(DashboardId dashboardId);
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/dashboard/DashboardMsgConstructorFactory.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/dashboard/DashboardMsgConstructorFactory.java
new file mode 100644
index 0000000000..384327f5bc
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/dashboard/DashboardMsgConstructorFactory.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.dashboard;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructorFactory;
+
+@Component
+@TbCoreComponent
+public class DashboardMsgConstructorFactory extends MsgConstructorFactory {
+
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DashboardMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/dashboard/DashboardMsgConstructorV1.java
similarity index 79%
rename from application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DashboardMsgConstructor.java
rename to application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/dashboard/DashboardMsgConstructorV1.java
index 50c2b46891..6a3bb43797 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DashboardMsgConstructor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/dashboard/DashboardMsgConstructorV1.java
@@ -13,20 +13,20 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.thingsboard.server.service.edge.rpc.constructor;
+package org.thingsboard.server.service.edge.rpc.constructor.dashboard;
import org.springframework.stereotype.Component;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Dashboard;
-import org.thingsboard.server.common.data.id.DashboardId;
import org.thingsboard.server.gen.edge.v1.DashboardUpdateMsg;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.queue.util.TbCoreComponent;
@Component
@TbCoreComponent
-public class DashboardMsgConstructor {
+public class DashboardMsgConstructorV1 extends BaseDashboardMsgConstructor {
+ @Override
public DashboardUpdateMsg constructDashboardUpdatedMsg(UpdateMsgType msgType, Dashboard dashboard) {
DashboardUpdateMsg.Builder builder = DashboardUpdateMsg.newBuilder()
.setMsgType(msgType)
@@ -46,12 +46,4 @@ public class DashboardMsgConstructor {
}
return builder.build();
}
-
- public DashboardUpdateMsg constructDashboardDeleteMsg(DashboardId dashboardId) {
- return DashboardUpdateMsg.newBuilder()
- .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
- .setIdMSB(dashboardId.getId().getMostSignificantBits())
- .setIdLSB(dashboardId.getId().getLeastSignificantBits()).build();
- }
-
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/dashboard/DashboardMsgConstructorV2.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/dashboard/DashboardMsgConstructorV2.java
new file mode 100644
index 0000000000..0940423119
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/dashboard/DashboardMsgConstructorV2.java
@@ -0,0 +1,35 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.dashboard;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.common.util.JacksonUtil;
+import org.thingsboard.server.common.data.Dashboard;
+import org.thingsboard.server.gen.edge.v1.DashboardUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+
+@Component
+@TbCoreComponent
+public class DashboardMsgConstructorV2 extends BaseDashboardMsgConstructor {
+
+ @Override
+ public DashboardUpdateMsg constructDashboardUpdatedMsg(UpdateMsgType msgType, Dashboard dashboard) {
+ return DashboardUpdateMsg.newBuilder().setMsgType(msgType).setEntity(JacksonUtil.toString(dashboard))
+ .setIdMSB(dashboard.getId().getId().getMostSignificantBits())
+ .setIdLSB(dashboard.getId().getId().getLeastSignificantBits()).build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/device/BaseDeviceMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/device/BaseDeviceMsgConstructor.java
new file mode 100644
index 0000000000..21d761dc26
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/device/BaseDeviceMsgConstructor.java
@@ -0,0 +1,102 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.device;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import org.thingsboard.common.util.JacksonUtil;
+import org.thingsboard.server.common.data.id.DeviceId;
+import org.thingsboard.server.common.data.id.DeviceProfileId;
+import org.thingsboard.server.gen.edge.v1.DeviceProfileUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.DeviceRpcCallMsg;
+import org.thingsboard.server.gen.edge.v1.DeviceUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.RpcRequestMsg;
+import org.thingsboard.server.gen.edge.v1.RpcResponseMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+
+import java.util.UUID;
+
+public abstract class BaseDeviceMsgConstructor implements DeviceMsgConstructor {
+
+ @Override
+ public DeviceUpdateMsg constructDeviceDeleteMsg(DeviceId deviceId) {
+ return DeviceUpdateMsg.newBuilder()
+ .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
+ .setIdMSB(deviceId.getId().getMostSignificantBits())
+ .setIdLSB(deviceId.getId().getLeastSignificantBits()).build();
+ }
+
+ @Override
+ public DeviceProfileUpdateMsg constructDeviceProfileDeleteMsg(DeviceProfileId deviceProfileId) {
+ return DeviceProfileUpdateMsg.newBuilder()
+ .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
+ .setIdMSB(deviceProfileId.getId().getMostSignificantBits())
+ .setIdLSB(deviceProfileId.getId().getLeastSignificantBits()).build();
+ }
+
+ @Override
+ public DeviceRpcCallMsg constructDeviceRpcCallMsg(UUID deviceId, JsonNode body) {
+ DeviceRpcCallMsg.Builder builder = constructDeviceRpcMsg(deviceId, body);
+ if (body.has("error") || body.has("response")) {
+ RpcResponseMsg.Builder responseBuilder = RpcResponseMsg.newBuilder();
+ if (body.has("error")) {
+ responseBuilder.setError(body.get("error").asText());
+ } else {
+ responseBuilder.setResponse(body.get("response").asText());
+ }
+ builder.setResponseMsg(responseBuilder.build());
+ } else {
+ RpcRequestMsg.Builder requestBuilder = RpcRequestMsg.newBuilder();
+ requestBuilder.setMethod(body.get("method").asText());
+ requestBuilder.setParams(body.get("params").asText());
+ builder.setRequestMsg(requestBuilder.build());
+ }
+ return builder.build();
+ }
+
+ private DeviceRpcCallMsg.Builder constructDeviceRpcMsg(UUID deviceId, JsonNode body) {
+ DeviceRpcCallMsg.Builder builder = DeviceRpcCallMsg.newBuilder()
+ .setDeviceIdMSB(deviceId.getMostSignificantBits())
+ .setDeviceIdLSB(deviceId.getLeastSignificantBits())
+ .setRequestId(body.get("requestId").asInt());
+ if (body.get("oneway") != null) {
+ builder.setOneway(body.get("oneway").asBoolean());
+ }
+ if (body.get("requestUUID") != null) {
+ UUID requestUUID = UUID.fromString(body.get("requestUUID").asText());
+ builder.setRequestUuidMSB(requestUUID.getMostSignificantBits())
+ .setRequestUuidLSB(requestUUID.getLeastSignificantBits());
+ }
+ if (body.get("expirationTime") != null) {
+ builder.setExpirationTime(body.get("expirationTime").asLong());
+ }
+ if (body.get("persisted") != null) {
+ builder.setPersisted(body.get("persisted").asBoolean());
+ }
+ if (body.get("retries") != null) {
+ builder.setRetries(body.get("retries").asInt());
+ }
+ if (body.get("additionalInfo") != null) {
+ builder.setAdditionalInfo(JacksonUtil.toString(body.get("additionalInfo")));
+ }
+ if (body.get("serviceId") != null) {
+ builder.setServiceId(body.get("serviceId").asText());
+ }
+ if (body.get("sessionId") != null) {
+ builder.setSessionId(body.get("sessionId").asText());
+ }
+ return builder;
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/device/DeviceMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/device/DeviceMsgConstructor.java
new file mode 100644
index 0000000000..4636dfd5ae
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/device/DeviceMsgConstructor.java
@@ -0,0 +1,46 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.device;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import org.thingsboard.server.common.data.Device;
+import org.thingsboard.server.common.data.DeviceProfile;
+import org.thingsboard.server.common.data.id.DeviceId;
+import org.thingsboard.server.common.data.id.DeviceProfileId;
+import org.thingsboard.server.common.data.security.DeviceCredentials;
+import org.thingsboard.server.gen.edge.v1.DeviceCredentialsUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.DeviceProfileUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.DeviceRpcCallMsg;
+import org.thingsboard.server.gen.edge.v1.DeviceUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructor;
+
+import java.util.UUID;
+
+public interface DeviceMsgConstructor extends MsgConstructor {
+
+ DeviceUpdateMsg constructDeviceUpdatedMsg(UpdateMsgType msgType, Device device);
+
+ DeviceUpdateMsg constructDeviceDeleteMsg(DeviceId deviceId);
+
+ DeviceCredentialsUpdateMsg constructDeviceCredentialsUpdatedMsg(DeviceCredentials deviceCredentials);
+
+ DeviceProfileUpdateMsg constructDeviceProfileUpdatedMsg(UpdateMsgType msgType, DeviceProfile deviceProfile);
+
+ DeviceProfileUpdateMsg constructDeviceProfileDeleteMsg(DeviceProfileId deviceProfileId);
+
+ DeviceRpcCallMsg constructDeviceRpcCallMsg(UUID deviceId, JsonNode body);
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/device/DeviceMsgConstructorFactory.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/device/DeviceMsgConstructorFactory.java
new file mode 100644
index 0000000000..b384259e14
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/device/DeviceMsgConstructorFactory.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.device;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructorFactory;
+
+@Component
+@TbCoreComponent
+public class DeviceMsgConstructorFactory extends MsgConstructorFactory {
+
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/device/DeviceMsgConstructorV1.java
similarity index 57%
rename from application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceMsgConstructor.java
rename to application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/device/DeviceMsgConstructorV1.java
index 78b785a5d8..4442387b21 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/DeviceMsgConstructor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/device/DeviceMsgConstructorV1.java
@@ -13,34 +13,32 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.thingsboard.server.service.edge.rpc.constructor;
+package org.thingsboard.server.service.edge.rpc.constructor.device;
-import com.fasterxml.jackson.databind.JsonNode;
import com.google.protobuf.ByteString;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Device;
-import org.thingsboard.server.common.data.id.DeviceId;
+import org.thingsboard.server.common.data.DeviceProfile;
import org.thingsboard.server.common.data.security.DeviceCredentials;
import org.thingsboard.server.gen.edge.v1.DeviceCredentialsUpdateMsg;
-import org.thingsboard.server.gen.edge.v1.DeviceRpcCallMsg;
+import org.thingsboard.server.gen.edge.v1.DeviceProfileUpdateMsg;
import org.thingsboard.server.gen.edge.v1.DeviceUpdateMsg;
-import org.thingsboard.server.gen.edge.v1.RpcRequestMsg;
-import org.thingsboard.server.gen.edge.v1.RpcResponseMsg;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.queue.util.DataDecodingEncodingService;
import org.thingsboard.server.queue.util.TbCoreComponent;
-import java.util.UUID;
+import java.nio.charset.StandardCharsets;
@Component
@TbCoreComponent
-public class DeviceMsgConstructor {
+public class DeviceMsgConstructorV1 extends BaseDeviceMsgConstructor {
@Autowired
private DataDecodingEncodingService dataDecodingEncodingService;
+ @Override
public DeviceUpdateMsg constructDeviceUpdatedMsg(UpdateMsgType msgType, Device device) {
DeviceUpdateMsg.Builder builder = DeviceUpdateMsg.newBuilder()
.setMsgType(msgType)
@@ -76,6 +74,7 @@ public class DeviceMsgConstructor {
return builder.build();
}
+ @Override
public DeviceCredentialsUpdateMsg constructDeviceCredentialsUpdatedMsg(DeviceCredentials deviceCredentials) {
DeviceCredentialsUpdateMsg.Builder builder = DeviceCredentialsUpdateMsg.newBuilder()
.setDeviceIdMSB(deviceCredentials.getDeviceId().getId().getMostSignificantBits())
@@ -90,63 +89,50 @@ public class DeviceMsgConstructor {
return builder.build();
}
- public DeviceUpdateMsg constructDeviceDeleteMsg(DeviceId deviceId) {
- return DeviceUpdateMsg.newBuilder()
- .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
- .setIdMSB(deviceId.getId().getMostSignificantBits())
- .setIdLSB(deviceId.getId().getLeastSignificantBits()).build();
- }
-
- public DeviceRpcCallMsg constructDeviceRpcCallMsg(UUID deviceId, JsonNode body) {
- DeviceRpcCallMsg.Builder builder = constructDeviceRpcMsg(deviceId, body);
- if (body.has("error") || body.has("response")) {
- RpcResponseMsg.Builder responseBuilder = RpcResponseMsg.newBuilder();
- if (body.has("error")) {
- responseBuilder.setError(body.get("error").asText());
- } else {
- responseBuilder.setResponse(body.get("response").asText());
- }
- builder.setResponseMsg(responseBuilder.build());
- } else {
- RpcRequestMsg.Builder requestBuilder = RpcRequestMsg.newBuilder();
- requestBuilder.setMethod(body.get("method").asText());
- requestBuilder.setParams(body.get("params").asText());
- builder.setRequestMsg(requestBuilder.build());
+ @Override
+ public DeviceProfileUpdateMsg constructDeviceProfileUpdatedMsg(UpdateMsgType msgType, DeviceProfile deviceProfile) {
+ DeviceProfileUpdateMsg.Builder builder = DeviceProfileUpdateMsg.newBuilder()
+ .setMsgType(msgType)
+ .setIdMSB(deviceProfile.getId().getId().getMostSignificantBits())
+ .setIdLSB(deviceProfile.getId().getId().getLeastSignificantBits())
+ .setName(deviceProfile.getName())
+ .setDefault(deviceProfile.isDefault())
+ .setType(deviceProfile.getType().name())
+ .setProfileDataBytes(ByteString.copyFrom(dataDecodingEncodingService.encode(deviceProfile.getProfileData())));
+ if (deviceProfile.getDefaultQueueName() != null) {
+ builder.setDefaultQueueName(deviceProfile.getDefaultQueueName());
}
- return builder.build();
- }
-
- private DeviceRpcCallMsg.Builder constructDeviceRpcMsg(UUID deviceId, JsonNode body) {
- DeviceRpcCallMsg.Builder builder = DeviceRpcCallMsg.newBuilder()
- .setDeviceIdMSB(deviceId.getMostSignificantBits())
- .setDeviceIdLSB(deviceId.getLeastSignificantBits())
- .setRequestId(body.get("requestId").asInt());
- if (body.get("oneway") != null) {
- builder.setOneway(body.get("oneway").asBoolean());
+ if (deviceProfile.getDescription() != null) {
+ builder.setDescription(deviceProfile.getDescription());
}
- if (body.get("requestUUID") != null) {
- UUID requestUUID = UUID.fromString(body.get("requestUUID").asText());
- builder.setRequestUuidMSB(requestUUID.getMostSignificantBits())
- .setRequestUuidLSB(requestUUID.getLeastSignificantBits());
+ if (deviceProfile.getTransportType() != null) {
+ builder.setTransportType(deviceProfile.getTransportType().name());
}
- if (body.get("expirationTime") != null) {
- builder.setExpirationTime(body.get("expirationTime").asLong());
+ if (deviceProfile.getProvisionType() != null) {
+ builder.setProvisionType(deviceProfile.getProvisionType().name());
}
- if (body.get("persisted") != null) {
- builder.setPersisted(body.get("persisted").asBoolean());
+ if (deviceProfile.getProvisionDeviceKey() != null) {
+ builder.setProvisionDeviceKey(deviceProfile.getProvisionDeviceKey());
}
- if (body.get("retries") != null) {
- builder.setRetries(body.get("retries").asInt());
+ if (deviceProfile.getImage() != null) {
+ builder.setImage(ByteString.copyFrom(deviceProfile.getImage().getBytes(StandardCharsets.UTF_8)));
}
- if (body.get("additionalInfo") != null) {
- builder.setAdditionalInfo(JacksonUtil.toString(body.get("additionalInfo")));
+ if (deviceProfile.getFirmwareId() != null) {
+ builder.setFirmwareIdMSB(deviceProfile.getFirmwareId().getId().getMostSignificantBits())
+ .setFirmwareIdLSB(deviceProfile.getFirmwareId().getId().getLeastSignificantBits());
}
- if (body.get("serviceId") != null) {
- builder.setServiceId(body.get("serviceId").asText());
+ if (deviceProfile.getSoftwareId() != null) {
+ builder.setSoftwareIdMSB(deviceProfile.getSoftwareId().getId().getMostSignificantBits())
+ .setSoftwareIdLSB(deviceProfile.getSoftwareId().getId().getLeastSignificantBits());
}
- if (body.get("sessionId") != null) {
- builder.setSessionId(body.get("sessionId").asText());
+ if (deviceProfile.getDefaultEdgeRuleChainId() != null) {
+ builder.setDefaultRuleChainIdMSB(deviceProfile.getDefaultEdgeRuleChainId().getId().getMostSignificantBits())
+ .setDefaultRuleChainIdLSB(deviceProfile.getDefaultEdgeRuleChainId().getId().getLeastSignificantBits());
}
- return builder;
+ if (deviceProfile.getDefaultDashboardId() != null) {
+ builder.setDefaultDashboardIdMSB(deviceProfile.getDefaultDashboardId().getId().getMostSignificantBits())
+ .setDefaultDashboardIdLSB(deviceProfile.getDefaultDashboardId().getId().getLeastSignificantBits());
+ }
+ return builder.build();
}
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/device/DeviceMsgConstructorV2.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/device/DeviceMsgConstructorV2.java
new file mode 100644
index 0000000000..189251f8c4
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/device/DeviceMsgConstructorV2.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.device;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.common.util.JacksonUtil;
+import org.thingsboard.server.common.data.Device;
+import org.thingsboard.server.common.data.DeviceProfile;
+import org.thingsboard.server.common.data.security.DeviceCredentials;
+import org.thingsboard.server.gen.edge.v1.DeviceCredentialsUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.DeviceProfileUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.DeviceUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+
+@Component
+@TbCoreComponent
+public class DeviceMsgConstructorV2 extends BaseDeviceMsgConstructor {
+
+ @Override
+ public DeviceUpdateMsg constructDeviceUpdatedMsg(UpdateMsgType msgType, Device device) {
+ return DeviceUpdateMsg.newBuilder().setMsgType(msgType).setEntity(JacksonUtil.toString(device))
+ .setIdMSB(device.getId().getId().getMostSignificantBits())
+ .setIdLSB(device.getId().getId().getLeastSignificantBits()).build();
+ }
+
+ @Override
+ public DeviceCredentialsUpdateMsg constructDeviceCredentialsUpdatedMsg(DeviceCredentials deviceCredentials) {
+ return DeviceCredentialsUpdateMsg.newBuilder().setEntity(JacksonUtil.toString(deviceCredentials)).build();
+ }
+
+ @Override
+ public DeviceProfileUpdateMsg constructDeviceProfileUpdatedMsg(UpdateMsgType msgType, DeviceProfile deviceProfile) {
+ return DeviceProfileUpdateMsg.newBuilder().setMsgType(msgType).setEntity(JacksonUtil.toString(deviceProfile))
+ .setIdMSB(deviceProfile.getId().getId().getMostSignificantBits())
+ .setIdLSB(deviceProfile.getId().getId().getLeastSignificantBits()).build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EdgeMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/edge/EdgeMsgConstructor.java
similarity index 96%
rename from application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EdgeMsgConstructor.java
rename to application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/edge/EdgeMsgConstructor.java
index 3416240b2c..c3741ee8bf 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EdgeMsgConstructor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/edge/EdgeMsgConstructor.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.thingsboard.server.service.edge.rpc.constructor;
+package org.thingsboard.server.service.edge.rpc.constructor.edge;
import org.springframework.stereotype.Component;
import org.thingsboard.common.util.JacksonUtil;
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/entityview/BaseEntityViewMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/entityview/BaseEntityViewMsgConstructor.java
new file mode 100644
index 0000000000..a037e3ee09
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/entityview/BaseEntityViewMsgConstructor.java
@@ -0,0 +1,31 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.entityview;
+
+import org.thingsboard.server.common.data.id.EntityViewId;
+import org.thingsboard.server.gen.edge.v1.EntityViewUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+
+public abstract class BaseEntityViewMsgConstructor implements EntityViewMsgConstructor {
+
+ @Override
+ public EntityViewUpdateMsg constructEntityViewDeleteMsg(EntityViewId entityViewId) {
+ return EntityViewUpdateMsg.newBuilder()
+ .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
+ .setIdMSB(entityViewId.getId().getMostSignificantBits())
+ .setIdLSB(entityViewId.getId().getLeastSignificantBits()).build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/entityview/EntityViewMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/entityview/EntityViewMsgConstructor.java
new file mode 100644
index 0000000000..7f14f62c68
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/entityview/EntityViewMsgConstructor.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.entityview;
+
+import org.thingsboard.server.common.data.EntityView;
+import org.thingsboard.server.common.data.id.EntityViewId;
+import org.thingsboard.server.gen.edge.v1.EntityViewUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructor;
+
+public interface EntityViewMsgConstructor extends MsgConstructor {
+
+ EntityViewUpdateMsg constructEntityViewUpdatedMsg(UpdateMsgType msgType, EntityView entityView);
+
+ EntityViewUpdateMsg constructEntityViewDeleteMsg(EntityViewId entityViewId);
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/entityview/EntityViewMsgConstructorFactory.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/entityview/EntityViewMsgConstructorFactory.java
new file mode 100644
index 0000000000..849f7f093a
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/entityview/EntityViewMsgConstructorFactory.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.entityview;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructorFactory;
+
+@Component
+@TbCoreComponent
+public class EntityViewMsgConstructorFactory extends MsgConstructorFactory {
+
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EntityViewMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/entityview/EntityViewMsgConstructorV1.java
similarity index 72%
rename from application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EntityViewMsgConstructor.java
rename to application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/entityview/EntityViewMsgConstructorV1.java
index 235199d75e..da369ecf90 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EntityViewMsgConstructor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/entityview/EntityViewMsgConstructorV1.java
@@ -13,12 +13,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.thingsboard.server.service.edge.rpc.constructor;
+package org.thingsboard.server.service.edge.rpc.constructor.entityview;
import org.springframework.stereotype.Component;
import org.thingsboard.common.util.JacksonUtil;
+import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.EntityView;
-import org.thingsboard.server.common.data.id.EntityViewId;
import org.thingsboard.server.gen.edge.v1.EdgeEntityType;
import org.thingsboard.server.gen.edge.v1.EntityViewUpdateMsg;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
@@ -26,20 +26,11 @@ import org.thingsboard.server.queue.util.TbCoreComponent;
@Component
@TbCoreComponent
-public class EntityViewMsgConstructor {
+public class EntityViewMsgConstructorV1 extends BaseEntityViewMsgConstructor {
+ @Override
public EntityViewUpdateMsg constructEntityViewUpdatedMsg(UpdateMsgType msgType, EntityView entityView) {
- EdgeEntityType entityType;
- switch (entityView.getEntityId().getEntityType()) {
- case DEVICE:
- entityType = EdgeEntityType.DEVICE;
- break;
- case ASSET:
- entityType = EdgeEntityType.ASSET;
- break;
- default:
- throw new RuntimeException("Unsupported entity type [" + entityView.getEntityId().getEntityType() + "]");
- }
+ EdgeEntityType edgeEntityType = checkEntityType(entityView.getEntityId().getEntityType());
EntityViewUpdateMsg.Builder builder = EntityViewUpdateMsg.newBuilder()
.setMsgType(msgType)
.setIdMSB(entityView.getId().getId().getMostSignificantBits())
@@ -48,7 +39,7 @@ public class EntityViewMsgConstructor {
.setType(entityView.getType())
.setEntityIdMSB(entityView.getEntityId().getId().getMostSignificantBits())
.setEntityIdLSB(entityView.getEntityId().getId().getLeastSignificantBits())
- .setEntityType(entityType);
+ .setEntityType(edgeEntityType);
if (entityView.getCustomerId() != null) {
builder.setCustomerIdMSB(entityView.getCustomerId().getId().getMostSignificantBits());
builder.setCustomerIdLSB(entityView.getCustomerId().getId().getLeastSignificantBits());
@@ -59,10 +50,14 @@ public class EntityViewMsgConstructor {
return builder.build();
}
- public EntityViewUpdateMsg constructEntityViewDeleteMsg(EntityViewId entityViewId) {
- return EntityViewUpdateMsg.newBuilder()
- .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
- .setIdMSB(entityViewId.getId().getMostSignificantBits())
- .setIdLSB(entityViewId.getId().getLeastSignificantBits()).build();
+ private EdgeEntityType checkEntityType(EntityType entityType) {
+ switch (entityType) {
+ case DEVICE:
+ return EdgeEntityType.DEVICE;
+ case ASSET:
+ return EdgeEntityType.ASSET;
+ default:
+ throw new RuntimeException("Unsupported entity type [" + entityType + "]");
+ }
}
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/entityview/EntityViewMsgConstructorV2.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/entityview/EntityViewMsgConstructorV2.java
new file mode 100644
index 0000000000..c1eae91097
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/entityview/EntityViewMsgConstructorV2.java
@@ -0,0 +1,35 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.entityview;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.common.util.JacksonUtil;
+import org.thingsboard.server.common.data.EntityView;
+import org.thingsboard.server.gen.edge.v1.EntityViewUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+
+@Component
+@TbCoreComponent
+public class EntityViewMsgConstructorV2 extends BaseEntityViewMsgConstructor {
+
+ @Override
+ public EntityViewUpdateMsg constructEntityViewUpdatedMsg(UpdateMsgType msgType, EntityView entityView) {
+ return EntityViewUpdateMsg.newBuilder().setMsgType(msgType).setEntity(JacksonUtil.toString(entityView))
+ .setIdMSB(entityView.getId().getId().getMostSignificantBits())
+ .setIdLSB(entityView.getId().getId().getLeastSignificantBits()).build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/ota/BaseOtaPackageMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/ota/BaseOtaPackageMsgConstructor.java
new file mode 100644
index 0000000000..110c24caca
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/ota/BaseOtaPackageMsgConstructor.java
@@ -0,0 +1,31 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.ota;
+
+import org.thingsboard.server.common.data.id.OtaPackageId;
+import org.thingsboard.server.gen.edge.v1.OtaPackageUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+
+public abstract class BaseOtaPackageMsgConstructor implements OtaPackageMsgConstructor {
+
+ @Override
+ public OtaPackageUpdateMsg constructOtaPackageDeleteMsg(OtaPackageId otaPackageId) {
+ return OtaPackageUpdateMsg.newBuilder()
+ .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
+ .setIdMSB(otaPackageId.getId().getMostSignificantBits())
+ .setIdLSB(otaPackageId.getId().getLeastSignificantBits()).build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/ota/OtaPackageMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/ota/OtaPackageMsgConstructor.java
new file mode 100644
index 0000000000..500500a7fc
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/ota/OtaPackageMsgConstructor.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.ota;
+
+import org.thingsboard.server.common.data.OtaPackage;
+import org.thingsboard.server.common.data.id.OtaPackageId;
+import org.thingsboard.server.gen.edge.v1.OtaPackageUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructor;
+
+public interface OtaPackageMsgConstructor extends MsgConstructor {
+
+ OtaPackageUpdateMsg constructOtaPackageUpdatedMsg(UpdateMsgType msgType, OtaPackage otaPackage);
+
+ OtaPackageUpdateMsg constructOtaPackageDeleteMsg(OtaPackageId otaPackageId);
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/ota/OtaPackageMsgConstructorFactory.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/ota/OtaPackageMsgConstructorFactory.java
new file mode 100644
index 0000000000..fd775d77ff
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/ota/OtaPackageMsgConstructorFactory.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.ota;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.customer.CustomerMsgConstructorV1;
+import org.thingsboard.server.service.edge.rpc.constructor.customer.CustomerMsgConstructorV2;
+
+@Component
+@TbCoreComponent
+public class OtaPackageMsgConstructorFactory extends MsgConstructorFactory {
+
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/OtaPackageMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/ota/OtaPackageMsgConstructorV1.java
similarity index 84%
rename from application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/OtaPackageMsgConstructor.java
rename to application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/ota/OtaPackageMsgConstructorV1.java
index 253305a5ab..5e1f297c01 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/OtaPackageMsgConstructor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/ota/OtaPackageMsgConstructorV1.java
@@ -13,21 +13,21 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.thingsboard.server.service.edge.rpc.constructor;
+package org.thingsboard.server.service.edge.rpc.constructor.ota;
import com.google.protobuf.ByteString;
import org.springframework.stereotype.Component;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.OtaPackage;
-import org.thingsboard.server.common.data.id.OtaPackageId;
import org.thingsboard.server.gen.edge.v1.OtaPackageUpdateMsg;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.queue.util.TbCoreComponent;
@Component
@TbCoreComponent
-public class OtaPackageMsgConstructor {
+public class OtaPackageMsgConstructorV1 extends BaseOtaPackageMsgConstructor {
+ @Override
public OtaPackageUpdateMsg constructOtaPackageUpdatedMsg(UpdateMsgType msgType, OtaPackage otaPackage) {
OtaPackageUpdateMsg.Builder builder = OtaPackageUpdateMsg.newBuilder()
.setMsgType(msgType)
@@ -69,12 +69,4 @@ public class OtaPackageMsgConstructor {
}
return builder.build();
}
-
- public OtaPackageUpdateMsg constructOtaPackageDeleteMsg(OtaPackageId otaPackageId) {
- return OtaPackageUpdateMsg.newBuilder()
- .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
- .setIdMSB(otaPackageId.getId().getMostSignificantBits())
- .setIdLSB(otaPackageId.getId().getLeastSignificantBits()).build();
- }
-
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/ota/OtaPackageMsgConstructorV2.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/ota/OtaPackageMsgConstructorV2.java
new file mode 100644
index 0000000000..69d7f12874
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/ota/OtaPackageMsgConstructorV2.java
@@ -0,0 +1,35 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.ota;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.common.util.JacksonUtil;
+import org.thingsboard.server.common.data.OtaPackage;
+import org.thingsboard.server.gen.edge.v1.OtaPackageUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+
+@Component
+@TbCoreComponent
+public class OtaPackageMsgConstructorV2 extends BaseOtaPackageMsgConstructor {
+
+ @Override
+ public OtaPackageUpdateMsg constructOtaPackageUpdatedMsg(UpdateMsgType msgType, OtaPackage otaPackage) {
+ return OtaPackageUpdateMsg.newBuilder().setMsgType(msgType).setEntity(JacksonUtil.toString(otaPackage))
+ .setIdMSB(otaPackage.getId().getId().getMostSignificantBits())
+ .setIdLSB(otaPackage.getId().getId().getLeastSignificantBits()).build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/queue/BaseQueueMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/queue/BaseQueueMsgConstructor.java
new file mode 100644
index 0000000000..486a143d85
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/queue/BaseQueueMsgConstructor.java
@@ -0,0 +1,31 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.queue;
+
+import org.thingsboard.server.common.data.id.QueueId;
+import org.thingsboard.server.gen.edge.v1.QueueUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+
+public abstract class BaseQueueMsgConstructor implements QueueMsgConstructor {
+
+ @Override
+ public QueueUpdateMsg constructQueueDeleteMsg(QueueId queueId) {
+ return QueueUpdateMsg.newBuilder()
+ .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
+ .setIdMSB(queueId.getId().getMostSignificantBits())
+ .setIdLSB(queueId.getId().getLeastSignificantBits()).build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/queue/QueueMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/queue/QueueMsgConstructor.java
new file mode 100644
index 0000000000..847f19419e
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/queue/QueueMsgConstructor.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.queue;
+
+import org.thingsboard.server.common.data.id.QueueId;
+import org.thingsboard.server.common.data.queue.Queue;
+import org.thingsboard.server.gen.edge.v1.QueueUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructor;
+
+public interface QueueMsgConstructor extends MsgConstructor {
+
+ QueueUpdateMsg constructQueueUpdatedMsg(UpdateMsgType msgType, Queue queue);
+
+ QueueUpdateMsg constructQueueDeleteMsg(QueueId queueId);
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/queue/QueueMsgConstructorFactory.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/queue/QueueMsgConstructorFactory.java
new file mode 100644
index 0000000000..0f9a4b9e2e
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/queue/QueueMsgConstructorFactory.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.queue;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructorFactory;
+
+@Component
+@TbCoreComponent
+public class QueueMsgConstructorFactory extends MsgConstructorFactory {
+
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/QueueMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/queue/QueueMsgConstructorV1.java
similarity index 93%
rename from application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/QueueMsgConstructor.java
rename to application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/queue/QueueMsgConstructorV1.java
index 2644a5409b..8621ce1011 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/QueueMsgConstructor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/queue/QueueMsgConstructorV1.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.thingsboard.server.service.edge.rpc.constructor;
+package org.thingsboard.server.service.edge.rpc.constructor.queue;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.id.QueueId;
@@ -28,10 +28,11 @@ import org.thingsboard.server.queue.util.TbCoreComponent;
@Component
@TbCoreComponent
-public class QueueMsgConstructor {
+public class QueueMsgConstructorV1 extends BaseQueueMsgConstructor {
+ @Override
public QueueUpdateMsg constructQueueUpdatedMsg(UpdateMsgType msgType, Queue queue) {
- QueueUpdateMsg.Builder builder = QueueUpdateMsg.newBuilder()
+ return QueueUpdateMsg.newBuilder()
.setMsgType(msgType)
.setIdMSB(queue.getId().getId().getMostSignificantBits())
.setIdLSB(queue.getId().getId().getLeastSignificantBits())
@@ -44,8 +45,7 @@ public class QueueMsgConstructor {
.setConsumerPerPartition(queue.isConsumerPerPartition())
.setPackProcessingTimeout(queue.getPackProcessingTimeout())
.setSubmitStrategy(createSubmitStrategyProto(queue.getSubmitStrategy()))
- .setProcessingStrategy(createProcessingStrategyProto(queue.getProcessingStrategy()));
- return builder.build();
+ .setProcessingStrategy(createProcessingStrategyProto(queue.getProcessingStrategy())).build();
}
private ProcessingStrategyProto createProcessingStrategyProto(ProcessingStrategy processingStrategy) {
@@ -71,5 +71,4 @@ public class QueueMsgConstructor {
.setIdMSB(queueId.getId().getMostSignificantBits())
.setIdLSB(queueId.getId().getLeastSignificantBits()).build();
}
-
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/queue/QueueMsgConstructorV2.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/queue/QueueMsgConstructorV2.java
new file mode 100644
index 0000000000..1bf80eea64
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/queue/QueueMsgConstructorV2.java
@@ -0,0 +1,35 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.queue;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.common.util.JacksonUtil;
+import org.thingsboard.server.common.data.queue.Queue;
+import org.thingsboard.server.gen.edge.v1.QueueUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+
+@Component
+@TbCoreComponent
+public class QueueMsgConstructorV2 extends BaseQueueMsgConstructor {
+
+ @Override
+ public QueueUpdateMsg constructQueueUpdatedMsg(UpdateMsgType msgType, Queue queue) {
+ return QueueUpdateMsg.newBuilder().setMsgType(msgType).setEntity(JacksonUtil.toString(queue))
+ .setIdMSB(queue.getId().getId().getMostSignificantBits())
+ .setIdLSB(queue.getId().getId().getLeastSignificantBits()).build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/relation/RelationMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/relation/RelationMsgConstructor.java
new file mode 100644
index 0000000000..f7fac6ce71
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/relation/RelationMsgConstructor.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.relation;
+
+import org.thingsboard.server.common.data.relation.EntityRelation;
+import org.thingsboard.server.gen.edge.v1.RelationUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructor;
+
+public interface RelationMsgConstructor extends MsgConstructor {
+
+ RelationUpdateMsg constructRelationUpdatedMsg(UpdateMsgType msgType, EntityRelation entityRelation);
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/relation/RelationMsgConstructorFactory.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/relation/RelationMsgConstructorFactory.java
new file mode 100644
index 0000000000..4ec02c5b49
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/relation/RelationMsgConstructorFactory.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.relation;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.customer.CustomerMsgConstructorV1;
+import org.thingsboard.server.service.edge.rpc.constructor.customer.CustomerMsgConstructorV2;
+
+@Component
+@TbCoreComponent
+public class RelationMsgConstructorFactory extends MsgConstructorFactory {
+
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/RelationMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/relation/RelationMsgConstructorV1.java
similarity index 93%
rename from application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/RelationMsgConstructor.java
rename to application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/relation/RelationMsgConstructorV1.java
index 24786a4f7c..394086fdd0 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/RelationMsgConstructor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/relation/RelationMsgConstructorV1.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.thingsboard.server.service.edge.rpc.constructor;
+package org.thingsboard.server.service.edge.rpc.constructor.relation;
import org.springframework.stereotype.Component;
import org.thingsboard.common.util.JacksonUtil;
@@ -24,8 +24,9 @@ import org.thingsboard.server.queue.util.TbCoreComponent;
@Component
@TbCoreComponent
-public class RelationMsgConstructor {
+public class RelationMsgConstructorV1 implements RelationMsgConstructor {
+ @Override
public RelationUpdateMsg constructRelationUpdatedMsg(UpdateMsgType msgType, EntityRelation entityRelation) {
RelationUpdateMsg.Builder builder = RelationUpdateMsg.newBuilder()
.setMsgType(msgType)
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/relation/RelationMsgConstructorV2.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/relation/RelationMsgConstructorV2.java
new file mode 100644
index 0000000000..4510909490
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/relation/RelationMsgConstructorV2.java
@@ -0,0 +1,34 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.relation;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.common.util.JacksonUtil;
+import org.thingsboard.server.common.data.relation.EntityRelation;
+import org.thingsboard.server.gen.edge.v1.RelationUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+
+@Component
+@TbCoreComponent
+public class RelationMsgConstructorV2 implements RelationMsgConstructor {
+
+
+ @Override
+ public RelationUpdateMsg constructRelationUpdatedMsg(UpdateMsgType msgType, EntityRelation entityRelation) {
+ return RelationUpdateMsg.newBuilder().setMsgType(msgType).setEntity(JacksonUtil.toString(entityRelation)).build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/resource/BaseResourceMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/resource/BaseResourceMsgConstructor.java
new file mode 100644
index 0000000000..620f71c9e7
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/resource/BaseResourceMsgConstructor.java
@@ -0,0 +1,31 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.resource;
+
+import org.thingsboard.server.common.data.id.TbResourceId;
+import org.thingsboard.server.gen.edge.v1.ResourceUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+
+public abstract class BaseResourceMsgConstructor implements ResourceMsgConstructor {
+
+ @Override
+ public ResourceUpdateMsg constructResourceDeleteMsg(TbResourceId tbResourceId) {
+ return ResourceUpdateMsg.newBuilder()
+ .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
+ .setIdMSB(tbResourceId.getId().getMostSignificantBits())
+ .setIdLSB(tbResourceId.getId().getLeastSignificantBits()).build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/resource/ResourceMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/resource/ResourceMsgConstructor.java
new file mode 100644
index 0000000000..cfeedced80
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/resource/ResourceMsgConstructor.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.resource;
+
+import org.thingsboard.server.common.data.TbResource;
+import org.thingsboard.server.common.data.id.TbResourceId;
+import org.thingsboard.server.gen.edge.v1.ResourceUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructor;
+
+public interface ResourceMsgConstructor extends MsgConstructor {
+
+ ResourceUpdateMsg constructResourceUpdatedMsg(UpdateMsgType msgType, TbResource tbResource);
+
+ ResourceUpdateMsg constructResourceDeleteMsg(TbResourceId tbResourceId);
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/resource/ResourceMsgConstructorFactory.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/resource/ResourceMsgConstructorFactory.java
new file mode 100644
index 0000000000..2c67d8731e
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/resource/ResourceMsgConstructorFactory.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.resource;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructorFactory;
+
+@Component
+@TbCoreComponent
+public class ResourceMsgConstructorFactory extends MsgConstructorFactory {
+
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/ResourceMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/resource/ResourceMsgConstructorV1.java
similarity index 76%
rename from application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/ResourceMsgConstructor.java
rename to application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/resource/ResourceMsgConstructorV1.java
index 27b7dc3978..fa92832741 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/ResourceMsgConstructor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/resource/ResourceMsgConstructorV1.java
@@ -13,11 +13,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.thingsboard.server.service.edge.rpc.constructor;
+package org.thingsboard.server.service.edge.rpc.constructor.resource;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.TbResource;
-import org.thingsboard.server.common.data.id.TbResourceId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.gen.edge.v1.ResourceUpdateMsg;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
@@ -25,8 +24,9 @@ import org.thingsboard.server.queue.util.TbCoreComponent;
@Component
@TbCoreComponent
-public class ResourceMsgConstructor {
+public class ResourceMsgConstructorV1 extends BaseResourceMsgConstructor {
+ @Override
public ResourceUpdateMsg constructResourceUpdatedMsg(UpdateMsgType msgType, TbResource tbResource) {
ResourceUpdateMsg.Builder builder = ResourceUpdateMsg.newBuilder()
.setMsgType(msgType)
@@ -42,16 +42,9 @@ public class ResourceMsgConstructor {
if (tbResource.getEtag() != null) {
builder.setEtag(tbResource.getEtag());
}
- if (tbResource.getTenantId().equals(TenantId.SYS_TENANT_ID)) {
+ if (TenantId.SYS_TENANT_ID.equals(tbResource.getTenantId())) {
builder.setIsSystem(true);
}
return builder.build();
}
-
- public ResourceUpdateMsg constructResourceDeleteMsg(TbResourceId tbResourceId) {
- return ResourceUpdateMsg.newBuilder()
- .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
- .setIdMSB(tbResourceId.getId().getMostSignificantBits())
- .setIdLSB(tbResourceId.getId().getLeastSignificantBits()).build();
- }
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/resource/ResourceMsgConstructorV2.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/resource/ResourceMsgConstructorV2.java
new file mode 100644
index 0000000000..094e5636bb
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/resource/ResourceMsgConstructorV2.java
@@ -0,0 +1,35 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.resource;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.common.util.JacksonUtil;
+import org.thingsboard.server.common.data.TbResource;
+import org.thingsboard.server.gen.edge.v1.ResourceUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+
+@Component
+@TbCoreComponent
+public class ResourceMsgConstructorV2 extends BaseResourceMsgConstructor {
+
+ @Override
+ public ResourceUpdateMsg constructResourceUpdatedMsg(UpdateMsgType msgType, TbResource tbResource) {
+ return ResourceUpdateMsg.newBuilder().setMsgType(msgType).setEntity(JacksonUtil.toString(tbResource))
+ .setIdMSB(tbResource.getId().getId().getMostSignificantBits())
+ .setIdLSB(tbResource.getId().getId().getLeastSignificantBits()).build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/AbstractRuleChainMetadataConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/BaseRuleChainMetadataConstructor.java
similarity index 88%
rename from application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/AbstractRuleChainMetadataConstructor.java
rename to application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/BaseRuleChainMetadataConstructor.java
index a720d0aab6..be10a714f6 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/AbstractRuleChainMetadataConstructor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/BaseRuleChainMetadataConstructor.java
@@ -24,6 +24,7 @@ import org.thingsboard.server.common.data.rule.NodeConnectionInfo;
import org.thingsboard.server.common.data.rule.RuleChainConnectionInfo;
import org.thingsboard.server.common.data.rule.RuleChainMetaData;
import org.thingsboard.server.common.data.rule.RuleNode;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.edge.v1.NodeConnectionInfoProto;
import org.thingsboard.server.gen.edge.v1.RuleChainConnectionInfoProto;
import org.thingsboard.server.gen.edge.v1.RuleChainMetadataUpdateMsg;
@@ -36,23 +37,17 @@ import java.util.NavigableSet;
@Slf4j
@AllArgsConstructor
-public abstract class AbstractRuleChainMetadataConstructor implements RuleChainMetadataConstructor {
+public abstract class BaseRuleChainMetadataConstructor implements RuleChainMetadataConstructor {
@Override
public RuleChainMetadataUpdateMsg constructRuleChainMetadataUpdatedMsg(TenantId tenantId,
UpdateMsgType msgType,
- RuleChainMetaData ruleChainMetaData) {
- try {
- RuleChainMetadataUpdateMsg.Builder builder = RuleChainMetadataUpdateMsg.newBuilder();
- builder.setRuleChainIdMSB(ruleChainMetaData.getRuleChainId().getId().getMostSignificantBits())
- .setRuleChainIdLSB(ruleChainMetaData.getRuleChainId().getId().getLeastSignificantBits());
- constructRuleChainMetadataUpdatedMsg(tenantId, builder, ruleChainMetaData);
- builder.setMsgType(msgType);
- return builder.build();
- } catch (Exception ex) {
- log.error("[{}] Can't construct RuleChainMetadataUpdateMsg", tenantId, ex);
- }
- return null;
+ RuleChainMetaData ruleChainMetaData,
+ EdgeVersion edgeVersion) {
+ RuleChainMetadataUpdateMsg.Builder builder = RuleChainMetadataUpdateMsg.newBuilder();
+ constructRuleChainMetadataUpdatedMsg(tenantId, builder, ruleChainMetaData);
+ builder.setMsgType(msgType);
+ return builder.build();
}
protected abstract void constructRuleChainMetadataUpdatedMsg(TenantId tenantId,
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/RuleChainMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/BaseRuleChainMsgConstructor.java
similarity index 54%
rename from application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/RuleChainMsgConstructor.java
rename to application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/BaseRuleChainMsgConstructor.java
index 8f91f5d19e..cf5967fac1 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/RuleChainMsgConstructor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/BaseRuleChainMsgConstructor.java
@@ -13,57 +13,32 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.thingsboard.server.service.edge.rpc.constructor;
+package org.thingsboard.server.service.edge.rpc.constructor.rule;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.id.RuleChainId;
import org.thingsboard.server.common.data.id.TenantId;
-import org.thingsboard.server.common.data.rule.RuleChain;
import org.thingsboard.server.common.data.rule.RuleChainMetaData;
import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.edge.v1.RuleChainMetadataUpdateMsg;
import org.thingsboard.server.gen.edge.v1.RuleChainUpdateMsg;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
-import org.thingsboard.server.queue.util.TbCoreComponent;
-import org.thingsboard.server.service.edge.rpc.constructor.rule.RuleChainMetadataConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.rule.RuleChainMetadataConstructorFactory;
-@Component
-@Slf4j
-@TbCoreComponent
-public class RuleChainMsgConstructor {
+public abstract class BaseRuleChainMsgConstructor implements RuleChainMsgConstructor {
- public RuleChainUpdateMsg constructRuleChainUpdatedMsg(UpdateMsgType msgType, RuleChain ruleChain, boolean isRoot) {
- RuleChainUpdateMsg.Builder builder = RuleChainUpdateMsg.newBuilder()
- .setMsgType(msgType)
- .setIdMSB(ruleChain.getId().getId().getMostSignificantBits())
- .setIdLSB(ruleChain.getId().getId().getLeastSignificantBits())
- .setName(ruleChain.getName())
- .setRoot(isRoot)
- .setDebugMode(ruleChain.isDebugMode())
- .setConfiguration(JacksonUtil.toString(ruleChain.getConfiguration()));
- if (ruleChain.getFirstRuleNodeId() != null) {
- builder.setFirstRuleNodeIdMSB(ruleChain.getFirstRuleNodeId().getId().getMostSignificantBits())
- .setFirstRuleNodeIdLSB(ruleChain.getFirstRuleNodeId().getId().getLeastSignificantBits());
- }
- return builder.build();
+ @Override
+ public RuleChainUpdateMsg constructRuleChainDeleteMsg(RuleChainId ruleChainId) {
+ return RuleChainUpdateMsg.newBuilder()
+ .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
+ .setIdMSB(ruleChainId.getId().getMostSignificantBits())
+ .setIdLSB(ruleChainId.getId().getLeastSignificantBits()).build();
}
+ @Override
public RuleChainMetadataUpdateMsg constructRuleChainMetadataUpdatedMsg(TenantId tenantId,
UpdateMsgType msgType,
RuleChainMetaData ruleChainMetaData,
EdgeVersion edgeVersion) {
- RuleChainMetadataConstructor ruleChainMetadataConstructor
- = RuleChainMetadataConstructorFactory.getByEdgeVersion(edgeVersion);
- return ruleChainMetadataConstructor.constructRuleChainMetadataUpdatedMsg(tenantId, msgType, ruleChainMetaData);
- }
-
- public RuleChainUpdateMsg constructRuleChainDeleteMsg(RuleChainId ruleChainId) {
- return RuleChainUpdateMsg.newBuilder()
- .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
- .setIdMSB(ruleChainId.getId().getMostSignificantBits())
- .setIdLSB(ruleChainId.getId().getLeastSignificantBits()).build();
+ RuleChainMetadataConstructor ruleChainMetadataConstructor = RuleChainMetadataConstructorFactory.getByEdgeVersion(edgeVersion);
+ return ruleChainMetadataConstructor.constructRuleChainMetadataUpdatedMsg(tenantId, msgType, ruleChainMetaData, edgeVersion);
}
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructor.java
index 51b7380e48..f80b30b3c4 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructor.java
@@ -17,6 +17,7 @@ package org.thingsboard.server.service.edge.rpc.constructor.rule;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.rule.RuleChainMetaData;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.edge.v1.RuleChainMetadataUpdateMsg;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
@@ -24,5 +25,6 @@ public interface RuleChainMetadataConstructor {
RuleChainMetadataUpdateMsg constructRuleChainMetadataUpdatedMsg(TenantId tenantId,
UpdateMsgType msgType,
- RuleChainMetaData ruleChainMetaData);
+ RuleChainMetaData ruleChainMetaData,
+ EdgeVersion edgeVersion);
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructorFactory.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructorFactory.java
index 1c581267c4..cdc7e128d3 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructorFactory.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructorFactory.java
@@ -25,8 +25,12 @@ public final class RuleChainMetadataConstructorFactory {
return new RuleChainMetadataConstructorV330();
case V_3_3_3:
case V_3_4_0:
- default:
+ case V_3_6_0:
+ case V_3_6_1:
return new RuleChainMetadataConstructorV340();
+ case V_3_6_2:
+ default:
+ return new RuleChainMetadataConstructorV362();
}
}
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructorV330.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructorV330.java
index 33fc39b7e7..64d362342b 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructorV330.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructorV330.java
@@ -36,7 +36,7 @@ import java.util.UUID;
import java.util.stream.Collectors;
@Slf4j
-public class RuleChainMetadataConstructorV330 extends AbstractRuleChainMetadataConstructor {
+public class RuleChainMetadataConstructorV330 extends BaseRuleChainMetadataConstructor {
private static final String RULE_CHAIN_INPUT_NODE = TbRuleChainInputNode.class.getName();
private static final String TB_RULE_CHAIN_OUTPUT_NODE = TbRuleChainOutputNode.class.getName();
@@ -45,6 +45,8 @@ public class RuleChainMetadataConstructorV330 extends AbstractRuleChainMetadataC
protected void constructRuleChainMetadataUpdatedMsg(TenantId tenantId,
RuleChainMetadataUpdateMsg.Builder builder,
RuleChainMetaData ruleChainMetaData) {
+ builder.setRuleChainIdMSB(ruleChainMetaData.getRuleChainId().getId().getMostSignificantBits())
+ .setRuleChainIdLSB(ruleChainMetaData.getRuleChainId().getId().getLeastSignificantBits());
List supportedNodes = filterNodes(ruleChainMetaData.getNodes());
NavigableSet removedNodeIndexes = getRemovedNodeIndexes(ruleChainMetaData.getNodes(), ruleChainMetaData.getConnections());
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructorV340.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructorV340.java
index 9a37e416db..2133024931 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructorV340.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructorV340.java
@@ -23,12 +23,14 @@ import org.thingsboard.server.gen.edge.v1.RuleChainMetadataUpdateMsg;
import java.util.TreeSet;
@Slf4j
-public class RuleChainMetadataConstructorV340 extends AbstractRuleChainMetadataConstructor {
+public class RuleChainMetadataConstructorV340 extends BaseRuleChainMetadataConstructor {
@Override
protected void constructRuleChainMetadataUpdatedMsg(TenantId tenantId,
RuleChainMetadataUpdateMsg.Builder builder,
RuleChainMetaData ruleChainMetaData) {
+ builder.setRuleChainIdMSB(ruleChainMetaData.getRuleChainId().getId().getMostSignificantBits())
+ .setRuleChainIdLSB(ruleChainMetaData.getRuleChainId().getId().getLeastSignificantBits());
builder.addAllNodes(constructNodes(ruleChainMetaData.getNodes()))
.addAllConnections(constructConnections(ruleChainMetaData.getConnections()))
.addAllRuleChainConnections(constructRuleChainConnections(ruleChainMetaData.getRuleChainConnections(), new TreeSet<>()));
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructorV362.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructorV362.java
new file mode 100644
index 0000000000..7a8a6d02cb
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructorV362.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.rule;
+
+import org.thingsboard.common.util.JacksonUtil;
+import org.thingsboard.server.common.data.id.TenantId;
+import org.thingsboard.server.common.data.rule.RuleChainMetaData;
+import org.thingsboard.server.gen.edge.v1.RuleChainMetadataUpdateMsg;
+
+public class RuleChainMetadataConstructorV362 extends BaseRuleChainMetadataConstructor {
+
+ @Override
+ protected void constructRuleChainMetadataUpdatedMsg(TenantId tenantId, RuleChainMetadataUpdateMsg.Builder builder, RuleChainMetaData ruleChainMetaData) {
+ builder.setEntity(JacksonUtil.toString(ruleChainMetaData));
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMsgConstructor.java
new file mode 100644
index 0000000000..8ea2ff9a63
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMsgConstructor.java
@@ -0,0 +1,38 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.rule;
+
+import org.thingsboard.server.common.data.id.RuleChainId;
+import org.thingsboard.server.common.data.id.TenantId;
+import org.thingsboard.server.common.data.rule.RuleChain;
+import org.thingsboard.server.common.data.rule.RuleChainMetaData;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
+import org.thingsboard.server.gen.edge.v1.RuleChainMetadataUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.RuleChainUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructor;
+
+public interface RuleChainMsgConstructor extends MsgConstructor {
+
+ RuleChainUpdateMsg constructRuleChainUpdatedMsg(UpdateMsgType msgType, RuleChain ruleChain, boolean isRoot);
+
+ RuleChainUpdateMsg constructRuleChainDeleteMsg(RuleChainId ruleChainId);
+
+ RuleChainMetadataUpdateMsg constructRuleChainMetadataUpdatedMsg(TenantId tenantId,
+ UpdateMsgType msgType,
+ RuleChainMetaData ruleChainMetaData,
+ EdgeVersion edgeVersion);
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMsgConstructorFactory.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMsgConstructorFactory.java
new file mode 100644
index 0000000000..2c1a839ab9
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMsgConstructorFactory.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.rule;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructorFactory;
+
+@Component
+@TbCoreComponent
+public class RuleChainMsgConstructorFactory extends MsgConstructorFactory {
+
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMsgConstructorV1.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMsgConstructorV1.java
new file mode 100644
index 0000000000..6c918cfc56
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMsgConstructorV1.java
@@ -0,0 +1,45 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.rule;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.common.util.JacksonUtil;
+import org.thingsboard.server.common.data.rule.RuleChain;
+import org.thingsboard.server.gen.edge.v1.RuleChainUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+
+@Component
+@TbCoreComponent
+public class RuleChainMsgConstructorV1 extends BaseRuleChainMsgConstructor {
+
+ @Override
+ public RuleChainUpdateMsg constructRuleChainUpdatedMsg(UpdateMsgType msgType, RuleChain ruleChain, boolean isRoot) {
+ RuleChainUpdateMsg.Builder builder = RuleChainUpdateMsg.newBuilder()
+ .setMsgType(msgType)
+ .setIdMSB(ruleChain.getId().getId().getMostSignificantBits())
+ .setIdLSB(ruleChain.getId().getId().getLeastSignificantBits())
+ .setName(ruleChain.getName())
+ .setRoot(isRoot)
+ .setDebugMode(ruleChain.isDebugMode())
+ .setConfiguration(JacksonUtil.toString(ruleChain.getConfiguration()));
+ if (ruleChain.getFirstRuleNodeId() != null) {
+ builder.setFirstRuleNodeIdMSB(ruleChain.getFirstRuleNodeId().getId().getMostSignificantBits())
+ .setFirstRuleNodeIdLSB(ruleChain.getFirstRuleNodeId().getId().getLeastSignificantBits());
+ }
+ return builder.build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMsgConstructorV2.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMsgConstructorV2.java
new file mode 100644
index 0000000000..f5c1c12b39
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMsgConstructorV2.java
@@ -0,0 +1,39 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.rule;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.common.util.JacksonUtil;
+import org.thingsboard.server.common.data.rule.RuleChain;
+import org.thingsboard.server.gen.edge.v1.RuleChainUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+
+@Component
+@TbCoreComponent
+public class RuleChainMsgConstructorV2 extends BaseRuleChainMsgConstructor {
+
+ @Override
+ public RuleChainUpdateMsg constructRuleChainUpdatedMsg(UpdateMsgType msgType, RuleChain ruleChain, boolean isRoot) {
+ boolean isTemplateRoot = ruleChain.isRoot();
+ ruleChain.setRoot(isRoot);
+ RuleChainUpdateMsg result = RuleChainUpdateMsg.newBuilder().setMsgType(msgType).setEntity(JacksonUtil.toString(ruleChain))
+ .setIdMSB(ruleChain.getId().getId().getMostSignificantBits())
+ .setIdLSB(ruleChain.getId().getId().getLeastSignificantBits()).build();
+ ruleChain.setRoot(isTemplateRoot);
+ return result;
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/settings/AdminSettingsMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/settings/AdminSettingsMsgConstructor.java
new file mode 100644
index 0000000000..da4f964218
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/settings/AdminSettingsMsgConstructor.java
@@ -0,0 +1,25 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.settings;
+
+import org.thingsboard.server.common.data.AdminSettings;
+import org.thingsboard.server.gen.edge.v1.AdminSettingsUpdateMsg;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructor;
+
+public interface AdminSettingsMsgConstructor extends MsgConstructor {
+
+ AdminSettingsUpdateMsg constructAdminSettingsUpdateMsg(AdminSettings adminSettings);
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/settings/AdminSettingsMsgConstructorFactory.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/settings/AdminSettingsMsgConstructorFactory.java
new file mode 100644
index 0000000000..ecf6131e52
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/settings/AdminSettingsMsgConstructorFactory.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.settings;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructorFactory;
+
+@Component
+@TbCoreComponent
+public class AdminSettingsMsgConstructorFactory extends MsgConstructorFactory {
+
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/AdminSettingsMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/settings/AdminSettingsMsgConstructorV1.java
similarity index 81%
rename from application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/AdminSettingsMsgConstructor.java
rename to application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/settings/AdminSettingsMsgConstructorV1.java
index 79754b867c..cbbd9b5bb8 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/AdminSettingsMsgConstructor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/settings/AdminSettingsMsgConstructorV1.java
@@ -13,26 +13,27 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.thingsboard.server.service.edge.rpc.constructor;
+package org.thingsboard.server.service.edge.rpc.constructor.settings;
import org.springframework.stereotype.Component;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.AdminSettings;
+import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.gen.edge.v1.AdminSettingsUpdateMsg;
import org.thingsboard.server.queue.util.TbCoreComponent;
@Component
@TbCoreComponent
-public class AdminSettingsMsgConstructor {
+public class AdminSettingsMsgConstructorV1 implements AdminSettingsMsgConstructor {
+ @Override
public AdminSettingsUpdateMsg constructAdminSettingsUpdateMsg(AdminSettings adminSettings) {
AdminSettingsUpdateMsg.Builder builder = AdminSettingsUpdateMsg.newBuilder()
.setKey(adminSettings.getKey())
.setJsonValue(JacksonUtil.toString(adminSettings.getJsonValue()));
- if (adminSettings.getId() != null) {
+ if (TenantId.SYS_TENANT_ID.equals(adminSettings.getTenantId())) {
builder.setIsSystem(true);
}
return builder.build();
}
-
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/settings/AdminSettingsMsgConstructorV2.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/settings/AdminSettingsMsgConstructorV2.java
new file mode 100644
index 0000000000..de92d2a1f9
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/settings/AdminSettingsMsgConstructorV2.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.settings;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.common.util.JacksonUtil;
+import org.thingsboard.server.common.data.AdminSettings;
+import org.thingsboard.server.gen.edge.v1.AdminSettingsUpdateMsg;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+
+@Component
+@TbCoreComponent
+public class AdminSettingsMsgConstructorV2 implements AdminSettingsMsgConstructor {
+
+ @Override
+ public AdminSettingsUpdateMsg constructAdminSettingsUpdateMsg(AdminSettings adminSettings) {
+ return AdminSettingsUpdateMsg.newBuilder().setEntity(JacksonUtil.toString(adminSettings)).build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EntityDataMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/telemetry/EntityDataMsgConstructor.java
similarity index 97%
rename from application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EntityDataMsgConstructor.java
rename to application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/telemetry/EntityDataMsgConstructor.java
index 47dbad231d..4ec6376a4d 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/EntityDataMsgConstructor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/telemetry/EntityDataMsgConstructor.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.thingsboard.server.service.edge.rpc.constructor;
+package org.thingsboard.server.service.edge.rpc.constructor.telemetry;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
@@ -28,7 +28,7 @@ import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.edge.EdgeEventActionType;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.TenantId;
-import org.thingsboard.server.common.transport.adaptor.JsonConverter;
+import org.thingsboard.server.common.adaptor.JsonConverter;
import org.thingsboard.server.gen.edge.v1.AttributeDeleteMsg;
import org.thingsboard.server.gen.edge.v1.EntityDataProto;
import org.thingsboard.server.gen.transport.TransportProtos;
@@ -36,8 +36,8 @@ import org.thingsboard.server.queue.util.TbCoreComponent;
import java.util.List;
-@Component
@Slf4j
+@Component
@TbCoreComponent
public class EntityDataMsgConstructor {
@@ -106,5 +106,4 @@ public class EntityDataMsgConstructor {
}
return result;
}
-
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/tenant/TenantMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/tenant/TenantMsgConstructor.java
new file mode 100644
index 0000000000..3de654fda6
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/tenant/TenantMsgConstructor.java
@@ -0,0 +1,31 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.tenant;
+
+import org.thingsboard.server.common.data.Tenant;
+import org.thingsboard.server.common.data.TenantProfile;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
+import org.thingsboard.server.gen.edge.v1.TenantProfileUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.TenantUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructor;
+
+public interface TenantMsgConstructor extends MsgConstructor {
+
+ TenantUpdateMsg constructTenantUpdateMsg(UpdateMsgType msgType, Tenant tenant);
+
+ TenantProfileUpdateMsg constructTenantProfileUpdateMsg(UpdateMsgType msgType, TenantProfile tenantProfile, EdgeVersion edgeVersion);
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/tenant/TenantMsgConstructorFactory.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/tenant/TenantMsgConstructorFactory.java
new file mode 100644
index 0000000000..7735d67684
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/tenant/TenantMsgConstructorFactory.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.tenant;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructorFactory;
+
+@Component
+@TbCoreComponent
+public class TenantMsgConstructorFactory extends MsgConstructorFactory {
+
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/TenantMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/tenant/TenantMsgConstructorV1.java
similarity index 59%
rename from application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/TenantMsgConstructor.java
rename to application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/tenant/TenantMsgConstructorV1.java
index 321a57970a..a3f815cc18 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/TenantMsgConstructor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/tenant/TenantMsgConstructorV1.java
@@ -13,19 +13,30 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.thingsboard.server.service.edge.rpc.constructor;
+package org.thingsboard.server.service.edge.rpc.constructor.tenant;
+import com.google.protobuf.ByteString;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Tenant;
+import org.thingsboard.server.common.data.TenantProfile;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
+import org.thingsboard.server.gen.edge.v1.TenantProfileUpdateMsg;
import org.thingsboard.server.gen.edge.v1.TenantUpdateMsg;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.queue.util.DataDecodingEncodingService;
import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.utils.EdgeVersionUtils;
@Component
@TbCoreComponent
-public class TenantMsgConstructor {
+public class TenantMsgConstructorV1 implements TenantMsgConstructor {
+ @Autowired
+ private DataDecodingEncodingService dataDecodingEncodingService;
+
+ @Override
public TenantUpdateMsg constructTenantUpdateMsg(UpdateMsgType msgType, Tenant tenant) {
TenantUpdateMsg.Builder builder = TenantUpdateMsg.newBuilder()
.setMsgType(msgType)
@@ -64,4 +75,22 @@ public class TenantMsgConstructor {
}
return builder.build();
}
+
+ @Override
+ public TenantProfileUpdateMsg constructTenantProfileUpdateMsg(UpdateMsgType msgType, TenantProfile tenantProfile, EdgeVersion edgeVersion) {
+ ByteString profileData = EdgeVersionUtils.isEdgeVersionOlderThan(edgeVersion, EdgeVersion.V_3_6_1) ?
+ ByteString.empty() : ByteString.copyFrom(dataDecodingEncodingService.encode(tenantProfile.getProfileData()));
+ TenantProfileUpdateMsg.Builder builder = TenantProfileUpdateMsg.newBuilder()
+ .setMsgType(msgType)
+ .setIdMSB(tenantProfile.getId().getId().getMostSignificantBits())
+ .setIdLSB(tenantProfile.getId().getId().getLeastSignificantBits())
+ .setName(tenantProfile.getName())
+ .setDefault(tenantProfile.isDefault())
+ .setIsolatedRuleChain(tenantProfile.isIsolatedTbRuleEngine())
+ .setProfileDataBytes(profileData);
+ if (tenantProfile.getDescription() != null) {
+ builder.setDescription(tenantProfile.getDescription());
+ }
+ return builder.build();
+ }
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/tenant/TenantMsgConstructorV2.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/tenant/TenantMsgConstructorV2.java
new file mode 100644
index 0000000000..69531e5630
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/tenant/TenantMsgConstructorV2.java
@@ -0,0 +1,41 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.tenant;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.common.util.JacksonUtil;
+import org.thingsboard.server.common.data.Tenant;
+import org.thingsboard.server.common.data.TenantProfile;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
+import org.thingsboard.server.gen.edge.v1.TenantProfileUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.TenantUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+
+@Component
+@TbCoreComponent
+public class TenantMsgConstructorV2 implements TenantMsgConstructor {
+
+ @Override
+ public TenantUpdateMsg constructTenantUpdateMsg(UpdateMsgType msgType, Tenant tenant) {
+ return TenantUpdateMsg.newBuilder().setMsgType(msgType).setEntity(JacksonUtil.toString(tenant)).build();
+ }
+
+ @Override
+ public TenantProfileUpdateMsg constructTenantProfileUpdateMsg(UpdateMsgType msgType, TenantProfile tenantProfile, EdgeVersion edgeVersion) {
+ return TenantProfileUpdateMsg.newBuilder().setMsgType(msgType).setEntity(JacksonUtil.toString(tenantProfile)).build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/user/BaseUserMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/user/BaseUserMsgConstructor.java
new file mode 100644
index 0000000000..aef35d8f50
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/user/BaseUserMsgConstructor.java
@@ -0,0 +1,31 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.user;
+
+import org.thingsboard.server.common.data.id.UserId;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.gen.edge.v1.UserUpdateMsg;
+
+public abstract class BaseUserMsgConstructor implements UserMsgConstructor {
+
+ @Override
+ public UserUpdateMsg constructUserDeleteMsg(UserId userId) {
+ return UserUpdateMsg.newBuilder()
+ .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
+ .setIdMSB(userId.getId().getMostSignificantBits())
+ .setIdLSB(userId.getId().getLeastSignificantBits()).build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/user/UserMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/user/UserMsgConstructor.java
new file mode 100644
index 0000000000..3184f8c751
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/user/UserMsgConstructor.java
@@ -0,0 +1,33 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.user;
+
+import org.thingsboard.server.common.data.User;
+import org.thingsboard.server.common.data.id.UserId;
+import org.thingsboard.server.common.data.security.UserCredentials;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.gen.edge.v1.UserCredentialsUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UserUpdateMsg;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructor;
+
+public interface UserMsgConstructor extends MsgConstructor {
+
+ UserUpdateMsg constructUserUpdatedMsg(UpdateMsgType msgType, User user);
+
+ UserUpdateMsg constructUserDeleteMsg(UserId userId);
+
+ UserCredentialsUpdateMsg constructUserCredentialsUpdatedMsg(UserCredentials userCredentials);
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/user/UserMsgConstructorFactory.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/user/UserMsgConstructorFactory.java
new file mode 100644
index 0000000000..bf1e4197c0
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/user/UserMsgConstructorFactory.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.user;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructorFactory;
+
+@Component
+@TbCoreComponent
+public class UserMsgConstructorFactory extends MsgConstructorFactory {
+
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/UserMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/user/UserMsgConstructorV1.java
similarity index 79%
rename from application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/UserMsgConstructor.java
rename to application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/user/UserMsgConstructorV1.java
index fbd3b31688..3fe635c54c 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/UserMsgConstructor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/user/UserMsgConstructorV1.java
@@ -13,12 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.thingsboard.server.service.edge.rpc.constructor;
+package org.thingsboard.server.service.edge.rpc.constructor.user;
import org.springframework.stereotype.Component;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.User;
-import org.thingsboard.server.common.data.id.UserId;
import org.thingsboard.server.common.data.security.UserCredentials;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.gen.edge.v1.UserCredentialsUpdateMsg;
@@ -27,8 +26,9 @@ import org.thingsboard.server.queue.util.TbCoreComponent;
@Component
@TbCoreComponent
-public class UserMsgConstructor {
+public class UserMsgConstructorV1 extends BaseUserMsgConstructor {
+ @Override
public UserUpdateMsg constructUserUpdatedMsg(UpdateMsgType msgType, User user) {
UserUpdateMsg.Builder builder = UserUpdateMsg.newBuilder()
.setMsgType(msgType)
@@ -52,19 +52,12 @@ public class UserMsgConstructor {
return builder.build();
}
- public UserUpdateMsg constructUserDeleteMsg(UserId userId) {
- return UserUpdateMsg.newBuilder()
- .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
- .setIdMSB(userId.getId().getMostSignificantBits())
- .setIdLSB(userId.getId().getLeastSignificantBits()).build();
- }
-
+ @Override
public UserCredentialsUpdateMsg constructUserCredentialsUpdatedMsg(UserCredentials userCredentials) {
- UserCredentialsUpdateMsg.Builder builder = UserCredentialsUpdateMsg.newBuilder()
+ return UserCredentialsUpdateMsg.newBuilder()
.setUserIdMSB(userCredentials.getUserId().getId().getMostSignificantBits())
.setUserIdLSB(userCredentials.getUserId().getId().getLeastSignificantBits())
.setEnabled(userCredentials.isEnabled())
- .setPassword(userCredentials.getPassword());
- return builder.build();
+ .setPassword(userCredentials.getPassword()).build();
}
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/user/UserMsgConstructorV2.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/user/UserMsgConstructorV2.java
new file mode 100644
index 0000000000..0b4c592712
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/user/UserMsgConstructorV2.java
@@ -0,0 +1,42 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.user;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.common.util.JacksonUtil;
+import org.thingsboard.server.common.data.User;
+import org.thingsboard.server.common.data.security.UserCredentials;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.gen.edge.v1.UserCredentialsUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.UserUpdateMsg;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+
+@Component
+@TbCoreComponent
+public class UserMsgConstructorV2 extends BaseUserMsgConstructor {
+
+ @Override
+ public UserUpdateMsg constructUserUpdatedMsg(UpdateMsgType msgType, User user) {
+ return UserUpdateMsg.newBuilder().setMsgType(msgType).setEntity(JacksonUtil.toString(user))
+ .setIdMSB(user.getId().getId().getMostSignificantBits())
+ .setIdLSB(user.getId().getId().getLeastSignificantBits()).build();
+ }
+
+ @Override
+ public UserCredentialsUpdateMsg constructUserCredentialsUpdatedMsg(UserCredentials userCredentials) {
+ return UserCredentialsUpdateMsg.newBuilder().setEntity(JacksonUtil.toString(userCredentials)).build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/widget/BaseWidgetMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/widget/BaseWidgetMsgConstructor.java
new file mode 100644
index 0000000000..6b4b3ac821
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/widget/BaseWidgetMsgConstructor.java
@@ -0,0 +1,43 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.widget;
+
+import org.thingsboard.server.common.data.id.WidgetTypeId;
+import org.thingsboard.server.common.data.id.WidgetsBundleId;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.gen.edge.v1.WidgetTypeUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.WidgetsBundleUpdateMsg;
+
+public abstract class BaseWidgetMsgConstructor implements WidgetMsgConstructor {
+
+ @Override
+ public WidgetsBundleUpdateMsg constructWidgetsBundleDeleteMsg(WidgetsBundleId widgetsBundleId) {
+ return WidgetsBundleUpdateMsg.newBuilder()
+ .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
+ .setIdMSB(widgetsBundleId.getId().getMostSignificantBits())
+ .setIdLSB(widgetsBundleId.getId().getLeastSignificantBits())
+ .build();
+ }
+
+ @Override
+ public WidgetTypeUpdateMsg constructWidgetTypeDeleteMsg(WidgetTypeId widgetTypeId) {
+ return WidgetTypeUpdateMsg.newBuilder()
+ .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
+ .setIdMSB(widgetTypeId.getId().getMostSignificantBits())
+ .setIdLSB(widgetTypeId.getId().getLeastSignificantBits())
+ .build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/widget/WidgetMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/widget/WidgetMsgConstructor.java
new file mode 100644
index 0000000000..544ba39b13
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/widget/WidgetMsgConstructor.java
@@ -0,0 +1,39 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.widget;
+
+import org.thingsboard.server.common.data.id.WidgetTypeId;
+import org.thingsboard.server.common.data.id.WidgetsBundleId;
+import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
+import org.thingsboard.server.common.data.widget.WidgetsBundle;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.gen.edge.v1.WidgetTypeUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.WidgetsBundleUpdateMsg;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructor;
+
+import java.util.List;
+
+public interface WidgetMsgConstructor extends MsgConstructor {
+
+ WidgetsBundleUpdateMsg constructWidgetsBundleUpdateMsg(UpdateMsgType msgType, WidgetsBundle widgetsBundle, List widgets);
+
+ WidgetsBundleUpdateMsg constructWidgetsBundleDeleteMsg(WidgetsBundleId widgetsBundleId);
+
+ WidgetTypeUpdateMsg constructWidgetTypeUpdateMsg(UpdateMsgType msgType, WidgetTypeDetails widgetTypeDetails, EdgeVersion edgeVersion);
+
+ WidgetTypeUpdateMsg constructWidgetTypeDeleteMsg(WidgetTypeId widgetTypeId);
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/widget/WidgetMsgConstructorFactory.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/widget/WidgetMsgConstructorFactory.java
new file mode 100644
index 0000000000..3a963f7041
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/widget/WidgetMsgConstructorFactory.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.widget;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.MsgConstructorFactory;
+
+@Component
+@TbCoreComponent
+public class WidgetMsgConstructorFactory extends MsgConstructorFactory {
+
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/WidgetTypeMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/widget/WidgetMsgConstructorV1.java
similarity index 67%
rename from application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/WidgetTypeMsgConstructor.java
rename to application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/widget/WidgetMsgConstructorV1.java
index 17a66a47d4..67bdbf1f54 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/WidgetTypeMsgConstructor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/widget/WidgetMsgConstructorV1.java
@@ -13,25 +13,54 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.thingsboard.server.service.edge.rpc.constructor;
+package org.thingsboard.server.service.edge.rpc.constructor.widget;
+import com.google.protobuf.ByteString;
import org.springframework.stereotype.Component;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.id.TenantId;
-import org.thingsboard.server.common.data.id.WidgetTypeId;
import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
+import org.thingsboard.server.common.data.widget.WidgetsBundle;
import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.gen.edge.v1.WidgetTypeUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.WidgetsBundleUpdateMsg;
import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.edge.rpc.utils.EdgeVersionUtils;
+import java.nio.charset.StandardCharsets;
import java.util.Arrays;
+import java.util.List;
@Component
@TbCoreComponent
-public class WidgetTypeMsgConstructor {
+public class WidgetMsgConstructorV1 extends BaseWidgetMsgConstructor {
+ @Override
+ public WidgetsBundleUpdateMsg constructWidgetsBundleUpdateMsg(UpdateMsgType msgType, WidgetsBundle widgetsBundle, List widgets) {
+ WidgetsBundleUpdateMsg.Builder builder = WidgetsBundleUpdateMsg.newBuilder()
+ .setMsgType(msgType)
+ .setIdMSB(widgetsBundle.getId().getId().getMostSignificantBits())
+ .setIdLSB(widgetsBundle.getId().getId().getLeastSignificantBits())
+ .setTitle(widgetsBundle.getTitle())
+ .setAlias(widgetsBundle.getAlias());
+ if (widgetsBundle.getImage() != null) {
+ builder.setImage(ByteString.copyFrom(widgetsBundle.getImage().getBytes(StandardCharsets.UTF_8)));
+ }
+ if (widgetsBundle.getDescription() != null) {
+ builder.setDescription(widgetsBundle.getDescription());
+ }
+ if (widgetsBundle.getOrder() != null) {
+ builder.setOrder(widgetsBundle.getOrder());
+ }
+ if (widgetsBundle.getTenantId().equals(TenantId.SYS_TENANT_ID)) {
+ builder.setIsSystem(true);
+ }
+ builder.setWidgets(JacksonUtil.toString(widgets));
+ return builder.build();
+ }
+
+ @Override
public WidgetTypeUpdateMsg constructWidgetTypeUpdateMsg(UpdateMsgType msgType, WidgetTypeDetails widgetTypeDetails, EdgeVersion edgeVersion) {
WidgetTypeUpdateMsg.Builder builder = WidgetTypeUpdateMsg.newBuilder()
.setMsgType(msgType)
@@ -73,12 +102,4 @@ public class WidgetTypeMsgConstructor {
}
return builder.build();
}
-
- public WidgetTypeUpdateMsg constructWidgetTypeDeleteMsg(WidgetTypeId widgetTypeId) {
- return WidgetTypeUpdateMsg.newBuilder()
- .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE)
- .setIdMSB(widgetTypeId.getId().getMostSignificantBits())
- .setIdLSB(widgetTypeId.getId().getLeastSignificantBits())
- .build();
- }
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/widget/WidgetMsgConstructorV2.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/widget/WidgetMsgConstructorV2.java
new file mode 100644
index 0000000000..aacc3c8399
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/widget/WidgetMsgConstructorV2.java
@@ -0,0 +1,48 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.edge.rpc.constructor.widget;
+
+import org.springframework.stereotype.Component;
+import org.thingsboard.common.util.JacksonUtil;
+import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
+import org.thingsboard.server.common.data.widget.WidgetsBundle;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
+import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.gen.edge.v1.WidgetTypeUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.WidgetsBundleUpdateMsg;
+import org.thingsboard.server.queue.util.TbCoreComponent;
+
+import java.util.List;
+
+@Component
+@TbCoreComponent
+public class WidgetMsgConstructorV2 extends BaseWidgetMsgConstructor {
+
+ @Override
+ public WidgetsBundleUpdateMsg constructWidgetsBundleUpdateMsg(UpdateMsgType msgType, WidgetsBundle widgetsBundle, List widgets) {
+ return WidgetsBundleUpdateMsg.newBuilder().setMsgType(msgType).setEntity(JacksonUtil.toString(widgetsBundle))
+ .setWidgets(JacksonUtil.toString(widgets))
+ .setIdMSB(widgetsBundle.getId().getId().getMostSignificantBits())
+ .setIdLSB(widgetsBundle.getId().getId().getLeastSignificantBits()).build();
+ }
+
+ @Override
+ public WidgetTypeUpdateMsg constructWidgetTypeUpdateMsg(UpdateMsgType msgType, WidgetTypeDetails widgetTypeDetails, EdgeVersion edgeVersion) {
+ return WidgetTypeUpdateMsg.newBuilder().setMsgType(msgType).setEntity(JacksonUtil.toString(widgetTypeDetails))
+ .setIdMSB(widgetTypeDetails.getId().getId().getMostSignificantBits())
+ .setIdLSB(widgetTypeDetails.getId().getId().getLeastSignificantBits()).build();
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/BaseEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/BaseEdgeProcessor.java
index 8790b5d1fd..fe5fc76f2c 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/BaseEdgeProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/BaseEdgeProcessor.java
@@ -90,27 +90,23 @@ import org.thingsboard.server.queue.TbQueueCallback;
import org.thingsboard.server.queue.TbQueueMsgMetadata;
import org.thingsboard.server.queue.discovery.PartitionService;
import org.thingsboard.server.queue.provider.TbQueueProducerProvider;
-import org.thingsboard.server.service.edge.rpc.constructor.AdminSettingsMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.AlarmMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.AssetMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.AssetProfileMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.CustomerMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.DashboardMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.DeviceMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.DeviceProfileMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.EdgeMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.EntityDataMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.EntityViewMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.OtaPackageMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.QueueMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.RelationMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.RuleChainMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.ResourceMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.TenantMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.TenantProfileMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.UserMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.WidgetTypeMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.WidgetsBundleMsgConstructor;
+import org.thingsboard.server.service.edge.rpc.constructor.alarm.AlarmMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.asset.AssetMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.customer.CustomerMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.dashboard.DashboardMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.device.DeviceMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.edge.EdgeMsgConstructor;
+import org.thingsboard.server.service.edge.rpc.constructor.entityview.EntityViewMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.ota.OtaPackageMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.queue.QueueMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.relation.RelationMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.resource.ResourceMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.rule.RuleChainMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.settings.AdminSettingsMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.telemetry.EntityDataMsgConstructor;
+import org.thingsboard.server.service.edge.rpc.constructor.tenant.TenantMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.user.UserMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.widget.WidgetMsgConstructorFactory;
import org.thingsboard.server.service.entitiy.TbNotificationEntityService;
import org.thingsboard.server.service.executors.DbCallbackExecutorService;
import org.thingsboard.server.service.profile.TbAssetProfileCache;
@@ -253,61 +249,49 @@ public abstract class BaseEdgeProcessor {
protected EntityDataMsgConstructor entityDataMsgConstructor;
@Autowired
- protected RuleChainMsgConstructor ruleChainMsgConstructor;
+ protected RuleChainMsgConstructorFactory ruleChainMsgConstructorFactory;
@Autowired
- protected AlarmMsgConstructor alarmMsgConstructor;
+ protected AlarmMsgConstructorFactory alarmMsgConstructorFactory;
@Autowired
- protected DeviceMsgConstructor deviceMsgConstructor;
+ protected DeviceMsgConstructorFactory deviceMsgConstructorFactory;
@Autowired
- protected AssetMsgConstructor assetMsgConstructor;
+ protected AssetMsgConstructorFactory assetMsgConstructorFactory;
@Autowired
- protected EntityViewMsgConstructor entityViewMsgConstructor;
+ protected EntityViewMsgConstructorFactory entityViewMsgConstructorFactory;
@Autowired
- protected DashboardMsgConstructor dashboardMsgConstructor;
+ protected DashboardMsgConstructorFactory dashboardMsgConstructorFactory;
@Autowired
- protected RelationMsgConstructor relationMsgConstructor;
+ protected RelationMsgConstructorFactory relationMsgConstructorFactory;
@Autowired
- protected UserMsgConstructor userMsgConstructor;
+ protected UserMsgConstructorFactory userMsgConstructorFactory;
@Autowired
- protected CustomerMsgConstructor customerMsgConstructor;
+ protected CustomerMsgConstructorFactory customerMsgConstructorFactory;
@Autowired
- protected DeviceProfileMsgConstructor deviceProfileMsgConstructor;
+ protected TenantMsgConstructorFactory tenantMsgConstructorFactory;
@Autowired
- protected AssetProfileMsgConstructor assetProfileMsgConstructor;
+ protected WidgetMsgConstructorFactory widgetMsgConstructorFactory;
@Autowired
- protected TenantMsgConstructor tenantMsgConstructor;
+ protected AdminSettingsMsgConstructorFactory adminSettingsMsgConstructorFactory;
@Autowired
- protected TenantProfileMsgConstructor tenantProfileMsgConstructor;
+ protected OtaPackageMsgConstructorFactory otaPackageMsgConstructorFactory;
@Autowired
- protected WidgetsBundleMsgConstructor widgetsBundleMsgConstructor;
+ protected QueueMsgConstructorFactory queueMsgConstructorFactory;
@Autowired
- protected WidgetTypeMsgConstructor widgetTypeMsgConstructor;
-
- @Autowired
- protected AdminSettingsMsgConstructor adminSettingsMsgConstructor;
-
- @Autowired
- protected OtaPackageMsgConstructor otaPackageMsgConstructor;
-
- @Autowired
- protected QueueMsgConstructor queueMsgConstructor;
-
- @Autowired
- protected ResourceMsgConstructor resourceMsgConstructor;
+ protected ResourceMsgConstructorFactory resourceMsgConstructorFactory;
@Autowired
protected EdgeSynchronizationManager edgeSynchronizationManager;
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/alarm/AlarmEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/alarm/AlarmEdgeProcessor.java
index 882fd90c46..b934a33d54 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/alarm/AlarmEdgeProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/alarm/AlarmEdgeProcessor.java
@@ -34,6 +34,7 @@ import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.gen.edge.v1.AlarmUpdateMsg;
import org.thingsboard.server.gen.edge.v1.DownlinkMsg;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.transport.TransportProtos;
import org.thingsboard.server.queue.util.TbCoreComponent;
@@ -46,19 +47,19 @@ import java.util.UUID;
@TbCoreComponent
public class AlarmEdgeProcessor extends BaseAlarmProcessor {
- public ListenableFuture processAlarmMsgFromEdge(TenantId tenantId, EdgeId edgeId, AlarmUpdateMsg alarmUpdateMsg) {
+ public ListenableFuture processAlarmMsgFromEdge(TenantId tenantId, EdgeId edgeId, AlarmUpdateMsg alarmUpdateMsg, EdgeVersion edgeVersion) {
log.trace("[{}] processAlarmMsgFromEdge [{}]", tenantId, alarmUpdateMsg);
try {
edgeSynchronizationManager.getEdgeId().set(edgeId);
- return processAlarmMsg(tenantId, alarmUpdateMsg);
+ return processAlarmMsg(tenantId, alarmUpdateMsg, edgeVersion);
} finally {
edgeSynchronizationManager.getEdgeId().remove();
}
}
- public DownlinkMsg convertAlarmEventToDownlink(EdgeEvent edgeEvent) {
- AlarmUpdateMsg alarmUpdateMsg =
- convertAlarmEventToAlarmMsg(edgeEvent.getTenantId(), edgeEvent.getEntityId(), edgeEvent.getAction(), edgeEvent.getBody());
+ public DownlinkMsg convertAlarmEventToDownlink(EdgeEvent edgeEvent, EdgeVersion edgeVersion) {
+ AlarmUpdateMsg alarmUpdateMsg = convertAlarmEventToAlarmMsg(edgeEvent.getTenantId(), edgeEvent.getEntityId(),
+ edgeEvent.getAction(), edgeEvent.getBody(), edgeVersion);
if (alarmUpdateMsg != null) {
return DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
@@ -122,5 +123,4 @@ public class AlarmEdgeProcessor extends BaseAlarmProcessor {
} while (pageData != null && pageData.hasNext());
return futures;
}
-
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/alarm/BaseAlarmProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/alarm/BaseAlarmProcessor.java
index 3fb086cd52..99b8d2c12a 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/alarm/BaseAlarmProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/alarm/BaseAlarmProcessor.java
@@ -37,18 +37,29 @@ import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.EntityViewId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.gen.edge.v1.AlarmUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.service.edge.rpc.constructor.alarm.AlarmMsgConstructor;
import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
+import org.thingsboard.server.service.edge.rpc.utils.EdgeVersionUtils;
import java.util.UUID;
@Slf4j
public abstract class BaseAlarmProcessor extends BaseEdgeProcessor {
- protected ListenableFuture processAlarmMsg(TenantId tenantId, AlarmUpdateMsg alarmUpdateMsg) {
- EntityId originatorId = getAlarmOriginator(tenantId, alarmUpdateMsg.getOriginatorName(),
- EntityType.valueOf(alarmUpdateMsg.getOriginatorType()));
+ public ListenableFuture processAlarmMsg(TenantId tenantId, AlarmUpdateMsg alarmUpdateMsg, EdgeVersion edgeVersion) {
+ log.trace("[{}] processAlarmMsg [{}]", tenantId, alarmUpdateMsg);
AlarmId alarmId = new AlarmId(new UUID(alarmUpdateMsg.getIdMSB(), alarmUpdateMsg.getIdLSB()));
+ boolean isEdgeVersionOlderThan_3_6_2 = EdgeVersionUtils.isEdgeVersionOlderThan_3_6_2(edgeVersion);
+ Alarm alarm = isEdgeVersionOlderThan_3_6_2 ? createDeprecatedAlarm(tenantId, alarmUpdateMsg)
+ : JacksonUtil.fromStringIgnoreUnknownProperties(alarmUpdateMsg.getEntity(), Alarm.class);
+ if (alarm == null) {
+ throw new RuntimeException("[{" + tenantId + "}] alarmUpdateMsg {" + alarmUpdateMsg + "} cannot be converted to alarm");
+ }
+ EntityId originatorId = isEdgeVersionOlderThan_3_6_2
+ ? getAlarmOriginator(tenantId, alarmUpdateMsg.getOriginatorName(), EntityType.valueOf(alarmUpdateMsg.getOriginatorType()))
+ : alarm.getOriginator();
if (originatorId == null) {
log.warn("[{}] Originator not found for the alarm msg {}", tenantId, alarmUpdateMsg);
return Futures.immediateFuture(null);
@@ -58,21 +69,8 @@ public abstract class BaseAlarmProcessor extends BaseEdgeProcessor {
switch (alarmUpdateMsg.getMsgType()) {
case ENTITY_CREATED_RPC_MESSAGE:
case ENTITY_UPDATED_RPC_MESSAGE:
- Alarm alarm = new Alarm();
alarm.setId(alarmId);
- alarm.setTenantId(tenantId);
- alarm.setType(alarmUpdateMsg.getName());
alarm.setOriginator(originatorId);
- alarm.setSeverity(AlarmSeverity.valueOf(alarmUpdateMsg.getSeverity()));
- alarm.setStartTs(alarmUpdateMsg.getStartTs());
- var alarmStatus = AlarmStatus.valueOf(alarmUpdateMsg.getStatus());
- alarm.setClearTs(alarmUpdateMsg.getClearTs());
- alarm.setPropagate(alarmUpdateMsg.getPropagate());
- alarm.setCleared(alarmStatus.isCleared());
- alarm.setAcknowledged(alarmStatus.isAck());
- alarm.setAckTs(alarmUpdateMsg.getAckTs());
- alarm.setEndTs(alarmUpdateMsg.getEndTs());
- alarm.setDetails(JacksonUtil.toJsonNode(alarmUpdateMsg.getDetails()));
if (UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE.equals(alarmUpdateMsg.getMsgType())) {
alarmService.createAlarm(AlarmCreateOrUpdateActiveRequest.fromAlarm(alarm, null, alarmId));
} else {
@@ -82,14 +80,13 @@ public abstract class BaseAlarmProcessor extends BaseEdgeProcessor {
case ALARM_ACK_RPC_MESSAGE:
Alarm alarmToAck = alarmService.findAlarmById(tenantId, alarmId);
if (alarmToAck != null) {
- alarmService.acknowledgeAlarm(tenantId, alarmId, alarmUpdateMsg.getAckTs());
+ alarmService.acknowledgeAlarm(tenantId, alarmId, alarm.getAckTs());
}
break;
case ALARM_CLEAR_RPC_MESSAGE:
Alarm alarmToClear = alarmService.findAlarmById(tenantId, alarmId);
if (alarmToClear != null) {
- alarmService.clearAlarm(tenantId, alarmId, alarmUpdateMsg.getClearTs(),
- JacksonUtil.toJsonNode(alarmUpdateMsg.getDetails()));
+ alarmService.clearAlarm(tenantId, alarmId, alarm.getClearTs(), alarm.getDetails());
}
break;
case ENTITY_DELETED_RPC_MESSAGE:
@@ -109,7 +106,24 @@ public abstract class BaseAlarmProcessor extends BaseEdgeProcessor {
return Futures.immediateFuture(null);
}
- protected AlarmUpdateMsg convertAlarmEventToAlarmMsg(TenantId tenantId, UUID entityId, EdgeEventActionType actionType, JsonNode body) {
+ private Alarm createDeprecatedAlarm(TenantId tenantId, AlarmUpdateMsg alarmUpdateMsg) {
+ Alarm alarm = new Alarm();
+ alarm.setTenantId(tenantId);
+ alarm.setType(alarmUpdateMsg.getName());
+ alarm.setSeverity(AlarmSeverity.valueOf(alarmUpdateMsg.getSeverity()));
+ alarm.setStartTs(alarmUpdateMsg.getStartTs());
+ AlarmStatus alarmStatus = AlarmStatus.valueOf(alarmUpdateMsg.getStatus());
+ alarm.setClearTs(alarmUpdateMsg.getClearTs());
+ alarm.setPropagate(alarmUpdateMsg.getPropagate());
+ alarm.setCleared(alarmStatus.isCleared());
+ alarm.setAcknowledged(alarmStatus.isAck());
+ alarm.setAckTs(alarmUpdateMsg.getAckTs());
+ alarm.setEndTs(alarmUpdateMsg.getEndTs());
+ alarm.setDetails(JacksonUtil.toJsonNode(alarmUpdateMsg.getDetails()));
+ return alarm;
+ }
+
+ public AlarmUpdateMsg convertAlarmEventToAlarmMsg(TenantId tenantId, UUID entityId, EdgeEventActionType actionType, JsonNode body, EdgeVersion edgeVersion) {
AlarmId alarmId = new AlarmId(entityId);
UpdateMsgType msgType = getUpdateMsgType(actionType);
switch (actionType) {
@@ -119,12 +133,16 @@ public abstract class BaseAlarmProcessor extends BaseEdgeProcessor {
case ALARM_CLEAR:
Alarm alarm = alarmService.findAlarmById(tenantId, alarmId);
if (alarm != null) {
- return alarmMsgConstructor.constructAlarmUpdatedMsg(msgType, alarm, findOriginatorEntityName(tenantId, alarm));
+ return ((AlarmMsgConstructor) alarmMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion))
+ .constructAlarmUpdatedMsg(msgType, alarm, findOriginatorEntityName(tenantId, alarm));
}
break;
case DELETED:
Alarm deletedAlarm = JacksonUtil.convertValue(body, Alarm.class);
- return alarmMsgConstructor.constructAlarmUpdatedMsg(msgType, deletedAlarm, findOriginatorEntityName(tenantId, deletedAlarm));
+ if (deletedAlarm != null) {
+ return ((AlarmMsgConstructor) alarmMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion))
+ .constructAlarmUpdatedMsg(msgType, deletedAlarm, findOriginatorEntityName(tenantId, deletedAlarm));
+ }
}
return null;
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetEdgeProcessor.java
index caa03af8a5..e760a4d73a 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetEdgeProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetEdgeProcessor.java
@@ -41,6 +41,8 @@ import org.thingsboard.server.gen.edge.v1.DownlinkMsg;
import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.asset.AssetMsgConstructor;
+import org.thingsboard.server.service.edge.rpc.utils.EdgeVersionUtils;
import java.util.UUID;
@@ -49,7 +51,7 @@ import java.util.UUID;
@TbCoreComponent
public class AssetEdgeProcessor extends BaseAssetProcessor {
- public ListenableFuture processAssetMsgFromEdge(TenantId tenantId, Edge edge, AssetUpdateMsg assetUpdateMsg) {
+ public ListenableFuture processAssetMsgFromEdge(TenantId tenantId, Edge edge, AssetUpdateMsg assetUpdateMsg, EdgeVersion edgeVersion) {
log.trace("[{}] executing processAssetMsgFromEdge [{}] from edge [{}]", tenantId, assetUpdateMsg, edge.getId());
AssetId assetId = new AssetId(new UUID(assetUpdateMsg.getIdMSB(), assetUpdateMsg.getIdLSB()));
try {
@@ -58,7 +60,7 @@ public class AssetEdgeProcessor extends BaseAssetProcessor {
switch (assetUpdateMsg.getMsgType()) {
case ENTITY_CREATED_RPC_MESSAGE:
case ENTITY_UPDATED_RPC_MESSAGE:
- saveOrUpdateAsset(tenantId, assetId, assetUpdateMsg, edge);
+ saveOrUpdateAsset(tenantId, assetId, assetUpdateMsg, edge, edgeVersion);
return Futures.immediateFuture(null);
case ENTITY_DELETED_RPC_MESSAGE:
Asset assetToDelete = assetService.findAssetById(tenantId, assetId);
@@ -82,9 +84,8 @@ public class AssetEdgeProcessor extends BaseAssetProcessor {
}
}
- private void saveOrUpdateAsset(TenantId tenantId, AssetId assetId, AssetUpdateMsg assetUpdateMsg, Edge edge) {
- CustomerId customerId = safeGetCustomerId(assetUpdateMsg.getCustomerIdMSB(), assetUpdateMsg.getCustomerIdLSB());
- Pair resultPair = super.saveOrUpdateAsset(tenantId, assetId, assetUpdateMsg, customerId);
+ private void saveOrUpdateAsset(TenantId tenantId, AssetId assetId, AssetUpdateMsg assetUpdateMsg, Edge edge, EdgeVersion edgeVersion) {
+ Pair resultPair = super.saveOrUpdateAsset(tenantId, assetId, assetUpdateMsg, edgeVersion);
Boolean created = resultPair.getFirst();
if (created) {
createRelationFromEdge(tenantId, edge.getId(), assetId);
@@ -120,23 +121,24 @@ public class AssetEdgeProcessor extends BaseAssetProcessor {
Asset asset = assetService.findAssetById(edgeEvent.getTenantId(), assetId);
if (asset != null && !BaseAssetService.TB_SERVICE_QUEUE.equals(asset.getType())) {
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
- AssetUpdateMsg assetUpdateMsg =
- assetMsgConstructor.constructAssetUpdatedMsg(msgType, asset);
+ AssetUpdateMsg assetUpdateMsg = ((AssetMsgConstructor)
+ assetMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructAssetUpdatedMsg(msgType, asset);
DownlinkMsg.Builder builder = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addAssetUpdateMsg(assetUpdateMsg);
if (UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE.equals(msgType)) {
AssetProfile assetProfile = assetProfileService.findAssetProfileById(edgeEvent.getTenantId(), asset.getAssetProfileId());
assetProfile = checkIfAssetProfileDefaultFieldsAssignedToEdge(edgeEvent.getTenantId(), edgeId, assetProfile, edgeVersion);
- builder.addAssetProfileUpdateMsg(assetProfileMsgConstructor.constructAssetProfileUpdatedMsg(msgType, assetProfile));
+ builder.addAssetProfileUpdateMsg(((AssetMsgConstructor) assetMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion))
+ .constructAssetProfileUpdatedMsg(msgType, assetProfile));
}
downlinkMsg = builder.build();
}
break;
case DELETED:
case UNASSIGNED_FROM_EDGE:
- AssetUpdateMsg assetUpdateMsg =
- assetMsgConstructor.constructAssetDeleteMsg(assetId);
+ AssetUpdateMsg assetUpdateMsg = ((AssetMsgConstructor)
+ assetMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructAssetDeleteMsg(assetId);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addAssetUpdateMsg(assetUpdateMsg)
@@ -145,4 +147,12 @@ public class AssetEdgeProcessor extends BaseAssetProcessor {
}
return downlinkMsg;
}
+
+ @Override
+ protected void setCustomerId(TenantId tenantId, CustomerId customerId, Asset asset, AssetUpdateMsg assetUpdateMsg, EdgeVersion edgeVersion) {
+ CustomerId customerUUID = EdgeVersionUtils.isEdgeVersionOlderThan_3_6_2(edgeVersion)
+ ? safeGetCustomerId(assetUpdateMsg.getCustomerIdMSB(), assetUpdateMsg.getCustomerIdLSB())
+ : asset.getCustomerId() != null ? asset.getCustomerId() : customerId;
+ asset.setCustomerId(customerUUID);
+ }
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetProfileEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetProfileEdgeProcessor.java
index fb55edd8c5..a18030992d 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetProfileEdgeProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetProfileEdgeProcessor.java
@@ -40,6 +40,8 @@ import org.thingsboard.server.gen.edge.v1.DownlinkMsg;
import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.asset.AssetMsgConstructor;
+import org.thingsboard.server.service.edge.rpc.utils.EdgeVersionUtils;
import java.util.UUID;
@@ -48,7 +50,7 @@ import java.util.UUID;
@TbCoreComponent
public class AssetProfileEdgeProcessor extends BaseAssetProfileProcessor {
- public ListenableFuture processAssetProfileMsgFromEdge(TenantId tenantId, Edge edge, AssetProfileUpdateMsg assetProfileUpdateMsg) {
+ public ListenableFuture processAssetProfileMsgFromEdge(TenantId tenantId, Edge edge, AssetProfileUpdateMsg assetProfileUpdateMsg, EdgeVersion edgeVersion) {
log.trace("[{}] executing processAssetProfileMsgFromEdge [{}] from edge [{}]", tenantId, assetProfileUpdateMsg, edge.getId());
AssetProfileId assetProfileId = new AssetProfileId(new UUID(assetProfileUpdateMsg.getIdMSB(), assetProfileUpdateMsg.getIdLSB()));
try {
@@ -57,7 +59,7 @@ public class AssetProfileEdgeProcessor extends BaseAssetProfileProcessor {
switch (assetProfileUpdateMsg.getMsgType()) {
case ENTITY_CREATED_RPC_MESSAGE:
case ENTITY_UPDATED_RPC_MESSAGE:
- saveOrUpdateAssetProfile(tenantId, assetProfileId, assetProfileUpdateMsg, edge);
+ saveOrUpdateAssetProfile(tenantId, assetProfileId, assetProfileUpdateMsg, edge, edgeVersion);
return Futures.immediateFuture(null);
case ENTITY_DELETED_RPC_MESSAGE:
case UNRECOGNIZED:
@@ -72,8 +74,8 @@ public class AssetProfileEdgeProcessor extends BaseAssetProfileProcessor {
}
}
- private void saveOrUpdateAssetProfile(TenantId tenantId, AssetProfileId assetProfileId, AssetProfileUpdateMsg assetProfileUpdateMsg, Edge edge) {
- Pair resultPair = super.saveOrUpdateAssetProfile(tenantId, assetProfileId, assetProfileUpdateMsg);
+ private void saveOrUpdateAssetProfile(TenantId tenantId, AssetProfileId assetProfileId, AssetProfileUpdateMsg assetProfileUpdateMsg, Edge edge, EdgeVersion edgeVersion) {
+ Pair resultPair = super.saveOrUpdateAssetProfile(tenantId, assetProfileId, assetProfileUpdateMsg, edgeVersion);
Boolean created = resultPair.getFirst();
if (created) {
createRelationFromEdge(tenantId, edge.getId(), assetProfileId);
@@ -106,8 +108,8 @@ public class AssetProfileEdgeProcessor extends BaseAssetProfileProcessor {
if (assetProfile != null) {
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
assetProfile = checkIfAssetProfileDefaultFieldsAssignedToEdge(edgeEvent.getTenantId(), edgeId, assetProfile, edgeVersion);
- AssetProfileUpdateMsg assetProfileUpdateMsg =
- assetProfileMsgConstructor.constructAssetProfileUpdatedMsg(msgType, assetProfile);
+ AssetProfileUpdateMsg assetProfileUpdateMsg = ((AssetMsgConstructor)
+ assetMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructAssetProfileUpdatedMsg(msgType, assetProfile);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addAssetProfileUpdateMsg(assetProfileUpdateMsg)
@@ -115,8 +117,8 @@ public class AssetProfileEdgeProcessor extends BaseAssetProfileProcessor {
}
break;
case DELETED:
- AssetProfileUpdateMsg assetProfileUpdateMsg =
- assetProfileMsgConstructor.constructAssetProfileDeleteMsg(assetProfileId);
+ AssetProfileUpdateMsg assetProfileUpdateMsg = ((AssetMsgConstructor)
+ assetMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructAssetProfileDeleteMsg(assetProfileId);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addAssetProfileUpdateMsg(assetProfileUpdateMsg)
@@ -127,19 +129,23 @@ public class AssetProfileEdgeProcessor extends BaseAssetProfileProcessor {
}
@Override
- protected void setDefaultRuleChainId(TenantId tenantId, AssetProfile assetProfile, AssetProfileUpdateMsg assetProfileUpdateMsg) {
- // do nothing on cloud
+ protected void setDefaultRuleChainId(TenantId tenantId, AssetProfile assetProfile, RuleChainId ruleChainId) {
+ assetProfile.setDefaultRuleChainId(ruleChainId);
}
@Override
- protected void setDefaultEdgeRuleChainId(TenantId tenantId,AssetProfile assetProfile, AssetProfileUpdateMsg assetProfileUpdateMsg) {
- UUID defaultEdgeRuleChainUUID = safeGetUUID(assetProfileUpdateMsg.getDefaultRuleChainIdMSB(), assetProfileUpdateMsg.getDefaultRuleChainIdLSB());
+ protected void setDefaultEdgeRuleChainId(AssetProfile assetProfile, RuleChainId ruleChainId, AssetProfileUpdateMsg assetProfileUpdateMsg, EdgeVersion edgeVersion) {
+ UUID defaultEdgeRuleChainUUID = EdgeVersionUtils.isEdgeVersionOlderThan_3_6_2(edgeVersion)
+ ? safeGetUUID(assetProfileUpdateMsg.getDefaultRuleChainIdMSB(), assetProfileUpdateMsg.getDefaultRuleChainIdLSB())
+ : ruleChainId != null ? ruleChainId.getId() : null;
assetProfile.setDefaultEdgeRuleChainId(defaultEdgeRuleChainUUID != null ? new RuleChainId(defaultEdgeRuleChainUUID) : null);
}
@Override
- protected void setDefaultDashboardId(TenantId tenantId, AssetProfile assetProfile, AssetProfileUpdateMsg assetProfileUpdateMsg) {
- UUID defaultDashboardUUID = safeGetUUID(assetProfileUpdateMsg.getDefaultDashboardIdMSB(), assetProfileUpdateMsg.getDefaultDashboardIdLSB());
+ protected void setDefaultDashboardId(TenantId tenantId, DashboardId dashboardId, AssetProfile assetProfile, AssetProfileUpdateMsg assetProfileUpdateMsg, EdgeVersion edgeVersion) {
+ UUID defaultDashboardUUID = EdgeVersionUtils.isEdgeVersionOlderThan_3_6_2(edgeVersion)
+ ? safeGetUUID(assetProfileUpdateMsg.getDefaultDashboardIdMSB(), assetProfileUpdateMsg.getDefaultDashboardIdLSB())
+ : assetProfile.getDefaultDashboardId() != null ? assetProfile.getDefaultDashboardId().getId() : (dashboardId != null ? dashboardId.getId() : null);
assetProfile.setDefaultDashboardId(defaultDashboardUUID != null ? new DashboardId(defaultDashboardUUID) : null);
}
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/BaseAssetProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/BaseAssetProcessor.java
index f8dcdbd8f6..6403631f50 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/BaseAssetProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/BaseAssetProcessor.java
@@ -26,43 +26,43 @@ import org.thingsboard.server.common.data.id.AssetProfileId;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.gen.edge.v1.AssetUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
+import org.thingsboard.server.service.edge.rpc.utils.EdgeVersionUtils;
import java.util.UUID;
@Slf4j
public abstract class BaseAssetProcessor extends BaseEdgeProcessor {
- protected Pair saveOrUpdateAsset(TenantId tenantId, AssetId assetId, AssetUpdateMsg assetUpdateMsg, CustomerId customerId) {
+ protected Pair saveOrUpdateAsset(TenantId tenantId, AssetId assetId, AssetUpdateMsg assetUpdateMsg, EdgeVersion edgeVersion) {
boolean created = false;
boolean assetNameUpdated = false;
assetCreationLock.lock();
try {
- Asset asset = assetService.findAssetById(tenantId, assetId);
- String assetName = assetUpdateMsg.getName();
+ Asset asset = EdgeVersionUtils.isEdgeVersionOlderThan_3_6_2(edgeVersion)
+ ? createAsset(tenantId, assetId, assetUpdateMsg)
+ : JacksonUtil.fromStringIgnoreUnknownProperties(assetUpdateMsg.getEntity(), Asset.class);
if (asset == null) {
+ throw new RuntimeException("[{" + tenantId + "}] assetUpdateMsg {" + assetUpdateMsg + " } cannot be converted to asset");
+ }
+ Asset assetById = assetService.findAssetById(tenantId, assetId);
+ if (assetById == null) {
created = true;
- asset = new Asset();
- asset.setTenantId(tenantId);
- asset.setCreatedTime(Uuids.unixTimestamp(assetId.getId()));
+ asset.setId(null);
+ } else {
+ asset.setId(assetId);
}
+ String assetName = asset.getName();
Asset assetByName = assetService.findAssetByTenantIdAndName(tenantId, assetName);
if (assetByName != null && !assetByName.getId().equals(assetId)) {
assetName = assetName + "_" + StringUtils.randomAlphanumeric(15);
log.warn("[{}] Asset with name {} already exists. Renaming asset name to {}",
- tenantId, assetUpdateMsg.getName(), assetName);
+ tenantId, asset.getName(), assetName);
assetNameUpdated = true;
}
asset.setName(assetName);
- asset.setType(assetUpdateMsg.getType());
- asset.setLabel(assetUpdateMsg.hasLabel() ? assetUpdateMsg.getLabel() : null);
- asset.setAdditionalInfo(assetUpdateMsg.hasAdditionalInfo()
- ? JacksonUtil.toJsonNode(assetUpdateMsg.getAdditionalInfo()) : null);
-
- UUID assetProfileUUID = safeGetUUID(assetUpdateMsg.getAssetProfileIdMSB(), assetUpdateMsg.getAssetProfileIdLSB());
- asset.setAssetProfileId(assetProfileUUID != null ? new AssetProfileId(assetProfileUUID) : null);
-
- asset.setCustomerId(customerId);
+ setCustomerId(tenantId, created ? null : assetById.getCustomerId(), asset, assetUpdateMsg, edgeVersion);
assetValidator.validate(asset, Asset::getTenantId);
if (created) {
@@ -77,4 +77,24 @@ public abstract class BaseAssetProcessor extends BaseEdgeProcessor {
}
return Pair.of(created, assetNameUpdated);
}
+
+ private Asset createAsset(TenantId tenantId, AssetId assetId, AssetUpdateMsg assetUpdateMsg) {
+ Asset asset = new Asset();
+ asset.setTenantId(tenantId);
+ asset.setName(assetUpdateMsg.getName());
+ asset.setCreatedTime(Uuids.unixTimestamp(assetId.getId()));
+ asset.setType(assetUpdateMsg.getType());
+ asset.setLabel(assetUpdateMsg.hasLabel() ? assetUpdateMsg.getLabel() : null);
+ asset.setAdditionalInfo(assetUpdateMsg.hasAdditionalInfo()
+ ? JacksonUtil.toJsonNode(assetUpdateMsg.getAdditionalInfo()) : null);
+
+ UUID assetProfileUUID = safeGetUUID(assetUpdateMsg.getAssetProfileIdMSB(), assetUpdateMsg.getAssetProfileIdLSB());
+ asset.setAssetProfileId(assetProfileUUID != null ? new AssetProfileId(assetProfileUUID) : null);
+
+ CustomerId customerId = safeGetCustomerId(assetUpdateMsg.getCustomerIdMSB(), assetUpdateMsg.getCustomerIdLSB());
+ asset.setCustomerId(customerId);
+ return asset;
+ }
+
+ protected abstract void setCustomerId(TenantId tenantId, CustomerId customerId, Asset asset, AssetUpdateMsg assetUpdateMsg, EdgeVersion edgeVersion);
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/BaseAssetProfileProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/BaseAssetProfileProcessor.java
index 67c8f8de44..68d52e74b6 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/BaseAssetProfileProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/BaseAssetProfileProcessor.java
@@ -18,54 +18,66 @@ package org.thingsboard.server.service.edge.rpc.processor.asset;
import com.datastax.oss.driver.api.core.uuid.Uuids;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.util.Pair;
+import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.asset.AssetProfile;
import org.thingsboard.server.common.data.id.AssetProfileId;
+import org.thingsboard.server.common.data.id.DashboardId;
+import org.thingsboard.server.common.data.id.RuleChainId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.gen.edge.v1.AssetProfileUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
+import org.thingsboard.server.service.edge.rpc.utils.EdgeVersionUtils;
import java.nio.charset.StandardCharsets;
@Slf4j
public abstract class BaseAssetProfileProcessor extends BaseEdgeProcessor {
- protected Pair saveOrUpdateAssetProfile(TenantId tenantId, AssetProfileId assetProfileId, AssetProfileUpdateMsg assetProfileUpdateMsg) {
+ protected Pair saveOrUpdateAssetProfile(TenantId tenantId, AssetProfileId assetProfileId, AssetProfileUpdateMsg assetProfileUpdateMsg, EdgeVersion edgeVersion) {
boolean created = false;
boolean assetProfileNameUpdated = false;
assetCreationLock.lock();
try {
- AssetProfile assetProfile = assetProfileService.findAssetProfileById(tenantId, assetProfileId);
- String assetProfileName = assetProfileUpdateMsg.getName();
+ AssetProfile assetProfile = EdgeVersionUtils.isEdgeVersionOlderThan_3_6_2(edgeVersion)
+ ? createAssetProfile(tenantId, assetProfileId, assetProfileUpdateMsg)
+ : JacksonUtil.fromStringIgnoreUnknownProperties(assetProfileUpdateMsg.getEntity(), AssetProfile.class);
if (assetProfile == null) {
+ throw new RuntimeException("[{" + tenantId + "}] assetProfileUpdateMsg {" + assetProfileUpdateMsg + "} cannot be converted to asset profile");
+ }
+ boolean isDefault = assetProfile.isDefault();
+ AssetProfile assetProfileById = assetProfileService.findAssetProfileById(tenantId, assetProfileId);
+ if (assetProfileById == null) {
created = true;
- assetProfile = new AssetProfile();
- assetProfile.setTenantId(tenantId);
- assetProfile.setCreatedTime(Uuids.unixTimestamp(assetProfileId.getId()));
+ assetProfile.setId(null);
+ } else {
+ assetProfile.setId(assetProfileId);
}
+ assetProfile.setDefault(false);
+ String assetProfileName = assetProfile.getName();
AssetProfile assetProfileByName = assetProfileService.findAssetProfileByName(tenantId, assetProfileName);
if (assetProfileByName != null && !assetProfileByName.getId().equals(assetProfileId)) {
assetProfileName = assetProfileName + "_" + StringUtils.randomAlphabetic(15);
log.warn("[{}] Asset profile with name {} already exists. Renaming asset profile name to {}",
- tenantId, assetProfileUpdateMsg.getName(), assetProfileName);
+ tenantId, assetProfile.getName(), assetProfileName);
assetProfileNameUpdated = true;
}
assetProfile.setName(assetProfileName);
- assetProfile.setDefault(assetProfileUpdateMsg.getDefault());
- assetProfile.setDefaultQueueName(assetProfileUpdateMsg.hasDefaultQueueName() ? assetProfileUpdateMsg.getDefaultQueueName() : null);
- assetProfile.setDescription(assetProfileUpdateMsg.hasDescription() ? assetProfileUpdateMsg.getDescription() : null);
- assetProfile.setImage(assetProfileUpdateMsg.hasImage()
- ? new String(assetProfileUpdateMsg.getImage().toByteArray(), StandardCharsets.UTF_8) : null);
- setDefaultRuleChainId(tenantId, assetProfile, assetProfileUpdateMsg);
- setDefaultEdgeRuleChainId(tenantId, assetProfile, assetProfileUpdateMsg);
- setDefaultDashboardId(tenantId, assetProfile, assetProfileUpdateMsg);
+ RuleChainId ruleChainId = assetProfile.getDefaultRuleChainId();
+ setDefaultRuleChainId(tenantId, assetProfile, created ? null : assetProfileById.getDefaultRuleChainId());
+ setDefaultEdgeRuleChainId(assetProfile, ruleChainId, assetProfileUpdateMsg, edgeVersion);
+ setDefaultDashboardId(tenantId, created ? null : assetProfileById.getDefaultDashboardId(), assetProfile, assetProfileUpdateMsg, edgeVersion);
assetProfileValidator.validate(assetProfile, AssetProfile::getTenantId);
if (created) {
assetProfile.setId(assetProfileId);
}
assetProfileService.saveAssetProfile(assetProfile, false);
+ if (isDefault) {
+ assetProfileService.setDefaultAssetProfile(tenantId, assetProfileId);
+ }
} catch (Exception e) {
log.error("[{}] Failed to process asset profile update msg [{}]", tenantId, assetProfileUpdateMsg, e);
throw e;
@@ -75,9 +87,22 @@ public abstract class BaseAssetProfileProcessor extends BaseEdgeProcessor {
return Pair.of(created, assetProfileNameUpdated);
}
- protected abstract void setDefaultRuleChainId(TenantId tenantId, AssetProfile assetProfile, AssetProfileUpdateMsg assetProfileUpdateMsg);
+ private AssetProfile createAssetProfile(TenantId tenantId, AssetProfileId assetProfileId, AssetProfileUpdateMsg assetProfileUpdateMsg) {
+ AssetProfile assetProfile = new AssetProfile();
+ assetProfile.setTenantId(tenantId);
+ assetProfile.setName(assetProfileUpdateMsg.getName());
+ assetProfile.setCreatedTime(Uuids.unixTimestamp(assetProfileId.getId()));
+ assetProfile.setDefault(assetProfileUpdateMsg.getDefault());
+ assetProfile.setDefaultQueueName(assetProfileUpdateMsg.hasDefaultQueueName() ? assetProfileUpdateMsg.getDefaultQueueName() : null);
+ assetProfile.setDescription(assetProfileUpdateMsg.hasDescription() ? assetProfileUpdateMsg.getDescription() : null);
+ assetProfile.setImage(assetProfileUpdateMsg.hasImage()
+ ? new String(assetProfileUpdateMsg.getImage().toByteArray(), StandardCharsets.UTF_8) : null);
+ return assetProfile;
+ }
+
+ protected abstract void setDefaultRuleChainId(TenantId tenantId, AssetProfile assetProfile, RuleChainId ruleChainId);
- protected abstract void setDefaultEdgeRuleChainId(TenantId tenantId, AssetProfile assetProfile, AssetProfileUpdateMsg assetProfileUpdateMsg);
+ protected abstract void setDefaultEdgeRuleChainId(AssetProfile assetProfile, RuleChainId ruleChainId, AssetProfileUpdateMsg assetProfileUpdateMsg, EdgeVersion edgeVersion);
- protected abstract void setDefaultDashboardId(TenantId tenantId, AssetProfile assetProfile, AssetProfileUpdateMsg assetProfileUpdateMsg);
+ protected abstract void setDefaultDashboardId(TenantId tenantId, DashboardId dashboardId, AssetProfile assetProfile, AssetProfileUpdateMsg assetProfileUpdateMsg, EdgeVersion edgeVersion);
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/customer/CustomerEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/customer/CustomerEdgeProcessor.java
index f553d6d5a0..9b9d99fcc3 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/customer/CustomerEdgeProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/customer/CustomerEdgeProcessor.java
@@ -33,9 +33,11 @@ import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.gen.edge.v1.CustomerUpdateMsg;
import org.thingsboard.server.gen.edge.v1.DownlinkMsg;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.gen.transport.TransportProtos;
import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.customer.CustomerMsgConstructor;
import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
import java.util.ArrayList;
@@ -47,7 +49,7 @@ import java.util.UUID;
@TbCoreComponent
public class CustomerEdgeProcessor extends BaseEdgeProcessor {
- public DownlinkMsg convertCustomerEventToDownlink(EdgeEvent edgeEvent) {
+ public DownlinkMsg convertCustomerEventToDownlink(EdgeEvent edgeEvent, EdgeVersion edgeVersion) {
CustomerId customerId = new CustomerId(edgeEvent.getEntityId());
DownlinkMsg downlinkMsg = null;
switch (edgeEvent.getAction()) {
@@ -56,8 +58,8 @@ public class CustomerEdgeProcessor extends BaseEdgeProcessor {
Customer customer = customerService.findCustomerById(edgeEvent.getTenantId(), customerId);
if (customer != null) {
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
- CustomerUpdateMsg customerUpdateMsg =
- customerMsgConstructor.constructCustomerUpdatedMsg(msgType, customer);
+ CustomerUpdateMsg customerUpdateMsg = ((CustomerMsgConstructor)
+ customerMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructCustomerUpdatedMsg(msgType, customer);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addCustomerUpdateMsg(customerUpdateMsg)
@@ -65,8 +67,8 @@ public class CustomerEdgeProcessor extends BaseEdgeProcessor {
}
break;
case DELETED:
- CustomerUpdateMsg customerUpdateMsg =
- customerMsgConstructor.constructCustomerDeleteMsg(customerId);
+ CustomerUpdateMsg customerUpdateMsg = ((CustomerMsgConstructor)
+ customerMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructCustomerDeleteMsg(customerId);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addCustomerUpdateMsg(customerUpdateMsg)
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/dashboard/BaseDashboardProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/dashboard/BaseDashboardProcessor.java
index 687e14a07d..0ae26d5160 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/dashboard/BaseDashboardProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/dashboard/BaseDashboardProcessor.java
@@ -25,60 +25,88 @@ import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DashboardId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.gen.edge.v1.DashboardUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
+import org.thingsboard.server.service.edge.rpc.utils.EdgeVersionUtils;
import java.util.Set;
@Slf4j
public abstract class BaseDashboardProcessor extends BaseEdgeProcessor {
- protected boolean saveOrUpdateDashboard(TenantId tenantId, DashboardId dashboardId, DashboardUpdateMsg dashboardUpdateMsg, CustomerId customerId) {
+ protected boolean saveOrUpdateDashboard(TenantId tenantId, DashboardId dashboardId, DashboardUpdateMsg dashboardUpdateMsg, CustomerId customerId, EdgeVersion edgeVersion) {
boolean created = false;
- Dashboard dashboard = dashboardService.findDashboardById(tenantId, dashboardId);
+ Dashboard dashboard = EdgeVersionUtils.isEdgeVersionOlderThan_3_6_2(edgeVersion)
+ ? createDashboard(tenantId, dashboardId, dashboardUpdateMsg)
+ : JacksonUtil.fromStringIgnoreUnknownProperties(dashboardUpdateMsg.getEntity(), Dashboard.class);
if (dashboard == null) {
- created = true;
- dashboard = new Dashboard();
- dashboard.setTenantId(tenantId);
- dashboard.setCreatedTime(Uuids.unixTimestamp(dashboardId.getId()));
+ throw new RuntimeException("[{" + tenantId + "}] dashboardUpdateMsg {" + dashboardUpdateMsg + "} cannot be converted to dashboard");
}
- dashboard.setTitle(dashboardUpdateMsg.getTitle());
- dashboard.setImage(dashboardUpdateMsg.hasImage() ? dashboardUpdateMsg.getImage() : null);
- dashboard.setConfiguration(JacksonUtil.toJsonNode(dashboardUpdateMsg.getConfiguration()));
-
Set assignedCustomers = null;
- if (dashboardUpdateMsg.hasAssignedCustomers()) {
- assignedCustomers = JacksonUtil.fromString(dashboardUpdateMsg.getAssignedCustomers(), new TypeReference<>() {});
- assignedCustomers = filterNonExistingCustomers(tenantId, assignedCustomers);
- dashboard.setAssignedCustomers(assignedCustomers);
+ Dashboard dashboardById = dashboardService.findDashboardById(tenantId, dashboardId);
+ if (dashboardById == null) {
+ created = true;
+ dashboard.setId(null);
+ } else {
+ dashboard.setId(dashboardId);
+ assignedCustomers = filterNonExistingCustomers(tenantId, dashboardById.getAssignedCustomers());
}
- dashboard.setMobileOrder(dashboardUpdateMsg.hasMobileOrder() ? dashboardUpdateMsg.getMobileOrder() : null);
- dashboard.setMobileHide(dashboardUpdateMsg.getMobileHide());
-
dashboardValidator.validate(dashboard, Dashboard::getTenantId);
if (created) {
dashboard.setId(dashboardId);
}
+ Set msgAssignedCustomers = filterNonExistingCustomers(tenantId, dashboard.getAssignedCustomers());
+ if (msgAssignedCustomers != null) {
+ if (assignedCustomers == null) {
+ assignedCustomers = msgAssignedCustomers;
+ } else {
+ assignedCustomers.addAll(msgAssignedCustomers);
+ }
+ }
+ dashboard.setAssignedCustomers(assignedCustomers);
Dashboard savedDashboard = dashboardService.saveDashboard(dashboard, false);
- if (assignedCustomers != null && !assignedCustomers.isEmpty()) {
- for (ShortCustomerInfo assignedCustomer : assignedCustomers) {
+ if (msgAssignedCustomers != null && !msgAssignedCustomers.isEmpty()) {
+ for (ShortCustomerInfo assignedCustomer : msgAssignedCustomers) {
if (assignedCustomer.getCustomerId().equals(customerId)) {
- dashboardService.assignDashboardToCustomer(tenantId, dashboardId, assignedCustomer.getCustomerId());
+ dashboardService.assignDashboardToCustomer(tenantId, savedDashboard.getId(), assignedCustomer.getCustomerId());
}
}
} else {
- unassignCustomersFromDashboard(tenantId, savedDashboard);
+ unassignCustomersFromDashboard(tenantId, savedDashboard, customerId);
}
return created;
}
- protected abstract Set filterNonExistingCustomers(TenantId tenantId, Set assignedCustomers);
+ private Dashboard createDashboard(TenantId tenantId, DashboardId dashboardId, DashboardUpdateMsg dashboardUpdateMsg) {
+ Dashboard dashboard = new Dashboard();
+ dashboard.setTenantId(tenantId);
+ dashboard.setCreatedTime(Uuids.unixTimestamp(dashboardId.getId()));
+ dashboard.setTitle(dashboardUpdateMsg.getTitle());
+ dashboard.setImage(dashboardUpdateMsg.hasImage() ? dashboardUpdateMsg.getImage() : null);
+ dashboard.setConfiguration(JacksonUtil.toJsonNode(dashboardUpdateMsg.getConfiguration()));
+
+ Set assignedCustomers;
+ if (dashboardUpdateMsg.hasAssignedCustomers()) {
+ assignedCustomers = JacksonUtil.fromString(dashboardUpdateMsg.getAssignedCustomers(), new TypeReference<>() {});
+ assignedCustomers = filterNonExistingCustomers(tenantId, assignedCustomers);
+ dashboard.setAssignedCustomers(assignedCustomers);
+ }
- private void unassignCustomersFromDashboard(TenantId tenantId, Dashboard dashboard) {
+ dashboard.setMobileOrder(dashboardUpdateMsg.hasMobileOrder() ? dashboardUpdateMsg.getMobileOrder() : null);
+ dashboard.setMobileHide(dashboardUpdateMsg.getMobileHide());
+ return dashboard;
+ }
+
+ private void unassignCustomersFromDashboard(TenantId tenantId, Dashboard dashboard, CustomerId customerId) {
if (dashboard.getAssignedCustomers() != null && !dashboard.getAssignedCustomers().isEmpty()) {
for (ShortCustomerInfo assignedCustomer : dashboard.getAssignedCustomers()) {
- dashboardService.unassignDashboardFromCustomer(tenantId, dashboard.getId(), assignedCustomer.getCustomerId());
+ if (assignedCustomer.getCustomerId().equals(customerId)) {
+ dashboardService.unassignDashboardFromCustomer(tenantId, dashboard.getId(), assignedCustomer.getCustomerId());
+ }
}
}
}
+
+ protected abstract Set filterNonExistingCustomers(TenantId tenantId, Set assignedCustomers);
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/dashboard/DashboardEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/dashboard/DashboardEdgeProcessor.java
index 291491a2fe..3104e1ac35 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/dashboard/DashboardEdgeProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/dashboard/DashboardEdgeProcessor.java
@@ -25,7 +25,6 @@ import org.thingsboard.server.common.data.EdgeUtils;
import org.thingsboard.server.common.data.ShortCustomerInfo;
import org.thingsboard.server.common.data.edge.Edge;
import org.thingsboard.server.common.data.edge.EdgeEvent;
-import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DashboardId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.msg.TbMsgType;
@@ -33,8 +32,10 @@ import org.thingsboard.server.common.msg.TbMsgMetaData;
import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.gen.edge.v1.DashboardUpdateMsg;
import org.thingsboard.server.gen.edge.v1.DownlinkMsg;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.dashboard.DashboardMsgConstructor;
import java.util.Set;
import java.util.UUID;
@@ -44,7 +45,7 @@ import java.util.UUID;
@TbCoreComponent
public class DashboardEdgeProcessor extends BaseDashboardProcessor {
- public ListenableFuture processDashboardMsgFromEdge(TenantId tenantId, Edge edge, DashboardUpdateMsg dashboardUpdateMsg) {
+ public ListenableFuture processDashboardMsgFromEdge(TenantId tenantId, Edge edge, DashboardUpdateMsg dashboardUpdateMsg, EdgeVersion edgeVersion) {
log.trace("[{}] executing processDashboardMsgFromEdge [{}] from edge [{}]", tenantId, dashboardUpdateMsg, edge.getId());
DashboardId dashboardId = new DashboardId(new UUID(dashboardUpdateMsg.getIdMSB(), dashboardUpdateMsg.getIdLSB()));
try {
@@ -53,7 +54,7 @@ public class DashboardEdgeProcessor extends BaseDashboardProcessor {
switch (dashboardUpdateMsg.getMsgType()) {
case ENTITY_CREATED_RPC_MESSAGE:
case ENTITY_UPDATED_RPC_MESSAGE:
- saveOrUpdateDashboard(tenantId, dashboardId, dashboardUpdateMsg, edge);
+ saveOrUpdateDashboard(tenantId, dashboardId, dashboardUpdateMsg, edge, edgeVersion);
return Futures.immediateFuture(null);
case ENTITY_DELETED_RPC_MESSAGE:
Dashboard dashboardToDelete = dashboardService.findDashboardById(tenantId, dashboardId);
@@ -77,9 +78,9 @@ public class DashboardEdgeProcessor extends BaseDashboardProcessor {
}
}
- private void saveOrUpdateDashboard(TenantId tenantId, DashboardId dashboardId, DashboardUpdateMsg dashboardUpdateMsg, Edge edge) {
- CustomerId customerId = safeGetCustomerId(dashboardUpdateMsg.getCustomerIdMSB(), dashboardUpdateMsg.getCustomerIdLSB());
- boolean created = super.saveOrUpdateDashboard(tenantId, dashboardId, dashboardUpdateMsg, customerId);
+ private void saveOrUpdateDashboard(TenantId tenantId, DashboardId dashboardId, DashboardUpdateMsg dashboardUpdateMsg, Edge edge, EdgeVersion edgeVersion) {
+ boolean created = super.saveOrUpdateDashboard(tenantId, dashboardId, dashboardUpdateMsg,
+ edge.getCustomerId(), edgeVersion);
if (created) {
createRelationFromEdge(tenantId, edge.getId(), dashboardId);
pushDashboardCreatedEventToRuleEngine(tenantId, edge, dashboardId);
@@ -98,7 +99,7 @@ public class DashboardEdgeProcessor extends BaseDashboardProcessor {
}
}
- public DownlinkMsg convertDashboardEventToDownlink(EdgeEvent edgeEvent) {
+ public DownlinkMsg convertDashboardEventToDownlink(EdgeEvent edgeEvent, EdgeVersion edgeVersion) {
DashboardId dashboardId = new DashboardId(edgeEvent.getEntityId());
DownlinkMsg downlinkMsg = null;
switch (edgeEvent.getAction()) {
@@ -110,8 +111,8 @@ public class DashboardEdgeProcessor extends BaseDashboardProcessor {
Dashboard dashboard = dashboardService.findDashboardById(edgeEvent.getTenantId(), dashboardId);
if (dashboard != null) {
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
- DashboardUpdateMsg dashboardUpdateMsg =
- dashboardMsgConstructor.constructDashboardUpdatedMsg(msgType, dashboard);
+ DashboardUpdateMsg dashboardUpdateMsg = ((DashboardMsgConstructor)
+ dashboardMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructDashboardUpdatedMsg(msgType, dashboard);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addDashboardUpdateMsg(dashboardUpdateMsg)
@@ -120,8 +121,8 @@ public class DashboardEdgeProcessor extends BaseDashboardProcessor {
break;
case DELETED:
case UNASSIGNED_FROM_EDGE:
- DashboardUpdateMsg dashboardUpdateMsg =
- dashboardMsgConstructor.constructDashboardDeleteMsg(dashboardId);
+ DashboardUpdateMsg dashboardUpdateMsg = ((DashboardMsgConstructor)
+ dashboardMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructDashboardDeleteMsg(dashboardId);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addDashboardUpdateMsg(dashboardUpdateMsg)
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/BaseDeviceProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/BaseDeviceProcessor.java
index 8958db0c44..e2ac06e84b 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/BaseDeviceProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/BaseDeviceProcessor.java
@@ -32,8 +32,10 @@ import org.thingsboard.server.common.data.security.DeviceCredentials;
import org.thingsboard.server.common.data.security.DeviceCredentialsType;
import org.thingsboard.server.gen.edge.v1.DeviceCredentialsUpdateMsg;
import org.thingsboard.server.gen.edge.v1.DeviceUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.queue.util.DataDecodingEncodingService;
import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
+import org.thingsboard.server.service.edge.rpc.utils.EdgeVersionUtils;
import java.util.Optional;
import java.util.UUID;
@@ -44,46 +46,35 @@ public abstract class BaseDeviceProcessor extends BaseEdgeProcessor {
@Autowired
protected DataDecodingEncodingService dataDecodingEncodingService;
- protected Pair saveOrUpdateDevice(TenantId tenantId, DeviceId deviceId, DeviceUpdateMsg deviceUpdateMsg, CustomerId customerId) {
+ protected Pair saveOrUpdateDevice(TenantId tenantId, DeviceId deviceId, DeviceUpdateMsg deviceUpdateMsg, EdgeVersion edgeVersion) {
boolean created = false;
boolean deviceNameUpdated = false;
deviceCreationLock.lock();
try {
- Device device = deviceService.findDeviceById(tenantId, deviceId);
- String deviceName = deviceUpdateMsg.getName();
+ Device device = EdgeVersionUtils.isEdgeVersionOlderThan_3_6_2(edgeVersion)
+ ? createDevice(tenantId, deviceId, deviceUpdateMsg)
+ : JacksonUtil.fromStringIgnoreUnknownProperties(deviceUpdateMsg.getEntity(), Device.class);
if (device == null) {
+ throw new RuntimeException("[{" + tenantId + "}] deviceUpdateMsg {" + deviceUpdateMsg + "} cannot be converted to device");
+ }
+ Device deviceById = deviceService.findDeviceById(tenantId, deviceId);
+ if (deviceById == null) {
created = true;
- device = new Device();
- device.setTenantId(tenantId);
- device.setCreatedTime(Uuids.unixTimestamp(deviceId.getId()));
+ device.setId(null);
+ } else {
+ device.setId(deviceId);
}
+ String deviceName = device.getName();
Device deviceByName = deviceService.findDeviceByTenantIdAndName(tenantId, deviceName);
if (deviceByName != null && !deviceByName.getId().equals(deviceId)) {
deviceName = deviceName + "_" + StringUtils.randomAlphabetic(15);
log.warn("[{}] Device with name {} already exists. Renaming device name to {}",
- tenantId, deviceUpdateMsg.getName(), deviceName);
+ tenantId, device.getName(), deviceName);
deviceNameUpdated = true;
}
device.setName(deviceName);
- device.setType(deviceUpdateMsg.getType());
- device.setLabel(deviceUpdateMsg.hasLabel() ? deviceUpdateMsg.getLabel() : null);
- device.setAdditionalInfo(deviceUpdateMsg.hasAdditionalInfo()
- ? JacksonUtil.toJsonNode(deviceUpdateMsg.getAdditionalInfo()) : null);
-
- UUID deviceProfileUUID = safeGetUUID(deviceUpdateMsg.getDeviceProfileIdMSB(), deviceUpdateMsg.getDeviceProfileIdLSB());
- device.setDeviceProfileId(deviceProfileUUID != null ? new DeviceProfileId(deviceProfileUUID) : null);
-
- device.setCustomerId(customerId);
+ setCustomerId(tenantId, created ? null : deviceById.getCustomerId(), device, deviceUpdateMsg, edgeVersion);
- Optional deviceDataOpt =
- dataDecodingEncodingService.decode(deviceUpdateMsg.getDeviceDataBytes().toByteArray());
- device.setDeviceData(deviceDataOpt.orElse(null));
-
- UUID firmwareUUID = safeGetUUID(deviceUpdateMsg.getFirmwareIdMSB(), deviceUpdateMsg.getFirmwareIdLSB());
- device.setFirmwareId(firmwareUUID != null ? new OtaPackageId(firmwareUUID) : null);
-
- UUID softwareUUID = safeGetUUID(deviceUpdateMsg.getSoftwareIdMSB(), deviceUpdateMsg.getSoftwareIdLSB());
- device.setSoftwareId(softwareUUID != null ? new OtaPackageId(softwareUUID) : null);
deviceValidator.validate(device, Device::getTenantId);
if (created) {
device.setId(deviceId);
@@ -100,25 +91,53 @@ public abstract class BaseDeviceProcessor extends BaseEdgeProcessor {
} catch (Exception e) {
log.error("[{}] Failed to process device update msg [{}]", tenantId, deviceUpdateMsg, e);
throw e;
- } finally {
+ } finally {
deviceCreationLock.unlock();
}
return Pair.of(created, deviceNameUpdated);
}
- protected void updateDeviceCredentials(TenantId tenantId, DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg) {
- DeviceId deviceId = new DeviceId(new UUID(deviceCredentialsUpdateMsg.getDeviceIdMSB(), deviceCredentialsUpdateMsg.getDeviceIdLSB()));
- Device device = deviceService.findDeviceById(tenantId, deviceId);
+ private Device createDevice(TenantId tenantId, DeviceId deviceId, DeviceUpdateMsg deviceUpdateMsg) {
+ Device device = new Device();
+ device.setTenantId(tenantId);
+ device.setCreatedTime(Uuids.unixTimestamp(deviceId.getId()));
+ device.setName(deviceUpdateMsg.getName());
+ device.setType(deviceUpdateMsg.getType());
+ device.setLabel(deviceUpdateMsg.hasLabel() ? deviceUpdateMsg.getLabel() : null);
+ device.setAdditionalInfo(deviceUpdateMsg.hasAdditionalInfo()
+ ? JacksonUtil.toJsonNode(deviceUpdateMsg.getAdditionalInfo()) : null);
+
+ UUID deviceProfileUUID = safeGetUUID(deviceUpdateMsg.getDeviceProfileIdMSB(), deviceUpdateMsg.getDeviceProfileIdLSB());
+ device.setDeviceProfileId(deviceProfileUUID != null ? new DeviceProfileId(deviceProfileUUID) : null);
+
+ Optional deviceDataOpt = dataDecodingEncodingService.decode(deviceUpdateMsg.getDeviceDataBytes().toByteArray());
+ device.setDeviceData(deviceDataOpt.orElse(null));
+
+ UUID firmwareUUID = safeGetUUID(deviceUpdateMsg.getFirmwareIdMSB(), deviceUpdateMsg.getFirmwareIdLSB());
+ device.setFirmwareId(firmwareUUID != null ? new OtaPackageId(firmwareUUID) : null);
+ UUID softwareUUID = safeGetUUID(deviceUpdateMsg.getSoftwareIdMSB(), deviceUpdateMsg.getSoftwareIdLSB());
+ device.setSoftwareId(softwareUUID != null ? new OtaPackageId(softwareUUID) : null);
+
+ return device;
+ }
+
+ protected void updateDeviceCredentials(TenantId tenantId, DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg, EdgeVersion edgeVersion) {
+ DeviceCredentials deviceCredentials = EdgeVersionUtils.isEdgeVersionOlderThan_3_6_2(edgeVersion)
+ ? createDeviceCredentials(deviceCredentialsUpdateMsg)
+ : JacksonUtil.fromStringIgnoreUnknownProperties(deviceCredentialsUpdateMsg.getEntity(), DeviceCredentials.class);
+ if (deviceCredentials == null) {
+ throw new RuntimeException("[{" + tenantId + "}] deviceCredentialsUpdateMsg {" + deviceCredentialsUpdateMsg + "} cannot be converted to device credentials");
+ }
+ Device device = deviceService.findDeviceById(tenantId, deviceCredentials.getDeviceId());
if (device != null) {
log.debug("[{}] Updating device credentials for device [{}]. New device credentials Id [{}], value [{}]",
- tenantId, device.getName(), deviceCredentialsUpdateMsg.getCredentialsId(), deviceCredentialsUpdateMsg.getCredentialsValue());
+ tenantId, device.getName(), deviceCredentials.getCredentialsId(), deviceCredentials.getCredentialsValue());
try {
- DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(tenantId, device.getId());
- deviceCredentials.setCredentialsType(DeviceCredentialsType.valueOf(deviceCredentialsUpdateMsg.getCredentialsType()));
- deviceCredentials.setCredentialsId(deviceCredentialsUpdateMsg.getCredentialsId());
- deviceCredentials.setCredentialsValue(deviceCredentialsUpdateMsg.hasCredentialsValue()
- ? deviceCredentialsUpdateMsg.getCredentialsValue() : null);
- deviceCredentialsService.updateDeviceCredentials(tenantId, deviceCredentials);
+ DeviceCredentials deviceCredentialsByDeviceId = deviceCredentialsService.findDeviceCredentialsByDeviceId(tenantId, device.getId());
+ deviceCredentialsByDeviceId.setCredentialsType(deviceCredentials.getCredentialsType());
+ deviceCredentialsByDeviceId.setCredentialsId(deviceCredentials.getCredentialsId());
+ deviceCredentialsByDeviceId.setCredentialsValue(deviceCredentials.getCredentialsValue());
+ deviceCredentialsService.updateDeviceCredentials(tenantId, deviceCredentialsByDeviceId);
} catch (Exception e) {
log.error("[{}] Can't update device credentials for device [{}], deviceCredentialsUpdateMsg [{}]",
@@ -126,7 +145,19 @@ public abstract class BaseDeviceProcessor extends BaseEdgeProcessor {
throw new RuntimeException(e);
}
} else {
- log.warn("[{}] Can't find device by id [{}], deviceCredentialsUpdateMsg [{}]", tenantId, deviceId, deviceCredentialsUpdateMsg);
+ log.warn("[{}] Can't find device by id [{}], deviceCredentialsUpdateMsg [{}]", tenantId, deviceCredentials.getDeviceId(), deviceCredentialsUpdateMsg);
}
}
+
+ private DeviceCredentials createDeviceCredentials(DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg) {
+ DeviceCredentials deviceCredentials = new DeviceCredentials();
+ deviceCredentials.setDeviceId(new DeviceId(new UUID(deviceCredentialsUpdateMsg.getDeviceIdMSB(), deviceCredentialsUpdateMsg.getDeviceIdLSB())));
+ deviceCredentials.setCredentialsType(DeviceCredentialsType.valueOf(deviceCredentialsUpdateMsg.getCredentialsType()));
+ deviceCredentials.setCredentialsId(deviceCredentialsUpdateMsg.getCredentialsId());
+ deviceCredentials.setCredentialsValue(deviceCredentialsUpdateMsg.hasCredentialsValue()
+ ? deviceCredentialsUpdateMsg.getCredentialsValue() : null);
+ return deviceCredentials;
+ }
+
+ protected abstract void setCustomerId(TenantId tenantId, CustomerId customerId, Device device, DeviceUpdateMsg deviceUpdateMsg, EdgeVersion edgeVersion);
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/BaseDeviceProfileProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/BaseDeviceProfileProcessor.java
index bd35a42e59..55153a7a79 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/BaseDeviceProfileProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/BaseDeviceProfileProcessor.java
@@ -19,18 +19,23 @@ import com.datastax.oss.driver.api.core.uuid.Uuids;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.util.Pair;
+import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.DeviceProfile;
import org.thingsboard.server.common.data.DeviceProfileProvisionType;
import org.thingsboard.server.common.data.DeviceProfileType;
import org.thingsboard.server.common.data.DeviceTransportType;
import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.device.profile.DeviceProfileData;
+import org.thingsboard.server.common.data.id.DashboardId;
import org.thingsboard.server.common.data.id.DeviceProfileId;
import org.thingsboard.server.common.data.id.OtaPackageId;
+import org.thingsboard.server.common.data.id.RuleChainId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.gen.edge.v1.DeviceProfileUpdateMsg;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.queue.util.DataDecodingEncodingService;
import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
+import org.thingsboard.server.service.edge.rpc.utils.EdgeVersionUtils;
import java.nio.charset.StandardCharsets;
import java.util.Optional;
@@ -42,74 +47,95 @@ public abstract class BaseDeviceProfileProcessor extends BaseEdgeProcessor {
@Autowired
private DataDecodingEncodingService dataDecodingEncodingService;
- protected Pair saveOrUpdateDeviceProfile(TenantId tenantId, DeviceProfileId deviceProfileId, DeviceProfileUpdateMsg deviceProfileUpdateMsg) {
+ protected Pair saveOrUpdateDeviceProfile(TenantId tenantId, DeviceProfileId deviceProfileId, DeviceProfileUpdateMsg deviceProfileUpdateMsg, EdgeVersion edgeVersion) {
boolean created = false;
boolean deviceProfileNameUpdated = false;
deviceCreationLock.lock();
try {
- DeviceProfile deviceProfile = deviceProfileService.findDeviceProfileById(tenantId, deviceProfileId);
- String deviceProfileName = deviceProfileUpdateMsg.getName();
+ DeviceProfile deviceProfile = EdgeVersionUtils.isEdgeVersionOlderThan_3_6_2(edgeVersion)
+ ? createDeviceProfile(tenantId, deviceProfileId, deviceProfileUpdateMsg)
+ : JacksonUtil.fromStringIgnoreUnknownProperties(deviceProfileUpdateMsg.getEntity(), DeviceProfile.class);
if (deviceProfile == null) {
+ throw new RuntimeException("[{" + tenantId + "}] deviceProfileUpdateMsg {" + deviceProfileUpdateMsg + "} cannot be converted to device profile");
+ }
+ boolean isDefault = deviceProfile.isDefault();
+ DeviceProfile deviceProfileById = deviceProfileService.findDeviceProfileById(tenantId, deviceProfileId);
+ if (deviceProfileById == null) {
created = true;
- deviceProfile = new DeviceProfile();
- deviceProfile.setTenantId(tenantId);
- deviceProfile.setCreatedTime(Uuids.unixTimestamp(deviceProfileId.getId()));
+ deviceProfile.setId(null);
+ } else {
+ deviceProfile.setId(deviceProfileId);
}
+ String deviceProfileName = deviceProfile.getName();
DeviceProfile deviceProfileByName = deviceProfileService.findDeviceProfileByName(tenantId, deviceProfileName);
if (deviceProfileByName != null && !deviceProfileByName.getId().equals(deviceProfileId)) {
deviceProfileName = deviceProfileName + "_" + StringUtils.randomAlphabetic(15);
log.warn("[{}] Device profile with name {} already exists. Renaming device profile name to {}",
- tenantId, deviceProfileUpdateMsg.getName(), deviceProfileName);
+ tenantId, deviceProfile.getName(), deviceProfileName);
deviceProfileNameUpdated = true;
}
+ deviceProfile.setDefault(false);
deviceProfile.setName(deviceProfileName);
- deviceProfile.setDescription(deviceProfileUpdateMsg.hasDescription() ? deviceProfileUpdateMsg.getDescription() : null);
- deviceProfile.setType(DeviceProfileType.valueOf(deviceProfileUpdateMsg.getType()));
- deviceProfile.setTransportType(deviceProfileUpdateMsg.hasTransportType()
- ? DeviceTransportType.valueOf(deviceProfileUpdateMsg.getTransportType()) : DeviceTransportType.DEFAULT);
- deviceProfile.setImage(deviceProfileUpdateMsg.hasImage()
- ? new String(deviceProfileUpdateMsg.getImage().toByteArray(), StandardCharsets.UTF_8) : null);
- deviceProfile.setProvisionType(deviceProfileUpdateMsg.hasProvisionType()
- ? DeviceProfileProvisionType.valueOf(deviceProfileUpdateMsg.getProvisionType()) : DeviceProfileProvisionType.DISABLED);
- deviceProfile.setProvisionDeviceKey(deviceProfileUpdateMsg.hasProvisionDeviceKey()
- ? deviceProfileUpdateMsg.getProvisionDeviceKey() : null);
- deviceProfile.setDefaultQueueName(deviceProfileUpdateMsg.getDefaultQueueName());
-
- Optional profileDataOpt =
- dataDecodingEncodingService.decode(deviceProfileUpdateMsg.getProfileDataBytes().toByteArray());
- deviceProfile.setProfileData(profileDataOpt.orElse(null));
-
- setDefaultRuleChainId(tenantId, deviceProfile, deviceProfileUpdateMsg);
- setDefaultEdgeRuleChainId(tenantId, deviceProfile, deviceProfileUpdateMsg);
- setDefaultDashboardId(tenantId, deviceProfile, deviceProfileUpdateMsg);
- String defaultQueueName = StringUtils.isNotBlank(deviceProfileUpdateMsg.getDefaultQueueName())
- ? deviceProfileUpdateMsg.getDefaultQueueName() : null;
- deviceProfile.setDefaultQueueName(defaultQueueName);
-
- UUID firmwareUUID = safeGetUUID(deviceProfileUpdateMsg.getFirmwareIdMSB(), deviceProfileUpdateMsg.getFirmwareIdLSB());
- deviceProfile.setFirmwareId(firmwareUUID != null ? new OtaPackageId(firmwareUUID) : null);
-
- UUID softwareUUID = safeGetUUID(deviceProfileUpdateMsg.getSoftwareIdMSB(), deviceProfileUpdateMsg.getSoftwareIdLSB());
- deviceProfile.setSoftwareId(softwareUUID != null ? new OtaPackageId(softwareUUID) : null);
+ RuleChainId ruleChainId = deviceProfile.getDefaultRuleChainId();
+ setDefaultRuleChainId(tenantId, deviceProfile, created ? null : deviceProfileById.getDefaultRuleChainId());
+ setDefaultEdgeRuleChainId(deviceProfile, ruleChainId, deviceProfileUpdateMsg, edgeVersion);
+ setDefaultDashboardId(tenantId, created ? null : deviceProfileById.getDefaultDashboardId(), deviceProfile, deviceProfileUpdateMsg, edgeVersion);
deviceProfileValidator.validate(deviceProfile, DeviceProfile::getTenantId);
if (created) {
deviceProfile.setId(deviceProfileId);
}
deviceProfileService.saveDeviceProfile(deviceProfile, false);
+ if (isDefault) {
+ deviceProfileService.setDefaultDeviceProfile(tenantId, deviceProfileId);
+ }
} catch (Exception e) {
log.error("[{}] Failed to process device profile update msg [{}]", tenantId, deviceProfileUpdateMsg, e);
throw e;
- } finally {
+ } finally {
deviceCreationLock.unlock();
}
return Pair.of(created, deviceProfileNameUpdated);
}
- protected abstract void setDefaultRuleChainId(TenantId tenantId, DeviceProfile deviceProfile, DeviceProfileUpdateMsg deviceProfileUpdateMsg);
+ private DeviceProfile createDeviceProfile(TenantId tenantId, DeviceProfileId deviceProfileId, DeviceProfileUpdateMsg deviceProfileUpdateMsg) {
+ DeviceProfile deviceProfile = new DeviceProfile();
+ deviceProfile.setTenantId(tenantId);
+ deviceProfile.setCreatedTime(Uuids.unixTimestamp(deviceProfileId.getId()));
+ deviceProfile.setName(deviceProfileUpdateMsg.getName());
+ deviceProfile.setDefault(deviceProfileUpdateMsg.getDefault());
+ deviceProfile.setDescription(deviceProfileUpdateMsg.hasDescription() ? deviceProfileUpdateMsg.getDescription() : null);
+ deviceProfile.setType(DeviceProfileType.valueOf(deviceProfileUpdateMsg.getType()));
+ deviceProfile.setTransportType(deviceProfileUpdateMsg.hasTransportType()
+ ? DeviceTransportType.valueOf(deviceProfileUpdateMsg.getTransportType()) : DeviceTransportType.DEFAULT);
+ deviceProfile.setImage(deviceProfileUpdateMsg.hasImage()
+ ? new String(deviceProfileUpdateMsg.getImage().toByteArray(), StandardCharsets.UTF_8) : null);
+ deviceProfile.setProvisionType(deviceProfileUpdateMsg.hasProvisionType()
+ ? DeviceProfileProvisionType.valueOf(deviceProfileUpdateMsg.getProvisionType()) : DeviceProfileProvisionType.DISABLED);
+ deviceProfile.setProvisionDeviceKey(deviceProfileUpdateMsg.hasProvisionDeviceKey()
+ ? deviceProfileUpdateMsg.getProvisionDeviceKey() : null);
+ deviceProfile.setDefaultQueueName(deviceProfileUpdateMsg.getDefaultQueueName());
+
+ Optional profileDataOpt =
+ dataDecodingEncodingService.decode(deviceProfileUpdateMsg.getProfileDataBytes().toByteArray());
+ deviceProfile.setProfileData(profileDataOpt.orElse(null));
+
+ String defaultQueueName = StringUtils.isNotBlank(deviceProfileUpdateMsg.getDefaultQueueName())
+ ? deviceProfileUpdateMsg.getDefaultQueueName() : null;
+ deviceProfile.setDefaultQueueName(defaultQueueName);
+
+ UUID firmwareUUID = safeGetUUID(deviceProfileUpdateMsg.getFirmwareIdMSB(), deviceProfileUpdateMsg.getFirmwareIdLSB());
+ deviceProfile.setFirmwareId(firmwareUUID != null ? new OtaPackageId(firmwareUUID) : null);
+
+ UUID softwareUUID = safeGetUUID(deviceProfileUpdateMsg.getSoftwareIdMSB(), deviceProfileUpdateMsg.getSoftwareIdLSB());
+ deviceProfile.setSoftwareId(softwareUUID != null ? new OtaPackageId(softwareUUID) : null);
+ return deviceProfile;
+ }
+
+ protected abstract void setDefaultRuleChainId(TenantId tenantId, DeviceProfile deviceProfile, RuleChainId ruleChainId);
- protected abstract void setDefaultEdgeRuleChainId(TenantId tenantId, DeviceProfile deviceProfile, DeviceProfileUpdateMsg deviceProfileUpdateMsg);
+ protected abstract void setDefaultEdgeRuleChainId(DeviceProfile deviceProfile, RuleChainId ruleChainId, DeviceProfileUpdateMsg deviceProfileUpdateMsg, EdgeVersion edgeVersion);
- protected abstract void setDefaultDashboardId(TenantId tenantId, DeviceProfile deviceProfile, DeviceProfileUpdateMsg deviceProfileUpdateMsg);
+ protected abstract void setDefaultDashboardId(TenantId tenantId, DashboardId dashboardId, DeviceProfile deviceProfile, DeviceProfileUpdateMsg deviceProfileUpdateMsg, EdgeVersion edgeVersion);
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceEdgeProcessor.java
index 910be10240..b65ef58e1d 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceEdgeProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceEdgeProcessor.java
@@ -43,6 +43,7 @@ import org.thingsboard.server.common.msg.TbMsg;
import org.thingsboard.server.common.msg.TbMsgDataType;
import org.thingsboard.server.common.msg.TbMsgMetaData;
import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponse;
+import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponseActorMsg;
import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.gen.edge.v1.DeviceCredentialsRequestMsg;
import org.thingsboard.server.gen.edge.v1.DeviceCredentialsUpdateMsg;
@@ -54,7 +55,8 @@ import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.queue.TbQueueCallback;
import org.thingsboard.server.queue.TbQueueMsgMetadata;
import org.thingsboard.server.queue.util.TbCoreComponent;
-import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponseActorMsg;
+import org.thingsboard.server.service.edge.rpc.constructor.device.DeviceMsgConstructor;
+import org.thingsboard.server.service.edge.rpc.utils.EdgeVersionUtils;
import java.util.UUID;
@@ -63,7 +65,7 @@ import java.util.UUID;
@TbCoreComponent
public class DeviceEdgeProcessor extends BaseDeviceProcessor {
- public ListenableFuture processDeviceMsgFromEdge(TenantId tenantId, Edge edge, DeviceUpdateMsg deviceUpdateMsg) {
+ public ListenableFuture processDeviceMsgFromEdge(TenantId tenantId, Edge edge, DeviceUpdateMsg deviceUpdateMsg, EdgeVersion edgeVersion) {
log.trace("[{}] executing processDeviceMsgFromEdge [{}] from edge [{}]", tenantId, deviceUpdateMsg, edge.getId());
DeviceId deviceId = new DeviceId(new UUID(deviceUpdateMsg.getIdMSB(), deviceUpdateMsg.getIdLSB()));
try {
@@ -72,7 +74,7 @@ public class DeviceEdgeProcessor extends BaseDeviceProcessor {
switch (deviceUpdateMsg.getMsgType()) {
case ENTITY_CREATED_RPC_MESSAGE:
case ENTITY_UPDATED_RPC_MESSAGE:
- saveOrUpdateDevice(tenantId, deviceId, deviceUpdateMsg, edge);
+ saveOrUpdateDevice(tenantId, deviceId, deviceUpdateMsg, edge, edgeVersion);
return saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.DEVICE, EdgeEventActionType.CREDENTIALS_REQUEST, deviceId, null);
case ENTITY_DELETED_RPC_MESSAGE:
Device deviceToDelete = deviceService.findDeviceById(tenantId, deviceId);
@@ -96,21 +98,20 @@ public class DeviceEdgeProcessor extends BaseDeviceProcessor {
}
}
- public ListenableFuture processDeviceCredentialsMsgFromEdge(TenantId tenantId, EdgeId edgeId, DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg) {
+ public ListenableFuture processDeviceCredentialsMsgFromEdge(TenantId tenantId, EdgeId edgeId, DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg, EdgeVersion edgeVersion) {
log.debug("[{}] Executing processDeviceCredentialsMsgFromEdge, deviceCredentialsUpdateMsg [{}]", tenantId, deviceCredentialsUpdateMsg);
try {
edgeSynchronizationManager.getEdgeId().set(edgeId);
- updateDeviceCredentials(tenantId, deviceCredentialsUpdateMsg);
+ updateDeviceCredentials(tenantId, deviceCredentialsUpdateMsg, edgeVersion);
} finally {
edgeSynchronizationManager.getEdgeId().remove();
}
return Futures.immediateFuture(null);
}
- private void saveOrUpdateDevice(TenantId tenantId, DeviceId deviceId, DeviceUpdateMsg deviceUpdateMsg, Edge edge) {
- CustomerId customerId = safeGetCustomerId(deviceUpdateMsg.getCustomerIdMSB(), deviceUpdateMsg.getCustomerIdLSB());
- Pair resultPair = super.saveOrUpdateDevice(tenantId, deviceId, deviceUpdateMsg, customerId);
+ private void saveOrUpdateDevice(TenantId tenantId, DeviceId deviceId, DeviceUpdateMsg deviceUpdateMsg, Edge edge, EdgeVersion edgeVersion) {
+ Pair resultPair = super.saveOrUpdateDevice(tenantId, deviceId, deviceUpdateMsg, edgeVersion);
Boolean created = resultPair.getFirst();
if (created) {
createRelationFromEdge(tenantId, edge.getId(), deviceId);
@@ -227,23 +228,26 @@ public class DeviceEdgeProcessor extends BaseDeviceProcessor {
Device device = deviceService.findDeviceById(edgeEvent.getTenantId(), deviceId);
if (device != null) {
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
- DeviceUpdateMsg deviceUpdateMsg =
- deviceMsgConstructor.constructDeviceUpdatedMsg(msgType, device);
+ DeviceUpdateMsg deviceUpdateMsg = ((DeviceMsgConstructor)
+ deviceMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion))
+ .constructDeviceUpdatedMsg(msgType, device);
DownlinkMsg.Builder builder = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addDeviceUpdateMsg(deviceUpdateMsg);
if (UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE.equals(msgType)) {
DeviceProfile deviceProfile = deviceProfileService.findDeviceProfileById(edgeEvent.getTenantId(), device.getDeviceProfileId());
deviceProfile = checkIfDeviceProfileDefaultFieldsAssignedToEdge(edgeEvent.getTenantId(), edgeId, deviceProfile, edgeVersion);
- builder.addDeviceProfileUpdateMsg(deviceProfileMsgConstructor.constructDeviceProfileUpdatedMsg(msgType, deviceProfile));
+ builder.addDeviceProfileUpdateMsg(((DeviceMsgConstructor)
+ deviceMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion))
+ .constructDeviceProfileUpdatedMsg(msgType, deviceProfile));
}
downlinkMsg = builder.build();
}
break;
case DELETED:
case UNASSIGNED_FROM_EDGE:
- DeviceUpdateMsg deviceUpdateMsg =
- deviceMsgConstructor.constructDeviceDeleteMsg(deviceId);
+ DeviceUpdateMsg deviceUpdateMsg = ((DeviceMsgConstructor)
+ deviceMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructDeviceDeleteMsg(deviceId);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addDeviceUpdateMsg(deviceUpdateMsg)
@@ -252,8 +256,8 @@ public class DeviceEdgeProcessor extends BaseDeviceProcessor {
case CREDENTIALS_UPDATED:
DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(edgeEvent.getTenantId(), deviceId);
if (deviceCredentials != null) {
- DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg =
- deviceMsgConstructor.constructDeviceCredentialsUpdatedMsg(deviceCredentials);
+ DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg = ((DeviceMsgConstructor)
+ deviceMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructDeviceCredentialsUpdatedMsg(deviceCredentials);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addDeviceCredentialsUpdateMsg(deviceCredentialsUpdateMsg)
@@ -261,20 +265,18 @@ public class DeviceEdgeProcessor extends BaseDeviceProcessor {
}
break;
case RPC_CALL:
- return convertRpcCallEventToDownlink(edgeEvent);
+ return DownlinkMsg.newBuilder()
+ .setDownlinkMsgId(EdgeUtils.nextPositiveInt())
+ .addDeviceRpcCallMsg(((DeviceMsgConstructor)
+ deviceMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion))
+ .constructDeviceRpcCallMsg(edgeEvent.getEntityId(), edgeEvent.getBody()))
+ .build();
case CREDENTIALS_REQUEST:
return convertCredentialsRequestEventToDownlink(edgeEvent);
}
return downlinkMsg;
}
- private DownlinkMsg convertRpcCallEventToDownlink(EdgeEvent edgeEvent) {
- return DownlinkMsg.newBuilder()
- .setDownlinkMsgId(EdgeUtils.nextPositiveInt())
- .addDeviceRpcCallMsg(deviceMsgConstructor.constructDeviceRpcCallMsg(edgeEvent.getEntityId(), edgeEvent.getBody()))
- .build();
- }
-
private DownlinkMsg convertCredentialsRequestEventToDownlink(EdgeEvent edgeEvent) {
DeviceId deviceId = new DeviceId(edgeEvent.getEntityId());
DeviceCredentialsRequestMsg deviceCredentialsRequestMsg = DeviceCredentialsRequestMsg.newBuilder()
@@ -286,4 +288,12 @@ public class DeviceEdgeProcessor extends BaseDeviceProcessor {
.addDeviceCredentialsRequestMsg(deviceCredentialsRequestMsg);
return builder.build();
}
+
+ @Override
+ protected void setCustomerId(TenantId tenantId, CustomerId customerId, Device device, DeviceUpdateMsg deviceUpdateMsg, EdgeVersion edgeVersion) {
+ CustomerId customerUUID = EdgeVersionUtils.isEdgeVersionOlderThan_3_6_2(edgeVersion)
+ ? safeGetCustomerId(deviceUpdateMsg.getCustomerIdMSB(), deviceUpdateMsg.getCustomerIdLSB())
+ : device.getCustomerId() != null ? device.getCustomerId() : customerId;
+ device.setCustomerId(customerUUID);
+ }
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceProfileEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceProfileEdgeProcessor.java
index 3ed75bdb41..c4105f9668 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceProfileEdgeProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceProfileEdgeProcessor.java
@@ -40,6 +40,8 @@ import org.thingsboard.server.gen.edge.v1.DownlinkMsg;
import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.device.DeviceMsgConstructor;
+import org.thingsboard.server.service.edge.rpc.utils.EdgeVersionUtils;
import java.util.UUID;
@@ -48,7 +50,7 @@ import java.util.UUID;
@TbCoreComponent
public class DeviceProfileEdgeProcessor extends BaseDeviceProfileProcessor {
- public ListenableFuture processDeviceProfileMsgFromEdge(TenantId tenantId, Edge edge, DeviceProfileUpdateMsg deviceProfileUpdateMsg) {
+ public ListenableFuture processDeviceProfileMsgFromEdge(TenantId tenantId, Edge edge, DeviceProfileUpdateMsg deviceProfileUpdateMsg, EdgeVersion edgeVersion) {
log.trace("[{}] executing processDeviceProfileMsgFromEdge [{}] from edge [{}]", tenantId, deviceProfileUpdateMsg, edge.getId());
DeviceProfileId deviceProfileId = new DeviceProfileId(new UUID(deviceProfileUpdateMsg.getIdMSB(), deviceProfileUpdateMsg.getIdLSB()));
try {
@@ -57,7 +59,7 @@ public class DeviceProfileEdgeProcessor extends BaseDeviceProfileProcessor {
switch (deviceProfileUpdateMsg.getMsgType()) {
case ENTITY_CREATED_RPC_MESSAGE:
case ENTITY_UPDATED_RPC_MESSAGE:
- saveOrUpdateDeviceProfile(tenantId, deviceProfileId, deviceProfileUpdateMsg, edge);
+ saveOrUpdateDeviceProfile(tenantId, deviceProfileId, deviceProfileUpdateMsg, edge, edgeVersion);
return Futures.immediateFuture(null);
case ENTITY_DELETED_RPC_MESSAGE:
case UNRECOGNIZED:
@@ -72,8 +74,8 @@ public class DeviceProfileEdgeProcessor extends BaseDeviceProfileProcessor {
}
}
- private void saveOrUpdateDeviceProfile(TenantId tenantId, DeviceProfileId deviceProfileId, DeviceProfileUpdateMsg deviceProfileUpdateMsg, Edge edge) {
- Pair resultPair = super.saveOrUpdateDeviceProfile(tenantId, deviceProfileId, deviceProfileUpdateMsg);
+ private void saveOrUpdateDeviceProfile(TenantId tenantId, DeviceProfileId deviceProfileId, DeviceProfileUpdateMsg deviceProfileUpdateMsg, Edge edge, EdgeVersion edgeVersion) {
+ Pair resultPair = super.saveOrUpdateDeviceProfile(tenantId, deviceProfileId, deviceProfileUpdateMsg, edgeVersion);
Boolean created = resultPair.getFirst();
if (created) {
createRelationFromEdge(tenantId, edge.getId(), deviceProfileId);
@@ -106,8 +108,8 @@ public class DeviceProfileEdgeProcessor extends BaseDeviceProfileProcessor {
if (deviceProfile != null) {
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
deviceProfile = checkIfDeviceProfileDefaultFieldsAssignedToEdge(edgeEvent.getTenantId(), edgeId, deviceProfile, edgeVersion);
- DeviceProfileUpdateMsg deviceProfileUpdateMsg =
- deviceProfileMsgConstructor.constructDeviceProfileUpdatedMsg(msgType, deviceProfile);
+ DeviceProfileUpdateMsg deviceProfileUpdateMsg = ((DeviceMsgConstructor)
+ deviceMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructDeviceProfileUpdatedMsg(msgType, deviceProfile);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addDeviceProfileUpdateMsg(deviceProfileUpdateMsg)
@@ -115,8 +117,8 @@ public class DeviceProfileEdgeProcessor extends BaseDeviceProfileProcessor {
}
break;
case DELETED:
- DeviceProfileUpdateMsg deviceProfileUpdateMsg =
- deviceProfileMsgConstructor.constructDeviceProfileDeleteMsg(deviceProfileId);
+ DeviceProfileUpdateMsg deviceProfileUpdateMsg = ((DeviceMsgConstructor)
+ deviceMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructDeviceProfileDeleteMsg(deviceProfileId);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addDeviceProfileUpdateMsg(deviceProfileUpdateMsg)
@@ -127,19 +129,23 @@ public class DeviceProfileEdgeProcessor extends BaseDeviceProfileProcessor {
}
@Override
- protected void setDefaultRuleChainId(TenantId tenantId, DeviceProfile deviceProfile, DeviceProfileUpdateMsg deviceProfileUpdateMsg) {
- // do nothing on cloud
+ protected void setDefaultRuleChainId(TenantId tenantId, DeviceProfile deviceProfile, RuleChainId ruleChainId) {
+ deviceProfile.setDefaultRuleChainId(ruleChainId);
}
@Override
- protected void setDefaultEdgeRuleChainId(TenantId tenantId, DeviceProfile deviceProfile, DeviceProfileUpdateMsg deviceProfileUpdateMsg) {
- UUID defaultEdgeRuleChainUUID = safeGetUUID(deviceProfileUpdateMsg.getDefaultRuleChainIdMSB(), deviceProfileUpdateMsg.getDefaultRuleChainIdLSB());
+ protected void setDefaultEdgeRuleChainId(DeviceProfile deviceProfile, RuleChainId ruleChainId, DeviceProfileUpdateMsg deviceProfileUpdateMsg, EdgeVersion edgeVersion) {
+ UUID defaultEdgeRuleChainUUID = EdgeVersionUtils.isEdgeVersionOlderThan_3_6_2(edgeVersion)
+ ? safeGetUUID(deviceProfileUpdateMsg.getDefaultRuleChainIdMSB(), deviceProfileUpdateMsg.getDefaultRuleChainIdLSB())
+ : ruleChainId != null ? ruleChainId.getId() : null;
deviceProfile.setDefaultEdgeRuleChainId(defaultEdgeRuleChainUUID != null ? new RuleChainId(defaultEdgeRuleChainUUID) : null);
}
@Override
- protected void setDefaultDashboardId(TenantId tenantId, DeviceProfile deviceProfile, DeviceProfileUpdateMsg deviceProfileUpdateMsg) {
- UUID defaultDashboardUUID = safeGetUUID(deviceProfileUpdateMsg.getDefaultDashboardIdMSB(), deviceProfileUpdateMsg.getDefaultDashboardIdLSB());
+ protected void setDefaultDashboardId(TenantId tenantId, DashboardId dashboardId, DeviceProfile deviceProfile, DeviceProfileUpdateMsg deviceProfileUpdateMsg, EdgeVersion edgeVersion) {
+ UUID defaultDashboardUUID = EdgeVersionUtils.isEdgeVersionOlderThan_3_6_2(edgeVersion)
+ ? safeGetUUID(deviceProfileUpdateMsg.getDefaultDashboardIdMSB(), deviceProfileUpdateMsg.getDefaultDashboardIdLSB())
+ : deviceProfile.getDefaultDashboardId() != null ? deviceProfile.getDefaultDashboardId().getId() : (dashboardId != null ? dashboardId.getId() : null);
deviceProfile.setDefaultDashboardId(defaultDashboardUUID != null ? new DashboardId(defaultDashboardUUID) : null);
}
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/entityview/BaseEntityViewProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/entityview/BaseEntityViewProcessor.java
index cca0057707..723f3e0e2f 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/entityview/BaseEntityViewProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/entityview/BaseEntityViewProcessor.java
@@ -27,50 +27,72 @@ import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.EntityViewId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.gen.edge.v1.EdgeEntityType;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.edge.v1.EntityViewUpdateMsg;
import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
+import org.thingsboard.server.service.edge.rpc.utils.EdgeVersionUtils;
import java.util.UUID;
@Slf4j
public abstract class BaseEntityViewProcessor extends BaseEdgeProcessor {
- protected Pair saveOrUpdateEntityView(TenantId tenantId, EntityViewId entityViewId, EntityViewUpdateMsg entityViewUpdateMsg, CustomerId customerId) {
+ protected Pair saveOrUpdateEntityView(TenantId tenantId, EntityViewId entityViewId, EntityViewUpdateMsg entityViewUpdateMsg, EdgeVersion edgeVersion) {
boolean created = false;
boolean entityViewNameUpdated = false;
- EntityView entityView = entityViewService.findEntityViewById(tenantId, entityViewId);
- String entityViewName = entityViewUpdateMsg.getName();
+ EntityView entityView = EdgeVersionUtils.isEdgeVersionOlderThan_3_6_2(edgeVersion)
+ ? createEntityView(tenantId, entityViewId, entityViewUpdateMsg)
+ : JacksonUtil.fromStringIgnoreUnknownProperties(entityViewUpdateMsg.getEntity(), EntityView.class);
if (entityView == null) {
+ throw new RuntimeException("[{" + tenantId + "}] entityViewUpdateMsg {" + entityViewUpdateMsg + "} cannot be converted to entity view");
+ }
+ EntityView entityViewById = entityViewService.findEntityViewById(tenantId, entityViewId);
+ if (entityViewById == null) {
created = true;
- entityView = new EntityView();
- entityView.setTenantId(tenantId);
- entityView.setCreatedTime(Uuids.unixTimestamp(entityViewId.getId()));
+ entityView.setId(null);
+ } else {
+ entityView.setId(entityViewId);
}
+ String entityViewName = entityView.getName();
EntityView entityViewByName = entityViewService.findEntityViewByTenantIdAndName(tenantId, entityViewName);
if (entityViewByName != null && !entityViewByName.getId().equals(entityViewId)) {
entityViewName = entityViewName + "_" + StringUtils.randomAlphanumeric(15);
log.warn("[{}] Entity view with name {} already exists. Renaming entity view name to {}",
- tenantId, entityViewUpdateMsg.getName(), entityViewName);
+ tenantId, entityView.getName(), entityViewName);
entityViewNameUpdated = true;
}
entityView.setName(entityViewName);
+ setCustomerId(tenantId, created ? null : entityViewById.getCustomerId(), entityView, entityViewUpdateMsg, edgeVersion);
+
+ entityViewValidator.validate(entityView, EntityView::getTenantId);
+ if (created) {
+ entityView.setId(entityViewId);
+ }
+ entityViewService.saveEntityView(entityView, false);
+ return Pair.of(created, entityViewNameUpdated);
+ }
+
+ private EntityView createEntityView(TenantId tenantId, EntityViewId entityViewId, EntityViewUpdateMsg entityViewUpdateMsg) {
+ EntityView entityView = new EntityView();
+ entityView.setTenantId(tenantId);
+ entityView.setCreatedTime(Uuids.unixTimestamp(entityViewId.getId()));
+ entityView.setName(entityViewUpdateMsg.getName());
entityView.setType(entityViewUpdateMsg.getType());
- entityView.setCustomerId(customerId);
+
entityView.setAdditionalInfo(entityViewUpdateMsg.hasAdditionalInfo() ?
JacksonUtil.toJsonNode(entityViewUpdateMsg.getAdditionalInfo()) : null);
+ CustomerId customerId = safeGetCustomerId(entityViewUpdateMsg.getCustomerIdMSB(), entityViewUpdateMsg.getCustomerIdLSB());
+ entityView.setCustomerId(customerId);
+
UUID entityIdUUID = safeGetUUID(entityViewUpdateMsg.getEntityIdMSB(), entityViewUpdateMsg.getEntityIdLSB());
if (EdgeEntityType.DEVICE.equals(entityViewUpdateMsg.getEntityType())) {
entityView.setEntityId(entityIdUUID != null ? new DeviceId(entityIdUUID) : null);
} else if (EdgeEntityType.ASSET.equals(entityViewUpdateMsg.getEntityType())) {
entityView.setEntityId(entityIdUUID != null ? new AssetId(entityIdUUID) : null);
}
-
- entityViewValidator.validate(entityView, EntityView::getTenantId);
- if (created) {
- entityView.setId(entityViewId);
- }
- entityViewService.saveEntityView(entityView, false);
- return Pair.of(created, entityViewNameUpdated);
+ return entityView;
}
+
+ protected abstract void setCustomerId(TenantId tenantId, CustomerId customerId, EntityView entityView, EntityViewUpdateMsg entityViewUpdateMsg, EdgeVersion edgeVersion);
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/entityview/EntityViewEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/entityview/EntityViewEdgeProcessor.java
index cd3a0b35ad..863c1112e2 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/entityview/EntityViewEdgeProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/entityview/EntityViewEdgeProcessor.java
@@ -34,9 +34,12 @@ import org.thingsboard.server.common.data.msg.TbMsgType;
import org.thingsboard.server.common.msg.TbMsgMetaData;
import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.gen.edge.v1.DownlinkMsg;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.edge.v1.EntityViewUpdateMsg;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.entityview.EntityViewMsgConstructor;
+import org.thingsboard.server.service.edge.rpc.utils.EdgeVersionUtils;
import java.util.UUID;
@@ -45,7 +48,7 @@ import java.util.UUID;
@TbCoreComponent
public class EntityViewEdgeProcessor extends BaseEntityViewProcessor {
- public ListenableFuture processEntityViewMsgFromEdge(TenantId tenantId, Edge edge, EntityViewUpdateMsg entityViewUpdateMsg) {
+ public ListenableFuture processEntityViewMsgFromEdge(TenantId tenantId, Edge edge, EntityViewUpdateMsg entityViewUpdateMsg, EdgeVersion edgeVersion) {
log.trace("[{}] executing processEntityViewMsgFromEdge [{}] from edge [{}]", tenantId, entityViewUpdateMsg, edge.getId());
EntityViewId entityViewId = new EntityViewId(new UUID(entityViewUpdateMsg.getIdMSB(), entityViewUpdateMsg.getIdLSB()));
try {
@@ -54,7 +57,7 @@ public class EntityViewEdgeProcessor extends BaseEntityViewProcessor {
switch (entityViewUpdateMsg.getMsgType()) {
case ENTITY_CREATED_RPC_MESSAGE:
case ENTITY_UPDATED_RPC_MESSAGE:
- saveOrUpdateEntityView(tenantId, entityViewId, entityViewUpdateMsg, edge);
+ saveOrUpdateEntityView(tenantId, entityViewId, entityViewUpdateMsg, edge, edgeVersion);
return Futures.immediateFuture(null);
case ENTITY_DELETED_RPC_MESSAGE:
EntityView entityViewToDelete = entityViewService.findEntityViewById(tenantId, entityViewId);
@@ -78,9 +81,8 @@ public class EntityViewEdgeProcessor extends BaseEntityViewProcessor {
}
}
- private void saveOrUpdateEntityView(TenantId tenantId, EntityViewId entityViewId, EntityViewUpdateMsg entityViewUpdateMsg, Edge edge) {
- CustomerId customerId = safeGetCustomerId(entityViewUpdateMsg.getCustomerIdMSB(), entityViewUpdateMsg.getCustomerIdLSB());
- Pair resultPair = super.saveOrUpdateEntityView(tenantId, entityViewId, entityViewUpdateMsg, customerId);
+ private void saveOrUpdateEntityView(TenantId tenantId, EntityViewId entityViewId, EntityViewUpdateMsg entityViewUpdateMsg, Edge edge, EdgeVersion edgeVersion) {
+ Pair resultPair = super.saveOrUpdateEntityView(tenantId, entityViewId, entityViewUpdateMsg, edgeVersion);
Boolean created = resultPair.getFirst();
if (created) {
createRelationFromEdge(tenantId, edge.getId(), entityViewId);
@@ -104,7 +106,7 @@ public class EntityViewEdgeProcessor extends BaseEntityViewProcessor {
}
}
- public DownlinkMsg convertEntityViewEventToDownlink(EdgeEvent edgeEvent) {
+ public DownlinkMsg convertEntityViewEventToDownlink(EdgeEvent edgeEvent, EdgeVersion edgeVersion) {
EntityViewId entityViewId = new EntityViewId(edgeEvent.getEntityId());
DownlinkMsg downlinkMsg = null;
switch (edgeEvent.getAction()) {
@@ -116,8 +118,8 @@ public class EntityViewEdgeProcessor extends BaseEntityViewProcessor {
EntityView entityView = entityViewService.findEntityViewById(edgeEvent.getTenantId(), entityViewId);
if (entityView != null) {
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
- EntityViewUpdateMsg entityViewUpdateMsg =
- entityViewMsgConstructor.constructEntityViewUpdatedMsg(msgType, entityView);
+ EntityViewUpdateMsg entityViewUpdateMsg = ((EntityViewMsgConstructor)
+ entityViewMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructEntityViewUpdatedMsg(msgType, entityView);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addEntityViewUpdateMsg(entityViewUpdateMsg)
@@ -126,8 +128,8 @@ public class EntityViewEdgeProcessor extends BaseEntityViewProcessor {
break;
case DELETED:
case UNASSIGNED_FROM_EDGE:
- EntityViewUpdateMsg entityViewUpdateMsg =
- entityViewMsgConstructor.constructEntityViewDeleteMsg(entityViewId);
+ EntityViewUpdateMsg entityViewUpdateMsg = ((EntityViewMsgConstructor)
+ entityViewMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructEntityViewDeleteMsg(entityViewId);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addEntityViewUpdateMsg(entityViewUpdateMsg)
@@ -136,4 +138,12 @@ public class EntityViewEdgeProcessor extends BaseEntityViewProcessor {
}
return downlinkMsg;
}
+
+ @Override
+ protected void setCustomerId(TenantId tenantId, CustomerId customerId, EntityView entityView, EntityViewUpdateMsg entityViewUpdateMsg, EdgeVersion edgeVersion) {
+ CustomerId customerUUID = EdgeVersionUtils.isEdgeVersionOlderThan_3_6_2(edgeVersion)
+ ? safeGetCustomerId(entityViewUpdateMsg.getCustomerIdMSB(), entityViewUpdateMsg.getCustomerIdLSB())
+ : entityView.getCustomerId() != null ? entityView.getCustomerId() : customerId;
+ entityView.setCustomerId(customerUUID);
+ }
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/ota/OtaPackageEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/ota/OtaPackageEdgeProcessor.java
index fae6399e3a..247cfe5c15 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/ota/OtaPackageEdgeProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/ota/OtaPackageEdgeProcessor.java
@@ -22,9 +22,11 @@ import org.thingsboard.server.common.data.OtaPackage;
import org.thingsboard.server.common.data.edge.EdgeEvent;
import org.thingsboard.server.common.data.id.OtaPackageId;
import org.thingsboard.server.gen.edge.v1.DownlinkMsg;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.edge.v1.OtaPackageUpdateMsg;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.ota.OtaPackageMsgConstructor;
import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
@Component
@@ -32,7 +34,7 @@ import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
@TbCoreComponent
public class OtaPackageEdgeProcessor extends BaseEdgeProcessor {
- public DownlinkMsg convertOtaPackageEventToDownlink(EdgeEvent edgeEvent) {
+ public DownlinkMsg convertOtaPackageEventToDownlink(EdgeEvent edgeEvent, EdgeVersion edgeVersion) {
OtaPackageId otaPackageId = new OtaPackageId(edgeEvent.getEntityId());
DownlinkMsg downlinkMsg = null;
switch (edgeEvent.getAction()) {
@@ -41,8 +43,8 @@ public class OtaPackageEdgeProcessor extends BaseEdgeProcessor {
OtaPackage otaPackage = otaPackageService.findOtaPackageById(edgeEvent.getTenantId(), otaPackageId);
if (otaPackage != null) {
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
- OtaPackageUpdateMsg otaPackageUpdateMsg =
- otaPackageMsgConstructor.constructOtaPackageUpdatedMsg(msgType, otaPackage);
+ OtaPackageUpdateMsg otaPackageUpdateMsg = ((OtaPackageMsgConstructor)
+ otaPackageMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructOtaPackageUpdatedMsg(msgType, otaPackage);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addOtaPackageUpdateMsg(otaPackageUpdateMsg)
@@ -50,8 +52,8 @@ public class OtaPackageEdgeProcessor extends BaseEdgeProcessor {
}
break;
case DELETED:
- OtaPackageUpdateMsg otaPackageUpdateMsg =
- otaPackageMsgConstructor.constructOtaPackageDeleteMsg(otaPackageId);
+ OtaPackageUpdateMsg otaPackageUpdateMsg = ((OtaPackageMsgConstructor)
+ otaPackageMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructOtaPackageDeleteMsg(otaPackageId);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addOtaPackageUpdateMsg(otaPackageUpdateMsg)
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/queue/QueueEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/queue/QueueEdgeProcessor.java
index 8562582940..cd595c1699 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/queue/QueueEdgeProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/queue/QueueEdgeProcessor.java
@@ -22,17 +22,19 @@ import org.thingsboard.server.common.data.edge.EdgeEvent;
import org.thingsboard.server.common.data.id.QueueId;
import org.thingsboard.server.common.data.queue.Queue;
import org.thingsboard.server.gen.edge.v1.DownlinkMsg;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.edge.v1.QueueUpdateMsg;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.queue.QueueMsgConstructor;
import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
-@Component
@Slf4j
+@Component
@TbCoreComponent
public class QueueEdgeProcessor extends BaseEdgeProcessor {
- public DownlinkMsg convertQueueEventToDownlink(EdgeEvent edgeEvent) {
+ public DownlinkMsg convertQueueEventToDownlink(EdgeEvent edgeEvent, EdgeVersion edgeVersion) {
QueueId queueId = new QueueId(edgeEvent.getEntityId());
DownlinkMsg downlinkMsg = null;
switch (edgeEvent.getAction()) {
@@ -41,8 +43,8 @@ public class QueueEdgeProcessor extends BaseEdgeProcessor {
Queue queue = queueService.findQueueById(edgeEvent.getTenantId(), queueId);
if (queue != null) {
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
- QueueUpdateMsg queueUpdateMsg =
- queueMsgConstructor.constructQueueUpdatedMsg(msgType, queue);
+ QueueUpdateMsg queueUpdateMsg = ((QueueMsgConstructor)
+ queueMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructQueueUpdatedMsg(msgType, queue);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addQueueUpdateMsg(queueUpdateMsg)
@@ -50,8 +52,8 @@ public class QueueEdgeProcessor extends BaseEdgeProcessor {
}
break;
case DELETED:
- QueueUpdateMsg queueDeleteMsg =
- queueMsgConstructor.constructQueueDeleteMsg(queueId);
+ QueueUpdateMsg queueDeleteMsg = ((QueueMsgConstructor)
+ queueMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructQueueDeleteMsg(queueId);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addQueueUpdateMsg(queueDeleteMsg)
@@ -60,5 +62,4 @@ public class QueueEdgeProcessor extends BaseEdgeProcessor {
}
return downlinkMsg;
}
-
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/relation/BaseRelationProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/relation/BaseRelationProcessor.java
index 952affdc3d..d673b1a613 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/relation/BaseRelationProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/relation/BaseRelationProcessor.java
@@ -25,41 +25,35 @@ import org.thingsboard.server.common.data.id.EntityIdFactory;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.relation.EntityRelation;
import org.thingsboard.server.common.data.relation.RelationTypeGroup;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.edge.v1.RelationUpdateMsg;
import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
+import org.thingsboard.server.service.edge.rpc.utils.EdgeVersionUtils;
import java.util.UUID;
@Slf4j
public abstract class BaseRelationProcessor extends BaseEdgeProcessor {
- protected ListenableFuture processRelationMsg(TenantId tenantId, RelationUpdateMsg relationUpdateMsg) {
+ protected ListenableFuture processRelationMsg(TenantId tenantId, RelationUpdateMsg relationUpdateMsg, EdgeVersion edgeVersion) {
+ log.trace("[{}] processRelationMsg [{}]", tenantId, relationUpdateMsg);
try {
- EntityRelation entityRelation = new EntityRelation();
-
- UUID fromUUID = new UUID(relationUpdateMsg.getFromIdMSB(), relationUpdateMsg.getFromIdLSB());
- EntityId fromId = EntityIdFactory.getByTypeAndUuid(EntityType.valueOf(relationUpdateMsg.getFromEntityType()), fromUUID);
- entityRelation.setFrom(fromId);
-
- UUID toUUID = new UUID(relationUpdateMsg.getToIdMSB(), relationUpdateMsg.getToIdLSB());
- EntityId toId = EntityIdFactory.getByTypeAndUuid(EntityType.valueOf(relationUpdateMsg.getToEntityType()), toUUID);
- entityRelation.setTo(toId);
-
- entityRelation.setType(relationUpdateMsg.getType());
- entityRelation.setTypeGroup(relationUpdateMsg.hasTypeGroup()
- ? RelationTypeGroup.valueOf(relationUpdateMsg.getTypeGroup()) : RelationTypeGroup.COMMON);
- entityRelation.setAdditionalInfo(JacksonUtil.toJsonNode(relationUpdateMsg.getAdditionalInfo()));
+ EntityRelation entityRelation = EdgeVersionUtils.isEdgeVersionOlderThan_3_6_2(edgeVersion)
+ ? createEntityRelation(relationUpdateMsg)
+ : JacksonUtil.fromStringIgnoreUnknownProperties(relationUpdateMsg.getEntity(), EntityRelation.class);
+ if (entityRelation == null) {
+ throw new RuntimeException("[{" + tenantId + "}] relationUpdateMsg {" + relationUpdateMsg + "} cannot be converted to entity relation");
+ }
switch (relationUpdateMsg.getMsgType()) {
case ENTITY_CREATED_RPC_MESSAGE:
case ENTITY_UPDATED_RPC_MESSAGE:
if (isEntityExists(tenantId, entityRelation.getTo())
&& isEntityExists(tenantId, entityRelation.getFrom())) {
relationService.saveRelation(tenantId, entityRelation);
- break;
} else {
log.warn("[{}] Skipping relating update msg because from/to entity doesn't exists on edge, {}", tenantId, relationUpdateMsg);
- break;
}
+ break;
case ENTITY_DELETED_RPC_MESSAGE:
relationService.deleteRelation(tenantId, entityRelation);
break;
@@ -73,4 +67,22 @@ public abstract class BaseRelationProcessor extends BaseEdgeProcessor {
}
return Futures.immediateFuture(null);
}
+
+ private EntityRelation createEntityRelation(RelationUpdateMsg relationUpdateMsg) {
+ EntityRelation entityRelation = new EntityRelation();
+
+ UUID fromUUID = new UUID(relationUpdateMsg.getFromIdMSB(), relationUpdateMsg.getFromIdLSB());
+ EntityId fromId = EntityIdFactory.getByTypeAndUuid(EntityType.valueOf(relationUpdateMsg.getFromEntityType()), fromUUID);
+ entityRelation.setFrom(fromId);
+
+ UUID toUUID = new UUID(relationUpdateMsg.getToIdMSB(), relationUpdateMsg.getToIdLSB());
+ EntityId toId = EntityIdFactory.getByTypeAndUuid(EntityType.valueOf(relationUpdateMsg.getToEntityType()), toUUID);
+ entityRelation.setTo(toId);
+
+ entityRelation.setType(relationUpdateMsg.getType());
+ entityRelation.setTypeGroup(relationUpdateMsg.hasTypeGroup()
+ ? RelationTypeGroup.valueOf(relationUpdateMsg.getTypeGroup()) : RelationTypeGroup.COMMON);
+ entityRelation.setAdditionalInfo(JacksonUtil.toJsonNode(relationUpdateMsg.getAdditionalInfo()));
+ return entityRelation;
+ }
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/relation/RelationEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/relation/RelationEdgeProcessor.java
index b3676e8d82..256d84a1e3 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/relation/RelationEdgeProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/relation/RelationEdgeProcessor.java
@@ -30,10 +30,12 @@ import org.thingsboard.server.common.data.id.EdgeId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.relation.EntityRelation;
import org.thingsboard.server.gen.edge.v1.DownlinkMsg;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.edge.v1.RelationUpdateMsg;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.gen.transport.TransportProtos;
import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.relation.RelationMsgConstructor;
import java.util.ArrayList;
import java.util.HashSet;
@@ -45,21 +47,21 @@ import java.util.Set;
@TbCoreComponent
public class RelationEdgeProcessor extends BaseRelationProcessor {
- public ListenableFuture processRelationMsgFromEdge(TenantId tenantId, Edge edge, RelationUpdateMsg relationUpdateMsg) {
+ public ListenableFuture processRelationMsgFromEdge(TenantId tenantId, Edge edge, RelationUpdateMsg relationUpdateMsg, EdgeVersion edgeVersion) {
log.trace("[{}] executing processRelationMsgFromEdge [{}] from edge [{}]", tenantId, relationUpdateMsg, edge.getId());
try {
edgeSynchronizationManager.getEdgeId().set(edge.getId());
-
- return processRelationMsg(tenantId, relationUpdateMsg);
+ return processRelationMsg(tenantId, relationUpdateMsg, edgeVersion);
} finally {
edgeSynchronizationManager.getEdgeId().remove();
}
}
- public DownlinkMsg convertRelationEventToDownlink(EdgeEvent edgeEvent) {
+ public DownlinkMsg convertRelationEventToDownlink(EdgeEvent edgeEvent, EdgeVersion edgeVersion) {
EntityRelation entityRelation = JacksonUtil.convertValue(edgeEvent.getBody(), EntityRelation.class);
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
- RelationUpdateMsg relationUpdateMsg = relationMsgConstructor.constructRelationUpdatedMsg(msgType, entityRelation);
+ RelationUpdateMsg relationUpdateMsg = ((RelationMsgConstructor) relationMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion))
+ .constructRelationUpdatedMsg(msgType, entityRelation);
return DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addRelationUpdateMsg(relationUpdateMsg)
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/resource/BaseResourceProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/resource/BaseResourceProcessor.java
index a00745d8b7..ebcbb2b7c9 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/resource/BaseResourceProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/resource/BaseResourceProcessor.java
@@ -17,6 +17,7 @@ package org.thingsboard.server.service.edge.rpc.processor.resource;
import com.datastax.oss.driver.api.core.uuid.Uuids;
import lombok.extern.slf4j.Slf4j;
+import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.ResourceType;
import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.TbResource;
@@ -24,45 +25,45 @@ import org.thingsboard.server.common.data.TbResourceInfo;
import org.thingsboard.server.common.data.id.TbResourceId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageDataIterable;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.edge.v1.ResourceUpdateMsg;
import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
+import org.thingsboard.server.service.edge.rpc.utils.EdgeVersionUtils;
@Slf4j
public abstract class BaseResourceProcessor extends BaseEdgeProcessor {
- protected boolean saveOrUpdateTbResource(TenantId tenantId, TbResourceId tbResourceId, ResourceUpdateMsg resourceUpdateMsg) {
+ protected boolean saveOrUpdateTbResource(TenantId tenantId, TbResourceId tbResourceId, ResourceUpdateMsg resourceUpdateMsg, EdgeVersion edgeVersion) {
boolean resourceKeyUpdated = false;
try {
- boolean created = false;
- TbResource resource = resourceService.findResourceById(tenantId, tbResourceId);
+ TbResource resource = EdgeVersionUtils.isEdgeVersionOlderThan_3_6_2(edgeVersion)
+ ? createTbResource(tenantId, resourceUpdateMsg)
+ : JacksonUtil.fromStringIgnoreUnknownProperties(resourceUpdateMsg.getEntity(), TbResource.class);
if (resource == null) {
- resource = new TbResource();
- if (resourceUpdateMsg.getIsSystem()) {
- resource.setTenantId(TenantId.SYS_TENANT_ID);
- } else {
- resource.setTenantId(tenantId);
- }
+ throw new RuntimeException("[{" + tenantId + "}] resourceUpdateMsg {" + resourceUpdateMsg + " } cannot be converted to resource");
+ }
+ boolean created = false;
+ TbResource resourceById = resourceService.findResourceById(tenantId, tbResourceId);
+ if (resourceById == null) {
resource.setCreatedTime(Uuids.unixTimestamp(tbResourceId.getId()));
created = true;
+ resource.setId(null);
+ } else {
+ resource.setId(tbResourceId);
}
- String resourceKey = resourceUpdateMsg.getResourceKey();
- ResourceType resourceType = ResourceType.valueOf(resourceUpdateMsg.getResourceType());
+ String resourceKey = resource.getResourceKey();
+ ResourceType resourceType = resource.getResourceType();
PageDataIterable resourcesIterable = new PageDataIterable<>(
link -> resourceService.findTenantResourcesByResourceTypeAndPageLink(tenantId, resourceType, link), 1024);
for (TbResource tbResource : resourcesIterable) {
- if (tbResource.getResourceKey().equals(resourceUpdateMsg.getResourceKey()) && !tbResourceId.equals(tbResource.getId())) {
+ if (tbResource.getResourceKey().equals(resourceKey) && !tbResourceId.equals(tbResource.getId())) {
resourceKey = StringUtils.randomAlphabetic(15) + "_" + resourceKey;
log.warn("[{}] Resource with resource type {} and key {} already exists. Renaming resource key to {}",
- tenantId, resourceType, resourceUpdateMsg.getResourceKey(), resourceKey);
+ tenantId, resourceType, resource.getResourceKey(), resourceKey);
resourceKeyUpdated = true;
}
}
- resource.setTitle(resourceUpdateMsg.getTitle());
resource.setResourceKey(resourceKey);
- resource.setResourceType(resourceType);
- resource.setFileName(resourceUpdateMsg.getFileName());
- resource.setData(resourceUpdateMsg.hasData() ? resourceUpdateMsg.getData() : null);
- resource.setEtag(resourceUpdateMsg.hasEtag() ? resourceUpdateMsg.getEtag() : null);
resourceValidator.validate(resource, TbResourceInfo::getTenantId);
if (created) {
resource.setId(tbResourceId);
@@ -74,4 +75,20 @@ public abstract class BaseResourceProcessor extends BaseEdgeProcessor {
}
return resourceKeyUpdated;
}
+
+ private TbResource createTbResource(TenantId tenantId, ResourceUpdateMsg resourceUpdateMsg) {
+ TbResource resource = new TbResource();
+ if (resourceUpdateMsg.getIsSystem()) {
+ resource.setTenantId(TenantId.SYS_TENANT_ID);
+ } else {
+ resource.setTenantId(tenantId);
+ }
+ resource.setTitle(resourceUpdateMsg.getTitle());
+ resource.setResourceKey(resourceUpdateMsg.getResourceKey());
+ resource.setResourceType(ResourceType.valueOf(resourceUpdateMsg.getResourceType()));
+ resource.setFileName(resourceUpdateMsg.getFileName());
+ resource.setData(resourceUpdateMsg.hasData() ? resourceUpdateMsg.getData() : null);
+ resource.setEtag(resourceUpdateMsg.hasEtag() ? resourceUpdateMsg.getEtag() : null);
+ return resource;
+ }
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/resource/ResourceEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/resource/ResourceEdgeProcessor.java
index ad283826f8..fd3a9c51f4 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/resource/ResourceEdgeProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/resource/ResourceEdgeProcessor.java
@@ -29,9 +29,11 @@ import org.thingsboard.server.common.data.id.TbResourceId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.gen.edge.v1.DownlinkMsg;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.edge.v1.ResourceUpdateMsg;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.resource.ResourceMsgConstructor;
import java.util.UUID;
@@ -40,7 +42,7 @@ import java.util.UUID;
@TbCoreComponent
public class ResourceEdgeProcessor extends BaseResourceProcessor {
- public ListenableFuture processResourceMsgFromEdge(TenantId tenantId, Edge edge, ResourceUpdateMsg resourceUpdateMsg) {
+ public ListenableFuture processResourceMsgFromEdge(TenantId tenantId, Edge edge, ResourceUpdateMsg resourceUpdateMsg, EdgeVersion edgeVersion) {
TbResourceId tbResourceId = new TbResourceId(new UUID(resourceUpdateMsg.getIdMSB(), resourceUpdateMsg.getIdLSB()));
try {
edgeSynchronizationManager.getEdgeId().set(edge.getId());
@@ -48,7 +50,7 @@ public class ResourceEdgeProcessor extends BaseResourceProcessor {
switch (resourceUpdateMsg.getMsgType()) {
case ENTITY_CREATED_RPC_MESSAGE:
case ENTITY_UPDATED_RPC_MESSAGE:
- boolean resourceKeyUpdated = super.saveOrUpdateTbResource(tenantId, tbResourceId, resourceUpdateMsg);
+ boolean resourceKeyUpdated = super.saveOrUpdateTbResource(tenantId, tbResourceId, resourceUpdateMsg, edgeVersion);
if (resourceKeyUpdated) {
saveEdgeEvent(tenantId, edge.getId(), EdgeEventType.TB_RESOURCE, EdgeEventActionType.UPDATED, tbResourceId, null);
}
@@ -70,7 +72,7 @@ public class ResourceEdgeProcessor extends BaseResourceProcessor {
return Futures.immediateFuture(null);
}
- public DownlinkMsg convertResourceEventToDownlink(EdgeEvent edgeEvent) {
+ public DownlinkMsg convertResourceEventToDownlink(EdgeEvent edgeEvent, EdgeVersion edgeVersion) {
TbResourceId tbResourceId = new TbResourceId(edgeEvent.getEntityId());
DownlinkMsg downlinkMsg = null;
switch (edgeEvent.getAction()) {
@@ -79,8 +81,8 @@ public class ResourceEdgeProcessor extends BaseResourceProcessor {
TbResource tbResource = resourceService.findResourceById(edgeEvent.getTenantId(), tbResourceId);
if (tbResource != null) {
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
- ResourceUpdateMsg resourceUpdateMsg =
- resourceMsgConstructor.constructResourceUpdatedMsg(msgType, tbResource);
+ ResourceUpdateMsg resourceUpdateMsg = ((ResourceMsgConstructor)
+ resourceMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructResourceUpdatedMsg(msgType, tbResource);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addResourceUpdateMsg(resourceUpdateMsg)
@@ -88,8 +90,8 @@ public class ResourceEdgeProcessor extends BaseResourceProcessor {
}
break;
case DELETED:
- ResourceUpdateMsg resourceUpdateMsg =
- resourceMsgConstructor.constructResourceDeleteMsg(tbResourceId);
+ ResourceUpdateMsg resourceUpdateMsg = ((ResourceMsgConstructor)
+ resourceMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructResourceDeleteMsg(tbResourceId);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addResourceUpdateMsg(resourceUpdateMsg)
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/rule/RuleChainEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/rule/RuleChainEdgeProcessor.java
index ba6fc1ef97..c17fb8030c 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/rule/RuleChainEdgeProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/rule/RuleChainEdgeProcessor.java
@@ -28,6 +28,7 @@ import org.thingsboard.server.gen.edge.v1.RuleChainMetadataUpdateMsg;
import org.thingsboard.server.gen.edge.v1.RuleChainUpdateMsg;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.rule.RuleChainMsgConstructor;
import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
import static org.thingsboard.server.service.edge.DefaultEdgeNotificationService.EDGE_IS_ROOT_BODY_KEY;
@@ -37,7 +38,7 @@ import static org.thingsboard.server.service.edge.DefaultEdgeNotificationService
@TbCoreComponent
public class RuleChainEdgeProcessor extends BaseEdgeProcessor {
- public DownlinkMsg convertRuleChainEventToDownlink(EdgeEvent edgeEvent) {
+ public DownlinkMsg convertRuleChainEventToDownlink(EdgeEvent edgeEvent, EdgeVersion edgeVersion) {
RuleChainId ruleChainId = new RuleChainId(edgeEvent.getEntityId());
DownlinkMsg downlinkMsg = null;
switch (edgeEvent.getAction()) {
@@ -53,8 +54,9 @@ public class RuleChainEdgeProcessor extends BaseEdgeProcessor {
} catch (Exception ignored) {}
}
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
- RuleChainUpdateMsg ruleChainUpdateMsg =
- ruleChainMsgConstructor.constructRuleChainUpdatedMsg(msgType, ruleChain, isRoot);
+ RuleChainUpdateMsg ruleChainUpdateMsg = ((RuleChainMsgConstructor)
+ ruleChainMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion))
+ .constructRuleChainUpdatedMsg(msgType, ruleChain, isRoot);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addRuleChainUpdateMsg(ruleChainUpdateMsg)
@@ -65,7 +67,8 @@ public class RuleChainEdgeProcessor extends BaseEdgeProcessor {
case UNASSIGNED_FROM_EDGE:
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
- .addRuleChainUpdateMsg(ruleChainMsgConstructor.constructRuleChainDeleteMsg(ruleChainId))
+ .addRuleChainUpdateMsg(((RuleChainMsgConstructor) ruleChainMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion))
+ .constructRuleChainDeleteMsg(ruleChainId))
.build();
break;
}
@@ -79,8 +82,9 @@ public class RuleChainEdgeProcessor extends BaseEdgeProcessor {
if (ruleChain != null) {
RuleChainMetaData ruleChainMetaData = ruleChainService.loadRuleChainMetaData(edgeEvent.getTenantId(), ruleChainId);
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
- RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg =
- ruleChainMsgConstructor.constructRuleChainMetadataUpdatedMsg(edgeEvent.getTenantId(), msgType, ruleChainMetaData, edgeVersion);
+ RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg = ((RuleChainMsgConstructor)
+ ruleChainMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion))
+ .constructRuleChainMetadataUpdatedMsg(edgeEvent.getTenantId(), msgType, ruleChainMetaData, edgeVersion);
if (ruleChainMetadataUpdateMsg != null) {
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/settings/AdminSettingsEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/settings/AdminSettingsEdgeProcessor.java
index bbd9edd172..6c201a261c 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/settings/AdminSettingsEdgeProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/settings/AdminSettingsEdgeProcessor.java
@@ -23,7 +23,9 @@ import org.thingsboard.server.common.data.EdgeUtils;
import org.thingsboard.server.common.data.edge.EdgeEvent;
import org.thingsboard.server.gen.edge.v1.AdminSettingsUpdateMsg;
import org.thingsboard.server.gen.edge.v1.DownlinkMsg;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.settings.AdminSettingsMsgConstructor;
import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
@Component
@@ -31,16 +33,16 @@ import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
@TbCoreComponent
public class AdminSettingsEdgeProcessor extends BaseEdgeProcessor {
- public DownlinkMsg convertAdminSettingsEventToDownlink(EdgeEvent edgeEvent) {
+ public DownlinkMsg convertAdminSettingsEventToDownlink(EdgeEvent edgeEvent, EdgeVersion edgeVersion) {
AdminSettings adminSettings = JacksonUtil.convertValue(edgeEvent.getBody(), AdminSettings.class);
if (adminSettings == null) {
return null;
}
- AdminSettingsUpdateMsg adminSettingsUpdateMsg = adminSettingsMsgConstructor.constructAdminSettingsUpdateMsg(adminSettings);
+ AdminSettingsUpdateMsg adminSettingsUpdateMsg = ((AdminSettingsMsgConstructor)
+ adminSettingsMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructAdminSettingsUpdateMsg(adminSettings);
return DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addAdminSettingsUpdateMsg(adminSettingsUpdateMsg)
.build();
}
-
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/telemetry/BaseTelemetryProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/telemetry/BaseTelemetryProcessor.java
index 974e9267f6..9cea8050b6 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/telemetry/BaseTelemetryProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/telemetry/BaseTelemetryProcessor.java
@@ -15,7 +15,6 @@
*/
package org.thingsboard.server.service.edge.rpc.processor.telemetry;
-import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
@@ -28,7 +27,6 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import org.thingsboard.common.util.JacksonUtil;
-import org.thingsboard.server.common.msg.rule.engine.DeviceAttributesEventNotificationMsg;
import org.thingsboard.server.common.data.DataConstants;
import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.DeviceProfile;
@@ -54,7 +52,8 @@ import org.thingsboard.server.common.msg.TbMsg;
import org.thingsboard.server.common.msg.TbMsgMetaData;
import org.thingsboard.server.common.msg.queue.ServiceType;
import org.thingsboard.server.common.msg.queue.TopicPartitionInfo;
-import org.thingsboard.server.common.transport.adaptor.JsonConverter;
+import org.thingsboard.server.common.adaptor.JsonConverter;
+import org.thingsboard.server.common.msg.rule.engine.DeviceAttributesEventNotificationMsg;
import org.thingsboard.server.common.transport.util.JsonUtils;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.gen.edge.v1.AttributeDeleteMsg;
@@ -314,7 +313,7 @@ public abstract class BaseTelemetryProcessor extends BaseEdgeProcessor {
EntityType entityType,
UUID entityUUID,
EdgeEventActionType actionType,
- JsonNode body) throws JsonProcessingException {
+ JsonNode body) {
EntityId entityId;
switch (entityType) {
case DEVICE:
@@ -349,5 +348,4 @@ public abstract class BaseTelemetryProcessor extends BaseEdgeProcessor {
return bodyJackson == null ? null :
entityDataMsgConstructor.constructEntityDataMsg(tenantId, entityId, actionType, JsonParser.parseString(bodyJackson));
}
-
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/telemetry/TelemetryEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/telemetry/TelemetryEdgeProcessor.java
index 667d661d2e..af9ff3de37 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/telemetry/TelemetryEdgeProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/telemetry/TelemetryEdgeProcessor.java
@@ -15,7 +15,6 @@
*/
package org.thingsboard.server.service.edge.rpc.processor.telemetry;
-import com.fasterxml.jackson.core.JsonProcessingException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.thingsboard.server.common.data.DataConstants;
@@ -37,7 +36,7 @@ public class TelemetryEdgeProcessor extends BaseTelemetryProcessor {
return DataConstants.EDGE_MSG_SOURCE;
}
- public DownlinkMsg convertTelemetryEventToDownlink(EdgeEvent edgeEvent) throws JsonProcessingException {
+ public DownlinkMsg convertTelemetryEventToDownlink(EdgeEvent edgeEvent) {
if (edgeEvent.getBody() != null) {
String bodyStr = edgeEvent.getBody().toString();
if (bodyStr.length() > 1000) {
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/tenant/TenantEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/tenant/TenantEdgeProcessor.java
index 9fd08b4447..92b887bf33 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/tenant/TenantEdgeProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/tenant/TenantEdgeProcessor.java
@@ -29,6 +29,7 @@ import org.thingsboard.server.gen.edge.v1.TenantProfileUpdateMsg;
import org.thingsboard.server.gen.edge.v1.TenantUpdateMsg;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.tenant.TenantMsgConstructor;
import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
@Component
@@ -43,9 +44,13 @@ public class TenantEdgeProcessor extends BaseEdgeProcessor {
Tenant tenant = tenantService.findTenantById(tenantId);
if (tenant != null) {
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
- TenantUpdateMsg tenantUpdateMsg = tenantMsgConstructor.constructTenantUpdateMsg(msgType, tenant);
+ TenantUpdateMsg tenantUpdateMsg = ((TenantMsgConstructor)
+ tenantMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion))
+ .constructTenantUpdateMsg(msgType, tenant);
TenantProfile tenantProfile = tenantProfileService.findTenantProfileById(tenantId, tenant.getTenantProfileId());
- TenantProfileUpdateMsg tenantProfileUpdateMsg = tenantProfileMsgConstructor.constructTenantProfileUpdateMsg(msgType, tenantProfile, edgeVersion);
+ TenantProfileUpdateMsg tenantProfileUpdateMsg = ((TenantMsgConstructor)
+ tenantMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion))
+ .constructTenantProfileUpdateMsg(msgType, tenantProfile, edgeVersion);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addTenantUpdateMsg(tenantUpdateMsg)
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/tenant/TenantProfileEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/tenant/TenantProfileEdgeProcessor.java
index 970ea3a1f6..57c29e8632 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/tenant/TenantProfileEdgeProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/tenant/TenantProfileEdgeProcessor.java
@@ -27,6 +27,7 @@ import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.edge.v1.TenantProfileUpdateMsg;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.tenant.TenantMsgConstructor;
import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
@Component
@@ -41,8 +42,9 @@ public class TenantProfileEdgeProcessor extends BaseEdgeProcessor {
TenantProfile tenantProfile = tenantProfileService.findTenantProfileById(edgeEvent.getTenantId(), tenantProfileId);
if (tenantProfile != null) {
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
- TenantProfileUpdateMsg tenantProfileUpdateMsg =
- tenantProfileMsgConstructor.constructTenantProfileUpdateMsg(msgType, tenantProfile, edgeVersion);
+ TenantProfileUpdateMsg tenantProfileUpdateMsg = ((TenantMsgConstructor)
+ tenantMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion))
+ .constructTenantProfileUpdateMsg(msgType, tenantProfile, edgeVersion);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addTenantProfileUpdateMsg(tenantProfileUpdateMsg)
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/user/UserEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/user/UserEdgeProcessor.java
index de40fdb1a3..c07cbc9414 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/user/UserEdgeProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/user/UserEdgeProcessor.java
@@ -23,9 +23,11 @@ import org.thingsboard.server.common.data.edge.EdgeEvent;
import org.thingsboard.server.common.data.id.UserId;
import org.thingsboard.server.common.data.security.UserCredentials;
import org.thingsboard.server.gen.edge.v1.DownlinkMsg;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.gen.edge.v1.UserCredentialsUpdateMsg;
import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.user.UserMsgConstructor;
import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
@Component
@@ -33,7 +35,7 @@ import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
@TbCoreComponent
public class UserEdgeProcessor extends BaseEdgeProcessor {
- public DownlinkMsg convertUserEventToDownlink(EdgeEvent edgeEvent) {
+ public DownlinkMsg convertUserEventToDownlink(EdgeEvent edgeEvent, EdgeVersion edgeVersion) {
UserId userId = new UserId(edgeEvent.getEntityId());
DownlinkMsg downlinkMsg = null;
switch (edgeEvent.getAction()) {
@@ -44,21 +46,21 @@ public class UserEdgeProcessor extends BaseEdgeProcessor {
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
- .addUserUpdateMsg(userMsgConstructor.constructUserUpdatedMsg(msgType, user))
+ .addUserUpdateMsg(((UserMsgConstructor) userMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructUserUpdatedMsg(msgType, user))
.build();
}
break;
case DELETED:
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
- .addUserUpdateMsg(userMsgConstructor.constructUserDeleteMsg(userId))
+ .addUserUpdateMsg(((UserMsgConstructor) userMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructUserDeleteMsg(userId))
.build();
break;
case CREDENTIALS_UPDATED:
UserCredentials userCredentialsByUserId = userService.findUserCredentialsByUserId(edgeEvent.getTenantId(), userId);
if (userCredentialsByUserId != null && userCredentialsByUserId.isEnabled()) {
UserCredentialsUpdateMsg userCredentialsUpdateMsg =
- userMsgConstructor.constructUserCredentialsUpdatedMsg(userCredentialsByUserId);
+ ((UserMsgConstructor) userMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructUserCredentialsUpdatedMsg(userCredentialsByUserId);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addUserCredentialsUpdateMsg(userCredentialsUpdateMsg)
@@ -68,5 +70,4 @@ public class UserEdgeProcessor extends BaseEdgeProcessor {
}
return downlinkMsg;
}
-
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/widget/WidgetBundleEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/widget/WidgetBundleEdgeProcessor.java
index 877ece1b15..28cd3167aa 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/widget/WidgetBundleEdgeProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/widget/WidgetBundleEdgeProcessor.java
@@ -22,9 +22,11 @@ import org.thingsboard.server.common.data.edge.EdgeEvent;
import org.thingsboard.server.common.data.id.WidgetsBundleId;
import org.thingsboard.server.common.data.widget.WidgetsBundle;
import org.thingsboard.server.gen.edge.v1.DownlinkMsg;
+import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.gen.edge.v1.WidgetsBundleUpdateMsg;
import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.widget.WidgetMsgConstructor;
import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
import java.util.List;
@@ -34,7 +36,7 @@ import java.util.List;
@TbCoreComponent
public class WidgetBundleEdgeProcessor extends BaseEdgeProcessor {
- public DownlinkMsg convertWidgetsBundleEventToDownlink(EdgeEvent edgeEvent) {
+ public DownlinkMsg convertWidgetsBundleEventToDownlink(EdgeEvent edgeEvent, EdgeVersion edgeVersion) {
WidgetsBundleId widgetsBundleId = new WidgetsBundleId(edgeEvent.getEntityId());
DownlinkMsg downlinkMsg = null;
switch (edgeEvent.getAction()) {
@@ -45,7 +47,7 @@ public class WidgetBundleEdgeProcessor extends BaseEdgeProcessor {
List widgets = widgetTypeService.findWidgetFqnsByWidgetsBundleId(edgeEvent.getTenantId(), widgetsBundleId);
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
WidgetsBundleUpdateMsg widgetsBundleUpdateMsg =
- widgetsBundleMsgConstructor.constructWidgetsBundleUpdateMsg(msgType, widgetsBundle, widgets);
+ ((WidgetMsgConstructor) widgetMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructWidgetsBundleUpdateMsg(msgType, widgetsBundle, widgets);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addWidgetsBundleUpdateMsg(widgetsBundleUpdateMsg)
@@ -54,7 +56,7 @@ public class WidgetBundleEdgeProcessor extends BaseEdgeProcessor {
break;
case DELETED:
WidgetsBundleUpdateMsg widgetsBundleUpdateMsg =
- widgetsBundleMsgConstructor.constructWidgetsBundleDeleteMsg(widgetsBundleId);
+ ((WidgetMsgConstructor) widgetMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructWidgetsBundleDeleteMsg(widgetsBundleId);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addWidgetsBundleUpdateMsg(widgetsBundleUpdateMsg)
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/widget/WidgetTypeEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/widget/WidgetTypeEdgeProcessor.java
index de9617d5d7..40556b5215 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/widget/WidgetTypeEdgeProcessor.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/widget/WidgetTypeEdgeProcessor.java
@@ -26,10 +26,11 @@ import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.gen.edge.v1.WidgetTypeUpdateMsg;
import org.thingsboard.server.queue.util.TbCoreComponent;
+import org.thingsboard.server.service.edge.rpc.constructor.widget.WidgetMsgConstructor;
import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor;
-@Component
@Slf4j
+@Component
@TbCoreComponent
public class WidgetTypeEdgeProcessor extends BaseEdgeProcessor {
@@ -43,7 +44,7 @@ public class WidgetTypeEdgeProcessor extends BaseEdgeProcessor {
if (widgetTypeDetails != null) {
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
WidgetTypeUpdateMsg widgetTypeUpdateMsg =
- widgetTypeMsgConstructor.constructWidgetTypeUpdateMsg(msgType, widgetTypeDetails, edgeVersion);
+ ((WidgetMsgConstructor) widgetMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructWidgetTypeUpdateMsg(msgType, widgetTypeDetails, edgeVersion);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addWidgetTypeUpdateMsg(widgetTypeUpdateMsg)
@@ -52,7 +53,7 @@ public class WidgetTypeEdgeProcessor extends BaseEdgeProcessor {
break;
case DELETED:
WidgetTypeUpdateMsg widgetTypeUpdateMsg =
- widgetTypeMsgConstructor.constructWidgetTypeDeleteMsg(widgetTypeId);
+ ((WidgetMsgConstructor) widgetMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructWidgetTypeDeleteMsg(widgetTypeId);
downlinkMsg = DownlinkMsg.newBuilder()
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
.addWidgetTypeUpdateMsg(widgetTypeUpdateMsg)
@@ -61,5 +62,4 @@ public class WidgetTypeEdgeProcessor extends BaseEdgeProcessor {
}
return downlinkMsg;
}
-
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/sync/DefaultEdgeRequestsService.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/sync/DefaultEdgeRequestsService.java
index af9f72e819..cd23f19556 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/sync/DefaultEdgeRequestsService.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/sync/DefaultEdgeRequestsService.java
@@ -294,7 +294,7 @@ public class DefaultEdgeRequestsService implements EdgeRequestsService {
private ListenableFuture> findRelationByQuery(TenantId tenantId, Edge edge,
EntityId entityId, EntitySearchDirection direction) {
EntityRelationsQuery query = new EntityRelationsQuery();
- query.setParameters(new RelationsSearchParameters(entityId, direction, -1, false));
+ query.setParameters(new RelationsSearchParameters(entityId, direction, 1, false));
return relationService.findByQuery(tenantId, query);
}
diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/utils/EdgeVersionUtils.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/utils/EdgeVersionUtils.java
index c9e6987a23..dc66e50748 100644
--- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/utils/EdgeVersionUtils.java
+++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/utils/EdgeVersionUtils.java
@@ -24,4 +24,8 @@ public final class EdgeVersionUtils {
public static boolean isEdgeVersionOlderThan(EdgeVersion currentVersion, EdgeVersion requiredVersion) {
return currentVersion.ordinal() < requiredVersion.ordinal();
}
+
+ public static boolean isEdgeVersionOlderThan_3_6_2(EdgeVersion currentVersion) {
+ return isEdgeVersionOlderThan(currentVersion, EdgeVersion.V_3_6_2);
+ }
}
diff --git a/application/src/main/java/org/thingsboard/server/service/entitiy/DefaultTbNotificationEntityService.java b/application/src/main/java/org/thingsboard/server/service/entitiy/DefaultTbNotificationEntityService.java
index 72e8f44020..8682d18a62 100644
--- a/application/src/main/java/org/thingsboard/server/service/entitiy/DefaultTbNotificationEntityService.java
+++ b/application/src/main/java/org/thingsboard/server/service/entitiy/DefaultTbNotificationEntityService.java
@@ -112,7 +112,7 @@ public class DefaultTbNotificationEntityService implements TbNotificationEntityS
public void notifyDeleteDevice(TenantId tenantId, DeviceId deviceId, CustomerId customerId, Device device,
User user, Object... additionalInfo) {
gatewayNotificationsService.onDeviceDeleted(device);
- tbClusterService.onDeviceDeleted(device, null);
+ tbClusterService.onDeviceDeleted(tenantId, device, null);
logEntityAction(tenantId, deviceId, device, customerId, ActionType.DELETED, user, additionalInfo);
}
@@ -126,6 +126,7 @@ public class DefaultTbNotificationEntityService implements TbNotificationEntityS
@Override
public void notifyAssignDeviceToTenant(TenantId tenantId, TenantId newTenantId, DeviceId deviceId, CustomerId customerId,
Device device, Tenant tenant, User user, Object... additionalInfo) {
+ tbClusterService.onDeviceAssignedToTenant(tenantId, device);
logEntityAction(tenantId, deviceId, device, customerId, ActionType.ASSIGNED_TO_TENANT, user, additionalInfo);
pushAssignedFromNotification(tenant, newTenantId, device);
}
diff --git a/application/src/main/java/org/thingsboard/server/service/entitiy/tenant/DefaultTbTenantService.java b/application/src/main/java/org/thingsboard/server/service/entitiy/tenant/DefaultTbTenantService.java
index 19d4126989..3267ed1c17 100644
--- a/application/src/main/java/org/thingsboard/server/service/entitiy/tenant/DefaultTbTenantService.java
+++ b/application/src/main/java/org/thingsboard/server/service/entitiy/tenant/DefaultTbTenantService.java
@@ -54,6 +54,7 @@ public class DefaultTbTenantService extends AbstractTbEntityService implements T
if (created) {
installScripts.createDefaultRuleChains(savedTenant.getId());
installScripts.createDefaultEdgeRuleChains(savedTenant.getId());
+ installScripts.createDefaultTenantDashboards(savedTenant.getId(), null);
}
tenantProfileCache.evict(savedTenant.getId());
notificationEntityService.notifyCreateOrUpdateTenant(savedTenant, created ?
diff --git a/application/src/main/java/org/thingsboard/server/service/executors/PubSubRuleNodeExecutorProvider.java b/application/src/main/java/org/thingsboard/server/service/executors/PubSubRuleNodeExecutorProvider.java
new file mode 100644
index 0000000000..74e1222acf
--- /dev/null
+++ b/application/src/main/java/org/thingsboard/server/service/executors/PubSubRuleNodeExecutorProvider.java
@@ -0,0 +1,63 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.service.executors;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+import org.thingsboard.common.util.ExecutorProvider;
+import org.thingsboard.common.util.ThingsBoardThreadFactory;
+import org.thingsboard.server.queue.util.TbRuleEngineComponent;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+
+@Lazy
+@TbRuleEngineComponent
+@Component
+public class PubSubRuleNodeExecutorProvider implements ExecutorProvider {
+
+ @Value("${service.rule_engine.pubsub.executor_thread_pool_size}")
+ private Integer threadPoolSize;
+
+ /**
+ * Refers to com.google.cloud.pubsub.v1.Publisher default executor configuration
+ */
+ private static final int THREADS_PER_CPU = 5;
+ private ScheduledExecutorService executor;
+
+ @PostConstruct
+ public void init() {
+ if (threadPoolSize == null) {
+ threadPoolSize = THREADS_PER_CPU * Runtime.getRuntime().availableProcessors();
+ }
+ executor = Executors.newScheduledThreadPool(threadPoolSize, ThingsBoardThreadFactory.forName("pubsub-rule-nodes"));
+ }
+
+ @Override
+ public ScheduledExecutorService getExecutor() {
+ return executor;
+ }
+
+ @PreDestroy
+ private void destroy() {
+ if (executor != null) {
+ executor.shutdownNow();
+ }
+ }
+}
diff --git a/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java b/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java
index 3e23f9af37..072ce349e7 100644
--- a/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java
+++ b/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java
@@ -299,6 +299,15 @@ public class InstallScripts {
public void loadDashboards(TenantId tenantId, CustomerId customerId) throws Exception {
Path dashboardsDir = Paths.get(getDataDir(), JSON_DIR, DEMO_DIR, DASHBOARDS_DIR);
+ loadDashboardsFromDir(tenantId, customerId, dashboardsDir);
+ }
+
+ public void createDefaultTenantDashboards(TenantId tenantId, CustomerId customerId) throws Exception {
+ Path dashboardsDir = Paths.get(getDataDir(), JSON_DIR, TENANT_DIR, DASHBOARDS_DIR);
+ loadDashboardsFromDir(tenantId, customerId, dashboardsDir);
+ }
+
+ private void loadDashboardsFromDir(TenantId tenantId, CustomerId customerId, Path dashboardsDir) throws IOException {
try (DirectoryStream dirStream = Files.newDirectoryStream(dashboardsDir, path -> path.toString().endsWith(JSON_EXT))) {
dirStream.forEach(
path -> {
diff --git a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbClusterService.java b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbClusterService.java
index f96e49930c..14930912d1 100644
--- a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbClusterService.java
+++ b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbClusterService.java
@@ -81,7 +81,7 @@ import java.util.Set;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
-import static org.thingsboard.server.service.queue.ProtoUtils.toProto;
+import static org.thingsboard.server.common.util.ProtoUtils.toProto;
@Service
@Slf4j
@@ -308,10 +308,17 @@ public class DefaultTbClusterService implements TbClusterService {
}
@Override
- public void onDeviceDeleted(Device device, TbQueueCallback callback) {
- broadcastEntityDeleteToTransport(device.getTenantId(), device.getId(), device.getName(), callback);
- sendDeviceStateServiceEvent(device.getTenantId(), device.getId(), false, false, true);
- broadcastEntityStateChangeEvent(device.getTenantId(), device.getId(), ComponentLifecycleEvent.DELETED);
+ public void onDeviceDeleted(TenantId tenantId, Device device, TbQueueCallback callback) {
+ DeviceId deviceId = device.getId();
+ broadcastEntityDeleteToTransport(tenantId, deviceId, device.getName(), callback);
+ sendDeviceStateServiceEvent(tenantId, deviceId, false, false, true);
+ broadcastEntityStateChangeEvent(tenantId, deviceId, ComponentLifecycleEvent.DELETED);
+ }
+
+ @Override
+ public void onDeviceAssignedToTenant(TenantId oldTenantId, Device device) {
+ onDeviceDeleted(oldTenantId, device, null);
+ sendDeviceStateServiceEvent(device.getTenantId(), device.getId(), true, false, false);
}
@Override
diff --git a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java
index 754537ef11..1511e227d5 100644
--- a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java
+++ b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java
@@ -45,6 +45,7 @@ import org.thingsboard.server.common.msg.queue.ServiceType;
import org.thingsboard.server.common.msg.queue.TbCallback;
import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponse;
import org.thingsboard.server.common.stats.StatsFactory;
+import org.thingsboard.server.common.util.ProtoUtils;
import org.thingsboard.server.dao.tenant.TbTenantProfileCache;
import org.thingsboard.server.gen.transport.TransportProtos;
import org.thingsboard.server.gen.transport.TransportProtos.DeviceStateServiceMsgProto;
diff --git a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbRuleEngineConsumerService.java b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbRuleEngineConsumerService.java
index 12fa5d3f27..273d7afc97 100644
--- a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbRuleEngineConsumerService.java
+++ b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbRuleEngineConsumerService.java
@@ -28,6 +28,7 @@ import org.thingsboard.server.common.data.rpc.RpcError;
import org.thingsboard.server.common.msg.queue.ServiceType;
import org.thingsboard.server.common.msg.queue.TbCallback;
import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponse;
+import org.thingsboard.server.common.util.ProtoUtils;
import org.thingsboard.server.dao.queue.QueueService;
import org.thingsboard.server.dao.tenant.TbTenantProfileCache;
import org.thingsboard.server.gen.transport.TransportProtos;
diff --git a/application/src/main/java/org/thingsboard/server/service/security/auth/oauth2/HttpCookieOAuth2AuthorizationRequestRepository.java b/application/src/main/java/org/thingsboard/server/service/security/auth/oauth2/HttpCookieOAuth2AuthorizationRequestRepository.java
index d63f759dd3..98ccb2c1be 100644
--- a/application/src/main/java/org/thingsboard/server/service/security/auth/oauth2/HttpCookieOAuth2AuthorizationRequestRepository.java
+++ b/application/src/main/java/org/thingsboard/server/service/security/auth/oauth2/HttpCookieOAuth2AuthorizationRequestRepository.java
@@ -18,11 +18,13 @@ package org.thingsboard.server.service.security.auth.oauth2;
import org.springframework.security.oauth2.client.web.AuthorizationRequestRepository;
import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest;
import org.springframework.stereotype.Component;
+import org.thingsboard.server.queue.util.TbCoreComponent;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
+@TbCoreComponent
public class HttpCookieOAuth2AuthorizationRequestRepository implements AuthorizationRequestRepository {
public static final String OAUTH2_AUTHORIZATION_REQUEST_COOKIE_NAME = "oauth2_auth_request";
public static final String PREV_URI_PARAMETER = "prevUri";
diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/csv/AbstractBulkImportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/csv/AbstractBulkImportService.java
index c03dd8dcb7..30765bd959 100644
--- a/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/csv/AbstractBulkImportService.java
+++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/csv/AbstractBulkImportService.java
@@ -47,7 +47,7 @@ import org.thingsboard.server.common.data.sync.ie.importing.csv.BulkImportColumn
import org.thingsboard.server.common.data.sync.ie.importing.csv.BulkImportRequest;
import org.thingsboard.server.common.data.sync.ie.importing.csv.BulkImportResult;
import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration;
-import org.thingsboard.server.common.transport.adaptor.JsonConverter;
+import org.thingsboard.server.common.adaptor.JsonConverter;
import org.thingsboard.server.controller.BaseController;
import org.thingsboard.server.dao.tenant.TbTenantProfileCache;
import org.thingsboard.server.service.action.EntityActionService;
diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml
index ecc89c84c5..d72e73b813 100644
--- a/application/src/main/resources/thingsboard.yml
+++ b/application/src/main/resources/thingsboard.yml
@@ -1414,6 +1414,8 @@ queue:
max_msg_size: "${TB_QUEUE_PUBSUB_MAX_MSG_SIZE:1048576}"
# Number of messages per consumer
max_messages: "${TB_QUEUE_PUBSUB_MAX_MESSAGES:1000}"
+ # Thread pool size for pubsub queue executor provider. If set to 0 - default pubsub executor provider value will be used (5 * number of available processors)
+ executor_thread_pool_size: "${TB_QUEUE_PUBSUB_EXECUTOR_THREAD_POOL_SIZE:0}"
queue-properties:
# Pub/Sub properties for Rule Engine subscribers, messages which will commit after ackDeadlineInSec period can be consumed again
rule-engine: "${TB_QUEUE_PUBSUB_RE_QUEUE_PROPERTIES:ackDeadlineInSec:30;messageRetentionInSec:604800}"
@@ -1642,6 +1644,9 @@ service:
# Comma-separated list of tenant profile ids assigned to this Rule Engine.
# This Rule Engine will only be responsible for tenants with these profiles (in case 'isolation' option is enabled in the profile).
assigned_tenant_profiles: "${TB_RULE_ENGINE_ASSIGNED_TENANT_PROFILES:}"
+ pubsub:
+ # Thread pool size for pubsub rule node executor provider. If not set - default pubsub executor provider value will be used (5 * number of available processors)
+ executor_thread_pool_size: "${TB_RULE_ENGINE_PUBSUB_EXECUTOR_THREAD_POOL_SIZE:0}"
# Metrics parameters
metrics:
diff --git a/application/src/test/java/org/thingsboard/server/controller/DashboardControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/DashboardControllerTest.java
index 6f0d6f9465..fb8064d6d5 100644
--- a/application/src/test/java/org/thingsboard/server/controller/DashboardControllerTest.java
+++ b/application/src/test/java/org/thingsboard/server/controller/DashboardControllerTest.java
@@ -327,7 +327,18 @@ public class DashboardControllerTest extends AbstractControllerTest {
@Test
public void testFindTenantDashboards() throws Exception {
- List dashboards = new ArrayList<>();
+ List expectedDashboards = new ArrayList<>();
+ PageLink pageLink = new PageLink(24);
+ PageData pageData = null;
+ do {
+ pageData = doGetTypedWithPageLink("/api/tenant/dashboards?",
+ new TypeReference>() {
+ }, pageLink);
+ expectedDashboards.addAll(pageData.getData());
+ if (pageData.hasNext()) {
+ pageLink = pageLink.nextPageLink();
+ }
+ } while (pageData.hasNext());
Mockito.reset(tbClusterService, auditLogService);
@@ -335,7 +346,7 @@ public class DashboardControllerTest extends AbstractControllerTest {
for (int i = 0; i < cntEntity; i++) {
Dashboard dashboard = new Dashboard();
dashboard.setTitle("Dashboard" + i);
- dashboards.add(new DashboardInfo(doPost("/api/dashboard", dashboard, Dashboard.class)));
+ expectedDashboards.add(new DashboardInfo(doPost("/api/dashboard", dashboard, Dashboard.class)));
}
testNotifyManyEntityManyTimeMsgToEdgeServiceEntityEqAny(new Dashboard(), new Dashboard(),
@@ -343,8 +354,6 @@ public class DashboardControllerTest extends AbstractControllerTest {
ActionType.ADDED, cntEntity, cntEntity, cntEntity);
List loadedDashboards = new ArrayList<>();
- PageLink pageLink = new PageLink(24);
- PageData pageData = null;
do {
pageData = doGetTypedWithPageLink("/api/tenant/dashboards?",
new TypeReference>() {
@@ -355,10 +364,10 @@ public class DashboardControllerTest extends AbstractControllerTest {
}
} while (pageData.hasNext());
- dashboards.sort(idComparator);
+ expectedDashboards.sort(idComparator);
loadedDashboards.sort(idComparator);
- Assert.assertEquals(dashboards, loadedDashboards);
+ Assert.assertEquals(expectedDashboards, loadedDashboards);
}
@Test
diff --git a/application/src/test/java/org/thingsboard/server/controller/DeviceConnectivityControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/DeviceConnectivityControllerTest.java
index 227d37f483..f517d2e9c5 100644
--- a/application/src/test/java/org/thingsboard/server/controller/DeviceConnectivityControllerTest.java
+++ b/application/src/test/java/org/thingsboard/server/controller/DeviceConnectivityControllerTest.java
@@ -18,8 +18,6 @@ package org.thingsboard.server.controller;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.common.util.concurrent.MoreExecutors;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
@@ -32,7 +30,6 @@ import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestPropertySource;
import org.thingsboard.common.util.JacksonUtil;
-import org.thingsboard.common.util.ThingsBoardExecutors;
import org.thingsboard.server.common.data.AdminSettings;
import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.DeviceProfile;
@@ -46,7 +43,6 @@ import org.thingsboard.server.common.data.device.profile.DefaultDeviceProfileCon
import org.thingsboard.server.common.data.device.profile.DeviceProfileData;
import org.thingsboard.server.common.data.device.profile.MqttDeviceProfileTransportConfiguration;
import org.thingsboard.server.common.data.id.DeviceProfileId;
-import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.security.Authority;
import org.thingsboard.server.common.data.security.DeviceCredentials;
import org.thingsboard.server.common.data.security.DeviceCredentialsType;
@@ -58,14 +54,16 @@ import java.nio.file.Path;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+import static org.thingsboard.server.dao.util.DeviceConnectivityUtil.CA_ROOT_CERT_PEM;
import static org.thingsboard.server.dao.util.DeviceConnectivityUtil.COAP;
import static org.thingsboard.server.dao.util.DeviceConnectivityUtil.COAPS;
import static org.thingsboard.server.dao.util.DeviceConnectivityUtil.DOCKER;
import static org.thingsboard.server.dao.util.DeviceConnectivityUtil.HTTP;
import static org.thingsboard.server.dao.util.DeviceConnectivityUtil.HTTPS;
+import static org.thingsboard.server.dao.util.DeviceConnectivityUtil.LINUX;
import static org.thingsboard.server.dao.util.DeviceConnectivityUtil.MQTT;
import static org.thingsboard.server.dao.util.DeviceConnectivityUtil.MQTTS;
-import static org.thingsboard.server.dao.util.DeviceConnectivityUtil.CA_ROOT_CERT_PEM;
+import static org.thingsboard.server.dao.util.DeviceConnectivityUtil.WINDOWS;
@TestPropertySource(properties = {
"device.connectivity.mqtts.pem_cert_file=/tmp/" + CA_ROOT_CERT_PEM
@@ -294,6 +292,140 @@ public class DeviceConnectivityControllerTest extends AbstractControllerTest {
DEVICE_TELEMETRY_TOPIC, credentials.getCredentialsId()));
}
+ @Test
+ public void testFetchGatewayLaunchCommands() throws Exception {
+ Device device = new Device();
+ device.setName("My device");
+ device.setType("default");
+ ObjectNode additionalInfo = JacksonUtil.newObjectNode();
+ additionalInfo.put("gateway", true);
+ device.setAdditionalInfo(additionalInfo);
+ Device savedDevice = doPost("/api/device", device, Device.class);
+ DeviceCredentials credentials =
+ doGet("/api/device/" + savedDevice.getId().getId() + "/credentials", DeviceCredentials.class);
+
+ JsonNode commands =
+ doGetTyped("/api/device-connectivity/gateway-launch/" + savedDevice.getId().getId(), new TypeReference<>() {
+ });
+
+ JsonNode dockerMqttCommands = commands.get(MQTT);
+ assertThat(dockerMqttCommands.get(LINUX).asText()).isEqualTo(String.format("docker run -it -v ~/.tb-gateway/logs:/thingsboard_gateway/logs -v ~/.tb-gateway/extensions:/thingsboard_gateway/extensions -v ~/.tb-gateway/config:/thingsboard_gateway/config --network=host -p 5000:5000 --name tbGatewayLocalhost -e host=localhost -e port=1883 -e accessToken=%s --restart always thingsboard/tb-gateway", credentials.getCredentialsId()));
+ assertThat(dockerMqttCommands.get(WINDOWS).asText()).isEqualTo("docker run -it -v %HOMEPATH%/tb-gateway/logs:/thingsboard_gateway/logs -v %HOMEPATH%/tb-gateway/extensions:/thingsboard_gateway/extensions -v %HOMEPATH%/tb-gateway/config:/thingsboard_gateway/config --network=host -p 5000:5000 --name tbGatewayLocalhost -e host=localhost -e port=1883 -e accessToken=" + credentials.getCredentialsId() + " --restart always thingsboard/tb-gateway");
+
+ JsonNode dockerMqttsCommands = commands.get(MQTTS);
+ assertThat(dockerMqttsCommands.get(LINUX).asText()).isEqualTo(String.format("docker run -it -v ~/.tb-gateway/logs:/thingsboard_gateway/logs -v ~/.tb-gateway/extensions:/thingsboard_gateway/extensions -v ~/.tb-gateway/config:/thingsboard_gateway/config --network=host -p 5000:5000 --name tbGatewayLocalhost -e host=localhost -e port=8883 -e accessToken=%s --restart always thingsboard/tb-gateway", credentials.getCredentialsId()));
+ assertThat(dockerMqttsCommands.get(WINDOWS).asText()).isEqualTo("docker run -it -v %HOMEPATH%/tb-gateway/logs:/thingsboard_gateway/logs -v %HOMEPATH%/tb-gateway/extensions:/thingsboard_gateway/extensions -v %HOMEPATH%/tb-gateway/config:/thingsboard_gateway/config --network=host -p 5000:5000 --name tbGatewayLocalhost -e host=localhost -e port=8883 -e accessToken=" + credentials.getCredentialsId() + " --restart always thingsboard/tb-gateway");
+ }
+
+ @Test
+ public void testFetchPublishTelemetryCommandsForDeviceWithIpV6LocalhostAddress() throws Exception {
+ loginSysAdmin();
+ setConnectivityHost("::1");
+ loginTenantAdmin();
+
+ Device device = new Device();
+ device.setName("My device");
+ device.setType("default");
+ Device savedDevice = doPost("/api/device", device, Device.class);
+ DeviceCredentials credentials =
+ doGet("/api/device/" + savedDevice.getId().getId() + "/credentials", DeviceCredentials.class);
+
+ JsonNode commands =
+ doGetTyped("/api/device-connectivity/" + savedDevice.getId().getId(), new TypeReference<>() {
+ });
+
+ assertThat(commands).hasSize(3);
+ JsonNode httpCommands = commands.get(HTTP);
+ assertThat(httpCommands.get(HTTP).asText()).isEqualTo(String.format("curl -v -X POST http://[::1]:8080/api/v1/%s/telemetry " +
+ "--header Content-Type:application/json --data \"{temperature:25}\"",
+ credentials.getCredentialsId()));
+ assertThat(httpCommands.get(HTTPS).asText()).isEqualTo(String.format("curl -v -X POST https://[::1]/api/v1/%s/telemetry " +
+ "--header Content-Type:application/json --data \"{temperature:25}\"",
+ credentials.getCredentialsId()));
+
+ JsonNode mqttCommands = commands.get(MQTT);
+ assertThat(mqttCommands.get(MQTT).asText()).isEqualTo(String.format("mosquitto_pub -d -q 1 -h ::1 -p 1883 -t v1/devices/me/telemetry " +
+ "-u \"%s\" -m \"{temperature:25}\"", credentials.getCredentialsId()));
+ assertThat(mqttCommands.get(MQTTS).get(0).asText()).isEqualTo("curl -f -S -o ca-root.pem http://localhost:80/api/device-connectivity/mqtts/certificate/download");
+ assertThat(mqttCommands.get(MQTTS).get(1).asText()).isEqualTo(String.format("mosquitto_pub -d -q 1 --cafile ca-root.pem -h ::1 -p 8883 " +
+ "-t v1/devices/me/telemetry -u \"%s\" -m \"{temperature:25}\"", credentials.getCredentialsId()));
+
+ JsonNode dockerMqttCommands = commands.get(MQTT).get(DOCKER);
+ assertThat(dockerMqttCommands.get(MQTT).asText()).isEqualTo(String.format("docker run --rm -it --network=host thingsboard/mosquitto-clients mosquitto_pub -d -q 1 -h ::1" +
+ " -p 1883 -t v1/devices/me/telemetry -u \"%s\" -m \"{temperature:25}\"", credentials.getCredentialsId()));
+ assertThat(dockerMqttCommands.get(MQTTS).asText()).isEqualTo(String.format("docker run --rm -it --network=host thingsboard/mosquitto-clients " +
+ "/bin/sh -c \"curl -f -S -o ca-root.pem http://localhost:80/api/device-connectivity/mqtts/certificate/download && " +
+ "mosquitto_pub -d -q 1 --cafile ca-root.pem -h ::1 -p 8883 -t v1/devices/me/telemetry -u \"%s\" -m \"{temperature:25}\"\"",
+ credentials.getCredentialsId()));
+
+ JsonNode linuxCoapCommands = commands.get(COAP);
+ assertThat(linuxCoapCommands.get(COAP).asText()).isEqualTo(String.format("coap-client -v 6 -m POST coap://[::1]:5683/api/v1/%s/telemetry " +
+ "-t json -e \"{temperature:25}\"", credentials.getCredentialsId()));
+ assertThat(linuxCoapCommands.get(COAPS).asText()).isEqualTo(String.format("coap-client-openssl -v 6 -m POST coaps://[::1]:5684/api/v1/%s/telemetry" +
+ " -t json -e \"{temperature:25}\"", credentials.getCredentialsId()));
+
+ JsonNode dockerCoapCommands = commands.get(COAP).get(DOCKER);
+ assertThat(dockerCoapCommands.get(COAP).asText()).isEqualTo(String.format("docker run --rm -it --network=host" +
+ " thingsboard/coap-clients coap-client -v 6 -m POST coap://[::1]:5683/api/v1/%s/telemetry -t json -e \"{temperature:25}\"", credentials.getCredentialsId()));
+ assertThat(dockerCoapCommands.get(COAPS).asText()).isEqualTo(String.format("docker run --rm -it --network=host" +
+ " thingsboard/coap-clients coap-client-openssl -v 6 -m POST coaps://[::1]:5684/api/v1/%s/telemetry -t json -e \"{temperature:25}\"", credentials.getCredentialsId()));
+ }
+
+ @Test
+ public void testFetchPublishTelemetryCommandsForDeviceWithIpV6Address() throws Exception {
+
+ loginSysAdmin();
+ setConnectivityHost("1:1:1:1:1:1:1:1");
+ loginTenantAdmin();
+
+ Device device = new Device();
+ device.setName("My device");
+ device.setType("default");
+ Device savedDevice = doPost("/api/device", device, Device.class);
+ DeviceCredentials credentials =
+ doGet("/api/device/" + savedDevice.getId().getId() + "/credentials", DeviceCredentials.class);
+
+ JsonNode commands =
+ doGetTyped("/api/device-connectivity/" + savedDevice.getId().getId(), new TypeReference<>() {
+ });
+ assertThat(commands).hasSize(3);
+ JsonNode httpCommands = commands.get(HTTP);
+ assertThat(httpCommands.get(HTTP).asText()).isEqualTo(String.format("curl -v -X POST http://[1:1:1:1:1:1:1:1]:8080/api/v1/%s/telemetry " +
+ "--header Content-Type:application/json --data \"{temperature:25}\"",
+ credentials.getCredentialsId()));
+ assertThat(httpCommands.get(HTTPS).asText()).isEqualTo(String.format("curl -v -X POST https://[1:1:1:1:1:1:1:1]/api/v1/%s/telemetry " +
+ "--header Content-Type:application/json --data \"{temperature:25}\"",
+ credentials.getCredentialsId()));
+
+ JsonNode mqttCommands = commands.get(MQTT);
+ assertThat(mqttCommands.get(MQTT).asText()).isEqualTo(String.format("mosquitto_pub -d -q 1 -h 1:1:1:1:1:1:1:1 -p 1883 -t v1/devices/me/telemetry " +
+ "-u \"%s\" -m \"{temperature:25}\"", credentials.getCredentialsId()));
+ assertThat(mqttCommands.get(MQTTS).get(0).asText()).isEqualTo("curl -f -S -o ca-root.pem http://localhost:80/api/device-connectivity/mqtts/certificate/download");
+ assertThat(mqttCommands.get(MQTTS).get(1).asText()).isEqualTo(String.format("mosquitto_pub -d -q 1 --cafile ca-root.pem -h 1:1:1:1:1:1:1:1 -p 8883 " +
+ "-t v1/devices/me/telemetry -u \"%s\" -m \"{temperature:25}\"", credentials.getCredentialsId()));
+
+ JsonNode dockerMqttCommands = commands.get(MQTT).get(DOCKER);
+ assertThat(dockerMqttCommands.get(MQTT).asText()).isEqualTo(String.format("docker run --rm -it thingsboard/mosquitto-clients mosquitto_pub -d -q 1 -h 1:1:1:1:1:1:1:1" +
+ " -p 1883 -t v1/devices/me/telemetry -u \"%s\" -m \"{temperature:25}\"", credentials.getCredentialsId()));
+ assertThat(dockerMqttCommands.get(MQTTS).asText()).isEqualTo(String.format("docker run --rm -it thingsboard/mosquitto-clients " +
+ "/bin/sh -c \"curl -f -S -o ca-root.pem http://localhost:80/api/device-connectivity/mqtts/certificate/download && " +
+ "mosquitto_pub -d -q 1 --cafile ca-root.pem -h 1:1:1:1:1:1:1:1 -p 8883 -t v1/devices/me/telemetry -u \"%s\" -m \"{temperature:25}\"\"",
+ credentials.getCredentialsId()));
+
+ JsonNode linuxCoapCommands = commands.get(COAP);
+ assertThat(linuxCoapCommands.get(COAP).asText()).isEqualTo(String.format("coap-client -v 6 -m POST coap://[1:1:1:1:1:1:1:1]:5683/api/v1/%s/telemetry " +
+ "-t json -e \"{temperature:25}\"", credentials.getCredentialsId()));
+ assertThat(linuxCoapCommands.get(COAPS).asText()).isEqualTo(String.format("coap-client-openssl -v 6 -m POST coaps://[1:1:1:1:1:1:1:1]:5684/api/v1/%s/telemetry" +
+ " -t json -e \"{temperature:25}\"", credentials.getCredentialsId()));
+
+ JsonNode dockerCoapCommands = commands.get(COAP).get(DOCKER);
+ assertThat(dockerCoapCommands.get(COAP).asText()).isEqualTo(String.format("docker run --rm -it" +
+ " thingsboard/coap-clients coap-client -v 6 -m POST coap://[1:1:1:1:1:1:1:1]:5683/api/v1/%s/telemetry -t json -e \"{temperature:25}\"", credentials.getCredentialsId()));
+ assertThat(dockerCoapCommands.get(COAPS).asText()).isEqualTo(String.format("docker run --rm -it" +
+ " thingsboard/coap-clients coap-client-openssl -v 6 -m POST coaps://[1:1:1:1:1:1:1:1]:5684/api/v1/%s/telemetry -t json -e \"{temperature:25}\"", credentials.getCredentialsId()));
+
+ }
+
@Test
public void testFetchPublishTelemetryCommandsForDeviceWithMqttBasicCreds() throws Exception {
Device device = new Device();
@@ -518,47 +650,7 @@ public class DeviceConnectivityControllerTest extends AbstractControllerTest {
public void testFetchPublishTelemetryCommandsForDefaultDeviceIfHostIsNotLocalhost() throws Exception {
loginSysAdmin();
- ObjectNode config = JacksonUtil.newObjectNode();
-
- ObjectNode http = JacksonUtil.newObjectNode();
- http.put("enabled", true);
- http.put("host", "test.domain");
- http.put("port", 8080);
- config.set("http", http);
-
- ObjectNode https = JacksonUtil.newObjectNode();
- https.put("enabled", true);
- https.put("host", "test.domain");
- https.put("port", 443);
- config.set("https", https);
-
- ObjectNode mqtt = JacksonUtil.newObjectNode();
- mqtt.put("enabled", true);
- mqtt.put("host", "test.domain");
- mqtt.put("port", 1883);
- config.set("mqtt", mqtt);
-
- ObjectNode mqtts = JacksonUtil.newObjectNode();
- mqtts.put("enabled", true);
- mqtts.put("host", "test.domain");
- mqtts.put("port", 8883);
- config.set("mqtts", mqtts);
-
- ObjectNode coap = JacksonUtil.newObjectNode();
- coap.put("enabled", true);
- coap.put("host", "test.domain");
- coap.put("port", 5683);
- config.set("coap", coap);
-
- ObjectNode coaps = JacksonUtil.newObjectNode();
- coaps.put("enabled", true);
- coaps.put("host", "test.domain");
- coaps.put("port", 5684);
- config.set("coaps", coaps);
-
- AdminSettings adminSettings = doGet("/api/admin/settings/connectivity", AdminSettings.class);
- adminSettings.setJsonValue(config);
- doPost("/api/admin/settings", adminSettings).andExpect(status().isOk());
+ setConnectivityHost("test.domain");
login("tenant2@thingsboard.org", "testPassword1");
@@ -612,4 +704,49 @@ public class DeviceConnectivityControllerTest extends AbstractControllerTest {
assertThat(dockerCoapCommands.get(COAPS).asText()).isEqualTo(String.format("docker run --rm -it " +
"thingsboard/coap-clients coap-client-openssl -v 6 -m POST coaps://test.domain:5684/api/v1/%s/telemetry -t json -e \"{temperature:25}\"", credentials.getCredentialsId()));
}
+
+
+ private void setConnectivityHost(String host) throws Exception {
+ ObjectNode config = JacksonUtil.newObjectNode();
+
+ ObjectNode http = JacksonUtil.newObjectNode();
+ http.put("enabled", true);
+ http.put("host", host);
+ http.put("port", 8080);
+ config.set("http", http);
+
+ ObjectNode https = JacksonUtil.newObjectNode();
+ https.put("enabled", true);
+ https.put("host", host);
+ https.put("port", 443);
+ config.set("https", https);
+
+ ObjectNode mqtt = JacksonUtil.newObjectNode();
+ mqtt.put("enabled", true);
+ mqtt.put("host", host);
+ mqtt.put("port", 1883);
+ config.set("mqtt", mqtt);
+
+ ObjectNode mqtts = JacksonUtil.newObjectNode();
+ mqtts.put("enabled", true);
+ mqtts.put("host", host);
+ mqtts.put("port", 8883);
+ config.set("mqtts", mqtts);
+
+ ObjectNode coap = JacksonUtil.newObjectNode();
+ coap.put("enabled", true);
+ coap.put("host", host);
+ coap.put("port", 5683);
+ config.set("coap", coap);
+
+ ObjectNode coaps = JacksonUtil.newObjectNode();
+ coaps.put("enabled", true);
+ coaps.put("host", host);
+ coaps.put("port", 5684);
+ config.set("coaps", coaps);
+
+ AdminSettings adminSettings = doGet("/api/admin/settings/connectivity", AdminSettings.class);
+ adminSettings.setJsonValue(config);
+ doPost("/api/admin/settings", adminSettings).andExpect(status().isOk());
+ }
}
diff --git a/application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java
index 778a11a552..7cafe2bbcb 100644
--- a/application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java
+++ b/application/src/test/java/org/thingsboard/server/controller/DeviceControllerTest.java
@@ -28,12 +28,14 @@ import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.mockito.AdditionalAnswers;
+import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.test.context.ContextConfiguration;
+import org.testcontainers.shaded.org.awaitility.Awaitility;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.common.util.ThingsBoardExecutors;
import org.thingsboard.server.common.data.Customer;
@@ -51,7 +53,6 @@ import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.alarm.Alarm;
import org.thingsboard.server.common.data.alarm.AlarmInfo;
import org.thingsboard.server.common.data.alarm.AlarmSeverity;
-import org.thingsboard.server.common.data.asset.Asset;
import org.thingsboard.server.common.data.audit.ActionType;
import org.thingsboard.server.common.data.edge.Edge;
import org.thingsboard.server.common.data.id.CustomerId;
@@ -73,7 +74,9 @@ import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.exception.DeviceCredentialsValidationException;
import org.thingsboard.server.dao.model.ModelConstants;
import org.thingsboard.server.dao.service.DaoSqlTest;
+import org.thingsboard.server.gen.transport.TransportProtos;
import org.thingsboard.server.service.gateway_device.GatewayNotificationsService;
+import org.thingsboard.server.service.state.DeviceStateService;
import java.util.ArrayList;
import java.util.List;
@@ -82,6 +85,7 @@ import java.util.concurrent.TimeUnit;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.Matchers.containsString;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@@ -106,6 +110,9 @@ public class DeviceControllerTest extends AbstractControllerTest {
@SpyBean
private GatewayNotificationsService gatewayNotificationsService;
+ @SpyBean
+ private DeviceStateService deviceStateService;
+
@Autowired
private DeviceDao deviceDao;
@@ -1340,6 +1347,28 @@ public class DeviceControllerTest extends AbstractControllerTest {
ActionType.ASSIGNED_TO_TENANT, savedDifferentTenant.getId().getId().toString(), savedDifferentTenant.getTitle());
testNotificationUpdateGatewayNever();
+ ArgumentCaptor protoCaptor = ArgumentCaptor.forClass(TransportProtos.DeviceStateServiceMsgProto.class);
+
+ Awaitility.await().atMost(5, TimeUnit.SECONDS).until(() -> {
+ Mockito.verify(deviceStateService, Mockito.atLeastOnce()).onQueueMsg(protoCaptor.capture(), any());
+ return protoCaptor.getAllValues().stream().anyMatch(proto ->
+ proto.getTenantIdMSB() == savedTenant.getUuidId().getMostSignificantBits() &&
+ proto.getTenantIdLSB() == savedTenant.getUuidId().getLeastSignificantBits() &&
+ proto.getDeviceIdMSB() == savedDevice.getUuidId().getMostSignificantBits() &&
+ proto.getDeviceIdLSB() == savedDevice.getUuidId().getLeastSignificantBits() &&
+ proto.getDeleted());
+ });
+
+ Awaitility.await().atMost(5, TimeUnit.SECONDS).until(() -> {
+ Mockito.verify(deviceStateService, Mockito.atLeastOnce()).onQueueMsg(protoCaptor.capture(), any());
+ return protoCaptor.getAllValues().stream().anyMatch(proto ->
+ proto.getTenantIdMSB() == savedDifferentTenant.getUuidId().getMostSignificantBits() &&
+ proto.getTenantIdLSB() == savedDifferentTenant.getUuidId().getLeastSignificantBits() &&
+ proto.getDeviceIdMSB() == savedDevice.getUuidId().getMostSignificantBits() &&
+ proto.getDeviceIdLSB() == savedDevice.getUuidId().getLeastSignificantBits() &&
+ proto.getAdded());
+ });
+
login("tenant9@thingsboard.org", "testPassword1");
Device foundDevice1 = doGet("/api/device/" + assignedDevice.getId().getId(), Device.class);
diff --git a/application/src/test/java/org/thingsboard/server/controller/EdgeControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/EdgeControllerTest.java
index 836b5903a5..cacc5b86c8 100644
--- a/application/src/test/java/org/thingsboard/server/controller/EdgeControllerTest.java
+++ b/application/src/test/java/org/thingsboard/server/controller/EdgeControllerTest.java
@@ -39,14 +39,18 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestPropertySource;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.common.util.ThingsBoardExecutors;
+import org.thingsboard.server.common.data.AdminSettings;
import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.DataConstants;
import org.thingsboard.server.common.data.Device;
+import org.thingsboard.server.common.data.DeviceProfile;
import org.thingsboard.server.common.data.EntitySubtype;
import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.Tenant;
+import org.thingsboard.server.common.data.TenantProfile;
import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.asset.Asset;
+import org.thingsboard.server.common.data.asset.AssetProfile;
import org.thingsboard.server.common.data.audit.ActionType;
import org.thingsboard.server.common.data.edge.Edge;
import org.thingsboard.server.common.data.id.CustomerId;
@@ -55,6 +59,8 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.TenantProfileId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
+import org.thingsboard.server.common.data.queue.Queue;
+import org.thingsboard.server.common.data.rule.RuleChain;
import org.thingsboard.server.common.data.security.Authority;
import org.thingsboard.server.common.data.security.model.JwtSettings;
import org.thingsboard.server.dao.edge.EdgeDao;
@@ -83,7 +89,6 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
-import java.util.UUID;
import java.util.concurrent.TimeUnit;
import static org.hamcrest.Matchers.containsString;
@@ -209,15 +214,13 @@ public class EdgeControllerTest extends AbstractControllerTest {
@Test
public void testFindEdgeTypesByTenantId() throws Exception {
- List edges = new ArrayList<>();
-
int cntEntity = 3;
Mockito.reset(tbClusterService, auditLogService);
for (int i = 0; i < cntEntity; i++) {
Edge edge = constructEdge("My edge B" + i, "typeB");
- edges.add(doPost("/api/edge", edge, Edge.class));
+ doPost("/api/edge", edge, Edge.class);
}
testNotifyManyEntityManyTimeMsgToEdgeServiceNeverAdditionalInfoAny(new Edge(), new Edge(),
@@ -226,11 +229,11 @@ public class EdgeControllerTest extends AbstractControllerTest {
for (int i = 0; i < 7; i++) {
Edge edge = constructEdge("My edge C" + i, "typeC");
- edges.add(doPost("/api/edge", edge, Edge.class));
+ doPost("/api/edge", edge, Edge.class);
}
for (int i = 0; i < 9; i++) {
Edge edge = constructEdge("My edge A" + i, "typeA");
- edges.add(doPost("/api/edge", edge, Edge.class));
+ doPost("/api/edge", edge, Edge.class);
}
List edgeTypes = doGetTyped("/api/edge/types",
new TypeReference<>() {
@@ -400,7 +403,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
List edges = new ArrayList<>(Futures.allAsList(futures).get(TIMEOUT, TimeUnit.SECONDS));
List loadedEdges = new ArrayList<>();
PageLink pageLink = new PageLink(23);
- PageData pageData = null;
+ PageData pageData;
do {
pageData = doGetTypedWithPageLink("/api/tenant/edges?",
new TypeReference<>() {
@@ -447,10 +450,10 @@ public class EdgeControllerTest extends AbstractControllerTest {
List loadedEdgesTitle1 = new ArrayList<>();
PageLink pageLink = new PageLink(15, 0, title1);
- PageData pageData = null;
+ PageData pageData;
do {
pageData = doGetTypedWithPageLink("/api/tenant/edges?",
- new TypeReference>() {
+ new TypeReference<>() {
}, pageLink);
loadedEdgesTitle1.addAll(pageData.getData());
if (pageData.hasNext()) {
@@ -467,7 +470,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
pageLink = new PageLink(4, 0, title2);
do {
pageData = doGetTypedWithPageLink("/api/tenant/edges?",
- new TypeReference>() {
+ new TypeReference<>() {
}, pageLink);
loadedEdgesTitle2.addAll(pageData.getData());
if (pageData.hasNext()) {
@@ -537,10 +540,10 @@ public class EdgeControllerTest extends AbstractControllerTest {
List loadedEdgesType1 = new ArrayList<>();
PageLink pageLink = new PageLink(15);
- PageData pageData = null;
+ PageData pageData;
do {
pageData = doGetTypedWithPageLink("/api/tenant/edges?type={type}&",
- new TypeReference>() {
+ new TypeReference<>() {
}, pageLink, type1);
loadedEdgesType1.addAll(pageData.getData());
if (pageData.hasNext()) {
@@ -557,7 +560,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
pageLink = new PageLink(4);
do {
pageData = doGetTypedWithPageLink("/api/tenant/edges?type={type}&",
- new TypeReference>() {
+ new TypeReference<>() {
}, pageLink, type2);
loadedEdgesType2.addAll(pageData.getData());
if (pageData.hasNext()) {
@@ -577,7 +580,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
pageLink = new PageLink(4);
pageData = doGetTypedWithPageLink("/api/tenant/edges?type={type}&",
- new TypeReference>() {
+ new TypeReference<>() {
}, pageLink, type1);
Assert.assertFalse(pageData.hasNext());
Assert.assertEquals(0, pageData.getData().size());
@@ -589,7 +592,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
pageLink = new PageLink(4);
pageData = doGetTypedWithPageLink("/api/tenant/edges?type={type}&",
- new TypeReference>() {
+ new TypeReference<>() {
}, pageLink, type2);
Assert.assertFalse(pageData.hasNext());
Assert.assertEquals(0, pageData.getData().size());
@@ -618,15 +621,14 @@ public class EdgeControllerTest extends AbstractControllerTest {
testNotifyManyEntityManyTimeMsgToEdgeServiceEntityEqAny(new Edge(), new Edge(),
tenantId, customerId, tenantAdminUser.getId(), tenantAdminUser.getEmail(),
- ActionType.ASSIGNED_TO_CUSTOMER, cntEntity, cntEntity, cntEntity * 2,
- new String(), new String(), new String());
+ ActionType.ASSIGNED_TO_CUSTOMER, cntEntity, cntEntity, cntEntity * 2, "", "", "");
List loadedEdges = new ArrayList<>();
PageLink pageLink = new PageLink(23);
PageData pageData = null;
do {
pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/edges?",
- new TypeReference>() {
+ new TypeReference<>() {
}, pageLink);
loadedEdges.addAll(pageData.getData());
if (pageData.hasNext()) {
@@ -684,7 +686,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
PageData pageData = null;
do {
pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/edges?",
- new TypeReference>() {
+ new TypeReference<>() {
}, pageLink);
loadedEdgesTitle1.addAll(pageData.getData());
if (pageData.hasNext()) {
@@ -701,7 +703,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
pageLink = new PageLink(4, 0, title2);
do {
pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/edges?",
- new TypeReference>() {
+ new TypeReference<>() {
}, pageLink);
loadedEdgesTitle2.addAll(pageData.getData());
if (pageData.hasNext()) {
@@ -728,7 +730,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
pageLink = new PageLink(4, 0, title1);
pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/edges?",
- new TypeReference>() {
+ new TypeReference<>() {
}, pageLink);
Assert.assertFalse(pageData.hasNext());
Assert.assertEquals(0, pageData.getData().size());
@@ -740,7 +742,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
pageLink = new PageLink(4, 0, title2);
pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/edges?",
- new TypeReference>() {
+ new TypeReference<>() {
}, pageLink);
Assert.assertFalse(pageData.hasNext());
Assert.assertEquals(0, pageData.getData().size());
@@ -789,10 +791,10 @@ public class EdgeControllerTest extends AbstractControllerTest {
List loadedEdgesType1 = new ArrayList<>();
PageLink pageLink = new PageLink(15, 0, title1);
- PageData pageData = null;
+ PageData pageData;
do {
pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/edges?type={type}&",
- new TypeReference>() {
+ new TypeReference<>() {
}, pageLink, type1);
loadedEdgesType1.addAll(pageData.getData());
if (pageData.hasNext()) {
@@ -809,7 +811,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
pageLink = new PageLink(4, 0, title2);
do {
pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/edges?type={type}&",
- new TypeReference>() {
+ new TypeReference<>() {
}, pageLink, type2);
loadedEdgesType2.addAll(pageData.getData());
if (pageData.hasNext()) {
@@ -829,7 +831,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
pageLink = new PageLink(4, 0, title1);
pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/edges?type={type}&",
- new TypeReference>() {
+ new TypeReference<>() {
}, pageLink, type1);
Assert.assertFalse(pageData.hasNext());
Assert.assertEquals(0, pageData.getData().size());
@@ -841,7 +843,7 @@ public class EdgeControllerTest extends AbstractControllerTest {
pageLink = new PageLink(4, 0, title2);
pageData = doGetTypedWithPageLink("/api/customer/" + customerId.getId().toString() + "/edges?type={type}&",
- new TypeReference>() {
+ new TypeReference<>() {
}, pageLink, type2);
Assert.assertFalse(pageData.hasNext());
Assert.assertEquals(0, pageData.getData().size());
@@ -967,8 +969,9 @@ public class EdgeControllerTest extends AbstractControllerTest {
for (AbstractMessage message : messages) {
if (message instanceof QueueUpdateMsg) {
QueueUpdateMsg queueUpdateMsg = (QueueUpdateMsg) message;
- if (msgType.equals(queueUpdateMsg.getMsgType())
- && name.equals(queueUpdateMsg.getName())) {
+ Queue queue = JacksonUtil.fromStringIgnoreUnknownProperties(queueUpdateMsg.getEntity(), Queue.class);
+ Assert.assertNotNull(queue);
+ if (msgType.equals(queueUpdateMsg.getMsgType()) && name.equals(queue.getName())) {
messages.remove(message);
return true;
}
@@ -981,9 +984,11 @@ public class EdgeControllerTest extends AbstractControllerTest {
for (AbstractMessage message : messages) {
if (message instanceof RuleChainUpdateMsg) {
RuleChainUpdateMsg ruleChainUpdateMsg = (RuleChainUpdateMsg) message;
+ RuleChain ruleChain = JacksonUtil.fromStringIgnoreUnknownProperties(ruleChainUpdateMsg.getEntity(), RuleChain.class);
+ Assert.assertNotNull(ruleChain);
if (msgType.equals(ruleChainUpdateMsg.getMsgType())
- && name.equals(ruleChainUpdateMsg.getName())
- && ruleChainUpdateMsg.getRoot()) {
+ && name.equals(ruleChain.getName())
+ && ruleChain.isRoot()) {
messages.remove(message);
return true;
}
@@ -996,7 +1001,9 @@ public class EdgeControllerTest extends AbstractControllerTest {
for (AbstractMessage message : messages) {
if (message instanceof AdminSettingsUpdateMsg) {
AdminSettingsUpdateMsg adminSettingsUpdateMsg = (AdminSettingsUpdateMsg) message;
- if (key.equals(adminSettingsUpdateMsg.getKey())) {
+ AdminSettings adminSettings = JacksonUtil.fromStringIgnoreUnknownProperties(adminSettingsUpdateMsg.getEntity(), AdminSettings.class);
+ Assert.assertNotNull(adminSettings);
+ if (key.equals(adminSettings.getKey())) {
messages.remove(message);
return true;
}
@@ -1009,8 +1016,10 @@ public class EdgeControllerTest extends AbstractControllerTest {
for (AbstractMessage message : messages) {
if (message instanceof DeviceProfileUpdateMsg) {
DeviceProfileUpdateMsg deviceProfileUpdateMsg = (DeviceProfileUpdateMsg) message;
+ DeviceProfile deviceProfile = JacksonUtil.fromStringIgnoreUnknownProperties(deviceProfileUpdateMsg.getEntity(), DeviceProfile.class);
+ Assert.assertNotNull(deviceProfile);
if (msgType.equals(deviceProfileUpdateMsg.getMsgType())
- && name.equals(deviceProfileUpdateMsg.getName())) {
+ && name.equals(deviceProfile.getName())) {
messages.remove(message);
return true;
}
@@ -1023,8 +1032,10 @@ public class EdgeControllerTest extends AbstractControllerTest {
for (AbstractMessage message : messages) {
if (message instanceof DeviceUpdateMsg) {
DeviceUpdateMsg deviceUpdateMsg = (DeviceUpdateMsg) message;
+ Device device = JacksonUtil.fromStringIgnoreUnknownProperties(deviceUpdateMsg.getEntity(), Device.class);
+ Assert.assertNotNull(device);
if (msgType.equals(deviceUpdateMsg.getMsgType())
- && name.equals(deviceUpdateMsg.getName())) {
+ && name.equals(device.getName())) {
messages.remove(message);
return true;
}
@@ -1037,8 +1048,10 @@ public class EdgeControllerTest extends AbstractControllerTest {
for (AbstractMessage message : messages) {
if (message instanceof AssetProfileUpdateMsg) {
AssetProfileUpdateMsg assetProfileUpdateMsg = (AssetProfileUpdateMsg) message;
+ AssetProfile assetProfile = JacksonUtil.fromStringIgnoreUnknownProperties(assetProfileUpdateMsg.getEntity(), AssetProfile.class);
+ Assert.assertNotNull(assetProfile);
if (msgType.equals(assetProfileUpdateMsg.getMsgType())
- && name.equals(assetProfileUpdateMsg.getName())) {
+ && name.equals(assetProfile.getName())) {
messages.remove(message);
return true;
}
@@ -1051,8 +1064,10 @@ public class EdgeControllerTest extends AbstractControllerTest {
for (AbstractMessage message : messages) {
if (message instanceof AssetUpdateMsg) {
AssetUpdateMsg assetUpdateMsg = (AssetUpdateMsg) message;
+ Asset asset = JacksonUtil.fromStringIgnoreUnknownProperties(assetUpdateMsg.getEntity(), Asset.class);
+ Assert.assertNotNull(asset);
if (msgType.equals(assetUpdateMsg.getMsgType())
- && name.equals(assetUpdateMsg.getName())) {
+ && name.equals(asset.getName())) {
messages.remove(message);
return true;
}
@@ -1065,9 +1080,11 @@ public class EdgeControllerTest extends AbstractControllerTest {
for (AbstractMessage message : messages) {
if (message instanceof UserUpdateMsg) {
UserUpdateMsg userUpdateMsg = (UserUpdateMsg) message;
+ User user = JacksonUtil.fromStringIgnoreUnknownProperties(userUpdateMsg.getEntity(), User.class);
+ Assert.assertNotNull(user);
if (msgType.equals(userUpdateMsg.getMsgType())
- && email.equals(userUpdateMsg.getEmail())
- && authority.name().equals(userUpdateMsg.getAuthority())) {
+ && email.equals(user.getEmail())
+ && authority.equals(user.getAuthority())) {
messages.remove(message);
return true;
}
@@ -1080,8 +1097,10 @@ public class EdgeControllerTest extends AbstractControllerTest {
for (AbstractMessage message : messages) {
if (message instanceof CustomerUpdateMsg) {
CustomerUpdateMsg customerUpdateMsg = (CustomerUpdateMsg) message;
+ Customer customer = JacksonUtil.fromStringIgnoreUnknownProperties(customerUpdateMsg.getEntity(), Customer.class);
+ Assert.assertNotNull(customer);
if (msgType.equals(customerUpdateMsg.getMsgType())
- && title.equals(customerUpdateMsg.getTitle())) {
+ && title.equals(customer.getTitle())) {
messages.remove(message);
return true;
}
@@ -1094,9 +1113,10 @@ public class EdgeControllerTest extends AbstractControllerTest {
for (AbstractMessage message : messages) {
if (message instanceof TenantUpdateMsg) {
TenantUpdateMsg tenantUpdateMsg = (TenantUpdateMsg) message;
- TenantId tenantIdMsg = new TenantId(new UUID(tenantUpdateMsg.getIdMSB(), tenantUpdateMsg.getIdLSB()));
+ Tenant tenant = JacksonUtil.fromStringIgnoreUnknownProperties(tenantUpdateMsg.getEntity(), Tenant.class);
+ Assert.assertNotNull(tenant);
if (UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE.equals(tenantUpdateMsg.getMsgType())
- && tenantId1.equals(tenantIdMsg)) {
+ && tenantId1.equals(tenant.getId())) {
messages.remove(message);
return true;
}
@@ -1109,9 +1129,10 @@ public class EdgeControllerTest extends AbstractControllerTest {
for (AbstractMessage message : messages) {
if (message instanceof TenantProfileUpdateMsg) {
TenantProfileUpdateMsg tenantProfileUpdateMsg = (TenantProfileUpdateMsg) message;
- TenantProfileId tenantProfileIdMsg = new TenantProfileId(new UUID(tenantProfileUpdateMsg.getIdMSB(), tenantProfileUpdateMsg.getIdLSB()));
+ TenantProfile tenantProfile = JacksonUtil.fromStringIgnoreUnknownProperties(tenantProfileUpdateMsg.getEntity(), TenantProfile.class);
+ Assert.assertNotNull(tenantProfile);
if (UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE.equals(tenantProfileUpdateMsg.getMsgType())
- && tenantProfileId.equals(tenantProfileIdMsg)) {
+ && tenantProfileId.equals(tenantProfile.getId())) {
messages.remove(message);
return true;
}
diff --git a/application/src/test/java/org/thingsboard/server/controller/HomePageApiTest.java b/application/src/test/java/org/thingsboard/server/controller/HomePageApiTest.java
index d020fef1cb..148c4afea9 100644
--- a/application/src/test/java/org/thingsboard/server/controller/HomePageApiTest.java
+++ b/application/src/test/java/org/thingsboard/server/controller/HomePageApiTest.java
@@ -92,6 +92,8 @@ public class HomePageApiTest extends AbstractControllerTest {
@MockBean
private SmsService smsService;
+ private static final int DEFAULT_DASHBOARDS_COUNT = 1;
+
//For system administrator
@Test
public void testTenantsCountWsCmd() throws Exception {
@@ -408,7 +410,7 @@ public class HomePageApiTest extends AbstractControllerTest {
Assert.assertEquals(2, usageInfo.getUsers());
Assert.assertEquals(configuration.getMaxUsers(), usageInfo.getMaxUsers());
- Assert.assertEquals(0, usageInfo.getDashboards());
+ Assert.assertEquals(DEFAULT_DASHBOARDS_COUNT, usageInfo.getDashboards());
Assert.assertEquals(configuration.getMaxDashboards(), usageInfo.getMaxDashboards());
Assert.assertEquals(0, usageInfo.getTransportMessages());
@@ -478,7 +480,8 @@ public class HomePageApiTest extends AbstractControllerTest {
}
usageInfo = doGet("/api/usage", UsageInfo.class);
- Assert.assertEquals(dashboards.size(), usageInfo.getDashboards());
+ int expectedDashboardsCount = dashboards.size() + DEFAULT_DASHBOARDS_COUNT;
+ Assert.assertEquals(expectedDashboardsCount, usageInfo.getDashboards());
}
private Long getInitialEntityCount(EntityType entityType) throws Exception {
diff --git a/application/src/test/java/org/thingsboard/server/controller/WidgetTypeControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/WidgetTypeControllerTest.java
index 9cc9fd0596..e515250321 100644
--- a/application/src/test/java/org/thingsboard/server/controller/WidgetTypeControllerTest.java
+++ b/application/src/test/java/org/thingsboard/server/controller/WidgetTypeControllerTest.java
@@ -190,6 +190,32 @@ public class WidgetTypeControllerTest extends AbstractControllerTest {
Collections.sort(loadedWidgetTypes, idComparator);
Assert.assertEquals(widgetTypes, loadedWidgetTypes);
+
+ loginCustomerUser();
+
+ List loadedWidgetTypesCustomer = doGetTyped("/api/widgetTypes?widgetsBundleId={widgetsBundleId}",
+ new TypeReference<>(){}, widgetsBundle.getId().getId().toString());
+ Collections.sort(loadedWidgetTypesCustomer, idComparator);
+ Assert.assertEquals(widgetTypes, loadedWidgetTypesCustomer);
+
+ List customerLoadedWidgetTypesDetails = doGetTyped("/api/widgetTypesDetails?widgetsBundleId={widgetsBundleId}",
+ new TypeReference<>(){}, widgetsBundle.getId().getId().toString());
+ List widgetTypesFromDetailsListCustomer = customerLoadedWidgetTypesDetails.stream().map(WidgetType::new).collect(Collectors.toList());
+ Collections.sort(widgetTypesFromDetailsListCustomer, idComparator);
+ Assert.assertEquals(widgetTypesFromDetailsListCustomer, loadedWidgetTypes);
+
+ loginSysAdmin();
+
+ List sysAdminLoadedWidgetTypes = doGetTyped("/api/widgetTypes?widgetsBundleId={widgetsBundleId}",
+ new TypeReference<>(){}, widgetsBundle.getId().getId().toString());
+ Collections.sort(sysAdminLoadedWidgetTypes, idComparator);
+ Assert.assertEquals(widgetTypes, sysAdminLoadedWidgetTypes);
+
+ List sysAdminLoadedWidgetTypesDetails = doGetTyped("/api/widgetTypesDetails?widgetsBundleId={widgetsBundleId}",
+ new TypeReference<>(){}, widgetsBundle.getId().getId().toString());
+ List widgetTypesFromDetailsListSysAdmin = sysAdminLoadedWidgetTypesDetails.stream().map(WidgetType::new).collect(Collectors.toList());
+ Collections.sort(widgetTypesFromDetailsListSysAdmin, idComparator);
+ Assert.assertEquals(widgetTypesFromDetailsListSysAdmin, loadedWidgetTypes);
}
@Test
diff --git a/application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java
index 2771a71eac..bf08967f16 100644
--- a/application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java
+++ b/application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java
@@ -28,6 +28,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.TestPropertySource;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.cluster.TbClusterService;
+import org.thingsboard.server.common.data.AdminSettings;
import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.Dashboard;
import org.thingsboard.server.common.data.DataConstants;
@@ -38,6 +39,7 @@ import org.thingsboard.server.common.data.OtaPackageInfo;
import org.thingsboard.server.common.data.SaveOtaPackageInfoRequest;
import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.Tenant;
+import org.thingsboard.server.common.data.TenantProfile;
import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.alarm.AlarmSeverity;
import org.thingsboard.server.common.data.asset.Asset;
@@ -70,6 +72,7 @@ import org.thingsboard.server.common.data.query.FilterPredicateValue;
import org.thingsboard.server.common.data.query.NumericFilterPredicate;
import org.thingsboard.server.common.data.queue.Queue;
import org.thingsboard.server.common.data.rule.RuleChain;
+import org.thingsboard.server.common.data.rule.RuleChainMetaData;
import org.thingsboard.server.common.data.rule.RuleChainType;
import org.thingsboard.server.common.data.security.model.JwtSettings;
import org.thingsboard.server.controller.AbstractControllerTest;
@@ -318,8 +321,9 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest {
Assert.assertTrue(tenantUpdateMsgOpt.isPresent());
TenantUpdateMsg tenantUpdateMsg = tenantUpdateMsgOpt.get();
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, tenantUpdateMsg.getMsgType());
- UUID tenantUUID = new UUID(tenantUpdateMsg.getIdMSB(), tenantUpdateMsg.getIdLSB());
- Tenant tenant = doGet("/api/tenant/" + tenantUUID, Tenant.class);
+ Tenant tenantMsg = JacksonUtil.fromStringIgnoreUnknownProperties(tenantUpdateMsg.getEntity(), Tenant.class);
+ Assert.assertNotNull(tenantMsg);
+ Tenant tenant = doGet("/api/tenant/" + tenantMsg.getUuidId(), Tenant.class);
Assert.assertNotNull(tenant);
testAutoGeneratedCodeByProtobuf(tenantUpdateMsg);
}
@@ -329,10 +333,11 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest {
Assert.assertTrue(tenantProfileUpdateMsgOpt.isPresent());
TenantProfileUpdateMsg tenantProfileUpdateMsg = tenantProfileUpdateMsgOpt.get();
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, tenantProfileUpdateMsg.getMsgType());
- UUID tenantProfileUUID = new UUID(tenantProfileUpdateMsg.getIdMSB(), tenantProfileUpdateMsg.getIdLSB());
+ TenantProfile tenantProfile = JacksonUtil.fromStringIgnoreUnknownProperties(tenantProfileUpdateMsg.getEntity(), TenantProfile.class);
+ Assert.assertNotNull(tenantProfile);
Tenant tenant = doGet("/api/tenant/" + tenantId.getId(), Tenant.class);
Assert.assertNotNull(tenant);
- Assert.assertEquals(tenantProfileUUID, tenant.getTenantProfileId().getId());
+ Assert.assertEquals(tenantProfile.getId(), tenant.getTenantProfileId());
testAutoGeneratedCodeByProtobuf(tenantProfileUpdateMsg);
}
@@ -344,7 +349,11 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest {
// thermostat msg from device fetcher
Assert.assertEquals(expectedMsgCnt, deviceProfileUpdateMsgList.size());
Optional thermostatProfileUpdateMsgOpt =
- deviceProfileUpdateMsgList.stream().filter(dfum -> THERMOSTAT_DEVICE_PROFILE_NAME.equals(dfum.getName())).findAny();
+ deviceProfileUpdateMsgList.stream().filter(dfum -> {
+ DeviceProfile deviceProfile = JacksonUtil.fromStringIgnoreUnknownProperties(dfum.getEntity(), DeviceProfile.class);
+ Assert.assertNotNull(deviceProfile);
+ return THERMOSTAT_DEVICE_PROFILE_NAME.equals(deviceProfile.getName());
+ }).findAny();
Assert.assertTrue(thermostatProfileUpdateMsgOpt.isPresent());
DeviceProfileUpdateMsg thermostatProfileUpdateMsg = thermostatProfileUpdateMsgOpt.get();
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, thermostatProfileUpdateMsg.getMsgType());
@@ -419,8 +428,9 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest {
Assert.assertTrue(ruleChainMetadataUpdateOpt.isPresent());
RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg = ruleChainMetadataUpdateOpt.get();
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, ruleChainMetadataUpdateMsg.getMsgType());
- UUID ruleChainUUID = new UUID(ruleChainMetadataUpdateMsg.getRuleChainIdMSB(), ruleChainMetadataUpdateMsg.getRuleChainIdLSB());
- Assert.assertEquals(expectedRuleChainUUID, ruleChainUUID);
+ RuleChainMetaData ruleChainMetaData = JacksonUtil.fromStringIgnoreUnknownProperties(ruleChainMetadataUpdateMsg.getEntity(), RuleChainMetaData.class);
+ Assert.assertNotNull(ruleChainMetaData);
+ Assert.assertEquals(expectedRuleChainUUID, ruleChainMetaData.getRuleChainId().getId());
}
private void validateAdminSettings(int expectedMsgCnt) {
@@ -428,25 +438,29 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest {
Assert.assertEquals(expectedMsgCnt, adminSettingsUpdateMsgs.size());
for (AdminSettingsUpdateMsg adminSettingsUpdateMsg : adminSettingsUpdateMsgs) {
- if (adminSettingsUpdateMsg.getKey().equals("general")) {
- validateGeneralAdminSettings(adminSettingsUpdateMsg);
+ AdminSettings adminSettings = JacksonUtil.fromStringIgnoreUnknownProperties(adminSettingsUpdateMsg.getEntity(), AdminSettings.class);
+ Assert.assertNotNull(adminSettings);
+ if (adminSettings.getKey().equals("general")) {
+ validateGeneralAdminSettings(adminSettings);
}
- if (adminSettingsUpdateMsg.getKey().equals("mail")) {
- validateMailAdminSettings(adminSettingsUpdateMsg);
+ if (adminSettings.getKey().equals("mail")) {
+ validateMailAdminSettings(adminSettings);
}
- if (adminSettingsUpdateMsg.getKey().equals("connectivity")) {
- validateConnectivityAdminSettings(adminSettingsUpdateMsg);
+ if (adminSettings.getKey().equals("connectivity")) {
+ validateConnectivityAdminSettings(adminSettings);
+ }
+ if (adminSettings.getKey().equals("jwt")) {
+ validateJwtAdminSettings(adminSettings);
}
}
}
- private void validateGeneralAdminSettings(AdminSettingsUpdateMsg adminSettingsUpdateMsg) {
- JsonNode jsonNode = JacksonUtil.toJsonNode(adminSettingsUpdateMsg.getJsonValue());
- Assert.assertNotNull(jsonNode.get("baseUrl"));
+ private void validateGeneralAdminSettings(AdminSettings adminSettings) {
+ Assert.assertNotNull(adminSettings.getJsonValue().get("baseUrl"));
}
- private void validateMailAdminSettings(AdminSettingsUpdateMsg adminSettingsUpdateMsg) {
- JsonNode jsonNode = JacksonUtil.toJsonNode(adminSettingsUpdateMsg.getJsonValue());
+ private void validateMailAdminSettings(AdminSettings adminSettings) {
+ JsonNode jsonNode = adminSettings.getJsonValue();
Assert.assertNotNull(jsonNode.get("mailFrom"));
Assert.assertNotNull(jsonNode.get("smtpProtocol"));
Assert.assertNotNull(jsonNode.get("smtpHost"));
@@ -454,8 +468,8 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest {
Assert.assertNotNull(jsonNode.get("timeout"));
}
- private void validateConnectivityAdminSettings(AdminSettingsUpdateMsg adminSettingsUpdateMsg) {
- JsonNode jsonNode = JacksonUtil.toJsonNode(adminSettingsUpdateMsg.getJsonValue());
+ private void validateConnectivityAdminSettings(AdminSettings adminSettings) {
+ JsonNode jsonNode = adminSettings.getJsonValue();
Assert.assertNotNull(jsonNode.get("http"));
Assert.assertNotNull(jsonNode.get("https"));
Assert.assertNotNull(jsonNode.get("mqtt"));
@@ -464,6 +478,14 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest {
Assert.assertNotNull(jsonNode.get("coaps"));
}
+ private void validateJwtAdminSettings(AdminSettings adminSettings) {
+ JsonNode jsonNode = adminSettings.getJsonValue();
+ Assert.assertNotNull(jsonNode.get("tokenExpirationTime"));
+ Assert.assertNotNull(jsonNode.get("refreshTokenExpTime"));
+ Assert.assertNotNull(jsonNode.get("tokenIssuer"));
+ Assert.assertNotNull(jsonNode.get("tokenSigningKey"));
+ }
+
private void validateAssetProfiles(int expectedMsgCnt) throws Exception {
List assetProfileUpdateMsgs = edgeImitator.findAllMessagesByType(AssetProfileUpdateMsg.class);
Assert.assertEquals(expectedMsgCnt, assetProfileUpdateMsgs.size());
@@ -485,10 +507,10 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest {
UUID queueUUID = new UUID(queueUpdateMsg.getIdMSB(), queueUpdateMsg.getIdLSB());
Queue queue = doGet("/api/queues/" + queueUUID, Queue.class);
Assert.assertNotNull(queue);
- Assert.assertEquals(DataConstants.MAIN_QUEUE_NAME, queueUpdateMsg.getName());
- Assert.assertEquals(DataConstants.MAIN_QUEUE_TOPIC, queueUpdateMsg.getTopic());
- Assert.assertEquals(10, queueUpdateMsg.getPartitions());
- Assert.assertEquals(25, queueUpdateMsg.getPollInterval());
+ Assert.assertEquals(DataConstants.MAIN_QUEUE_NAME, queue.getName());
+ Assert.assertEquals(DataConstants.MAIN_QUEUE_TOPIC, queue.getTopic());
+ Assert.assertEquals(10, queue.getPartitions());
+ Assert.assertEquals(25, queue.getPollInterval());
testAutoGeneratedCodeByProtobuf(queueUpdateMsg);
}
@@ -500,7 +522,7 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest {
UUID userUUID = new UUID(userUpdateMsg.getIdMSB(), userUpdateMsg.getIdLSB());
User user = doGet("/api/user/" + userUUID, User.class);
Assert.assertNotNull(user);
- Assert.assertEquals("testtenant@thingsboard.org", userUpdateMsg.getEmail());
+ Assert.assertEquals("testtenant@thingsboard.org", user.getEmail());
testAutoGeneratedCodeByProtobuf(userUpdateMsg);
}
diff --git a/application/src/test/java/org/thingsboard/server/edge/AlarmEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/AlarmEdgeTest.java
index 259572851c..804d2f6807 100644
--- a/application/src/test/java/org/thingsboard/server/edge/AlarmEdgeTest.java
+++ b/application/src/test/java/org/thingsboard/server/edge/AlarmEdgeTest.java
@@ -19,13 +19,14 @@ import com.fasterxml.jackson.core.type.TypeReference;
import com.google.protobuf.AbstractMessage;
import org.junit.Assert;
import org.junit.Test;
+import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Device;
-import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.alarm.Alarm;
import org.thingsboard.server.common.data.alarm.AlarmInfo;
import org.thingsboard.server.common.data.alarm.AlarmSeverity;
import org.thingsboard.server.common.data.alarm.AlarmStatus;
import org.thingsboard.server.common.data.id.AlarmId;
+import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.dao.service.DaoSqlTest;
@@ -46,16 +47,13 @@ public class AlarmEdgeTest extends AbstractEdgeTest {
public void testSendAlarmToCloud() throws Exception {
Device device = saveDeviceOnCloudAndVerifyDeliveryToEdge();
- UUID alarmUUID = UUID.randomUUID();
+ Alarm edgeAlarm = buildAlarmForUplinkMsg(device.getId());
+
UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
AlarmUpdateMsg.Builder alarmUpdateMgBuilder = AlarmUpdateMsg.newBuilder();
- alarmUpdateMgBuilder.setIdMSB(alarmUUID.getMostSignificantBits());
- alarmUpdateMgBuilder.setIdLSB(alarmUUID.getLeastSignificantBits());
- alarmUpdateMgBuilder.setName("alarm from edge");
- alarmUpdateMgBuilder.setStatus(AlarmStatus.ACTIVE_UNACK.name());
- alarmUpdateMgBuilder.setSeverity(AlarmSeverity.CRITICAL.name());
- alarmUpdateMgBuilder.setOriginatorName(device.getName());
- alarmUpdateMgBuilder.setOriginatorType(EntityType.DEVICE.name());
+ alarmUpdateMgBuilder.setIdMSB(edgeAlarm.getUuidId().getMostSignificantBits());
+ alarmUpdateMgBuilder.setIdLSB(edgeAlarm.getUuidId().getLeastSignificantBits());
+ alarmUpdateMgBuilder.setEntity(JacksonUtil.toString(edgeAlarm));
testAutoGeneratedCodeByProtobuf(alarmUpdateMgBuilder);
uplinkMsgBuilder.addAlarmUpdateMsg(alarmUpdateMgBuilder.build());
@@ -72,7 +70,7 @@ public class AlarmEdgeTest extends AbstractEdgeTest {
Optional foundAlarm = alarms.stream().filter(alarm -> alarm.getType().equals("alarm from edge")).findAny();
Assert.assertTrue(foundAlarm.isPresent());
AlarmInfo alarmInfo = foundAlarm.get();
- Assert.assertEquals(new AlarmId(alarmUUID), alarmInfo.getId());
+ Assert.assertEquals(edgeAlarm.getId(), alarmInfo.getId());
Assert.assertEquals(device.getId(), alarmInfo.getOriginator());
Assert.assertEquals(AlarmStatus.ACTIVE_UNACK, alarmInfo.getStatus());
Assert.assertEquals(AlarmSeverity.CRITICAL, alarmInfo.getSeverity());
@@ -92,14 +90,10 @@ public class AlarmEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof AlarmUpdateMsg);
AlarmUpdateMsg alarmUpdateMsg = (AlarmUpdateMsg) latestMessage;
+ Alarm alarmMsg = JacksonUtil.fromStringIgnoreUnknownProperties(alarmUpdateMsg.getEntity(), Alarm.class);
+ Assert.assertNotNull(alarmMsg);
+ Assert.assertEquals(savedAlarm, alarmMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, alarmUpdateMsg.getMsgType());
- Assert.assertEquals(savedAlarm.getUuidId().getMostSignificantBits(), alarmUpdateMsg.getIdMSB());
- Assert.assertEquals(savedAlarm.getUuidId().getLeastSignificantBits(), alarmUpdateMsg.getIdLSB());
- Assert.assertEquals(savedAlarm.getType(), alarmUpdateMsg.getType());
- Assert.assertEquals(savedAlarm.getName(), alarmUpdateMsg.getName());
- Assert.assertEquals(device.getName(), alarmUpdateMsg.getOriginatorName());
- Assert.assertEquals(savedAlarm.getStatus().name(), alarmUpdateMsg.getStatus());
- Assert.assertEquals(savedAlarm.getSeverity().name(), alarmUpdateMsg.getSeverity());
// ack alarm
edgeImitator.expectMessageAmount(1);
@@ -109,10 +103,11 @@ public class AlarmEdgeTest extends AbstractEdgeTest {
Assert.assertTrue(latestMessage instanceof AlarmUpdateMsg);
alarmUpdateMsg = (AlarmUpdateMsg) latestMessage;
Assert.assertEquals(UpdateMsgType.ALARM_ACK_RPC_MESSAGE, alarmUpdateMsg.getMsgType());
- Assert.assertEquals(savedAlarm.getType(), alarmUpdateMsg.getType());
- Assert.assertEquals(savedAlarm.getName(), alarmUpdateMsg.getName());
- Assert.assertEquals(device.getName(), alarmUpdateMsg.getOriginatorName());
- Assert.assertEquals(AlarmStatus.ACTIVE_ACK.name(), alarmUpdateMsg.getStatus());
+ alarmMsg = JacksonUtil.fromStringIgnoreUnknownProperties(alarmUpdateMsg.getEntity(), Alarm.class);
+ Assert.assertNotNull(alarmMsg);
+ Assert.assertEquals(savedAlarm.getType(), alarmMsg.getType());
+ Assert.assertEquals(savedAlarm.getName(), alarmMsg.getName());
+ Assert.assertEquals(AlarmStatus.ACTIVE_ACK, alarmMsg.getStatus());
// clear alarm
edgeImitator.expectMessageAmount(1);
@@ -122,10 +117,11 @@ public class AlarmEdgeTest extends AbstractEdgeTest {
Assert.assertTrue(latestMessage instanceof AlarmUpdateMsg);
alarmUpdateMsg = (AlarmUpdateMsg) latestMessage;
Assert.assertEquals(UpdateMsgType.ALARM_CLEAR_RPC_MESSAGE, alarmUpdateMsg.getMsgType());
- Assert.assertEquals(savedAlarm.getType(), alarmUpdateMsg.getType());
- Assert.assertEquals(savedAlarm.getName(), alarmUpdateMsg.getName());
- Assert.assertEquals(device.getName(), alarmUpdateMsg.getOriginatorName());
- Assert.assertEquals(AlarmStatus.CLEARED_ACK.name(), alarmUpdateMsg.getStatus());
+ alarmMsg = JacksonUtil.fromStringIgnoreUnknownProperties(alarmUpdateMsg.getEntity(), Alarm.class);
+ Assert.assertNotNull(alarmMsg);
+ Assert.assertEquals(savedAlarm.getType(), alarmMsg.getType());
+ Assert.assertEquals(savedAlarm.getName(), alarmMsg.getName());
+ Assert.assertEquals(AlarmStatus.CLEARED_ACK, alarmMsg.getStatus());
// delete alarm
edgeImitator.expectMessageAmount(1);
@@ -136,10 +132,20 @@ public class AlarmEdgeTest extends AbstractEdgeTest {
Assert.assertTrue(latestMessage instanceof AlarmUpdateMsg);
alarmUpdateMsg = (AlarmUpdateMsg) latestMessage;
Assert.assertEquals(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE, alarmUpdateMsg.getMsgType());
- Assert.assertEquals(savedAlarm.getType(), alarmUpdateMsg.getType());
- Assert.assertEquals(savedAlarm.getName(), alarmUpdateMsg.getName());
- Assert.assertEquals(device.getName(), alarmUpdateMsg.getOriginatorName());
- Assert.assertEquals(AlarmStatus.CLEARED_ACK.name(), alarmUpdateMsg.getStatus());
+ alarmMsg = JacksonUtil.fromStringIgnoreUnknownProperties(alarmUpdateMsg.getEntity(), Alarm.class);
+ Assert.assertNotNull(alarmMsg);
+ Assert.assertEquals(savedAlarm.getType(), alarmMsg.getType());
+ Assert.assertEquals(savedAlarm.getName(), alarmMsg.getName());
+ Assert.assertEquals(AlarmStatus.CLEARED_ACK, alarmMsg.getStatus());
}
+ private Alarm buildAlarmForUplinkMsg(DeviceId deviceId) {
+ Alarm alarm = new Alarm();
+ alarm.setId(new AlarmId(UUID.randomUUID()));
+ alarm.setTenantId(tenantId);
+ alarm.setType("alarm from edge");
+ alarm.setOriginator(deviceId);
+ alarm.setSeverity(AlarmSeverity.CRITICAL);
+ return alarm;
+ }
}
diff --git a/application/src/test/java/org/thingsboard/server/edge/AssetEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/AssetEdgeTest.java
index 0eb19a17fb..1e35b6266b 100644
--- a/application/src/test/java/org/thingsboard/server/edge/AssetEdgeTest.java
+++ b/application/src/test/java/org/thingsboard/server/edge/AssetEdgeTest.java
@@ -15,17 +15,17 @@
*/
package org.thingsboard.server.edge;
-import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.core.type.TypeReference;
import com.google.protobuf.AbstractMessage;
import org.junit.Assert;
import org.junit.Test;
+import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Customer;
-import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.asset.Asset;
import org.thingsboard.server.common.data.asset.AssetInfo;
import org.thingsboard.server.common.data.edge.Edge;
+import org.thingsboard.server.common.data.id.AssetId;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.page.PageData;
@@ -57,11 +57,10 @@ public class AssetEdgeTest extends AbstractEdgeTest {
Optional assetUpdateMsgOpt = edgeImitator.findMessageByType(AssetUpdateMsg.class);
Assert.assertTrue(assetUpdateMsgOpt.isPresent());
AssetUpdateMsg assetUpdateMsg = assetUpdateMsgOpt.get();
+ Asset assetMsg = JacksonUtil.fromStringIgnoreUnknownProperties(assetUpdateMsg.getEntity(), Asset.class);
+ Assert.assertNotNull(assetMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, assetUpdateMsg.getMsgType());
- Assert.assertEquals(savedAsset.getUuidId().getMostSignificantBits(), assetUpdateMsg.getIdMSB());
- Assert.assertEquals(savedAsset.getUuidId().getLeastSignificantBits(), assetUpdateMsg.getIdLSB());
- Assert.assertEquals(savedAsset.getName(), assetUpdateMsg.getName());
- Assert.assertEquals(savedAsset.getType(), assetUpdateMsg.getType());
+ Assert.assertEquals(savedAsset, assetMsg);
Optional assetProfileUpdateMsgOpt = edgeImitator.findMessageByType(AssetProfileUpdateMsg.class);
Assert.assertTrue(assetProfileUpdateMsgOpt.isPresent());
AssetProfileUpdateMsg assetProfileUpdateMsg = assetProfileUpdateMsgOpt.get();
@@ -77,8 +76,10 @@ public class AssetEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof AssetUpdateMsg);
assetUpdateMsg = (AssetUpdateMsg) latestMessage;
+ assetMsg = JacksonUtil.fromStringIgnoreUnknownProperties(assetUpdateMsg.getEntity(), Asset.class);
+ Assert.assertNotNull(assetMsg);
+ Assert.assertEquals(savedAsset.getName(), assetMsg.getName());
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, assetUpdateMsg.getMsgType());
- Assert.assertEquals(savedAsset.getName(), assetUpdateMsg.getName());
// unassign asset from edge
edgeImitator.expectMessageAmount(1);
@@ -107,11 +108,10 @@ public class AssetEdgeTest extends AbstractEdgeTest {
assetUpdateMsgOpt = edgeImitator.findMessageByType(AssetUpdateMsg.class);
Assert.assertTrue(assetUpdateMsgOpt.isPresent());
assetUpdateMsg = assetUpdateMsgOpt.get();
+ assetMsg = JacksonUtil.fromStringIgnoreUnknownProperties(assetUpdateMsg.getEntity(), Asset.class);
+ Assert.assertNotNull(assetMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, assetUpdateMsg.getMsgType());
- Assert.assertEquals(savedAsset.getUuidId().getMostSignificantBits(), assetUpdateMsg.getIdMSB());
- Assert.assertEquals(savedAsset.getUuidId().getLeastSignificantBits(), assetUpdateMsg.getIdLSB());
- Assert.assertEquals(savedAsset.getName(), assetUpdateMsg.getName());
- Assert.assertEquals(savedAsset.getType(), assetUpdateMsg.getType());
+ Assert.assertEquals(savedAsset, assetMsg);
assetProfileUpdateMsgOpt = edgeImitator.findMessageByType(AssetProfileUpdateMsg.class);
Assert.assertTrue(assetProfileUpdateMsgOpt.isPresent());
assetProfileUpdateMsg = assetProfileUpdateMsgOpt.get();
@@ -135,9 +135,10 @@ public class AssetEdgeTest extends AbstractEdgeTest {
latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof AssetUpdateMsg);
assetUpdateMsg = (AssetUpdateMsg) latestMessage;
+ assetMsg = JacksonUtil.fromStringIgnoreUnknownProperties(assetUpdateMsg.getEntity(), Asset.class);
+ Assert.assertNotNull(assetMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, assetUpdateMsg.getMsgType());
- Assert.assertEquals(savedCustomer.getUuidId().getMostSignificantBits(), assetUpdateMsg.getCustomerIdMSB());
- Assert.assertEquals(savedCustomer.getUuidId().getLeastSignificantBits(), assetUpdateMsg.getCustomerIdLSB());
+ Assert.assertEquals(savedCustomer.getId(), assetMsg.getCustomerId());
// unassign asset #2 from customer
edgeImitator.expectMessageAmount(1);
@@ -146,10 +147,10 @@ public class AssetEdgeTest extends AbstractEdgeTest {
latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof AssetUpdateMsg);
assetUpdateMsg = (AssetUpdateMsg) latestMessage;
+ assetMsg = JacksonUtil.fromStringIgnoreUnknownProperties(assetUpdateMsg.getEntity(), Asset.class);
+ Assert.assertNotNull(assetMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, assetUpdateMsg.getMsgType());
- Assert.assertEquals(
- new CustomerId(EntityId.NULL_UUID),
- new CustomerId(new UUID(assetUpdateMsg.getCustomerIdMSB(), assetUpdateMsg.getCustomerIdLSB())));
+ Assert.assertEquals(new CustomerId(EntityId.NULL_UUID), assetMsg.getCustomerId());
// delete asset #2 - messages expected
edgeImitator.expectMessageAmount(1);
@@ -166,14 +167,13 @@ public class AssetEdgeTest extends AbstractEdgeTest {
@Test
public void testSendAssetToCloud() throws Exception {
- UUID uuid = Uuids.timeBased();
+ Asset asset = buildAssetForUplinkMsg("Asset Edge 2");
UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
AssetUpdateMsg.Builder assetUpdateMsgBuilder = AssetUpdateMsg.newBuilder();
- assetUpdateMsgBuilder.setIdMSB(uuid.getMostSignificantBits());
- assetUpdateMsgBuilder.setIdLSB(uuid.getLeastSignificantBits());
- assetUpdateMsgBuilder.setName("Asset Edge 2");
- assetUpdateMsgBuilder.setType("default");
+ assetUpdateMsgBuilder.setIdMSB(asset.getUuidId().getMostSignificantBits());
+ assetUpdateMsgBuilder.setIdLSB(asset.getUuidId().getLeastSignificantBits());
+ assetUpdateMsgBuilder.setEntity(JacksonUtil.toString(asset));
assetUpdateMsgBuilder.setMsgType(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE);
testAutoGeneratedCodeByProtobuf(assetUpdateMsgBuilder);
uplinkMsgBuilder.addAssetUpdateMsg(assetUpdateMsgBuilder.build());
@@ -188,9 +188,9 @@ public class AssetEdgeTest extends AbstractEdgeTest {
UplinkResponseMsg latestResponseMsg = edgeImitator.getLatestResponseMsg();
Assert.assertTrue(latestResponseMsg.getSuccess());
- Asset asset = doGet("/api/asset/" + uuid, Asset.class);
- Assert.assertNotNull(asset);
- Assert.assertEquals("Asset Edge 2", asset.getName());
+ Asset foundAsset = doGet("/api/asset/" + asset.getUuidId(), Asset.class);
+ Assert.assertNotNull(foundAsset);
+ Assert.assertEquals("Asset Edge 2", foundAsset.getName());
}
@Test
@@ -198,14 +198,11 @@ public class AssetEdgeTest extends AbstractEdgeTest {
String assetOnCloudName = StringUtils.randomAlphanumeric(15);
Asset assetOnCloud = saveAsset(assetOnCloudName);
- UUID uuid = Uuids.timeBased();
+ Asset assetOnEdge = buildAssetForUplinkMsg(assetOnCloudName);
UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
AssetUpdateMsg.Builder assetUpdateMsgBuilder = AssetUpdateMsg.newBuilder();
- assetUpdateMsgBuilder.setIdMSB(uuid.getMostSignificantBits());
- assetUpdateMsgBuilder.setIdLSB(uuid.getLeastSignificantBits());
- assetUpdateMsgBuilder.setName(assetOnCloudName);
- assetUpdateMsgBuilder.setType("default");
+ assetUpdateMsgBuilder.setEntity(JacksonUtil.toString(assetOnEdge));
assetUpdateMsgBuilder.setMsgType(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE);
testAutoGeneratedCodeByProtobuf(assetUpdateMsgBuilder);
uplinkMsgBuilder.addAssetUpdateMsg(assetUpdateMsgBuilder.build());
@@ -223,7 +220,9 @@ public class AssetEdgeTest extends AbstractEdgeTest {
Optional assetUpdateMsgOpt = edgeImitator.findMessageByType(AssetUpdateMsg.class);
Assert.assertTrue(assetUpdateMsgOpt.isPresent());
AssetUpdateMsg latestAssetUpdateMsg = assetUpdateMsgOpt.get();
- Assert.assertNotEquals(assetOnCloudName, latestAssetUpdateMsg.getName());
+ Asset assetMsg = JacksonUtil.fromStringIgnoreUnknownProperties(latestAssetUpdateMsg.getEntity(), Asset.class);
+ Assert.assertNotNull(assetMsg);
+ Assert.assertNotEquals(assetOnCloudName, assetMsg.getName());
UUID newAssetId = new UUID(latestAssetUpdateMsg.getIdMSB(), latestAssetUpdateMsg.getIdLSB());
@@ -275,4 +274,12 @@ public class AssetEdgeTest extends AbstractEdgeTest {
return savedAsset;
}
+ private Asset buildAssetForUplinkMsg(String name) {
+ Asset asset = new Asset();
+ asset.setId(new AssetId(UUID.randomUUID()));
+ asset.setTenantId(tenantId);
+ asset.setName(name);
+ asset.setType("test");
+ return asset;
+ }
}
diff --git a/application/src/test/java/org/thingsboard/server/edge/AssetProfileEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/AssetProfileEdgeTest.java
index ebf0af1938..7ffff29ed7 100644
--- a/application/src/test/java/org/thingsboard/server/edge/AssetProfileEdgeTest.java
+++ b/application/src/test/java/org/thingsboard/server/edge/AssetProfileEdgeTest.java
@@ -15,13 +15,13 @@
*/
package org.thingsboard.server.edge;
-import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.google.protobuf.AbstractMessage;
-import com.google.protobuf.ByteString;
import org.junit.Assert;
import org.junit.Test;
+import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.asset.AssetProfile;
+import org.thingsboard.server.common.data.id.AssetProfileId;
import org.thingsboard.server.common.data.id.DashboardId;
import org.thingsboard.server.common.data.id.RuleChainId;
import org.thingsboard.server.dao.service.DaoSqlTest;
@@ -30,7 +30,6 @@ import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.gen.edge.v1.UplinkMsg;
import org.thingsboard.server.gen.edge.v1.UplinkResponseMsg;
-import java.nio.charset.StandardCharsets;
import java.util.Optional;
import java.util.UUID;
@@ -52,12 +51,12 @@ public class AssetProfileEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof AssetProfileUpdateMsg);
AssetProfileUpdateMsg assetProfileUpdateMsg = (AssetProfileUpdateMsg) latestMessage;
+ AssetProfile assetProfileMsg = JacksonUtil.fromStringIgnoreUnknownProperties(assetProfileUpdateMsg.getEntity(), AssetProfile.class);
+ Assert.assertNotNull(assetProfileMsg);
+ Assert.assertEquals(assetProfile, assetProfileMsg);
+ Assert.assertEquals("Building", assetProfileMsg.getName());
+ Assert.assertEquals(buildingsRuleChainId, assetProfileMsg.getDefaultEdgeRuleChainId());
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, assetProfileUpdateMsg.getMsgType());
- Assert.assertEquals(assetProfile.getUuidId().getMostSignificantBits(), assetProfileUpdateMsg.getIdMSB());
- Assert.assertEquals(assetProfile.getUuidId().getLeastSignificantBits(), assetProfileUpdateMsg.getIdLSB());
- Assert.assertEquals("Building", assetProfileUpdateMsg.getName());
- Assert.assertEquals(buildingsRuleChainId.getId().getMostSignificantBits(), assetProfileUpdateMsg.getDefaultRuleChainIdMSB());
- Assert.assertEquals(buildingsRuleChainId.getId().getLeastSignificantBits(), assetProfileUpdateMsg.getDefaultRuleChainIdLSB());
// update asset profile
assetProfile.setImage("IMAGE");
@@ -67,8 +66,10 @@ public class AssetProfileEdgeTest extends AbstractEdgeTest {
latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof AssetProfileUpdateMsg);
assetProfileUpdateMsg = (AssetProfileUpdateMsg) latestMessage;
+ assetProfileMsg = JacksonUtil.fromStringIgnoreUnknownProperties(assetProfileUpdateMsg.getEntity(), AssetProfile.class);
+ Assert.assertNotNull(assetProfileMsg);
+ Assert.assertEquals("IMAGE", assetProfileMsg.getImage());
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, assetProfileUpdateMsg.getMsgType());
- Assert.assertEquals(ByteString.copyFrom("IMAGE".getBytes(StandardCharsets.UTF_8)), assetProfileUpdateMsg.getImage());
// delete profile
edgeImitator.expectMessageAmount(1);
@@ -90,18 +91,15 @@ public class AssetProfileEdgeTest extends AbstractEdgeTest {
RuleChainId edgeRuleChainId = createEdgeRuleChainAndAssignToEdge("Asset Profile Rule Chain");
DashboardId dashboardId = createDashboardAndAssignToEdge("Asset Profile Dashboard");
- UUID uuid = Uuids.timeBased();
+ AssetProfile assetProfileOnEdge = buildAssetProfileForUplinkMsg("Asset Profile On Edge");
+ assetProfileOnEdge.setDefaultRuleChainId(edgeRuleChainId);
+ assetProfileOnEdge.setDefaultDashboardId(dashboardId);
UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
AssetProfileUpdateMsg.Builder assetProfileUpdateMsgBuilder = AssetProfileUpdateMsg.newBuilder();
- assetProfileUpdateMsgBuilder.setIdMSB(uuid.getMostSignificantBits());
- assetProfileUpdateMsgBuilder.setIdLSB(uuid.getLeastSignificantBits());
- assetProfileUpdateMsgBuilder.setName("Asset Profile On Edge");
- assetProfileUpdateMsgBuilder.setDefault(false);
- assetProfileUpdateMsgBuilder.setDefaultRuleChainIdMSB(edgeRuleChainId.getId().getMostSignificantBits());
- assetProfileUpdateMsgBuilder.setDefaultRuleChainIdLSB(edgeRuleChainId.getId().getLeastSignificantBits());
- assetProfileUpdateMsgBuilder.setDefaultDashboardIdMSB(dashboardId.getId().getMostSignificantBits());
- assetProfileUpdateMsgBuilder.setDefaultDashboardIdLSB(dashboardId.getId().getLeastSignificantBits());
+ assetProfileUpdateMsgBuilder.setIdMSB(assetProfileOnEdge.getUuidId().getMostSignificantBits());
+ assetProfileUpdateMsgBuilder.setIdLSB(assetProfileOnEdge.getUuidId().getLeastSignificantBits());
+ assetProfileUpdateMsgBuilder.setEntity(JacksonUtil.toString(assetProfileOnEdge));
assetProfileUpdateMsgBuilder.setMsgType(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE);
testAutoGeneratedCodeByProtobuf(assetProfileUpdateMsgBuilder);
uplinkMsgBuilder.addAssetProfileUpdateMsg(assetProfileUpdateMsgBuilder.build());
@@ -116,7 +114,7 @@ public class AssetProfileEdgeTest extends AbstractEdgeTest {
UplinkResponseMsg latestResponseMsg = edgeImitator.getLatestResponseMsg();
Assert.assertTrue(latestResponseMsg.getSuccess());
- AssetProfile assetProfile = doGet("/api/assetProfile/" + uuid, AssetProfile.class);
+ AssetProfile assetProfile = doGet("/api/assetProfile/" + assetProfileOnEdge.getUuidId(), AssetProfile.class);
Assert.assertNotNull(assetProfile);
Assert.assertEquals("Asset Profile On Edge", assetProfile.getName());
Assert.assertEquals(dashboardId, assetProfile.getDefaultDashboardId());
@@ -149,13 +147,11 @@ public class AssetProfileEdgeTest extends AbstractEdgeTest {
assetProfileOnCloud = doPost("/api/assetProfile", assetProfileOnCloud, AssetProfile.class);
Assert.assertTrue(edgeImitator.waitForMessages());
- UUID uuid = Uuids.timeBased();
+ AssetProfile assetProfileOnEdge = buildAssetProfileForUplinkMsg(assetProfileOnCloudName);
UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
AssetProfileUpdateMsg.Builder assetProfileUpdateMsgBuilder = AssetProfileUpdateMsg.newBuilder();
- assetProfileUpdateMsgBuilder.setIdMSB(uuid.getMostSignificantBits());
- assetProfileUpdateMsgBuilder.setIdLSB(uuid.getLeastSignificantBits());
- assetProfileUpdateMsgBuilder.setName(assetProfileOnCloudName);
+ assetProfileUpdateMsgBuilder.setEntity(JacksonUtil.toString(assetProfileOnEdge));
assetProfileUpdateMsgBuilder.setMsgType(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE);
uplinkMsgBuilder.addAssetProfileUpdateMsg(assetProfileUpdateMsgBuilder.build());
@@ -172,12 +168,23 @@ public class AssetProfileEdgeTest extends AbstractEdgeTest {
Optional assetProfileUpdateMsgOpt = edgeImitator.findMessageByType(AssetProfileUpdateMsg.class);
Assert.assertTrue(assetProfileUpdateMsgOpt.isPresent());
AssetProfileUpdateMsg latestAssetProfileUpdateMsg = assetProfileUpdateMsgOpt.get();
- Assert.assertNotEquals(assetProfileOnCloudName, latestAssetProfileUpdateMsg.getName());
+ AssetProfile assetProfileMsg = JacksonUtil.fromStringIgnoreUnknownProperties(latestAssetProfileUpdateMsg.getEntity(), AssetProfile.class);
+ Assert.assertNotNull(assetProfileMsg);
+ Assert.assertNotEquals(assetProfileOnCloudName, assetProfileMsg.getName());
- Assert.assertNotEquals(assetProfileOnCloud.getUuidId(), uuid);
+ Assert.assertNotEquals(assetProfileOnCloud.getUuidId(), assetProfileOnEdge.getUuidId());
- AssetProfile assetProfile = doGet("/api/assetProfile/" + uuid, AssetProfile.class);
+ AssetProfile assetProfile = doGet("/api/assetProfile/" + assetProfileMsg.getUuidId(), AssetProfile.class);
Assert.assertNotNull(assetProfile);
Assert.assertNotEquals(assetProfileOnCloudName, assetProfile.getName());
}
+
+ private AssetProfile buildAssetProfileForUplinkMsg(String name) {
+ AssetProfile assetProfile = new AssetProfile();
+ assetProfile.setId(new AssetProfileId(UUID.randomUUID()));
+ assetProfile.setTenantId(tenantId);
+ assetProfile.setName(name);
+ assetProfile.setDefault(false);
+ return assetProfile;
+ }
}
diff --git a/application/src/test/java/org/thingsboard/server/edge/CustomerEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/CustomerEdgeTest.java
index 6cc15837d9..125aa41e18 100644
--- a/application/src/test/java/org/thingsboard/server/edge/CustomerEdgeTest.java
+++ b/application/src/test/java/org/thingsboard/server/edge/CustomerEdgeTest.java
@@ -18,6 +18,7 @@ package org.thingsboard.server.edge;
import com.google.protobuf.AbstractMessage;
import org.junit.Assert;
import org.junit.Test;
+import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.edge.Edge;
import org.thingsboard.server.common.data.id.CustomerId;
@@ -57,10 +58,9 @@ public class CustomerEdgeTest extends AbstractEdgeTest {
Optional customerUpdateOpt = edgeImitator.findMessageByType(CustomerUpdateMsg.class);
Assert.assertTrue(customerUpdateOpt.isPresent());
CustomerUpdateMsg customerUpdateMsg = customerUpdateOpt.get();
+ Customer customerMsg = JacksonUtil.fromStringIgnoreUnknownProperties(customerUpdateMsg.getEntity(), Customer.class);
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, customerUpdateMsg.getMsgType());
- Assert.assertEquals(savedCustomer.getUuidId().getMostSignificantBits(), customerUpdateMsg.getIdMSB());
- Assert.assertEquals(savedCustomer.getUuidId().getLeastSignificantBits(), customerUpdateMsg.getIdLSB());
- Assert.assertEquals(savedCustomer.getTitle(), customerUpdateMsg.getTitle());
+ Assert.assertEquals(savedCustomer, customerMsg);
testAutoGeneratedCodeByProtobuf(customerUpdateMsg);
// update customer
@@ -71,10 +71,9 @@ public class CustomerEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof CustomerUpdateMsg);
customerUpdateMsg = (CustomerUpdateMsg) latestMessage;
+ customerMsg = JacksonUtil.fromStringIgnoreUnknownProperties(customerUpdateMsg.getEntity(), Customer.class);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, customerUpdateMsg.getMsgType());
- Assert.assertEquals(savedCustomer.getUuidId().getMostSignificantBits(), customerUpdateMsg.getIdMSB());
- Assert.assertEquals(savedCustomer.getUuidId().getLeastSignificantBits(), customerUpdateMsg.getIdLSB());
- Assert.assertEquals(savedCustomer.getTitle(), customerUpdateMsg.getTitle());
+ Assert.assertEquals(savedCustomer, customerMsg);
// delete customer
edgeImitator.expectMessageAmount(2);
diff --git a/application/src/test/java/org/thingsboard/server/edge/DashboardEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/DashboardEdgeTest.java
index 6180ced49c..fc342bf682 100644
--- a/application/src/test/java/org/thingsboard/server/edge/DashboardEdgeTest.java
+++ b/application/src/test/java/org/thingsboard/server/edge/DashboardEdgeTest.java
@@ -15,7 +15,6 @@
*/
package org.thingsboard.server.edge;
-import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.core.type.TypeReference;
import com.google.protobuf.AbstractMessage;
import org.junit.Assert;
@@ -27,6 +26,7 @@ import org.thingsboard.server.common.data.DashboardInfo;
import org.thingsboard.server.common.data.ShortCustomerInfo;
import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.edge.Edge;
+import org.thingsboard.server.common.data.id.DashboardId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.dao.service.DaoSqlTest;
@@ -36,7 +36,6 @@ import org.thingsboard.server.gen.edge.v1.UplinkMsg;
import java.util.List;
import java.util.Optional;
-import java.util.Set;
import java.util.UUID;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@@ -63,13 +62,12 @@ public class DashboardEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof DashboardUpdateMsg);
DashboardUpdateMsg dashboardUpdateMsg = (DashboardUpdateMsg) latestMessage;
+ Dashboard dashboardMsg = JacksonUtil.fromStringIgnoreUnknownProperties(dashboardUpdateMsg.getEntity(), Dashboard.class);
+ Assert.assertNotNull(dashboardMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, dashboardUpdateMsg.getMsgType());
- Assert.assertEquals(savedDashboard.getUuidId().getMostSignificantBits(), dashboardUpdateMsg.getIdMSB());
- Assert.assertEquals(savedDashboard.getUuidId().getLeastSignificantBits(), dashboardUpdateMsg.getIdLSB());
- Assert.assertEquals(savedDashboard.getTitle(), dashboardUpdateMsg.getTitle());
- Assert.assertTrue(dashboardUpdateMsg.getMobileHide());
- Assert.assertEquals(IMAGE, dashboardUpdateMsg.getImage());
- Assert.assertEquals(MOBILE_ORDER, dashboardUpdateMsg.getMobileOrder());
+ Assert.assertEquals(savedDashboard, dashboardMsg);
+ Assert.assertEquals(IMAGE, dashboardMsg.getImage());
+ Assert.assertEquals(MOBILE_ORDER, dashboardMsg.getMobileOrder().intValue());
testAutoGeneratedCodeByProtobuf(dashboardUpdateMsg);
// update dashboard
@@ -80,8 +78,10 @@ public class DashboardEdgeTest extends AbstractEdgeTest {
latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof DashboardUpdateMsg);
dashboardUpdateMsg = (DashboardUpdateMsg) latestMessage;
+ dashboardMsg = JacksonUtil.fromStringIgnoreUnknownProperties(dashboardUpdateMsg.getEntity(), Dashboard.class);
+ Assert.assertNotNull(dashboardMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, dashboardUpdateMsg.getMsgType());
- Assert.assertEquals(savedDashboard.getTitle(), dashboardUpdateMsg.getTitle());
+ Assert.assertEquals(savedDashboard.getTitle(), dashboardMsg.getTitle());
// unassign dashboard from edge
edgeImitator.expectMessageAmount(1);
@@ -112,10 +112,12 @@ public class DashboardEdgeTest extends AbstractEdgeTest {
latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof DashboardUpdateMsg);
dashboardUpdateMsg = (DashboardUpdateMsg) latestMessage;
+ dashboardMsg = JacksonUtil.fromStringIgnoreUnknownProperties(dashboardUpdateMsg.getEntity(), Dashboard.class);
+ Assert.assertNotNull(dashboardMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, dashboardUpdateMsg.getMsgType());
Assert.assertEquals(savedDashboard.getUuidId().getMostSignificantBits(), dashboardUpdateMsg.getIdMSB());
Assert.assertEquals(savedDashboard.getUuidId().getLeastSignificantBits(), dashboardUpdateMsg.getIdLSB());
- Assert.assertEquals(savedDashboard.getTitle(), dashboardUpdateMsg.getTitle());
+ Assert.assertEquals(savedDashboard.getTitle(), dashboardMsg.getTitle());
// assign dashboard #2 to customer
Customer customer = new Customer();
@@ -133,12 +135,12 @@ public class DashboardEdgeTest extends AbstractEdgeTest {
latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof DashboardUpdateMsg);
dashboardUpdateMsg = (DashboardUpdateMsg) latestMessage;
+ dashboardMsg = JacksonUtil.fromStringIgnoreUnknownProperties(dashboardUpdateMsg.getEntity(), Dashboard.class);
+ Assert.assertNotNull(dashboardMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, dashboardUpdateMsg.getMsgType());
- Set assignedCustomers =
- JacksonUtil.fromString(dashboardUpdateMsg.getAssignedCustomers(), new TypeReference<>() {});
- Assert.assertNotNull(assignedCustomers);
- Assert.assertFalse(assignedCustomers.isEmpty());
- Assert.assertTrue(assignedCustomers.contains(new ShortCustomerInfo(savedCustomer.getId(), customer.getTitle(), customer.isPublic())));
+ Assert.assertNotNull(dashboardMsg.getAssignedCustomers());
+ Assert.assertFalse(dashboardMsg.getAssignedCustomers().isEmpty());
+ Assert.assertTrue(dashboardMsg.getAssignedCustomers().contains(new ShortCustomerInfo(savedCustomer.getId(), customer.getTitle(), customer.isPublic())));
// unassign dashboard #2 from customer
edgeImitator.expectMessageAmount(1);
@@ -148,11 +150,11 @@ public class DashboardEdgeTest extends AbstractEdgeTest {
latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof DashboardUpdateMsg);
dashboardUpdateMsg = (DashboardUpdateMsg) latestMessage;
+ dashboardMsg = JacksonUtil.fromStringIgnoreUnknownProperties(dashboardUpdateMsg.getEntity(), Dashboard.class);
+ Assert.assertNotNull(dashboardMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, dashboardUpdateMsg.getMsgType());
- assignedCustomers =
- JacksonUtil.fromString(dashboardUpdateMsg.getAssignedCustomers(), new TypeReference<>() {});
- Assert.assertNotNull(assignedCustomers);
- Assert.assertTrue(assignedCustomers.isEmpty());
+ Assert.assertNotNull(dashboardMsg.getAssignedCustomers());
+ Assert.assertTrue(dashboardMsg.getAssignedCustomers().isEmpty());
// delete dashboard #2 - messages expected
edgeImitator.expectMessageAmount(1);
@@ -169,14 +171,13 @@ public class DashboardEdgeTest extends AbstractEdgeTest {
@Test
public void testSendDashboardToCloud() throws Exception {
- UUID uuid = Uuids.timeBased();
+ Dashboard dashboard = buildDashboardForUplinkMsg();
UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
DashboardUpdateMsg.Builder dashboardUpdateMsgBuilder = DashboardUpdateMsg.newBuilder();
- dashboardUpdateMsgBuilder.setIdMSB(uuid.getMostSignificantBits());
- dashboardUpdateMsgBuilder.setIdLSB(uuid.getLeastSignificantBits());
- dashboardUpdateMsgBuilder.setTitle("Edge Test Dashboard");
- dashboardUpdateMsgBuilder.setConfiguration("");
+ dashboardUpdateMsgBuilder.setIdMSB(dashboard.getUuidId().getMostSignificantBits());
+ dashboardUpdateMsgBuilder.setIdLSB(dashboard.getUuidId().getLeastSignificantBits());
+ dashboardUpdateMsgBuilder.setEntity(JacksonUtil.toString(dashboard));
dashboardUpdateMsgBuilder.setMsgType(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE);
testAutoGeneratedCodeByProtobuf(dashboardUpdateMsgBuilder);
uplinkMsgBuilder.addDashboardUpdateMsg(dashboardUpdateMsgBuilder.build());
@@ -188,9 +189,9 @@ public class DashboardEdgeTest extends AbstractEdgeTest {
Assert.assertTrue(edgeImitator.waitForResponses());
- Dashboard dashboard = doGet("/api/dashboard/" + uuid, Dashboard.class);
- Assert.assertNotNull(dashboard);
- Assert.assertEquals("Edge Test Dashboard", dashboard.getName());
+ Dashboard foundDashboard = doGet("/api/dashboard/" + dashboard.getUuidId(), Dashboard.class);
+ Assert.assertNotNull(foundDashboard);
+ Assert.assertEquals("Edge Test Dashboard", foundDashboard.getName());
}
@Test
@@ -237,4 +238,12 @@ public class DashboardEdgeTest extends AbstractEdgeTest {
return savedDashboard;
}
+ private Dashboard buildDashboardForUplinkMsg() {
+ Dashboard dashboard = new Dashboard();
+ dashboard.setId(new DashboardId(UUID.randomUUID()));
+ dashboard.setTenantId(tenantId);
+ dashboard.setTitle("Edge Test Dashboard");
+ return dashboard;
+ }
+
}
diff --git a/application/src/test/java/org/thingsboard/server/edge/DeviceEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/DeviceEdgeTest.java
index e6fee370f1..56b8897ed3 100644
--- a/application/src/test/java/org/thingsboard/server/edge/DeviceEdgeTest.java
+++ b/application/src/test/java/org/thingsboard/server/edge/DeviceEdgeTest.java
@@ -43,6 +43,7 @@ import org.thingsboard.server.common.data.edge.EdgeEvent;
import org.thingsboard.server.common.data.edge.EdgeEventActionType;
import org.thingsboard.server.common.data.edge.EdgeEventType;
import org.thingsboard.server.common.data.id.CustomerId;
+import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.ota.OtaPackageType;
import org.thingsboard.server.common.data.page.PageData;
@@ -51,7 +52,7 @@ import org.thingsboard.server.common.data.security.DeviceCredentials;
import org.thingsboard.server.common.data.security.DeviceCredentialsType;
import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration;
import org.thingsboard.server.common.msg.session.FeatureType;
-import org.thingsboard.server.common.transport.adaptor.JsonConverter;
+import org.thingsboard.server.common.adaptor.JsonConverter;
import org.thingsboard.server.dao.service.DaoSqlTest;
import org.thingsboard.server.gen.edge.v1.AttributesRequestMsg;
import org.thingsboard.server.gen.edge.v1.DeviceCredentialsRequestMsg;
@@ -117,11 +118,13 @@ public class DeviceEdgeTest extends AbstractEdgeTest {
Optional deviceUpdateMsgOpt = edgeImitator.findMessageByType(DeviceUpdateMsg.class);
Assert.assertTrue(deviceUpdateMsgOpt.isPresent());
deviceUpdateMsg = deviceUpdateMsgOpt.get();
+ Device deviceFromMsg = JacksonUtil.fromStringIgnoreUnknownProperties(deviceUpdateMsg.getEntity(), Device.class);
+ Assert.assertNotNull(deviceFromMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, deviceUpdateMsg.getMsgType());
- Assert.assertEquals(savedDevice.getUuidId().getMostSignificantBits(), deviceUpdateMsg.getIdMSB());
- Assert.assertEquals(savedDevice.getUuidId().getLeastSignificantBits(), deviceUpdateMsg.getIdLSB());
- Assert.assertEquals(savedDevice.getName(), deviceUpdateMsg.getName());
- Assert.assertEquals(savedDevice.getType(), deviceUpdateMsg.getType());
+ Assert.assertEquals(savedDevice, deviceFromMsg);
+ Assert.assertEquals(savedDevice.getId(), deviceFromMsg.getId());
+ Assert.assertEquals(savedDevice.getName(), deviceFromMsg.getName());
+ Assert.assertEquals(savedDevice.getType(), deviceFromMsg.getType());
Optional deviceProfileUpdateMsgOpt = edgeImitator.findMessageByType(DeviceProfileUpdateMsg.class);
Assert.assertTrue(deviceProfileUpdateMsgOpt.isPresent());
@@ -146,9 +149,10 @@ public class DeviceEdgeTest extends AbstractEdgeTest {
latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg);
deviceUpdateMsg = (DeviceUpdateMsg) latestMessage;
+ deviceFromMsg = JacksonUtil.fromStringIgnoreUnknownProperties(deviceUpdateMsg.getEntity(), Device.class);
+ Assert.assertNotNull(deviceFromMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, deviceUpdateMsg.getMsgType());
- Assert.assertEquals(savedCustomer.getUuidId().getMostSignificantBits(), deviceUpdateMsg.getCustomerIdMSB());
- Assert.assertEquals(savedCustomer.getUuidId().getLeastSignificantBits(), deviceUpdateMsg.getCustomerIdLSB());
+ Assert.assertEquals(savedCustomer.getId(), deviceFromMsg.getCustomerId());
// unassign device #2 from customer
edgeImitator.expectMessageAmount(1);
@@ -157,10 +161,12 @@ public class DeviceEdgeTest extends AbstractEdgeTest {
latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg);
deviceUpdateMsg = (DeviceUpdateMsg) latestMessage;
+ deviceFromMsg = JacksonUtil.fromStringIgnoreUnknownProperties(deviceUpdateMsg.getEntity(), Device.class);
+ Assert.assertNotNull(deviceFromMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, deviceUpdateMsg.getMsgType());
Assert.assertEquals(
new CustomerId(EntityId.NULL_UUID),
- new CustomerId(new UUID(deviceUpdateMsg.getCustomerIdMSB(), deviceUpdateMsg.getCustomerIdLSB())));
+ new CustomerId(new UUID(deviceFromMsg.getCustomerId().getId().getMostSignificantBits(), deviceFromMsg.getCustomerId().getId().getLeastSignificantBits())));
// delete device #2 - messages expected
edgeImitator.expectMessageAmount(1);
@@ -196,9 +202,8 @@ public class DeviceEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof DeviceCredentialsUpdateMsg);
DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg = (DeviceCredentialsUpdateMsg) latestMessage;
- Assert.assertEquals(deviceCredentials.getCredentialsType().name(), deviceCredentialsUpdateMsg.getCredentialsType());
- Assert.assertEquals(deviceCredentials.getCredentialsId(), deviceCredentialsUpdateMsg.getCredentialsId());
- Assert.assertFalse(deviceCredentialsUpdateMsg.hasCredentialsValue());
+ DeviceCredentials deviceCredentialsMsg = JacksonUtil.fromStringIgnoreUnknownProperties(deviceCredentialsUpdateMsg.getEntity(), DeviceCredentials.class);
+ Assert.assertEquals(deviceCredentials, deviceCredentialsMsg);
// update device credentials - X509_CERTIFICATE
edgeImitator.expectMessageAmount(1);
@@ -211,10 +216,12 @@ public class DeviceEdgeTest extends AbstractEdgeTest {
latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof DeviceCredentialsUpdateMsg);
deviceCredentialsUpdateMsg = (DeviceCredentialsUpdateMsg) latestMessage;
- Assert.assertEquals(deviceCredentials.getCredentialsType().name(), deviceCredentialsUpdateMsg.getCredentialsType());
- Assert.assertFalse(deviceCredentialsUpdateMsg.getCredentialsId().isEmpty());
- Assert.assertTrue(deviceCredentialsUpdateMsg.hasCredentialsValue());
- Assert.assertEquals(deviceCredentials.getCredentialsValue(), deviceCredentialsUpdateMsg.getCredentialsValue());
+ deviceCredentialsMsg = JacksonUtil.fromStringIgnoreUnknownProperties(deviceCredentialsUpdateMsg.getEntity(), DeviceCredentials.class);
+ Assert.assertNotNull(deviceCredentialsMsg);
+ Assert.assertEquals(deviceCredentials.getCredentialsType(), deviceCredentialsMsg.getCredentialsType());
+ Assert.assertFalse(deviceCredentialsMsg.getCredentialsId().isEmpty());
+ Assert.assertNotNull(deviceCredentialsMsg.getCredentialsValue());
+ Assert.assertEquals(deviceCredentials.getCredentialsValue(), deviceCredentialsMsg.getCredentialsValue());
}
private void verifyUpdateFirmwareIdSoftwareIdAndDeviceData(Device savedDevice) throws InterruptedException {
@@ -244,19 +251,13 @@ public class DeviceEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg);
DeviceUpdateMsg deviceUpdateMsg = (DeviceUpdateMsg) latestMessage;
+ Device deviceMsg = JacksonUtil.fromStringIgnoreUnknownProperties(deviceUpdateMsg.getEntity(), Device.class);
+ Assert.assertNotNull(deviceMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, deviceUpdateMsg.getMsgType());
- Assert.assertEquals(savedDevice.getUuidId().getMostSignificantBits(), deviceUpdateMsg.getIdMSB());
- Assert.assertEquals(savedDevice.getUuidId().getLeastSignificantBits(), deviceUpdateMsg.getIdLSB());
- Assert.assertEquals(savedDevice.getName(), deviceUpdateMsg.getName());
- Assert.assertEquals(savedDevice.getType(), deviceUpdateMsg.getType());
- Assert.assertEquals(firmwareOtaPackageInfo.getUuidId().getMostSignificantBits(), deviceUpdateMsg.getFirmwareIdMSB());
- Assert.assertEquals(firmwareOtaPackageInfo.getUuidId().getLeastSignificantBits(), deviceUpdateMsg.getFirmwareIdLSB());
- Assert.assertEquals(softwareOtaPackageInfo.getUuidId().getMostSignificantBits(), deviceUpdateMsg.getSoftwareIdMSB());
- Assert.assertEquals(softwareOtaPackageInfo.getUuidId().getLeastSignificantBits(), deviceUpdateMsg.getSoftwareIdLSB());
- Optional deviceDataOpt =
- dataDecodingEncodingService.decode(deviceUpdateMsg.getDeviceDataBytes().toByteArray());
- Assert.assertTrue(deviceDataOpt.isPresent());
- deviceData = deviceDataOpt.get();
+ Assert.assertEquals(savedDevice, deviceMsg);
+ Assert.assertEquals(firmwareOtaPackageInfo.getId(), deviceMsg.getFirmwareId());
+ Assert.assertEquals(softwareOtaPackageInfo.getId(), deviceMsg.getSoftwareId());
+ deviceData = deviceMsg.getDeviceData();
Assert.assertTrue(deviceData.getTransportConfiguration() instanceof MqttDeviceTransportConfiguration);
MqttDeviceTransportConfiguration mqttDeviceTransportConfiguration =
(MqttDeviceTransportConfiguration) deviceData.getTransportConfiguration();
@@ -276,14 +277,13 @@ public class DeviceEdgeTest extends AbstractEdgeTest {
loginTenantAdmin();
- UUID uuid = Uuids.timeBased();
+ Device device = buildDeviceForUplinkMsg("Edge Device", DEFAULT_DEVICE_TYPE);
UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
DeviceUpdateMsg.Builder deviceUpdateMsgBuilder = DeviceUpdateMsg.newBuilder();
- deviceUpdateMsgBuilder.setIdMSB(uuid.getMostSignificantBits());
- deviceUpdateMsgBuilder.setIdLSB(uuid.getLeastSignificantBits());
- deviceUpdateMsgBuilder.setName("Edge Device");
- deviceUpdateMsgBuilder.setType(DEFAULT_DEVICE_TYPE);
+ deviceUpdateMsgBuilder.setIdMSB(device.getUuidId().getMostSignificantBits());
+ deviceUpdateMsgBuilder.setIdLSB(device.getUuidId().getLeastSignificantBits());
+ deviceUpdateMsgBuilder.setEntity(JacksonUtil.toString(device));
deviceUpdateMsgBuilder.setMsgType(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE);
uplinkMsgBuilder.addDeviceUpdateMsg(deviceUpdateMsgBuilder.build());
@@ -327,12 +327,11 @@ public class DeviceEdgeTest extends AbstractEdgeTest {
public void testSendDeviceCredentialsUpdateToCloud() throws Exception {
Device device = findDeviceByName("Edge Device 1");
+ DeviceCredentials deviceCredentials = buildDeviceCredentialsForUplinkMsg(device.getId());
+
UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
DeviceCredentialsUpdateMsg.Builder deviceCredentialsUpdateMsgBuilder = DeviceCredentialsUpdateMsg.newBuilder();
- deviceCredentialsUpdateMsgBuilder.setDeviceIdMSB(device.getUuidId().getMostSignificantBits());
- deviceCredentialsUpdateMsgBuilder.setDeviceIdLSB(device.getUuidId().getLeastSignificantBits());
- deviceCredentialsUpdateMsgBuilder.setCredentialsType(DeviceCredentialsType.ACCESS_TOKEN.name());
- deviceCredentialsUpdateMsgBuilder.setCredentialsId("NEW_TOKEN");
+ deviceCredentialsUpdateMsgBuilder.setEntity(JacksonUtil.toString(deviceCredentials));
testAutoGeneratedCodeByProtobuf(deviceCredentialsUpdateMsgBuilder);
uplinkMsgBuilder.addDeviceCredentialsUpdateMsg(deviceCredentialsUpdateMsgBuilder.build());
@@ -367,10 +366,10 @@ public class DeviceEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof DeviceCredentialsUpdateMsg);
DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg = (DeviceCredentialsUpdateMsg) latestMessage;
- Assert.assertEquals(deviceCredentialsUpdateMsg.getDeviceIdMSB(), device.getUuidId().getMostSignificantBits());
- Assert.assertEquals(deviceCredentialsUpdateMsg.getDeviceIdLSB(), device.getUuidId().getLeastSignificantBits());
- Assert.assertEquals(deviceCredentialsUpdateMsg.getCredentialsType(), deviceCredentials.getCredentialsType().name());
- Assert.assertEquals(deviceCredentialsUpdateMsg.getCredentialsId(), deviceCredentials.getCredentialsId());
+ DeviceCredentials deviceCredentialsMsg = JacksonUtil.fromStringIgnoreUnknownProperties(deviceCredentialsUpdateMsg.getEntity(), DeviceCredentials.class);
+ Assert.assertNotNull(deviceCredentialsMsg);
+ Assert.assertEquals(device.getId(), deviceCredentialsMsg.getDeviceId());
+ Assert.assertEquals(deviceCredentials, deviceCredentialsMsg);
}
@Test
@@ -485,14 +484,13 @@ public class DeviceEdgeTest extends AbstractEdgeTest {
String deviceOnCloudName = StringUtils.randomAlphanumeric(15);
Device deviceOnCloud = saveDevice(deviceOnCloudName, DEFAULT_DEVICE_TYPE);
- UUID uuid = Uuids.timeBased();
+ Device deviceMsg = buildDeviceForUplinkMsg(deviceOnCloudName, "test");
UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
DeviceUpdateMsg.Builder deviceUpdateMsgBuilder = DeviceUpdateMsg.newBuilder();
- deviceUpdateMsgBuilder.setIdMSB(uuid.getMostSignificantBits());
- deviceUpdateMsgBuilder.setIdLSB(uuid.getLeastSignificantBits());
- deviceUpdateMsgBuilder.setName(deviceOnCloudName);
- deviceUpdateMsgBuilder.setType("default");
+ deviceUpdateMsgBuilder.setIdMSB(deviceMsg.getUuidId().getMostSignificantBits());
+ deviceUpdateMsgBuilder.setIdLSB(deviceMsg.getUuidId().getLeastSignificantBits());
+ deviceUpdateMsgBuilder.setEntity(JacksonUtil.toString(deviceMsg));
deviceUpdateMsgBuilder.setMsgType(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE);
testAutoGeneratedCodeByProtobuf(deviceUpdateMsgBuilder);
uplinkMsgBuilder.addDeviceUpdateMsg(deviceUpdateMsgBuilder.build());
@@ -509,7 +507,9 @@ public class DeviceEdgeTest extends AbstractEdgeTest {
Optional deviceUpdateMsgOpt = edgeImitator.findMessageByType(DeviceUpdateMsg.class);
Assert.assertTrue(deviceUpdateMsgOpt.isPresent());
DeviceUpdateMsg latestDeviceUpdateMsg = deviceUpdateMsgOpt.get();
- Assert.assertNotEquals(deviceOnCloudName, latestDeviceUpdateMsg.getName());
+ Device deviceLatestMsg = JacksonUtil.fromStringIgnoreUnknownProperties(latestDeviceUpdateMsg.getEntity(), Device.class);
+ Assert.assertNotNull(deviceLatestMsg);
+ Assert.assertNotEquals(deviceOnCloudName, deviceLatestMsg.getName());
UUID newDeviceId = new UUID(latestDeviceUpdateMsg.getIdMSB(), latestDeviceUpdateMsg.getIdLSB());
@@ -522,8 +522,8 @@ public class DeviceEdgeTest extends AbstractEdgeTest {
Optional deviceCredentialsUpdateMsgOpt = edgeImitator.findMessageByType(DeviceCredentialsRequestMsg.class);
Assert.assertTrue(deviceCredentialsUpdateMsgOpt.isPresent());
DeviceCredentialsRequestMsg latestDeviceCredentialsRequestMsg = deviceCredentialsUpdateMsgOpt.get();
- Assert.assertEquals(uuid.getMostSignificantBits(), latestDeviceCredentialsRequestMsg.getDeviceIdMSB());
- Assert.assertEquals(uuid.getLeastSignificantBits(), latestDeviceCredentialsRequestMsg.getDeviceIdLSB());
+ Assert.assertEquals(deviceMsg.getUuidId().getMostSignificantBits(), latestDeviceCredentialsRequestMsg.getDeviceIdMSB());
+ Assert.assertEquals(device.getUuidId().getLeastSignificantBits(), latestDeviceCredentialsRequestMsg.getDeviceIdLSB());
newDeviceId = new UUID(latestDeviceCredentialsRequestMsg.getDeviceIdMSB(), latestDeviceCredentialsRequestMsg.getDeviceIdLSB());
@@ -534,14 +534,13 @@ public class DeviceEdgeTest extends AbstractEdgeTest {
@Test
public void testSendDeviceToCloud() throws Exception {
- UUID uuid = Uuids.timeBased();
+ Device deviceMsg = buildDeviceForUplinkMsg("Edge Device 2", "test");
UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
DeviceUpdateMsg.Builder deviceUpdateMsgBuilder = DeviceUpdateMsg.newBuilder();
- deviceUpdateMsgBuilder.setIdMSB(uuid.getMostSignificantBits());
- deviceUpdateMsgBuilder.setIdLSB(uuid.getLeastSignificantBits());
- deviceUpdateMsgBuilder.setName("Edge Device 2");
- deviceUpdateMsgBuilder.setType("default");
+ deviceUpdateMsgBuilder.setIdMSB(deviceMsg.getUuidId().getMostSignificantBits());
+ deviceUpdateMsgBuilder.setIdLSB(deviceMsg.getUuidId().getLeastSignificantBits());
+ deviceUpdateMsgBuilder.setEntity(JacksonUtil.toString(deviceMsg));
deviceUpdateMsgBuilder.setMsgType(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE);
uplinkMsgBuilder.addDeviceUpdateMsg(deviceUpdateMsgBuilder.build());
@@ -553,11 +552,11 @@ public class DeviceEdgeTest extends AbstractEdgeTest {
Assert.assertTrue(edgeImitator.waitForResponses());
Assert.assertTrue(edgeImitator.waitForMessages());
- Optional deviceCredentialsRequestMsgOpt = edgeImitator.findMessageByType(DeviceCredentialsRequestMsg.class);
- Assert.assertTrue(deviceCredentialsRequestMsgOpt.isPresent());
- DeviceCredentialsRequestMsg latestDeviceCredentialsRequestMsg = deviceCredentialsRequestMsgOpt.get();
- Assert.assertEquals(uuid.getMostSignificantBits(), latestDeviceCredentialsRequestMsg.getDeviceIdMSB());
- Assert.assertEquals(uuid.getLeastSignificantBits(), latestDeviceCredentialsRequestMsg.getDeviceIdLSB());
+ AbstractMessage latestMessage = edgeImitator.getLatestMessage();
+ Assert.assertTrue(latestMessage instanceof DeviceCredentialsRequestMsg);
+ DeviceCredentialsRequestMsg latestDeviceCredentialsRequestMsg = (DeviceCredentialsRequestMsg) latestMessage;
+ Assert.assertEquals(deviceMsg.getUuidId().getMostSignificantBits(), latestDeviceCredentialsRequestMsg.getDeviceIdMSB());
+ Assert.assertEquals(deviceMsg.getUuidId().getLeastSignificantBits(), latestDeviceCredentialsRequestMsg.getDeviceIdLSB());
UUID newDeviceId = new UUID(latestDeviceCredentialsRequestMsg.getDeviceIdMSB(), latestDeviceCredentialsRequestMsg.getDeviceIdLSB());
@@ -769,4 +768,22 @@ public class DeviceEdgeTest extends AbstractEdgeTest {
}
}
}
+
+ private Device buildDeviceForUplinkMsg(String name, String type) {
+ Device device = new Device();
+ device.setId(new DeviceId(UUID.randomUUID()));
+ device.setTenantId(tenantId);
+ device.setType(type);
+ device.setName(name);
+ return device;
+ }
+
+
+ private DeviceCredentials buildDeviceCredentialsForUplinkMsg(DeviceId deviceId) {
+ DeviceCredentials deviceCredentials = new DeviceCredentials();
+ deviceCredentials.setDeviceId(deviceId);
+ deviceCredentials.setCredentialsValue("NEW_TOKEN");
+ deviceCredentials.setCredentialsType(DeviceCredentialsType.ACCESS_TOKEN);
+ return deviceCredentials;
+ }
}
diff --git a/application/src/test/java/org/thingsboard/server/edge/DeviceProfileEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/DeviceProfileEdgeTest.java
index 9d48824bed..325872d919 100644
--- a/application/src/test/java/org/thingsboard/server/edge/DeviceProfileEdgeTest.java
+++ b/application/src/test/java/org/thingsboard/server/edge/DeviceProfileEdgeTest.java
@@ -15,9 +15,7 @@
*/
package org.thingsboard.server.edge;
-import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.google.protobuf.AbstractMessage;
-import com.google.protobuf.ByteString;
import org.junit.Assert;
import org.junit.Test;
import org.thingsboard.common.util.JacksonUtil;
@@ -44,6 +42,7 @@ import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.Abstrac
import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.LwM2MBootstrapServerCredential;
import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.NoSecLwM2MBootstrapServerCredential;
import org.thingsboard.server.common.data.id.DashboardId;
+import org.thingsboard.server.common.data.id.DeviceProfileId;
import org.thingsboard.server.common.data.id.RuleChainId;
import org.thingsboard.server.common.data.kv.DataType;
import org.thingsboard.server.common.data.ota.OtaPackageType;
@@ -82,11 +81,10 @@ public class DeviceProfileEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof DeviceProfileUpdateMsg);
DeviceProfileUpdateMsg deviceProfileUpdateMsg = (DeviceProfileUpdateMsg) latestMessage;
+ DeviceProfile deviceProfileMsg = JacksonUtil.fromStringIgnoreUnknownProperties(deviceProfileUpdateMsg.getEntity(), DeviceProfile.class);
+ Assert.assertNotNull(deviceProfileMsg);
+ Assert.assertEquals(deviceProfile, deviceProfileMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, deviceProfileUpdateMsg.getMsgType());
- Assert.assertEquals(deviceProfile.getUuidId().getMostSignificantBits(), deviceProfileUpdateMsg.getIdMSB());
- Assert.assertEquals(deviceProfile.getUuidId().getLeastSignificantBits(), deviceProfileUpdateMsg.getIdLSB());
- Assert.assertEquals(thermostatsRuleChainId.getId().getMostSignificantBits(), deviceProfileUpdateMsg.getDefaultRuleChainIdMSB());
- Assert.assertEquals(thermostatsRuleChainId.getId().getLeastSignificantBits(), deviceProfileUpdateMsg.getDefaultRuleChainIdLSB());
// update device profile
edgeImitator.expectMessageAmount(1);
@@ -108,12 +106,9 @@ public class DeviceProfileEdgeTest extends AbstractEdgeTest {
latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof DeviceProfileUpdateMsg);
deviceProfileUpdateMsg = (DeviceProfileUpdateMsg) latestMessage;
- Assert.assertEquals(firmwareOtaPackageInfo.getUuidId().getMostSignificantBits(), deviceProfileUpdateMsg.getFirmwareIdMSB());
- Assert.assertEquals(firmwareOtaPackageInfo.getUuidId().getLeastSignificantBits(), deviceProfileUpdateMsg.getFirmwareIdLSB());
- Assert.assertEquals(softwareOtaPackageInfo.getUuidId().getMostSignificantBits(), deviceProfileUpdateMsg.getSoftwareIdMSB());
- Assert.assertEquals(softwareOtaPackageInfo.getUuidId().getLeastSignificantBits(), deviceProfileUpdateMsg.getSoftwareIdLSB());
- Assert.assertEquals(thermostatsDashboardId.getId().getMostSignificantBits(), deviceProfileUpdateMsg.getDefaultDashboardIdMSB());
- Assert.assertEquals(thermostatsDashboardId.getId().getLeastSignificantBits(), deviceProfileUpdateMsg.getDefaultDashboardIdLSB());
+ deviceProfileMsg = JacksonUtil.fromStringIgnoreUnknownProperties(deviceProfileUpdateMsg.getEntity(), DeviceProfile.class);
+ Assert.assertNotNull(deviceProfileMsg);
+ Assert.assertEquals(deviceProfile, deviceProfileMsg);
// delete profile
edgeImitator.expectMessageAmount(1);
@@ -138,16 +133,13 @@ public class DeviceProfileEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof DeviceProfileUpdateMsg);
DeviceProfileUpdateMsg deviceProfileUpdateMsg = (DeviceProfileUpdateMsg) latestMessage;
+ DeviceProfile deviceProfileMsg = JacksonUtil.fromStringIgnoreUnknownProperties(deviceProfileUpdateMsg.getEntity(), DeviceProfile.class);
+ Assert.assertNotNull(deviceProfileMsg);
+ Assert.assertEquals(deviceProfile, deviceProfileMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, deviceProfileUpdateMsg.getMsgType());
- Assert.assertEquals(deviceProfile.getUuidId().getMostSignificantBits(), deviceProfileUpdateMsg.getIdMSB());
- Assert.assertEquals(deviceProfile.getUuidId().getLeastSignificantBits(), deviceProfileUpdateMsg.getIdLSB());
- Assert.assertEquals(DeviceTransportType.SNMP.name(), deviceProfileUpdateMsg.getTransportType());
+ Assert.assertEquals(DeviceTransportType.SNMP, deviceProfileMsg.getTransportType());
- Optional deviceProfileDataOpt =
- dataDecodingEncodingService.decode(deviceProfileUpdateMsg.getProfileDataBytes().toByteArray());
-
- Assert.assertTrue(deviceProfileDataOpt.isPresent());
- DeviceProfileData deviceProfileData = deviceProfileDataOpt.get();
+ DeviceProfileData deviceProfileData = deviceProfileMsg.getProfileData();
Assert.assertTrue(deviceProfileData.getTransportConfiguration() instanceof SnmpDeviceProfileTransportConfiguration);
SnmpDeviceProfileTransportConfiguration transportConfiguration =
@@ -179,16 +171,13 @@ public class DeviceProfileEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof DeviceProfileUpdateMsg);
DeviceProfileUpdateMsg deviceProfileUpdateMsg = (DeviceProfileUpdateMsg) latestMessage;
+ DeviceProfile deviceProfileMsg = JacksonUtil.fromStringIgnoreUnknownProperties(deviceProfileUpdateMsg.getEntity(), DeviceProfile.class);
+ Assert.assertNotNull(deviceProfileMsg);
+ Assert.assertEquals(deviceProfile, deviceProfileMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, deviceProfileUpdateMsg.getMsgType());
- Assert.assertEquals(deviceProfile.getUuidId().getMostSignificantBits(), deviceProfileUpdateMsg.getIdMSB());
- Assert.assertEquals(deviceProfile.getUuidId().getLeastSignificantBits(), deviceProfileUpdateMsg.getIdLSB());
- Assert.assertEquals(DeviceTransportType.LWM2M.name(), deviceProfileUpdateMsg.getTransportType());
+ Assert.assertEquals(DeviceTransportType.LWM2M, deviceProfileMsg.getTransportType());
- Optional deviceProfileDataOpt =
- dataDecodingEncodingService.decode(deviceProfileUpdateMsg.getProfileDataBytes().toByteArray());
-
- Assert.assertTrue(deviceProfileDataOpt.isPresent());
- DeviceProfileData deviceProfileData = deviceProfileDataOpt.get();
+ DeviceProfileData deviceProfileData = deviceProfileMsg.getProfileData();
Assert.assertTrue(deviceProfileData.getTransportConfiguration() instanceof Lwm2mDeviceProfileTransportConfiguration);
Lwm2mDeviceProfileTransportConfiguration transportConfiguration =
@@ -231,16 +220,13 @@ public class DeviceProfileEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof DeviceProfileUpdateMsg);
DeviceProfileUpdateMsg deviceProfileUpdateMsg = (DeviceProfileUpdateMsg) latestMessage;
+ DeviceProfile deviceProfileMsg = JacksonUtil.fromStringIgnoreUnknownProperties(deviceProfileUpdateMsg.getEntity(), DeviceProfile.class);
+ Assert.assertNotNull(deviceProfileMsg);
+ Assert.assertEquals(deviceProfile, deviceProfileMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, deviceProfileUpdateMsg.getMsgType());
- Assert.assertEquals(deviceProfile.getUuidId().getMostSignificantBits(), deviceProfileUpdateMsg.getIdMSB());
- Assert.assertEquals(deviceProfile.getUuidId().getLeastSignificantBits(), deviceProfileUpdateMsg.getIdLSB());
- Assert.assertEquals(DeviceTransportType.COAP.name(), deviceProfileUpdateMsg.getTransportType());
-
- Optional deviceProfileDataOpt =
- dataDecodingEncodingService.decode(deviceProfileUpdateMsg.getProfileDataBytes().toByteArray());
+ Assert.assertEquals(DeviceTransportType.COAP, deviceProfileMsg.getTransportType());
- Assert.assertTrue(deviceProfileDataOpt.isPresent());
- DeviceProfileData deviceProfileData = deviceProfileDataOpt.get();
+ DeviceProfileData deviceProfileData = deviceProfileMsg.getProfileData();
Assert.assertTrue(deviceProfileData.getTransportConfiguration() instanceof CoapDeviceProfileTransportConfiguration);
CoapDeviceProfileTransportConfiguration transportConfiguration =
@@ -275,20 +261,15 @@ public class DeviceProfileEdgeTest extends AbstractEdgeTest {
RuleChainId ruleChainId = createEdgeRuleChainAndAssignToEdge("Device Profile Rule Chain");
DashboardId dashboardId = createDashboardAndAssignToEdge("Device Profile Dashboard");
- UUID uuid = Uuids.timeBased();
+ DeviceProfile deviceProfileMsg = buildDeviceProfileForUplinkMsg("Device Profile On Edge");
+ deviceProfileMsg.setDefaultRuleChainId(ruleChainId);
+ deviceProfileMsg.setDefaultDashboardId(dashboardId);
UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
DeviceProfileUpdateMsg.Builder deviceProfileUpdateMsgBuilder = DeviceProfileUpdateMsg.newBuilder();
- deviceProfileUpdateMsgBuilder.setIdMSB(uuid.getMostSignificantBits());
- deviceProfileUpdateMsgBuilder.setIdLSB(uuid.getLeastSignificantBits());
- deviceProfileUpdateMsgBuilder.setName("Device Profile On Edge");
- deviceProfileUpdateMsgBuilder.setDefault(false);
- deviceProfileUpdateMsgBuilder.setType(DeviceProfileType.DEFAULT.name());
- deviceProfileUpdateMsgBuilder.setProfileDataBytes(ByteString.copyFrom(dataDecodingEncodingService.encode(createProfileData())));
- deviceProfileUpdateMsgBuilder.setDefaultRuleChainIdMSB(ruleChainId.getId().getMostSignificantBits());
- deviceProfileUpdateMsgBuilder.setDefaultRuleChainIdLSB(ruleChainId.getId().getLeastSignificantBits());
- deviceProfileUpdateMsgBuilder.setDefaultDashboardIdMSB(dashboardId.getId().getMostSignificantBits());
- deviceProfileUpdateMsgBuilder.setDefaultDashboardIdLSB(dashboardId.getId().getLeastSignificantBits());
+ deviceProfileUpdateMsgBuilder.setIdMSB(deviceProfileMsg.getUuidId().getMostSignificantBits());
+ deviceProfileUpdateMsgBuilder.setIdLSB(deviceProfileMsg.getUuidId().getLeastSignificantBits());
+ deviceProfileUpdateMsgBuilder.setEntity(JacksonUtil.toString(deviceProfileMsg));
deviceProfileUpdateMsgBuilder.setMsgType(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE);
testAutoGeneratedCodeByProtobuf(deviceProfileUpdateMsgBuilder);
uplinkMsgBuilder.addDeviceProfileUpdateMsg(deviceProfileUpdateMsgBuilder.build());
@@ -303,7 +284,7 @@ public class DeviceProfileEdgeTest extends AbstractEdgeTest {
UplinkResponseMsg latestResponseMsg = edgeImitator.getLatestResponseMsg();
Assert.assertTrue(latestResponseMsg.getSuccess());
- DeviceProfile deviceProfile = doGet("/api/deviceProfile/" + uuid, DeviceProfile.class);
+ DeviceProfile deviceProfile = doGet("/api/deviceProfile/" + deviceProfileMsg.getUuidId(), DeviceProfile.class);
Assert.assertNotNull(deviceProfile);
Assert.assertEquals("Device Profile On Edge", deviceProfile.getName());
@@ -422,16 +403,15 @@ public class DeviceProfileEdgeTest extends AbstractEdgeTest {
deviceProfileOnCloud = doPost("/api/deviceProfile", deviceProfileOnCloud, DeviceProfile.class);
Assert.assertTrue(edgeImitator.waitForMessages());
- UUID uuid = Uuids.timeBased();
+ DeviceProfile deviceProfileMsg = buildDeviceProfileForUplinkMsg(deviceProfileOnCloudName);
+ deviceProfileMsg.setProfileData(deviceProfileOnCloud.getProfileData());
UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
DeviceProfileUpdateMsg.Builder deviceProfileUpdateMsgBuilder = DeviceProfileUpdateMsg.newBuilder();
- deviceProfileUpdateMsgBuilder.setIdMSB(uuid.getMostSignificantBits());
- deviceProfileUpdateMsgBuilder.setIdLSB(uuid.getLeastSignificantBits());
- deviceProfileUpdateMsgBuilder.setName(deviceProfileOnCloudName);
- deviceProfileUpdateMsgBuilder.setType(DeviceProfileType.DEFAULT.name());
+ deviceProfileUpdateMsgBuilder.setIdMSB(deviceProfileMsg.getUuidId().getMostSignificantBits());
+ deviceProfileUpdateMsgBuilder.setIdLSB(deviceProfileMsg.getUuidId().getLeastSignificantBits());
+ deviceProfileUpdateMsgBuilder.setEntity(JacksonUtil.toString(deviceProfileMsg));
deviceProfileUpdateMsgBuilder.setMsgType(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE);
- deviceProfileUpdateMsgBuilder.setProfileDataBytes(ByteString.copyFrom(dataDecodingEncodingService.encode(deviceProfileOnCloud.getProfileData())));
uplinkMsgBuilder.addDeviceProfileUpdateMsg(deviceProfileUpdateMsgBuilder.build());
testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder);
@@ -447,12 +427,26 @@ public class DeviceProfileEdgeTest extends AbstractEdgeTest {
Optional deviceProfileUpdateMsgOpt = edgeImitator.findMessageByType(DeviceProfileUpdateMsg.class);
Assert.assertTrue(deviceProfileUpdateMsgOpt.isPresent());
DeviceProfileUpdateMsg latestDeviceProfileUpdateMsg = deviceProfileUpdateMsgOpt.get();
- Assert.assertNotEquals(deviceProfileOnCloudName, latestDeviceProfileUpdateMsg.getName());
+ deviceProfileMsg = JacksonUtil.fromStringIgnoreUnknownProperties(latestDeviceProfileUpdateMsg.getEntity(), DeviceProfile.class);
+ Assert.assertNotNull(deviceProfileMsg);
+ Assert.assertNotEquals(deviceProfileOnCloudName, deviceProfileMsg.getName());
- Assert.assertNotEquals(deviceProfileOnCloud.getUuidId(), uuid);
+ Assert.assertNotEquals(deviceProfileOnCloud.getId(), deviceProfileMsg.getId());
- DeviceProfile deviceProfile = doGet("/api/deviceProfile/" + uuid, DeviceProfile.class);
+ DeviceProfile deviceProfile = doGet("/api/deviceProfile/" + deviceProfileMsg.getUuidId(), DeviceProfile.class);
Assert.assertNotNull(deviceProfile);
Assert.assertNotEquals(deviceProfileOnCloudName, deviceProfile.getName());
}
+
+ private DeviceProfile buildDeviceProfileForUplinkMsg(String name) {
+ DeviceProfile deviceProfile = new DeviceProfile();
+ deviceProfile.setId(new DeviceProfileId(UUID.randomUUID()));
+ deviceProfile.setTenantId(tenantId);
+ deviceProfile.setName(name);
+ deviceProfile.setDefault(false);
+ deviceProfile.setType(DeviceProfileType.DEFAULT);
+ deviceProfile.setTransportType(DeviceTransportType.DEFAULT);
+ deviceProfile.setProfileData(createProfileData());
+ return deviceProfile;
+ }
}
diff --git a/application/src/test/java/org/thingsboard/server/edge/EdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/EdgeTest.java
index fd34b0d973..7330e2f5fc 100644
--- a/application/src/test/java/org/thingsboard/server/edge/EdgeTest.java
+++ b/application/src/test/java/org/thingsboard/server/edge/EdgeTest.java
@@ -17,6 +17,7 @@ package org.thingsboard.server.edge;
import org.junit.Assert;
import org.junit.Test;
+import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.edge.Edge;
import org.thingsboard.server.common.data.id.CustomerId;
@@ -54,10 +55,9 @@ public class EdgeTest extends AbstractEdgeTest {
Optional customerUpdateOpt = edgeImitator.findMessageByType(CustomerUpdateMsg.class);
Assert.assertTrue(customerUpdateOpt.isPresent());
CustomerUpdateMsg customerUpdateMsg = customerUpdateOpt.get();
+ Customer customerMsg = JacksonUtil.fromStringIgnoreUnknownProperties(customerUpdateMsg.getEntity(), Customer.class);
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, customerUpdateMsg.getMsgType());
- Assert.assertEquals(savedCustomer.getUuidId().getMostSignificantBits(), customerUpdateMsg.getIdMSB());
- Assert.assertEquals(savedCustomer.getUuidId().getLeastSignificantBits(), customerUpdateMsg.getIdLSB());
- Assert.assertEquals(savedCustomer.getTitle(), customerUpdateMsg.getTitle());
+ Assert.assertEquals(savedCustomer, customerMsg);
// unassign edge from customer
edgeImitator.expectMessageAmount(2);
diff --git a/application/src/test/java/org/thingsboard/server/edge/EntityViewEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/EntityViewEdgeTest.java
index d56ded7014..903f49f756 100644
--- a/application/src/test/java/org/thingsboard/server/edge/EntityViewEdgeTest.java
+++ b/application/src/test/java/org/thingsboard/server/edge/EntityViewEdgeTest.java
@@ -15,12 +15,12 @@
*/
package org.thingsboard.server.edge;
-import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.core.type.TypeReference;
import com.google.protobuf.AbstractMessage;
import com.google.protobuf.InvalidProtocolBufferException;
import org.junit.Assert;
import org.junit.Test;
+import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.EntityView;
@@ -30,10 +30,10 @@ import org.thingsboard.server.common.data.edge.Edge;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.id.EntityViewId;
import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.dao.service.DaoSqlTest;
-import org.thingsboard.server.gen.edge.v1.EdgeEntityType;
import org.thingsboard.server.gen.edge.v1.EntityViewUpdateMsg;
import org.thingsboard.server.gen.edge.v1.EntityViewsRequestMsg;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
@@ -68,8 +68,10 @@ public class EntityViewEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof EntityViewUpdateMsg);
EntityViewUpdateMsg entityViewUpdateMsg = (EntityViewUpdateMsg) latestMessage;
+ EntityView entityView = JacksonUtil.fromStringIgnoreUnknownProperties(entityViewUpdateMsg.getEntity(), EntityView.class);
+ Assert.assertNotNull(entityView);
+ Assert.assertEquals(savedEntityView, entityView);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, entityViewUpdateMsg.getMsgType());
- Assert.assertEquals(savedEntityView.getName(), entityViewUpdateMsg.getName());
// request entity view(s) for device
UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
@@ -131,9 +133,10 @@ public class EntityViewEdgeTest extends AbstractEdgeTest {
latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof EntityViewUpdateMsg);
entityViewUpdateMsg = (EntityViewUpdateMsg) latestMessage;
+ EntityView entityViewMsg = JacksonUtil.fromStringIgnoreUnknownProperties(entityViewUpdateMsg.getEntity(), EntityView.class);
+ Assert.assertNotNull(entityViewMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, entityViewUpdateMsg.getMsgType());
- Assert.assertEquals(savedCustomer.getUuidId().getMostSignificantBits(), entityViewUpdateMsg.getCustomerIdMSB());
- Assert.assertEquals(savedCustomer.getUuidId().getLeastSignificantBits(), entityViewUpdateMsg.getCustomerIdLSB());
+ Assert.assertEquals(savedCustomer.getId(), entityViewMsg.getCustomerId());
// unassign entity view #2 from customer
edgeImitator.expectMessageAmount(1);
@@ -142,10 +145,10 @@ public class EntityViewEdgeTest extends AbstractEdgeTest {
latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof EntityViewUpdateMsg);
entityViewUpdateMsg = (EntityViewUpdateMsg) latestMessage;
+ entityViewMsg = JacksonUtil.fromStringIgnoreUnknownProperties(entityViewUpdateMsg.getEntity(), EntityView.class);
+ Assert.assertNotNull(entityViewMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, entityViewUpdateMsg.getMsgType());
- Assert.assertEquals(
- new CustomerId(EntityId.NULL_UUID),
- new CustomerId(new UUID(entityViewUpdateMsg.getCustomerIdMSB(), entityViewUpdateMsg.getCustomerIdLSB())));
+ Assert.assertEquals(new CustomerId(EntityId.NULL_UUID), entityViewMsg.getCustomerId());
// delete entity view #2 - messages expected
edgeImitator.expectMessageAmount(1);
@@ -165,17 +168,13 @@ public class EntityViewEdgeTest extends AbstractEdgeTest {
public void testSendEntityViewToCloud() throws Exception {
Device device = findDeviceByName("Edge Device 1");
- UUID uuid = Uuids.timeBased();
+ EntityView entityViewMsg = buildEntityViewForUplinkMsg(device, "Edge EntityView 2");
UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
EntityViewUpdateMsg.Builder entityViewUpdateMsgBuilder = EntityViewUpdateMsg.newBuilder();
- entityViewUpdateMsgBuilder.setIdMSB(uuid.getMostSignificantBits());
- entityViewUpdateMsgBuilder.setIdLSB(uuid.getLeastSignificantBits());
- entityViewUpdateMsgBuilder.setName("Edge EntityView 2");
- entityViewUpdateMsgBuilder.setType("test");
- entityViewUpdateMsgBuilder.setEntityType(EdgeEntityType.DEVICE);
- entityViewUpdateMsgBuilder.setEntityIdMSB(device.getUuidId().getMostSignificantBits());
- entityViewUpdateMsgBuilder.setEntityIdLSB(device.getUuidId().getLeastSignificantBits());
+ entityViewUpdateMsgBuilder.setIdMSB(entityViewMsg.getUuidId().getMostSignificantBits());
+ entityViewUpdateMsgBuilder.setIdLSB(entityViewMsg.getUuidId().getLeastSignificantBits());
+ entityViewUpdateMsgBuilder.setEntity(JacksonUtil.toString(entityViewMsg));
entityViewUpdateMsgBuilder.setMsgType(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE);
testAutoGeneratedCodeByProtobuf(entityViewUpdateMsgBuilder);
uplinkMsgBuilder.addEntityViewUpdateMsg(entityViewUpdateMsgBuilder.build());
@@ -192,7 +191,7 @@ public class EntityViewEdgeTest extends AbstractEdgeTest {
UplinkResponseMsg latestResponseMsg = edgeImitator.getLatestResponseMsg();
Assert.assertTrue(latestResponseMsg.getSuccess());
- EntityView entityView = doGet("/api/entityView/" + uuid, EntityView.class);
+ EntityView entityView = doGet("/api/entityView/" + entityViewMsg.getUuidId(), EntityView.class);
Assert.assertNotNull(entityView);
Assert.assertEquals("Edge EntityView 2", entityView.getName());
}
@@ -204,17 +203,13 @@ public class EntityViewEdgeTest extends AbstractEdgeTest {
String entityViewOnCloudName = StringUtils.randomAlphanumeric(15);
EntityView entityViewOnCloud = saveEntityView(entityViewOnCloudName, device.getId());
- UUID uuid = Uuids.timeBased();
+ EntityView entityViewMsg = buildEntityViewForUplinkMsg(device, entityViewOnCloudName);
UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
EntityViewUpdateMsg.Builder entityViewUpdateMsgBuilder = EntityViewUpdateMsg.newBuilder();
- entityViewUpdateMsgBuilder.setIdMSB(uuid.getMostSignificantBits());
- entityViewUpdateMsgBuilder.setIdLSB(uuid.getLeastSignificantBits());
- entityViewUpdateMsgBuilder.setName(entityViewOnCloudName);
- entityViewUpdateMsgBuilder.setType("test");
- entityViewUpdateMsgBuilder.setEntityType(EdgeEntityType.DEVICE);
- entityViewUpdateMsgBuilder.setEntityIdMSB(device.getUuidId().getMostSignificantBits());
- entityViewUpdateMsgBuilder.setEntityIdLSB(device.getUuidId().getLeastSignificantBits());
+ entityViewUpdateMsgBuilder.setIdMSB(entityViewMsg.getUuidId().getMostSignificantBits());
+ entityViewUpdateMsgBuilder.setIdLSB(entityViewMsg.getUuidId().getLeastSignificantBits());
+ entityViewUpdateMsgBuilder.setEntity(JacksonUtil.toString(entityViewMsg));
entityViewUpdateMsgBuilder.setMsgType(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE);
testAutoGeneratedCodeByProtobuf(entityViewUpdateMsgBuilder);
uplinkMsgBuilder.addEntityViewUpdateMsg(entityViewUpdateMsgBuilder.build());
@@ -232,13 +227,12 @@ public class EntityViewEdgeTest extends AbstractEdgeTest {
Optional entityViewUpdateMsgOpt = edgeImitator.findMessageByType(EntityViewUpdateMsg.class);
Assert.assertTrue(entityViewUpdateMsgOpt.isPresent());
EntityViewUpdateMsg latestEntityViewUpdateMsg = entityViewUpdateMsgOpt.get();
- Assert.assertNotEquals(entityViewOnCloudName, latestEntityViewUpdateMsg.getName());
-
- UUID newEntityViewId = new UUID(latestEntityViewUpdateMsg.getIdMSB(), latestEntityViewUpdateMsg.getIdLSB());
-
- Assert.assertNotEquals(entityViewOnCloud.getId().getId(), newEntityViewId);
+ entityViewMsg = JacksonUtil.fromStringIgnoreUnknownProperties(latestEntityViewUpdateMsg.getEntity(), EntityView.class);
+ Assert.assertNotNull(entityViewMsg);
+ Assert.assertNotEquals(entityViewOnCloudName, entityViewMsg.getName());
+ Assert.assertNotEquals(entityViewOnCloud.getId(), entityViewMsg.getId());
- EntityView entityView = doGet("/api/entityView/" + newEntityViewId, EntityView.class);
+ EntityView entityView = doGet("/api/entityView/" + entityViewMsg.getUuidId(), EntityView.class);
Assert.assertNotNull(entityView);
Assert.assertNotEquals(entityViewOnCloudName, entityView.getName());
}
@@ -274,14 +268,11 @@ public class EntityViewEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof EntityViewUpdateMsg);
EntityViewUpdateMsg entityViewUpdateMsg = (EntityViewUpdateMsg) latestMessage;
+ EntityView entityViewMsg = JacksonUtil.fromStringIgnoreUnknownProperties(entityViewUpdateMsg.getEntity(), EntityView.class);
+ Assert.assertNotNull(entityViewMsg);
+ Assert.assertEquals(entityView, entityViewMsg);
+ Assert.assertEquals(device.getId(), entityViewMsg.getEntityId());
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, entityViewUpdateMsg.getMsgType());
- Assert.assertEquals(entityView.getType(), entityViewUpdateMsg.getType());
- Assert.assertEquals(entityView.getName(), entityViewUpdateMsg.getName());
- Assert.assertEquals(entityView.getUuidId().getMostSignificantBits(), entityViewUpdateMsg.getIdMSB());
- Assert.assertEquals(entityView.getUuidId().getLeastSignificantBits(), entityViewUpdateMsg.getIdLSB());
- Assert.assertEquals(device.getUuidId().getMostSignificantBits(), entityViewUpdateMsg.getEntityIdMSB());
- Assert.assertEquals(device.getUuidId().getLeastSignificantBits(), entityViewUpdateMsg.getEntityIdLSB());
- Assert.assertEquals(device.getId().getEntityType().name(), entityViewUpdateMsg.getEntityType().name());
testAutoGeneratedCodeByProtobuf(entityViewUpdateMsg);
}
@@ -309,4 +300,15 @@ public class EntityViewEdgeTest extends AbstractEdgeTest {
return doPost("/api/entityView", entityView, EntityView.class);
}
+
+ private EntityView buildEntityViewForUplinkMsg(Device device, String name) {
+ EntityView entityView = new EntityView();
+ entityView.setId(new EntityViewId(UUID.randomUUID()));
+ entityView.setTenantId(tenantId);
+ entityView.setName(name);
+ entityView.setType("test");
+ entityView.setEntityId(device.getId());
+ return entityView;
+ }
+
}
diff --git a/application/src/test/java/org/thingsboard/server/edge/OtaPackageEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/OtaPackageEdgeTest.java
index 5525d63f41..0ff72b94ec 100644
--- a/application/src/test/java/org/thingsboard/server/edge/OtaPackageEdgeTest.java
+++ b/application/src/test/java/org/thingsboard/server/edge/OtaPackageEdgeTest.java
@@ -16,17 +16,16 @@
package org.thingsboard.server.edge;
import com.google.protobuf.AbstractMessage;
-import com.google.protobuf.ByteString;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.test.web.servlet.request.MockMultipartHttpServletRequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.thingsboard.common.util.JacksonUtil;
+import org.thingsboard.server.common.data.OtaPackage;
import org.thingsboard.server.common.data.OtaPackageInfo;
import org.thingsboard.server.common.data.SaveOtaPackageInfoRequest;
import org.thingsboard.server.common.data.ota.ChecksumAlgorithm;
-import org.thingsboard.server.common.data.ota.OtaPackageType;
import org.thingsboard.server.dao.service.DaoSqlTest;
import org.thingsboard.server.gen.edge.v1.OtaPackageUpdateMsg;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
@@ -59,22 +58,22 @@ public class OtaPackageEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof OtaPackageUpdateMsg);
OtaPackageUpdateMsg otaPackageUpdateMsg = (OtaPackageUpdateMsg) latestMessage;
+ OtaPackage otaPackage = JacksonUtil.fromStringIgnoreUnknownProperties(otaPackageUpdateMsg.getEntity(), OtaPackage.class);
+ Assert.assertNotNull(otaPackage);
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, otaPackageUpdateMsg.getMsgType());
- Assert.assertEquals(savedFirmwareInfo.getUuidId().getMostSignificantBits(), otaPackageUpdateMsg.getIdMSB());
- Assert.assertEquals(savedFirmwareInfo.getUuidId().getLeastSignificantBits(), otaPackageUpdateMsg.getIdLSB());
- Assert.assertEquals(thermostatDeviceProfile.getUuidId().getMostSignificantBits(), otaPackageUpdateMsg.getDeviceProfileIdMSB());
- Assert.assertEquals(thermostatDeviceProfile.getUuidId().getLeastSignificantBits(), otaPackageUpdateMsg.getDeviceProfileIdLSB());
- Assert.assertEquals(FIRMWARE, OtaPackageType.valueOf(otaPackageUpdateMsg.getType()));
- Assert.assertEquals("My firmware #1", otaPackageUpdateMsg.getTitle());
- Assert.assertEquals("v1.0", otaPackageUpdateMsg.getVersion());
- Assert.assertEquals("My firmware #1 v1.0", otaPackageUpdateMsg.getTag());
- Assert.assertEquals("http://localhost:8080/v1/package", otaPackageUpdateMsg.getUrl());
- Assert.assertFalse(otaPackageUpdateMsg.hasData());
- Assert.assertFalse(otaPackageUpdateMsg.hasFileName());
- Assert.assertFalse(otaPackageUpdateMsg.hasContentType());
- Assert.assertFalse(otaPackageUpdateMsg.hasChecksumAlgorithm());
- Assert.assertFalse(otaPackageUpdateMsg.hasChecksum());
- Assert.assertFalse(otaPackageUpdateMsg.hasDataSize());
+ Assert.assertEquals(savedFirmwareInfo.getId(), otaPackage.getId());
+ Assert.assertEquals(thermostatDeviceProfile.getId(), otaPackage.getDeviceProfileId());
+ Assert.assertEquals(FIRMWARE, otaPackage.getType());
+ Assert.assertEquals("My firmware #1", otaPackage.getTitle());
+ Assert.assertEquals("v1.0", otaPackage.getVersion());
+ Assert.assertEquals("My firmware #1 v1.0", otaPackage.getTag());
+ Assert.assertEquals("http://localhost:8080/v1/package", otaPackage.getUrl());
+ Assert.assertNull(otaPackage.getData());
+ Assert.assertNull(otaPackage.getFileName());
+ Assert.assertNull(otaPackage.getContentType());
+ Assert.assertNull(otaPackage.getChecksumAlgorithm());
+ Assert.assertNull(otaPackage.getChecksum());
+ Assert.assertNull(otaPackage.getDataSize());
// delete ota package
edgeImitator.expectMessageAmount(1);
@@ -113,22 +112,22 @@ public class OtaPackageEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof OtaPackageUpdateMsg);
OtaPackageUpdateMsg otaPackageUpdateMsg = (OtaPackageUpdateMsg) latestMessage;
+ OtaPackage otaPackage = JacksonUtil.fromStringIgnoreUnknownProperties(otaPackageUpdateMsg.getEntity(), OtaPackage.class);
+ Assert.assertNotNull(otaPackage);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, otaPackageUpdateMsg.getMsgType());
- Assert.assertEquals(savedFirmwareInfo.getUuidId().getMostSignificantBits(), otaPackageUpdateMsg.getIdMSB());
- Assert.assertEquals(savedFirmwareInfo.getUuidId().getLeastSignificantBits(), otaPackageUpdateMsg.getIdLSB());
- Assert.assertEquals(thermostatDeviceProfile.getUuidId().getMostSignificantBits(), otaPackageUpdateMsg.getDeviceProfileIdMSB());
- Assert.assertEquals(thermostatDeviceProfile.getUuidId().getLeastSignificantBits(), otaPackageUpdateMsg.getDeviceProfileIdLSB());
- Assert.assertEquals(FIRMWARE, OtaPackageType.valueOf(otaPackageUpdateMsg.getType()));
- Assert.assertEquals("My firmware #2", otaPackageUpdateMsg.getTitle());
- Assert.assertEquals("v2.0", otaPackageUpdateMsg.getVersion());
- Assert.assertEquals("My firmware #2 v2.0", otaPackageUpdateMsg.getTag());
- Assert.assertFalse(otaPackageUpdateMsg.hasUrl());
- Assert.assertEquals("firmware.bin", otaPackageUpdateMsg.getFileName());
- Assert.assertEquals("image/png", otaPackageUpdateMsg.getContentType());
- Assert.assertEquals(ChecksumAlgorithm.SHA256.name(), otaPackageUpdateMsg.getChecksumAlgorithm());
- Assert.assertEquals("62467691cf583d4fa78b18fafaf9801f505e0ef03baf0603fd4b0cd004cd1e75", otaPackageUpdateMsg.getChecksum());
- Assert.assertEquals(3L, otaPackageUpdateMsg.getDataSize());
- Assert.assertEquals(ByteString.copyFrom(new byte[]{1, 3, 5}), otaPackageUpdateMsg.getData());
+ Assert.assertEquals(savedFirmwareInfo.getId(), otaPackage.getId());
+ Assert.assertEquals(thermostatDeviceProfile.getId(), otaPackage.getDeviceProfileId());
+ Assert.assertEquals(FIRMWARE, otaPackage.getType());
+ Assert.assertEquals("My firmware #2", otaPackage.getTitle());
+ Assert.assertEquals("v2.0", otaPackage.getVersion());
+ Assert.assertEquals("My firmware #2 v2.0", otaPackage.getTag());
+ Assert.assertFalse(otaPackage.hasUrl());
+ Assert.assertEquals("firmware.bin", otaPackage.getFileName());
+ Assert.assertEquals("image/png", otaPackage.getContentType());
+ Assert.assertEquals(ChecksumAlgorithm.SHA256, otaPackage.getChecksumAlgorithm());
+ Assert.assertEquals("62467691cf583d4fa78b18fafaf9801f505e0ef03baf0603fd4b0cd004cd1e75", otaPackage.getChecksum());
+ Assert.assertEquals(3L, otaPackage.getDataSize().longValue());
+ Assert.assertEquals(ByteBuffer.wrap(new byte[]{1, 3, 5}), otaPackage.getData());
// delete ota package
edgeImitator.expectMessageAmount(1);
diff --git a/application/src/test/java/org/thingsboard/server/edge/QueueEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/QueueEdgeTest.java
index 32e8e7f222..b80a7de112 100644
--- a/application/src/test/java/org/thingsboard/server/edge/QueueEdgeTest.java
+++ b/application/src/test/java/org/thingsboard/server/edge/QueueEdgeTest.java
@@ -18,6 +18,7 @@ package org.thingsboard.server.edge;
import com.google.protobuf.AbstractMessage;
import org.junit.Assert;
import org.junit.Test;
+import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.queue.ProcessingStrategy;
import org.thingsboard.server.common.data.queue.ProcessingStrategyType;
import org.thingsboard.server.common.data.queue.Queue;
@@ -63,24 +64,22 @@ public class QueueEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof QueueUpdateMsg);
QueueUpdateMsg queueUpdateMsg = (QueueUpdateMsg) latestMessage;
+ Queue queueMsg = JacksonUtil.fromStringIgnoreUnknownProperties(queueUpdateMsg.getEntity(), Queue.class);
+ Assert.assertNotNull(queueMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, queueUpdateMsg.getMsgType());
- Assert.assertEquals(savedQueue.getUuidId().getMostSignificantBits(), queueUpdateMsg.getIdMSB());
- Assert.assertEquals(savedQueue.getUuidId().getLeastSignificantBits(), queueUpdateMsg.getIdLSB());
- Assert.assertEquals(savedQueue.getTenantId().getId().getMostSignificantBits(), queueUpdateMsg.getTenantIdMSB());
- Assert.assertEquals(savedQueue.getTenantId().getId().getLeastSignificantBits(), queueUpdateMsg.getTenantIdLSB());
- Assert.assertEquals("EdgeMain", queueUpdateMsg.getName());
- Assert.assertEquals("tb_rule_engine.EdgeMain", queueUpdateMsg.getTopic());
- Assert.assertEquals(25, queueUpdateMsg.getPollInterval());
- Assert.assertEquals(10, queueUpdateMsg.getPartitions());
- Assert.assertFalse(queueUpdateMsg.getConsumerPerPartition());
- Assert.assertEquals(2000, queueUpdateMsg.getPackProcessingTimeout());
- Assert.assertEquals(SubmitStrategyType.SEQUENTIAL_BY_ORIGINATOR.name(), queueUpdateMsg.getSubmitStrategy().getType());
- Assert.assertEquals(0, queueUpdateMsg.getSubmitStrategy().getBatchSize());
- Assert.assertEquals(ProcessingStrategyType.RETRY_ALL.name(), queueUpdateMsg.getProcessingStrategy().getType());
- Assert.assertEquals(3, queueUpdateMsg.getProcessingStrategy().getRetries());
- Assert.assertEquals(0.7, queueUpdateMsg.getProcessingStrategy().getFailurePercentage(), 1);
- Assert.assertEquals(3, queueUpdateMsg.getProcessingStrategy().getPauseBetweenRetries());
- Assert.assertEquals(5, queueUpdateMsg.getProcessingStrategy().getMaxPauseBetweenRetries());
+ Assert.assertEquals(savedQueue, queueMsg);
+ Assert.assertEquals("EdgeMain", queueMsg.getName());
+ Assert.assertEquals("tb_rule_engine.EdgeMain", queueMsg.getTopic());
+ Assert.assertEquals(25, queueMsg.getPollInterval());
+ Assert.assertEquals(10, queueMsg.getPartitions());
+ Assert.assertEquals(2000, queueMsg.getPackProcessingTimeout());
+ Assert.assertEquals(SubmitStrategyType.SEQUENTIAL_BY_ORIGINATOR, queueMsg.getSubmitStrategy().getType());
+ Assert.assertEquals(0, queueMsg.getSubmitStrategy().getBatchSize());
+ Assert.assertEquals(ProcessingStrategyType.RETRY_ALL, queueMsg.getProcessingStrategy().getType());
+ Assert.assertEquals(3, queueMsg.getProcessingStrategy().getRetries());
+ Assert.assertEquals(0.7, queueMsg.getProcessingStrategy().getFailurePercentage(), 1);
+ Assert.assertEquals(3, queueMsg.getProcessingStrategy().getPauseBetweenRetries());
+ Assert.assertEquals(5, queueMsg.getProcessingStrategy().getMaxPauseBetweenRetries());
// update queue
edgeImitator.expectMessageAmount(1);
@@ -90,8 +89,10 @@ public class QueueEdgeTest extends AbstractEdgeTest {
latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof QueueUpdateMsg);
queueUpdateMsg = (QueueUpdateMsg) latestMessage;
+ queueMsg = JacksonUtil.fromStringIgnoreUnknownProperties(queueUpdateMsg.getEntity(), Queue.class);
+ Assert.assertNotNull(queueMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, queueUpdateMsg.getMsgType());
- Assert.assertEquals(50, queueUpdateMsg.getPollInterval());
+ Assert.assertEquals(50, queueMsg.getPollInterval());
// delete queue
edgeImitator.expectMessageAmount(1);
diff --git a/application/src/test/java/org/thingsboard/server/edge/RelationEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/RelationEdgeTest.java
index 04e6f3a3fb..5fc532ece5 100644
--- a/application/src/test/java/org/thingsboard/server/edge/RelationEdgeTest.java
+++ b/application/src/test/java/org/thingsboard/server/edge/RelationEdgeTest.java
@@ -15,13 +15,14 @@
*/
package org.thingsboard.server.edge;
+import com.fasterxml.jackson.databind.node.TextNode;
import com.google.protobuf.AbstractMessage;
import org.junit.Assert;
import org.junit.Test;
+import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.asset.Asset;
-import org.thingsboard.server.common.data.id.EntityId;
-import org.thingsboard.server.common.data.id.EntityIdFactory;
+import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.relation.EntityRelation;
import org.thingsboard.server.common.data.relation.RelationTypeGroup;
import org.thingsboard.server.dao.service.DaoSqlTest;
@@ -30,8 +31,6 @@ import org.thingsboard.server.gen.edge.v1.RelationUpdateMsg;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.gen.edge.v1.UplinkMsg;
-import java.util.UUID;
-
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@DaoSqlTest
@@ -54,15 +53,10 @@ public class RelationEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof RelationUpdateMsg);
RelationUpdateMsg relationUpdateMsg = (RelationUpdateMsg) latestMessage;
+ EntityRelation entityRelation = JacksonUtil.fromStringIgnoreUnknownProperties(relationUpdateMsg.getEntity(), EntityRelation.class);
+ Assert.assertNotNull(entityRelation);
+ Assert.assertEquals(relation, entityRelation);
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, relationUpdateMsg.getMsgType());
- Assert.assertEquals(relationUpdateMsg.getType(), relation.getType());
- Assert.assertEquals(relationUpdateMsg.getFromIdMSB(), relation.getFrom().getId().getMostSignificantBits());
- Assert.assertEquals(relationUpdateMsg.getFromIdLSB(), relation.getFrom().getId().getLeastSignificantBits());
- Assert.assertEquals(relationUpdateMsg.getToEntityType(), relation.getTo().getEntityType().name());
- Assert.assertEquals(relationUpdateMsg.getFromIdMSB(), relation.getFrom().getId().getMostSignificantBits());
- Assert.assertEquals(relationUpdateMsg.getToIdLSB(), relation.getTo().getId().getLeastSignificantBits());
- Assert.assertEquals(relationUpdateMsg.getToEntityType(), relation.getTo().getEntityType().name());
- Assert.assertEquals(relationUpdateMsg.getTypeGroup(), relation.getTypeGroup().name());
// delete relation
edgeImitator.expectMessageAmount(1);
@@ -78,15 +72,10 @@ public class RelationEdgeTest extends AbstractEdgeTest {
latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof RelationUpdateMsg);
relationUpdateMsg = (RelationUpdateMsg) latestMessage;
+ entityRelation = JacksonUtil.fromStringIgnoreUnknownProperties(relationUpdateMsg.getEntity(), EntityRelation.class);
+ Assert.assertNotNull(entityRelation);
+ Assert.assertEquals(relation, entityRelation);
Assert.assertEquals(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE, relationUpdateMsg.getMsgType());
- Assert.assertEquals(relationUpdateMsg.getType(), relation.getType());
- Assert.assertEquals(relationUpdateMsg.getFromIdMSB(), relation.getFrom().getId().getMostSignificantBits());
- Assert.assertEquals(relationUpdateMsg.getFromIdLSB(), relation.getFrom().getId().getLeastSignificantBits());
- Assert.assertEquals(relationUpdateMsg.getToEntityType(), relation.getTo().getEntityType().name());
- Assert.assertEquals(relationUpdateMsg.getFromIdMSB(), relation.getFrom().getId().getMostSignificantBits());
- Assert.assertEquals(relationUpdateMsg.getToIdLSB(), relation.getTo().getId().getLeastSignificantBits());
- Assert.assertEquals(relationUpdateMsg.getToEntityType(), relation.getTo().getEntityType().name());
- Assert.assertEquals(relationUpdateMsg.getTypeGroup(), relation.getTypeGroup().name());
}
@Test
@@ -94,17 +83,11 @@ public class RelationEdgeTest extends AbstractEdgeTest {
Device device1 = saveDeviceOnCloudAndVerifyDeliveryToEdge();
Device device2 = saveDeviceOnCloudAndVerifyDeliveryToEdge();
+ EntityRelation entityRelation = buildEntityRelationForUplinkMsg(device1.getId(), device2.getId());
+
UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
RelationUpdateMsg.Builder relationUpdateMsgBuilder = RelationUpdateMsg.newBuilder();
- relationUpdateMsgBuilder.setType("test");
- relationUpdateMsgBuilder.setTypeGroup(RelationTypeGroup.COMMON.name());
- relationUpdateMsgBuilder.setToIdMSB(device1.getId().getId().getMostSignificantBits());
- relationUpdateMsgBuilder.setToIdLSB(device1.getId().getId().getLeastSignificantBits());
- relationUpdateMsgBuilder.setToEntityType(device1.getId().getEntityType().name());
- relationUpdateMsgBuilder.setFromIdMSB(device2.getId().getId().getMostSignificantBits());
- relationUpdateMsgBuilder.setFromIdLSB(device2.getId().getId().getLeastSignificantBits());
- relationUpdateMsgBuilder.setFromEntityType(device2.getId().getEntityType().name());
- relationUpdateMsgBuilder.setAdditionalInfo("{}");
+ relationUpdateMsgBuilder.setEntity(JacksonUtil.toString(entityRelation));
testAutoGeneratedCodeByProtobuf(relationUpdateMsgBuilder);
uplinkMsgBuilder.addRelationUpdateMsg(relationUpdateMsgBuilder.build());
@@ -129,14 +112,24 @@ public class RelationEdgeTest extends AbstractEdgeTest {
Device device = findDeviceByName("Edge Device 1");
Asset asset = findAssetByName("Edge Asset 1");
- EntityRelation relation = new EntityRelation();
- relation.setType("test");
- relation.setFrom(device.getId());
- relation.setTo(asset.getId());
- relation.setTypeGroup(RelationTypeGroup.COMMON);
+ EntityRelation deviceToAssetRelation = new EntityRelation();
+ deviceToAssetRelation.setType("test");
+ deviceToAssetRelation.setFrom(device.getId());
+ deviceToAssetRelation.setTo(asset.getId());
+ deviceToAssetRelation.setTypeGroup(RelationTypeGroup.COMMON);
edgeImitator.expectMessageAmount(1);
- doPost("/api/relation", relation);
+ doPost("/api/relation", deviceToAssetRelation);
+ Assert.assertTrue(edgeImitator.waitForMessages());
+
+ EntityRelation assetToTenantRelation = new EntityRelation();
+ assetToTenantRelation.setType("test");
+ assetToTenantRelation.setFrom(asset.getId());
+ assetToTenantRelation.setTo(tenantId);
+ assetToTenantRelation.setTypeGroup(RelationTypeGroup.COMMON);
+
+ edgeImitator.expectMessageAmount(1);
+ doPost("/api/relation", assetToTenantRelation);
Assert.assertTrue(edgeImitator.waitForMessages());
UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
@@ -158,17 +151,19 @@ public class RelationEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof RelationUpdateMsg);
RelationUpdateMsg relationUpdateMsg = (RelationUpdateMsg) latestMessage;
+ EntityRelation entityRelation = JacksonUtil.fromStringIgnoreUnknownProperties(relationUpdateMsg.getEntity(), EntityRelation.class);
+ Assert.assertNotNull(entityRelation);
+ Assert.assertEquals(deviceToAssetRelation, entityRelation);
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, relationUpdateMsg.getMsgType());
- Assert.assertEquals(relation.getType(), relationUpdateMsg.getType());
-
- UUID fromUUID = new UUID(relationUpdateMsg.getFromIdMSB(), relationUpdateMsg.getFromIdLSB());
- EntityId fromEntityId = EntityIdFactory.getByTypeAndUuid(relationUpdateMsg.getFromEntityType(), fromUUID);
- Assert.assertEquals(relation.getFrom(), fromEntityId);
-
- UUID toUUID = new UUID(relationUpdateMsg.getToIdMSB(), relationUpdateMsg.getToIdLSB());
- EntityId toEntityId = EntityIdFactory.getByTypeAndUuid(relationUpdateMsg.getToEntityType(), toUUID);
- Assert.assertEquals(relation.getTo(), toEntityId);
+ }
- Assert.assertEquals(relation.getTypeGroup().name(), relationUpdateMsg.getTypeGroup());
+ private EntityRelation buildEntityRelationForUplinkMsg(DeviceId deviceId1, DeviceId deviceId2) {
+ EntityRelation relation = new EntityRelation();
+ relation.setType("test");
+ relation.setTypeGroup(RelationTypeGroup.COMMON);
+ relation.setTo(deviceId1);
+ relation.setFrom(deviceId2);
+ relation.setAdditionalInfo(TextNode.valueOf("{}"));
+ return relation;
}
}
diff --git a/application/src/test/java/org/thingsboard/server/edge/ResourceEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/ResourceEdgeTest.java
index 2ae57f7f19..74773208da 100644
--- a/application/src/test/java/org/thingsboard/server/edge/ResourceEdgeTest.java
+++ b/application/src/test/java/org/thingsboard/server/edge/ResourceEdgeTest.java
@@ -19,6 +19,7 @@ import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.google.protobuf.AbstractMessage;
import org.junit.Assert;
import org.junit.Test;
+import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.ResourceType;
import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.TbResource;
@@ -58,12 +59,14 @@ public class ResourceEdgeTest extends AbstractEdgeTest {
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, resourceUpdateMsg.getMsgType());
Assert.assertEquals(savedResource.getUuidId().getMostSignificantBits(), resourceUpdateMsg.getIdMSB());
Assert.assertEquals(savedResource.getUuidId().getLeastSignificantBits(), resourceUpdateMsg.getIdLSB());
- Assert.assertEquals("Edge Test Resource", resourceUpdateMsg.getTitle());
- Assert.assertEquals(ResourceType.JKS.name(), resourceUpdateMsg.getResourceType());
- Assert.assertEquals(FILE_NAME, resourceUpdateMsg.getResourceKey());
- Assert.assertEquals(FILE_NAME, resourceUpdateMsg.getFileName());
- Assert.assertEquals(TEST_DATA, resourceUpdateMsg.getData());
- Assert.assertTrue(StringUtils.isNotBlank(resourceUpdateMsg.getEtag()));
+ TbResource tbResource = JacksonUtil.fromStringIgnoreUnknownProperties(resourceUpdateMsg.getEntity(), TbResource.class);
+ Assert.assertNotNull(tbResource);
+ Assert.assertEquals("Edge Test Resource", tbResource.getTitle());
+ Assert.assertEquals(ResourceType.JKS, tbResource.getResourceType());
+ Assert.assertEquals(FILE_NAME, tbResource.getResourceKey());
+ Assert.assertEquals(FILE_NAME, tbResource.getFileName());
+ Assert.assertEquals(TEST_DATA, tbResource.getData());
+ Assert.assertTrue(StringUtils.isNotBlank(tbResource.getEtag()));
// update resource
edgeImitator.expectMessageAmount(1);
@@ -73,8 +76,10 @@ public class ResourceEdgeTest extends AbstractEdgeTest {
latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof ResourceUpdateMsg);
resourceUpdateMsg = (ResourceUpdateMsg) latestMessage;
+ tbResource = JacksonUtil.fromStringIgnoreUnknownProperties(resourceUpdateMsg.getEntity(), TbResource.class);
+ Assert.assertNotNull(tbResource);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, resourceUpdateMsg.getMsgType());
- Assert.assertEquals("Updated Edge Test Resource", resourceUpdateMsg.getTitle());
+ Assert.assertEquals("Updated Edge Test Resource", tbResource.getTitle());
// delete resource
edgeImitator.expectMessageAmount(1);
@@ -91,18 +96,14 @@ public class ResourceEdgeTest extends AbstractEdgeTest {
@Test
public void testSendResourceToCloud() throws Exception {
+ TbResource tbResource = createTbResource();
UUID uuid = Uuids.timeBased();
UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder();
ResourceUpdateMsg.Builder resourceUpdateMsgBuilder = ResourceUpdateMsg.newBuilder();
resourceUpdateMsgBuilder.setIdMSB(uuid.getMostSignificantBits());
resourceUpdateMsgBuilder.setIdLSB(uuid.getLeastSignificantBits());
- resourceUpdateMsgBuilder.setTitle("Edge Test Resource");
- resourceUpdateMsgBuilder.setResourceType(ResourceType.JKS.name());
- resourceUpdateMsgBuilder.setResourceKey(FILE_NAME);
- resourceUpdateMsgBuilder.setFileName(FILE_NAME);
- resourceUpdateMsgBuilder.setData(TEST_DATA);
- resourceUpdateMsgBuilder.setIsSystem(false);
+ resourceUpdateMsgBuilder.setEntity(JacksonUtil.toString(tbResource));
resourceUpdateMsgBuilder.setMsgType(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE);
testAutoGeneratedCodeByProtobuf(resourceUpdateMsgBuilder);
uplinkMsgBuilder.addResourceUpdateMsg(resourceUpdateMsgBuilder.build());
@@ -117,18 +118,14 @@ public class ResourceEdgeTest extends AbstractEdgeTest {
UplinkResponseMsg latestResponseMsg = edgeImitator.getLatestResponseMsg();
Assert.assertTrue(latestResponseMsg.getSuccess());
- TbResource tbResource = doGet("/api/resource/" + uuid, TbResource.class);
- Assert.assertNotNull(tbResource);
- Assert.assertEquals("Edge Test Resource", tbResource.getName());
+ TbResource tb = doGet("/api/resource/" + uuid, TbResource.class);
+ Assert.assertNotNull(tb);
+ Assert.assertEquals("Edge Test Resource", tb.getName());
}
@Test
public void testResourceToCloudWithNameThatAlreadyExistsOnCloud() throws Exception {
- TbResource resource = new TbResource();
- resource.setResourceType(ResourceType.JKS);
- resource.setTitle("Edge Test Resource");
- resource.setFileName(FILE_NAME);
- resource.setData(TEST_DATA);
+ TbResource resource = createTbResource();
edgeImitator.expectMessageAmount(1);
TbResource savedResource = doPost("/api/resource", resource, TbResource.class);
@@ -140,12 +137,7 @@ public class ResourceEdgeTest extends AbstractEdgeTest {
ResourceUpdateMsg.Builder resourceUpdateMsgBuilder = ResourceUpdateMsg.newBuilder();
resourceUpdateMsgBuilder.setIdMSB(uuid.getMostSignificantBits());
resourceUpdateMsgBuilder.setIdLSB(uuid.getLeastSignificantBits());
- resourceUpdateMsgBuilder.setTitle("Edge Test Resource");
- resourceUpdateMsgBuilder.setResourceType(ResourceType.JKS.name());
- resourceUpdateMsgBuilder.setResourceKey(FILE_NAME);
- resourceUpdateMsgBuilder.setFileName(FILE_NAME);
- resourceUpdateMsgBuilder.setData(TEST_DATA);
- resourceUpdateMsgBuilder.setIsSystem(false);
+ resourceUpdateMsgBuilder.setEntity(JacksonUtil.toString(resource));
resourceUpdateMsgBuilder.setMsgType(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE);
testAutoGeneratedCodeByProtobuf(resourceUpdateMsgBuilder);
uplinkMsgBuilder.addResourceUpdateMsg(resourceUpdateMsgBuilder.build());
@@ -171,4 +163,15 @@ public class ResourceEdgeTest extends AbstractEdgeTest {
Assert.assertNotNull(tbResource);
Assert.assertNotEquals(FILE_NAME, tbResource.getName());
}
+
+ private TbResource createTbResource() {
+ TbResource tbResource = new TbResource();
+ tbResource.setTenantId(tenantId);
+ tbResource.setTitle("Edge Test Resource");
+ tbResource.setResourceType(ResourceType.JKS);
+ tbResource.setResourceKey(FILE_NAME);
+ tbResource.setFileName(FILE_NAME);
+ tbResource.setData(TEST_DATA);
+ return tbResource;
+ }
}
diff --git a/application/src/test/java/org/thingsboard/server/edge/RuleChainEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/RuleChainEdgeTest.java
index 848b115c72..ff87a64bfe 100644
--- a/application/src/test/java/org/thingsboard/server/edge/RuleChainEdgeTest.java
+++ b/application/src/test/java/org/thingsboard/server/edge/RuleChainEdgeTest.java
@@ -19,7 +19,6 @@ import com.google.protobuf.AbstractMessage;
import org.junit.Assert;
import org.junit.Test;
import org.thingsboard.common.util.JacksonUtil;
-import org.thingsboard.rule.engine.metadata.TbGetAttributesNode;
import org.thingsboard.rule.engine.metadata.TbGetAttributesNodeConfiguration;
import org.thingsboard.rule.engine.util.TbMsgSource;
import org.thingsboard.server.common.data.edge.Edge;
@@ -32,7 +31,6 @@ import org.thingsboard.server.dao.service.DaoSqlTest;
import org.thingsboard.server.gen.edge.v1.RuleChainMetadataRequestMsg;
import org.thingsboard.server.gen.edge.v1.RuleChainMetadataUpdateMsg;
import org.thingsboard.server.gen.edge.v1.RuleChainUpdateMsg;
-import org.thingsboard.server.gen.edge.v1.RuleNodeProto;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.gen.edge.v1.UplinkMsg;
@@ -40,7 +38,6 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
-import java.util.UUID;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@@ -64,11 +61,12 @@ public class RuleChainEdgeTest extends AbstractEdgeTest {
Optional ruleChainUpdateMsgOpt = edgeImitator.findMessageByType(RuleChainUpdateMsg.class);
Assert.assertTrue(ruleChainUpdateMsgOpt.isPresent());
RuleChainUpdateMsg ruleChainUpdateMsg = ruleChainUpdateMsgOpt.get();
+ RuleChain ruleChainMsg = JacksonUtil.fromStringIgnoreUnknownProperties(ruleChainUpdateMsg.getEntity(), RuleChain.class);
+ Assert.assertNotNull(ruleChainMsg);
Assert.assertTrue(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE.equals(ruleChainUpdateMsg.getMsgType()) ||
UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE.equals(ruleChainUpdateMsg.getMsgType()));
- Assert.assertEquals(ruleChainUpdateMsg.getIdMSB(), savedRuleChain.getUuidId().getMostSignificantBits());
- Assert.assertEquals(ruleChainUpdateMsg.getIdLSB(), savedRuleChain.getUuidId().getLeastSignificantBits());
- Assert.assertEquals(ruleChainUpdateMsg.getName(), savedRuleChain.getName());
+ Assert.assertEquals(savedRuleChain.getId(), ruleChainMsg.getId());
+ Assert.assertEquals(savedRuleChain.getName(), ruleChainMsg.getName());
testRuleChainMetadataRequestMsg(savedRuleChain.getId());
@@ -113,8 +111,9 @@ public class RuleChainEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof RuleChainMetadataUpdateMsg);
RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg = (RuleChainMetadataUpdateMsg) latestMessage;
- Assert.assertEquals(ruleChainMetadataUpdateMsg.getRuleChainIdMSB(), edgeRootRuleChainId.getId().getMostSignificantBits());
- Assert.assertEquals(ruleChainMetadataUpdateMsg.getRuleChainIdLSB(), edgeRootRuleChainId.getId().getLeastSignificantBits());
+ RuleChainMetaData ruleChainMetadataMsg = JacksonUtil.fromStringIgnoreUnknownProperties(ruleChainMetadataUpdateMsg.getEntity(), RuleChainMetaData.class);
+ Assert.assertNotNull(ruleChainMetadataMsg);
+ Assert.assertEquals(edgeRootRuleChainId, ruleChainMetadataMsg.getRuleChainId());
testAutoGeneratedCodeByProtobuf(ruleChainMetadataUpdateMsg);
}
@@ -138,12 +137,12 @@ public class RuleChainEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof RuleChainMetadataUpdateMsg);
RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg = (RuleChainMetadataUpdateMsg) latestMessage;
- RuleChainId receivedRuleChainId =
- new RuleChainId(new UUID(ruleChainMetadataUpdateMsg.getRuleChainIdMSB(), ruleChainMetadataUpdateMsg.getRuleChainIdLSB()));
- Assert.assertEquals(ruleChainId, receivedRuleChainId);
+ RuleChainMetaData ruleChainMetadataMsg = JacksonUtil.fromStringIgnoreUnknownProperties(ruleChainMetadataUpdateMsg.getEntity(), RuleChainMetaData.class);
+ Assert.assertNotNull(ruleChainMetadataMsg);
+ Assert.assertEquals(ruleChainId, ruleChainMetadataMsg.getRuleChainId());
- for (RuleNodeProto ruleNodeProto : ruleChainMetadataUpdateMsg.getNodesList()) {
- Assert.assertEquals(CONFIGURATION_VERSION, ruleNodeProto.getConfigurationVersion());
+ for (RuleNode ruleNode : ruleChainMetadataMsg.getNodes()) {
+ Assert.assertEquals(CONFIGURATION_VERSION, ruleNode.getConfigurationVersion());
}
}
@@ -208,10 +207,11 @@ public class RuleChainEdgeTest extends AbstractEdgeTest {
Optional ruleChainUpdateMsgOpt = edgeImitator.findMessageByType(RuleChainUpdateMsg.class);
Assert.assertTrue(ruleChainUpdateMsgOpt.isPresent());
RuleChainUpdateMsg ruleChainUpdateMsg = ruleChainUpdateMsgOpt.get();
+ RuleChain ruleChainMsg = JacksonUtil.fromStringIgnoreUnknownProperties(ruleChainUpdateMsg.getEntity(), RuleChain.class);
+ Assert.assertNotNull(ruleChainMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, ruleChainUpdateMsg.getMsgType());
- Assert.assertEquals(ruleChainUpdateMsg.getIdMSB(), savedRuleChain.getUuidId().getMostSignificantBits());
- Assert.assertEquals(ruleChainUpdateMsg.getIdLSB(), savedRuleChain.getUuidId().getLeastSignificantBits());
- Assert.assertTrue(ruleChainUpdateMsg.getRoot());
+ Assert.assertTrue(ruleChainMsg.isRoot());
+ Assert.assertEquals(savedRuleChain.getId(), ruleChainMsg.getId());
// revert root rule chain
edgeImitator.expectMessageAmount(1);
diff --git a/application/src/test/java/org/thingsboard/server/edge/TenantEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/TenantEdgeTest.java
index 95fdc9f56a..4c61b0d91d 100644
--- a/application/src/test/java/org/thingsboard/server/edge/TenantEdgeTest.java
+++ b/application/src/test/java/org/thingsboard/server/edge/TenantEdgeTest.java
@@ -17,16 +17,15 @@ package org.thingsboard.server.edge;
import org.junit.Assert;
import org.junit.Test;
+import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.TenantProfile;
-import org.thingsboard.server.common.data.id.TenantProfileId;
import org.thingsboard.server.dao.service.DaoSqlTest;
import org.thingsboard.server.gen.edge.v1.TenantProfileUpdateMsg;
import org.thingsboard.server.gen.edge.v1.TenantUpdateMsg;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import java.util.Optional;
-import java.util.UUID;
@DaoSqlTest
public class TenantEdgeTest extends AbstractEdgeTest {
@@ -49,15 +48,14 @@ public class TenantEdgeTest extends AbstractEdgeTest {
Optional tenantProfileUpdateMsgOpt = edgeImitator.findMessageByType(TenantProfileUpdateMsg.class);
Assert.assertTrue(tenantProfileUpdateMsgOpt.isPresent());
TenantProfileUpdateMsg tenantProfileUpdateMsg = tenantProfileUpdateMsgOpt.get();
+ Tenant tenantMsg = JacksonUtil.fromStringIgnoreUnknownProperties(tenantUpdateMsg.getEntity(), Tenant.class);
+ Assert.assertNotNull(tenantMsg);
+ Assert.assertEquals(savedTenant, tenantMsg);
+ TenantProfile tenantProfileMsg = JacksonUtil.fromStringIgnoreUnknownProperties(tenantProfileUpdateMsg.getEntity(), TenantProfile.class);
+ Assert.assertNotNull(tenantProfileMsg);
+ Assert.assertEquals(tenantMsg.getTenantProfileId(), tenantProfileMsg.getId());
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, tenantUpdateMsg.getMsgType());
- Assert.assertEquals(savedTenant.getUuidId().getMostSignificantBits(), tenantUpdateMsg.getIdMSB());
- Assert.assertEquals(savedTenant.getUuidId().getLeastSignificantBits(), tenantUpdateMsg.getIdLSB());
- Assert.assertEquals(savedTenant.getTitle(), tenantUpdateMsg.getTitle());
- Assert.assertEquals("Updated Title for Tenant Edge Test", tenantUpdateMsg.getTitle());
- Assert.assertEquals(savedTenant.getTenantProfileId(), new TenantProfileId
- (new UUID(tenantUpdateMsg.getProfileIdMSB(), tenantUpdateMsg.getProfileIdLSB())));
- Assert.assertEquals(savedTenant.getTenantProfileId(), new TenantProfileId
- (new UUID(tenantProfileUpdateMsg.getIdMSB(), tenantProfileUpdateMsg.getIdLSB())));
+ Assert.assertEquals("Updated Title for Tenant Edge Test", tenantMsg.getTitle());
//change tenant profile for tenant
TenantProfile tenantProfile = createTenantProfile();
@@ -68,18 +66,17 @@ public class TenantEdgeTest extends AbstractEdgeTest {
tenantUpdateMsgOpt = edgeImitator.findMessageByType(TenantUpdateMsg.class);
Assert.assertTrue(tenantUpdateMsgOpt.isPresent());
tenantUpdateMsg = tenantUpdateMsgOpt.get();
+ tenantMsg = JacksonUtil.fromStringIgnoreUnknownProperties(tenantUpdateMsg.getEntity(), Tenant.class);
+ Assert.assertNotNull(tenantMsg);
tenantProfileUpdateMsgOpt = edgeImitator.findMessageByType(TenantProfileUpdateMsg.class);
Assert.assertTrue(tenantProfileUpdateMsgOpt.isPresent());
tenantProfileUpdateMsg = tenantProfileUpdateMsgOpt.get();
+ tenantProfileMsg = JacksonUtil.fromStringIgnoreUnknownProperties(tenantProfileUpdateMsg.getEntity(), TenantProfile.class);
+ Assert.assertNotNull(tenantProfileMsg);
// tenant update
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, tenantUpdateMsg.getMsgType());
- Assert.assertEquals(savedTenant.getUuidId().getMostSignificantBits(), tenantUpdateMsg.getIdMSB());
- Assert.assertEquals(savedTenant.getUuidId().getLeastSignificantBits(), tenantUpdateMsg.getIdLSB());
- Assert.assertEquals(savedTenant.getTitle(), tenantUpdateMsg.getTitle());
- Assert.assertEquals(savedTenant.getTenantProfileId(), new TenantProfileId
- (new UUID(tenantUpdateMsg.getProfileIdMSB(), tenantUpdateMsg.getProfileIdLSB())));
- Assert.assertEquals(savedTenant.getTenantProfileId(), new TenantProfileId
- (new UUID(tenantProfileUpdateMsg.getIdMSB(), tenantProfileUpdateMsg.getIdLSB())));
+ Assert.assertEquals(savedTenant, tenantMsg);
+ Assert.assertEquals(savedTenant.getTenantProfileId(), tenantProfileMsg.getId());
}
private TenantProfile createTenantProfile() {
diff --git a/application/src/test/java/org/thingsboard/server/edge/TenantProfileEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/TenantProfileEdgeTest.java
index 6f665ce462..e958325410 100644
--- a/application/src/test/java/org/thingsboard/server/edge/TenantProfileEdgeTest.java
+++ b/application/src/test/java/org/thingsboard/server/edge/TenantProfileEdgeTest.java
@@ -18,10 +18,12 @@ package org.thingsboard.server.edge;
import com.google.protobuf.AbstractMessage;
import org.junit.Assert;
import org.junit.Test;
+import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.DataConstants;
import org.thingsboard.server.common.data.TenantProfile;
import org.thingsboard.server.common.data.queue.ProcessingStrategy;
import org.thingsboard.server.common.data.queue.ProcessingStrategyType;
+import org.thingsboard.server.common.data.queue.Queue;
import org.thingsboard.server.common.data.queue.SubmitStrategy;
import org.thingsboard.server.common.data.queue.SubmitStrategyType;
import org.thingsboard.server.common.data.tenant.profile.TenantProfileQueueConfiguration;
@@ -55,12 +57,12 @@ public class TenantProfileEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof TenantProfileUpdateMsg);
TenantProfileUpdateMsg tenantProfileUpdateMsg = (TenantProfileUpdateMsg) latestMessage;
+ TenantProfile tenantProfileMsg = JacksonUtil.fromStringIgnoreUnknownProperties(tenantProfileUpdateMsg.getEntity(), TenantProfile.class);
+ Assert.assertNotNull(tenantProfileMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, tenantProfileUpdateMsg.getMsgType());
- Assert.assertEquals(edgeTenantProfile.getUuidId().getMostSignificantBits(), tenantProfileUpdateMsg.getIdMSB());
- Assert.assertEquals(edgeTenantProfile.getUuidId().getLeastSignificantBits(), tenantProfileUpdateMsg.getIdLSB());
- Assert.assertEquals(edgeTenantProfile.getDescription(), tenantProfileUpdateMsg.getDescription());
- Assert.assertEquals("Updated tenant profile Edge Test", tenantProfileUpdateMsg.getDescription());
- Assert.assertEquals("Tenant Profile Edge Test", tenantProfileUpdateMsg.getName());
+ Assert.assertEquals(edgeTenantProfile, tenantProfileMsg);
+ Assert.assertEquals("Updated tenant profile Edge Test", tenantProfileMsg.getDescription());
+ Assert.assertEquals("Tenant Profile Edge Test", tenantProfileMsg.getName());
loginTenantAdmin();
}
@@ -83,10 +85,11 @@ public class TenantProfileEdgeTest extends AbstractEdgeTest {
Optional tenantProfileUpdateMsgOpt = edgeImitator.findMessageByType(TenantProfileUpdateMsg.class);
Assert.assertTrue(tenantProfileUpdateMsgOpt.isPresent());
TenantProfileUpdateMsg tenantProfileUpdateMsg = tenantProfileUpdateMsgOpt.get();
+ TenantProfile tenantProfile = JacksonUtil.fromStringIgnoreUnknownProperties(tenantProfileUpdateMsg.getEntity(), TenantProfile.class);
+ Assert.assertNotNull(tenantProfile);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, tenantProfileUpdateMsg.getMsgType());
- Assert.assertEquals(edgeTenantProfile.getUuidId().getMostSignificantBits(), tenantProfileUpdateMsg.getIdMSB());
- Assert.assertEquals(edgeTenantProfile.getUuidId().getLeastSignificantBits(), tenantProfileUpdateMsg.getIdLSB());
- Assert.assertEquals(edgeTenantProfile.getDescription(), tenantProfileUpdateMsg.getDescription());
+ Assert.assertEquals(edgeTenantProfile.getId(), tenantProfile.getId());
+ Assert.assertEquals(edgeTenantProfile.getDescription(), tenantProfile.getDescription());
List queueUpdateMsgs = edgeImitator.findAllMessagesByType(QueueUpdateMsg.class);
Assert.assertEquals(2, queueUpdateMsgs.size());
@@ -103,8 +106,9 @@ public class TenantProfileEdgeTest extends AbstractEdgeTest {
queueUpdateMsgs = edgeImitator.findAllMessagesByType(QueueUpdateMsg.class);
Assert.assertEquals(2, queueUpdateMsgs.size());
for (QueueUpdateMsg queueUpdateMsg : queueUpdateMsgs) {
- Assert.assertEquals(tenantId.getId().getMostSignificantBits(), queueUpdateMsg.getTenantIdMSB());
- Assert.assertEquals(tenantId.getId().getLeastSignificantBits(), queueUpdateMsg.getTenantIdLSB());
+ Queue queue = JacksonUtil.fromStringIgnoreUnknownProperties(queueUpdateMsg.getEntity(), Queue.class);
+ Assert.assertNotNull(queue);
+ Assert.assertEquals(tenantId, queue.getTenantId());
}
}
diff --git a/application/src/test/java/org/thingsboard/server/edge/UserEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/UserEdgeTest.java
index 3dc398b9f3..8dd5b27ad5 100644
--- a/application/src/test/java/org/thingsboard/server/edge/UserEdgeTest.java
+++ b/application/src/test/java/org/thingsboard/server/edge/UserEdgeTest.java
@@ -20,10 +20,12 @@ import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.edge.Edge;
import org.thingsboard.server.common.data.security.Authority;
+import org.thingsboard.server.common.data.security.UserCredentials;
import org.thingsboard.server.dao.service.DaoSqlTest;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
import org.thingsboard.server.gen.edge.v1.UplinkMsg;
@@ -57,13 +59,14 @@ public class UserEdgeTest extends AbstractEdgeTest {
Optional userUpdateMsgOpt = edgeImitator.findMessageByType(UserUpdateMsg.class);
Assert.assertTrue(userUpdateMsgOpt.isPresent());
UserUpdateMsg userUpdateMsg = userUpdateMsgOpt.get();
+ User userMsg = JacksonUtil.fromStringIgnoreUnknownProperties(userUpdateMsg.getEntity(), User.class);
+ Assert.assertNotNull(userMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, userUpdateMsg.getMsgType());
- Assert.assertEquals(savedTenantAdmin.getUuidId().getMostSignificantBits(), userUpdateMsg.getIdMSB());
- Assert.assertEquals(savedTenantAdmin.getUuidId().getLeastSignificantBits(), userUpdateMsg.getIdLSB());
- Assert.assertEquals(savedTenantAdmin.getAuthority().name(), userUpdateMsg.getAuthority());
- Assert.assertEquals(savedTenantAdmin.getEmail(), userUpdateMsg.getEmail());
- Assert.assertEquals(savedTenantAdmin.getFirstName(), userUpdateMsg.getFirstName());
- Assert.assertEquals(savedTenantAdmin.getLastName(), userUpdateMsg.getLastName());
+ Assert.assertEquals(savedTenantAdmin.getId(), userMsg.getId());
+ Assert.assertEquals(savedTenantAdmin.getAuthority(), userMsg.getAuthority());
+ Assert.assertEquals(savedTenantAdmin.getEmail(), userMsg.getEmail());
+ Assert.assertEquals(savedTenantAdmin.getFirstName(), userMsg.getFirstName());
+ Assert.assertEquals(savedTenantAdmin.getLastName(), userMsg.getLastName());
Optional userCredentialsUpdateMsgOpt = edgeImitator.findMessageByType(UserCredentialsUpdateMsg.class);
Assert.assertTrue(userCredentialsUpdateMsgOpt.isPresent());
@@ -75,8 +78,10 @@ public class UserEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof UserUpdateMsg);
userUpdateMsg = (UserUpdateMsg) latestMessage;
+ userMsg = JacksonUtil.fromStringIgnoreUnknownProperties(userUpdateMsg.getEntity(), User.class);
+ Assert.assertNotNull(userMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, userUpdateMsg.getMsgType());
- Assert.assertEquals(savedTenantAdmin.getLastName(), userUpdateMsg.getLastName());
+ Assert.assertEquals(savedTenantAdmin.getLastName(), userMsg.getLastName());
// update user credentials
login(savedTenantAdmin.getEmail(), "tenant");
@@ -90,9 +95,10 @@ public class UserEdgeTest extends AbstractEdgeTest {
latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof UserCredentialsUpdateMsg);
UserCredentialsUpdateMsg userCredentialsUpdateMsg = (UserCredentialsUpdateMsg) latestMessage;
- Assert.assertEquals(savedTenantAdmin.getUuidId().getMostSignificantBits(), userCredentialsUpdateMsg.getUserIdMSB());
- Assert.assertEquals(savedTenantAdmin.getUuidId().getLeastSignificantBits(), userCredentialsUpdateMsg.getUserIdLSB());
- Assert.assertTrue(passwordEncoder.matches(changePasswordRequest.getNewPassword(), userCredentialsUpdateMsg.getPassword()));
+ UserCredentials userCredentialsMsg = JacksonUtil.fromStringIgnoreUnknownProperties(userCredentialsUpdateMsg.getEntity(), UserCredentials.class);
+ Assert.assertNotNull(userCredentialsMsg);
+ Assert.assertEquals(savedTenantAdmin.getId(), userCredentialsMsg.getUserId());
+ Assert.assertTrue(passwordEncoder.matches(changePasswordRequest.getNewPassword(), userCredentialsMsg.getPassword()));
loginTenantAdmin();
@@ -138,15 +144,15 @@ public class UserEdgeTest extends AbstractEdgeTest {
Optional userUpdateMsgOpt = edgeImitator.findMessageByType(UserUpdateMsg.class);
Assert.assertTrue(userUpdateMsgOpt.isPresent());
UserUpdateMsg userUpdateMsg = userUpdateMsgOpt.get();
+ User userMsg = JacksonUtil.fromStringIgnoreUnknownProperties(userUpdateMsg.getEntity(), User.class);
+ Assert.assertNotNull(userMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, userUpdateMsg.getMsgType());
- Assert.assertEquals(savedCustomerUser.getUuidId().getMostSignificantBits(), userUpdateMsg.getIdMSB());
- Assert.assertEquals(savedCustomerUser.getUuidId().getLeastSignificantBits(), userUpdateMsg.getIdLSB());
- Assert.assertEquals(savedCustomerUser.getCustomerId().getId().getMostSignificantBits(), userUpdateMsg.getCustomerIdMSB());
- Assert.assertEquals(savedCustomerUser.getCustomerId().getId().getLeastSignificantBits(), userUpdateMsg.getCustomerIdLSB());
- Assert.assertEquals(savedCustomerUser.getAuthority().name(), userUpdateMsg.getAuthority());
- Assert.assertEquals(savedCustomerUser.getEmail(), userUpdateMsg.getEmail());
- Assert.assertEquals(savedCustomerUser.getFirstName(), userUpdateMsg.getFirstName());
- Assert.assertEquals(savedCustomerUser.getLastName(), userUpdateMsg.getLastName());
+ Assert.assertEquals(savedCustomerUser.getId(), userMsg.getId());
+ Assert.assertEquals(savedCustomerUser.getCustomerId(), userMsg.getCustomerId());
+ Assert.assertEquals(savedCustomerUser.getAuthority(), userMsg.getAuthority());
+ Assert.assertEquals(savedCustomerUser.getEmail(), userMsg.getEmail());
+ Assert.assertEquals(savedCustomerUser.getFirstName(), userMsg.getFirstName());
+ Assert.assertEquals(savedCustomerUser.getLastName(), userMsg.getLastName());
// update user
edgeImitator.expectMessageAmount(1);
@@ -156,8 +162,10 @@ public class UserEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof UserUpdateMsg);
userUpdateMsg = (UserUpdateMsg) latestMessage;
+ userMsg = JacksonUtil.fromStringIgnoreUnknownProperties(userUpdateMsg.getEntity(), User.class);
+ Assert.assertNotNull(userMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, userUpdateMsg.getMsgType());
- Assert.assertEquals(savedCustomerUser.getLastName(), userUpdateMsg.getLastName());
+ Assert.assertEquals(savedCustomerUser.getLastName(), userMsg.getLastName());
// update user credentials
login(savedCustomerUser.getEmail(), "customer");
@@ -171,9 +179,10 @@ public class UserEdgeTest extends AbstractEdgeTest {
latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof UserCredentialsUpdateMsg);
UserCredentialsUpdateMsg userCredentialsUpdateMsg = (UserCredentialsUpdateMsg) latestMessage;
- Assert.assertEquals(savedCustomerUser.getUuidId().getMostSignificantBits(), userCredentialsUpdateMsg.getUserIdMSB());
- Assert.assertEquals(savedCustomerUser.getUuidId().getLeastSignificantBits(), userCredentialsUpdateMsg.getUserIdLSB());
- Assert.assertTrue(passwordEncoder.matches(changePasswordRequest.getNewPassword(), userCredentialsUpdateMsg.getPassword()));
+ UserCredentials userCredentialsMsg = JacksonUtil.fromStringIgnoreUnknownProperties(userCredentialsUpdateMsg.getEntity(), UserCredentials.class);
+ Assert.assertNotNull(userCredentialsMsg);
+ Assert.assertEquals(savedCustomerUser.getId(), userCredentialsMsg.getUserId());
+ Assert.assertTrue(passwordEncoder.matches(changePasswordRequest.getNewPassword(), userCredentialsMsg.getPassword()));
loginTenantAdmin();
@@ -211,8 +220,9 @@ public class UserEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof UserCredentialsUpdateMsg);
UserCredentialsUpdateMsg userCredentialsUpdateMsg = (UserCredentialsUpdateMsg) latestMessage;
- Assert.assertEquals(tenantAdminUserId.getId().getMostSignificantBits(), userCredentialsUpdateMsg.getUserIdMSB());
- Assert.assertEquals(tenantAdminUserId.getId().getLeastSignificantBits(), userCredentialsUpdateMsg.getUserIdLSB());
+ UserCredentials userCredentialsMsg = JacksonUtil.fromStringIgnoreUnknownProperties(userCredentialsUpdateMsg.getEntity(), UserCredentials.class);
+ Assert.assertNotNull(userCredentialsMsg);
+ Assert.assertEquals(tenantAdminUserId, userCredentialsMsg.getUserId());
}
@Test
@@ -235,8 +245,9 @@ public class UserEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof UserCredentialsUpdateMsg);
UserCredentialsUpdateMsg userCredentialsUpdateMsg = (UserCredentialsUpdateMsg) latestMessage;
- Assert.assertEquals(userCredentialsUpdateMsg.getUserIdMSB(), tenantAdminUserId.getId().getMostSignificantBits());
- Assert.assertEquals(userCredentialsUpdateMsg.getUserIdLSB(), tenantAdminUserId.getId().getLeastSignificantBits());
+ UserCredentials userCredentialsMsg = JacksonUtil.fromStringIgnoreUnknownProperties(userCredentialsUpdateMsg.getEntity(), UserCredentials.class);
+ Assert.assertNotNull(userCredentialsMsg);
+ Assert.assertEquals(tenantAdminUserId, userCredentialsMsg.getUserId());
testAutoGeneratedCodeByProtobuf(userCredentialsUpdateMsg);
}
diff --git a/application/src/test/java/org/thingsboard/server/edge/WidgetEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/WidgetEdgeTest.java
index e958741cd2..a325de3402 100644
--- a/application/src/test/java/org/thingsboard/server/edge/WidgetEdgeTest.java
+++ b/application/src/test/java/org/thingsboard/server/edge/WidgetEdgeTest.java
@@ -43,11 +43,12 @@ public class WidgetEdgeTest extends AbstractEdgeTest {
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof WidgetsBundleUpdateMsg);
WidgetsBundleUpdateMsg widgetsBundleUpdateMsg = (WidgetsBundleUpdateMsg) latestMessage;
+ WidgetsBundle widgetsBundleMsg = JacksonUtil.fromStringIgnoreUnknownProperties(widgetsBundleUpdateMsg.getEntity(), WidgetsBundle.class);
+ Assert.assertNotNull(widgetsBundleMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, widgetsBundleUpdateMsg.getMsgType());
- Assert.assertEquals(savedWidgetsBundle.getUuidId().getMostSignificantBits(), widgetsBundleUpdateMsg.getIdMSB());
- Assert.assertEquals(savedWidgetsBundle.getUuidId().getLeastSignificantBits(), widgetsBundleUpdateMsg.getIdLSB());
- Assert.assertEquals(savedWidgetsBundle.getAlias(), widgetsBundleUpdateMsg.getAlias());
- Assert.assertEquals(savedWidgetsBundle.getTitle(), widgetsBundleUpdateMsg.getTitle());
+ Assert.assertEquals(savedWidgetsBundle.getId(), widgetsBundleMsg.getId());
+ Assert.assertEquals(savedWidgetsBundle.getAlias(), widgetsBundleMsg.getAlias());
+ Assert.assertEquals(savedWidgetsBundle.getTitle(), widgetsBundleMsg.getTitle());
testAutoGeneratedCodeByProtobuf(widgetsBundleUpdateMsg);
// create widget type
@@ -64,15 +65,10 @@ public class WidgetEdgeTest extends AbstractEdgeTest {
latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof WidgetTypeUpdateMsg);
WidgetTypeUpdateMsg widgetTypeUpdateMsg = (WidgetTypeUpdateMsg) latestMessage;
+ WidgetType widgetsType = JacksonUtil.fromStringIgnoreUnknownProperties(widgetTypeUpdateMsg.getEntity(), WidgetType.class);
+ Assert.assertNotNull(widgetsType);
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, widgetTypeUpdateMsg.getMsgType());
- Assert.assertEquals(savedWidgetType.getUuidId().getMostSignificantBits(), widgetTypeUpdateMsg.getIdMSB());
- Assert.assertEquals(savedWidgetType.getUuidId().getLeastSignificantBits(), widgetTypeUpdateMsg.getIdLSB());
- Assert.assertEquals(savedWidgetType.getFqn(), widgetTypeUpdateMsg.getFqn());
- Assert.assertEquals(savedWidgetType.getName(), widgetTypeUpdateMsg.getName());
- Assert.assertTrue(widgetTypeUpdateMsg.getDeprecated());
- Assert.assertEquals("bundle_alias", widgetTypeUpdateMsg.getBundleAlias());
- Assert.assertEquals("type_alias", widgetTypeUpdateMsg.getAlias());
- Assert.assertEquals(JacksonUtil.toJsonNode(widgetTypeUpdateMsg.getDescriptorJson()), savedWidgetType.getDescriptor());
+ Assert.assertEquals(savedWidgetType, widgetsType);
// update widget bundle
edgeImitator.expectMessageAmount(1);
@@ -82,8 +78,10 @@ public class WidgetEdgeTest extends AbstractEdgeTest {
latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof WidgetsBundleUpdateMsg);
widgetsBundleUpdateMsg = (WidgetsBundleUpdateMsg) latestMessage;
+ widgetsBundleMsg = JacksonUtil.fromStringIgnoreUnknownProperties(widgetsBundleUpdateMsg.getEntity(), WidgetsBundle.class);
+ Assert.assertNotNull(widgetsBundleMsg);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, widgetsBundleUpdateMsg.getMsgType());
- Assert.assertEquals(savedWidgetsBundle.getTitle(), widgetsBundleUpdateMsg.getTitle());
+ Assert.assertEquals(savedWidgetsBundle.getTitle(), widgetsBundleMsg.getTitle());
// update widget type
edgeImitator.expectMessageAmount(1);
@@ -93,8 +91,10 @@ public class WidgetEdgeTest extends AbstractEdgeTest {
latestMessage = edgeImitator.getLatestMessage();
Assert.assertTrue(latestMessage instanceof WidgetTypeUpdateMsg);
widgetTypeUpdateMsg = (WidgetTypeUpdateMsg) latestMessage;
+ widgetsType = JacksonUtil.fromStringIgnoreUnknownProperties(widgetTypeUpdateMsg.getEntity(), WidgetType.class);
+ Assert.assertNotNull(widgetsType);
Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, widgetTypeUpdateMsg.getMsgType());
- Assert.assertEquals(savedWidgetType.getName(), widgetTypeUpdateMsg.getName());
+ Assert.assertEquals(savedWidgetType.getName(), widgetsType.getName());
// delete widget type
edgeImitator.expectMessageAmount(1);
diff --git a/application/src/test/java/org/thingsboard/server/service/edge/rpc/constructor/RuleChainMsgConstructorTest.java b/application/src/test/java/org/thingsboard/server/service/edge/rpc/constructor/RuleChainMsgConstructorTest.java
index c1f34217ac..c7a3e7a24c 100644
--- a/application/src/test/java/org/thingsboard/server/service/edge/rpc/constructor/RuleChainMsgConstructorTest.java
+++ b/application/src/test/java/org/thingsboard/server/service/edge/rpc/constructor/RuleChainMsgConstructorTest.java
@@ -24,11 +24,11 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
import org.thingsboard.common.util.JacksonUtil;
-import org.thingsboard.server.common.data.msg.TbNodeConnectionType;
import org.thingsboard.server.common.data.id.RuleChainId;
import org.thingsboard.server.common.data.id.RuleNodeId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.msg.TbMsgType;
+import org.thingsboard.server.common.data.msg.TbNodeConnectionType;
import org.thingsboard.server.common.data.rule.NodeConnectionInfo;
import org.thingsboard.server.common.data.rule.RuleChainMetaData;
import org.thingsboard.server.common.data.rule.RuleNode;
@@ -37,6 +37,7 @@ import org.thingsboard.server.gen.edge.v1.RuleChainConnectionInfoProto;
import org.thingsboard.server.gen.edge.v1.RuleChainMetadataUpdateMsg;
import org.thingsboard.server.gen.edge.v1.RuleNodeProto;
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
+import org.thingsboard.server.service.edge.rpc.constructor.rule.RuleChainMsgConstructorV1;
import java.util.ArrayList;
import java.util.List;
@@ -49,13 +50,13 @@ public class RuleChainMsgConstructorTest {
private static final String RPC_CONNECTION_TYPE = "RPC";
- private RuleChainMsgConstructor constructor;
+ private RuleChainMsgConstructorV1 ruleChainMsgConstructorV1;
private TenantId tenantId;
@Before
public void setup() {
- constructor = new RuleChainMsgConstructor();
+ ruleChainMsgConstructorV1 = new RuleChainMsgConstructorV1();
tenantId = new TenantId(UUID.randomUUID());
}
@@ -65,7 +66,7 @@ public class RuleChainMsgConstructorTest {
RuleChainMetaData ruleChainMetaData = createRuleChainMetaData(
ruleChainId, 3, createRuleNodes(ruleChainId), createConnections());
RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg =
- constructor.constructRuleChainMetadataUpdatedMsg(
+ ruleChainMsgConstructorV1.constructRuleChainMetadataUpdatedMsg(
tenantId,
UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE,
ruleChainMetaData,
@@ -84,7 +85,7 @@ public class RuleChainMsgConstructorTest {
RuleChainMetaData ruleChainMetaData = createRuleChainMetaData(
ruleChainId, 3, createRuleNodes(ruleChainId), createConnections());
RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg =
- constructor.constructRuleChainMetadataUpdatedMsg(
+ ruleChainMsgConstructorV1.constructRuleChainMetadataUpdatedMsg(
tenantId,
UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE,
ruleChainMetaData,
@@ -123,7 +124,7 @@ public class RuleChainMsgConstructorTest {
RuleChainId ruleChainId = new RuleChainId(UUID.randomUUID());
RuleChainMetaData ruleChainMetaData = createRuleChainMetaData(ruleChainId, 3, createRuleNodes(ruleChainId), createConnections());
RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg =
- constructor.constructRuleChainMetadataUpdatedMsg(
+ ruleChainMsgConstructorV1.constructRuleChainMetadataUpdatedMsg(
tenantId,
UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE,
ruleChainMetaData,
@@ -165,7 +166,7 @@ public class RuleChainMsgConstructorTest {
RuleChainId ruleChainId = new RuleChainId(UUID.randomUUID());
RuleChainMetaData ruleChainMetaData1 = createRuleChainMetaData(ruleChainId, 8, createRuleNodesInDifferentOrder(ruleChainId), createConnectionsInDifferentOrder());
RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg =
- constructor.constructRuleChainMetadataUpdatedMsg(
+ ruleChainMsgConstructorV1.constructRuleChainMetadataUpdatedMsg(
tenantId,
UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE,
ruleChainMetaData1,
diff --git a/application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/BaseEdgeProcessorTest.java b/application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/BaseEdgeProcessorTest.java
index dc59d4f7e9..c6ee264783 100644
--- a/application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/BaseEdgeProcessorTest.java
+++ b/application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/BaseEdgeProcessorTest.java
@@ -60,27 +60,53 @@ import org.thingsboard.server.gen.edge.v1.EdgeVersion;
import org.thingsboard.server.queue.discovery.PartitionService;
import org.thingsboard.server.queue.provider.TbQueueProducerProvider;
import org.thingsboard.server.queue.util.DataDecodingEncodingService;
-import org.thingsboard.server.service.edge.rpc.constructor.AdminSettingsMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.AlarmMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.AssetMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.AssetProfileMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.CustomerMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.DashboardMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.DeviceMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.DeviceProfileMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.EdgeMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.EntityDataMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.EntityViewMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.OtaPackageMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.QueueMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.RelationMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.ResourceMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.RuleChainMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.TenantMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.TenantProfileMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.UserMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.WidgetTypeMsgConstructor;
-import org.thingsboard.server.service.edge.rpc.constructor.WidgetsBundleMsgConstructor;
+import org.thingsboard.server.service.edge.rpc.constructor.alarm.AlarmMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.alarm.AlarmMsgConstructorV1;
+import org.thingsboard.server.service.edge.rpc.constructor.alarm.AlarmMsgConstructorV2;
+import org.thingsboard.server.service.edge.rpc.constructor.asset.AssetMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.asset.AssetMsgConstructorV1;
+import org.thingsboard.server.service.edge.rpc.constructor.asset.AssetMsgConstructorV2;
+import org.thingsboard.server.service.edge.rpc.constructor.customer.CustomerMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.customer.CustomerMsgConstructorV1;
+import org.thingsboard.server.service.edge.rpc.constructor.customer.CustomerMsgConstructorV2;
+import org.thingsboard.server.service.edge.rpc.constructor.dashboard.DashboardMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.dashboard.DashboardMsgConstructorV1;
+import org.thingsboard.server.service.edge.rpc.constructor.dashboard.DashboardMsgConstructorV2;
+import org.thingsboard.server.service.edge.rpc.constructor.device.DeviceMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.device.DeviceMsgConstructorV1;
+import org.thingsboard.server.service.edge.rpc.constructor.device.DeviceMsgConstructorV2;
+import org.thingsboard.server.service.edge.rpc.constructor.edge.EdgeMsgConstructor;
+import org.thingsboard.server.service.edge.rpc.constructor.entityview.EntityViewMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.entityview.EntityViewMsgConstructorV1;
+import org.thingsboard.server.service.edge.rpc.constructor.entityview.EntityViewMsgConstructorV2;
+import org.thingsboard.server.service.edge.rpc.constructor.ota.OtaPackageMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.ota.OtaPackageMsgConstructorV1;
+import org.thingsboard.server.service.edge.rpc.constructor.ota.OtaPackageMsgConstructorV2;
+import org.thingsboard.server.service.edge.rpc.constructor.queue.QueueMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.queue.QueueMsgConstructorV1;
+import org.thingsboard.server.service.edge.rpc.constructor.queue.QueueMsgConstructorV2;
+import org.thingsboard.server.service.edge.rpc.constructor.relation.RelationMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.relation.RelationMsgConstructorV1;
+import org.thingsboard.server.service.edge.rpc.constructor.relation.RelationMsgConstructorV2;
+import org.thingsboard.server.service.edge.rpc.constructor.resource.ResourceMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.resource.ResourceMsgConstructorV1;
+import org.thingsboard.server.service.edge.rpc.constructor.resource.ResourceMsgConstructorV2;
+import org.thingsboard.server.service.edge.rpc.constructor.rule.RuleChainMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.rule.RuleChainMsgConstructorV1;
+import org.thingsboard.server.service.edge.rpc.constructor.rule.RuleChainMsgConstructorV2;
+import org.thingsboard.server.service.edge.rpc.constructor.settings.AdminSettingsMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.settings.AdminSettingsMsgConstructorV1;
+import org.thingsboard.server.service.edge.rpc.constructor.settings.AdminSettingsMsgConstructorV2;
+import org.thingsboard.server.service.edge.rpc.constructor.telemetry.EntityDataMsgConstructor;
+import org.thingsboard.server.service.edge.rpc.constructor.tenant.TenantMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.tenant.TenantMsgConstructorV1;
+import org.thingsboard.server.service.edge.rpc.constructor.tenant.TenantMsgConstructorV2;
+import org.thingsboard.server.service.edge.rpc.constructor.user.UserMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.user.UserMsgConstructorV1;
+import org.thingsboard.server.service.edge.rpc.constructor.user.UserMsgConstructorV2;
+import org.thingsboard.server.service.edge.rpc.constructor.widget.WidgetMsgConstructorFactory;
+import org.thingsboard.server.service.edge.rpc.constructor.widget.WidgetMsgConstructorV1;
+import org.thingsboard.server.service.edge.rpc.constructor.widget.WidgetMsgConstructorV2;
import org.thingsboard.server.service.entitiy.TbNotificationEntityService;
import org.thingsboard.server.service.executors.DbCallbackExecutorService;
import org.thingsboard.server.service.profile.TbAssetProfileCache;
@@ -212,61 +238,139 @@ public abstract class BaseEdgeProcessorTest {
protected EntityDataMsgConstructor entityDataMsgConstructor;
@MockBean
- protected RuleChainMsgConstructor ruleChainMsgConstructor;
+ protected AdminSettingsMsgConstructorV1 adminSettingsMsgConstructorV1;
@MockBean
- protected AlarmMsgConstructor alarmMsgConstructor;
+ protected AdminSettingsMsgConstructorV2 adminSettingsMsgConstructorV2;
+
+ @MockBean
+ protected AlarmMsgConstructorV1 alarmMsgConstructorV1;
+
+ @MockBean
+ protected AlarmMsgConstructorV2 alarmMsgConstructorV2;
+
+ @SpyBean
+ protected AssetMsgConstructorV1 assetMsgConstructorV1;
+
+ @SpyBean
+ protected AssetMsgConstructorV2 assetMsgConstructorV2;
+
+ @MockBean
+ protected CustomerMsgConstructorV1 customerMsgConstructorV1;
+
+ @MockBean
+ protected CustomerMsgConstructorV2 customerMsgConstructorV2;
+
+ @MockBean
+ protected DashboardMsgConstructorV1 dashboardMsgConstructorV1;
+
+ @MockBean
+ protected DashboardMsgConstructorV2 dashboardMsgConstructorV2;
+
+ @SpyBean
+ protected DeviceMsgConstructorV1 deviceMsgConstructorV1;
+
+ @SpyBean
+ protected DeviceMsgConstructorV2 deviceMsgConstructorV2;
+
+ @MockBean
+ protected EntityViewMsgConstructorV1 entityViewMsgConstructorV1;
+
+ @MockBean
+ protected EntityViewMsgConstructorV2 entityViewMsgConstructorV2;
+
+ @MockBean
+ protected OtaPackageMsgConstructorV1 otaPackageMsgConstructorV1;
+
+ @MockBean
+ protected OtaPackageMsgConstructorV2 otaPackageMsgConstructorV2;
+
+ @MockBean
+ protected QueueMsgConstructorV1 queueMsgConstructorV1;
+
+ @MockBean
+ protected QueueMsgConstructorV2 queueMsgConstructorV2;
+
+ @MockBean
+ protected RelationMsgConstructorV1 relationMsgConstructorV1;
+
+ @MockBean
+ protected RelationMsgConstructorV2 relationMsgConstructorV2;
+
+ @MockBean
+ protected ResourceMsgConstructorV1 resourceMsgConstructorV1;
+
+ @MockBean
+ protected ResourceMsgConstructorV2 resourceMsgConstructorV2;
@SpyBean
- protected DeviceMsgConstructor deviceMsgConstructor;
+ protected RuleChainMsgConstructorV1 ruleChainMsgConstructorV1;
@SpyBean
- protected AssetMsgConstructor assetMsgConstructor;
+ protected RuleChainMsgConstructorV2 ruleChainMsgConstructorV2;
+
+ @MockBean
+ protected TenantMsgConstructorV1 tenantMsgConstructorV1;
@MockBean
- protected EntityViewMsgConstructor entityViewMsgConstructor;
+ protected TenantMsgConstructorV2 tenantMsgConstructorV2;
@MockBean
- protected DashboardMsgConstructor dashboardMsgConstructor;
+ protected UserMsgConstructorV1 userMsgConstructorV1;
@MockBean
- protected RelationMsgConstructor relationMsgConstructor;
+ protected UserMsgConstructorV2 userMsgConstructorV2;
@MockBean
- protected UserMsgConstructor userMsgConstructor;
+ protected WidgetMsgConstructorV1 widgetMsgConstructorV1;
+
+ @MockBean
+ protected WidgetMsgConstructorV2 widgetMsgConstructorV2;
+
+ @SpyBean
+ protected RuleChainMsgConstructorFactory ruleChainMsgConstructorFactory;
@MockBean
- protected CustomerMsgConstructor customerMsgConstructor;
+ protected AlarmMsgConstructorFactory alarmMsgConstructorFactory;
@SpyBean
- protected DeviceProfileMsgConstructor deviceProfileMsgConstructor;
+ protected DeviceMsgConstructorFactory deviceMsgConstructorFactory;
@SpyBean
- protected AssetProfileMsgConstructor assetProfileMsgConstructor;
+ protected AssetMsgConstructorFactory assetMsgConstructorFactory;
+
+ @MockBean
+ protected DashboardMsgConstructorFactory dashboardMsgConstructorFactory;
+
+ @MockBean
+ protected EntityViewMsgConstructorFactory entityViewMsgConstructorFactory;
+
+ @MockBean
+ protected RelationMsgConstructorFactory relationMsgConstructorFactory;
@MockBean
- protected TenantMsgConstructor tenantMsgConstructor;
+ protected UserMsgConstructorFactory userMsgConstructorFactory;
@MockBean
- protected TenantProfileMsgConstructor tenantProfileMsgConstructor;
+ protected CustomerMsgConstructorFactory customerMsgConstructorFactory;
@MockBean
- protected WidgetsBundleMsgConstructor widgetsBundleMsgConstructor;
+ protected TenantMsgConstructorFactory tenantMsgConstructorFactory;
@MockBean
- protected WidgetTypeMsgConstructor widgetTypeMsgConstructor;
+ protected WidgetMsgConstructorFactory widgetBundleMsgConstructorFactory;
@MockBean
- protected AdminSettingsMsgConstructor adminSettingsMsgConstructor;
+ protected AdminSettingsMsgConstructorFactory adminSettingsMsgConstructorFactory;
@MockBean
- protected OtaPackageMsgConstructor otaPackageMsgConstructor;
+ protected OtaPackageMsgConstructorFactory otaPackageMsgConstructorFactory;
@MockBean
- protected QueueMsgConstructor queueMsgConstructor;
+ protected QueueMsgConstructorFactory queueMsgConstructorFactory;
@MockBean
- protected ResourceMsgConstructor resourceMsgConstructor;
+ protected ResourceMsgConstructorFactory resourceMsgConstructorFactory;
@MockBean
protected EdgeSynchronizationManager edgeSynchronizationManager;
diff --git a/common/cache/src/main/java/org/thingsboard/server/cache/RedisTbTransactionalCache.java b/common/cache/src/main/java/org/thingsboard/server/cache/RedisTbTransactionalCache.java
index c5af954392..01a18ad7ad 100644
--- a/common/cache/src/main/java/org/thingsboard/server/cache/RedisTbTransactionalCache.java
+++ b/common/cache/src/main/java/org/thingsboard/server/cache/RedisTbTransactionalCache.java
@@ -17,6 +17,7 @@ package org.thingsboard.server.cache;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.support.NullValue;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisConnectionFactory;
@@ -27,6 +28,7 @@ import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.types.Expiration;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
+import org.thingsboard.server.common.data.FstStatsService;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.util.JedisClusterCRC16;
@@ -44,6 +46,9 @@ public abstract class RedisTbTransactionalCacheorg.thingsboard.common
data
+
+ org.thingsboard.common
+ proto
+
org.thingsboard.common
message
diff --git a/common/cluster-api/src/main/java/org/thingsboard/server/cluster/TbClusterService.java b/common/cluster-api/src/main/java/org/thingsboard/server/cluster/TbClusterService.java
index 5b1eb1ae4f..5c3b9076ff 100644
--- a/common/cluster-api/src/main/java/org/thingsboard/server/cluster/TbClusterService.java
+++ b/common/cluster-api/src/main/java/org/thingsboard/server/cluster/TbClusterService.java
@@ -83,7 +83,9 @@ public interface TbClusterService extends TbQueueClusterService {
void onDeviceUpdated(Device device, Device old);
- void onDeviceDeleted(Device device, TbQueueCallback callback);
+ void onDeviceDeleted(TenantId tenantId, Device device, TbQueueCallback callback);
+
+ void onDeviceAssignedToTenant(TenantId oldTenantId, Device device);
void onResourceChange(TbResource resource, TbQueueCallback callback);
diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/DashboardInfo.java b/common/data/src/main/java/org/thingsboard/server/common/data/DashboardInfo.java
index fe08934f79..abc9a53202 100644
--- a/common/data/src/main/java/org/thingsboard/server/common/data/DashboardInfo.java
+++ b/common/data/src/main/java/org/thingsboard/server/common/data/DashboardInfo.java
@@ -32,6 +32,8 @@ import java.util.Set;
@ApiModel
public class DashboardInfo extends BaseData implements HasName, HasTenantId, HasTitle {
+ private static final long serialVersionUID = -9080404114760433799L;
+
private TenantId tenantId;
@NoXss
@Length(fieldName = "title")
diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/FstStatsService.java b/common/data/src/main/java/org/thingsboard/server/common/data/FstStatsService.java
new file mode 100644
index 0000000000..42be4b3b68
--- /dev/null
+++ b/common/data/src/main/java/org/thingsboard/server/common/data/FstStatsService.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.common.data;
+
+public interface FstStatsService {
+
+ void incrementEncode(Class> clazz);
+
+ void incrementDecode(Class> clazz);
+
+ void recordEncodeTime(Class> clazz, long startTime);
+
+ void recordDecodeTime(Class> clazz, long startTime);
+
+}
diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/edge/EdgeEvent.java b/common/data/src/main/java/org/thingsboard/server/common/data/edge/EdgeEvent.java
index 3688f5c6c2..1baf707040 100644
--- a/common/data/src/main/java/org/thingsboard/server/common/data/edge/EdgeEvent.java
+++ b/common/data/src/main/java/org/thingsboard/server/common/data/edge/EdgeEvent.java
@@ -31,6 +31,8 @@ import java.util.UUID;
@ToString(callSuper = true)
public class EdgeEvent extends BaseData {
+ private static final long serialVersionUID = 5548866356798094088L;
+
private long seqId;
private TenantId tenantId;
private EdgeId edgeId;
diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/id/UserCredentialsId.java b/common/data/src/main/java/org/thingsboard/server/common/data/id/UserCredentialsId.java
index 543ac1ba6f..d0a29695c0 100644
--- a/common/data/src/main/java/org/thingsboard/server/common/data/id/UserCredentialsId.java
+++ b/common/data/src/main/java/org/thingsboard/server/common/data/id/UserCredentialsId.java
@@ -15,11 +15,15 @@
*/
package org.thingsboard.server.common.data.id;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
import java.util.UUID;
public class UserCredentialsId extends UUIDBased {
- public UserCredentialsId(UUID id){
+ @JsonCreator
+ public UserCredentialsId(@JsonProperty("id")UUID id){
super(id);
}
}
diff --git a/common/edge-api/src/main/proto/edge.proto b/common/edge-api/src/main/proto/edge.proto
index 854ce29935..18b30e439f 100644
--- a/common/edge-api/src/main/proto/edge.proto
+++ b/common/edge-api/src/main/proto/edge.proto
@@ -139,25 +139,28 @@ message RuleChainUpdateMsg {
UpdateMsgType msgType = 1;
int64 idMSB = 2;
int64 idLSB = 3;
- string name = 4;
- optional int64 firstRuleNodeIdMSB = 5;
- optional int64 firstRuleNodeIdLSB = 6;
- bool root = 7;
- bool debugMode = 8;
- string configuration = 9;
+ string name = 4 [deprecated = true];
+ optional int64 firstRuleNodeIdMSB = 5 [deprecated = true];
+ optional int64 firstRuleNodeIdLSB = 6 [deprecated = true];
+ bool root = 7 [deprecated = true];
+ bool debugMode = 8 [deprecated = true];
+ string configuration = 9 [deprecated = true];
+ string entity = 10;
}
message RuleChainMetadataUpdateMsg {
UpdateMsgType msgType = 1;
- int64 ruleChainIdMSB = 2;
- int64 ruleChainIdLSB = 3;
- int32 firstNodeIndex = 4;
- repeated RuleNodeProto nodes = 5;
- repeated NodeConnectionInfoProto connections = 6;
- repeated RuleChainConnectionInfoProto ruleChainConnections = 7;
+ int64 ruleChainIdMSB = 2 [deprecated = true];
+ int64 ruleChainIdLSB = 3 [deprecated = true];
+ int32 firstNodeIndex = 4 [deprecated = true];
+ repeated RuleNodeProto nodes = 5 [deprecated = true];
+ repeated NodeConnectionInfoProto connections = 6 [deprecated = true];
+ repeated RuleChainConnectionInfoProto ruleChainConnections = 7 [deprecated = true];
+ string entity = 8;
}
message RuleNodeProto {
+ option deprecated = true;
int64 idMSB = 1;
int64 idLSB = 2;
string type = 3;
@@ -170,12 +173,14 @@ message RuleNodeProto {
}
message NodeConnectionInfoProto {
+ option deprecated = true;
int32 fromIndex = 1;
int32 toIndex = 2;
string type = 3;
}
message RuleChainConnectionInfoProto {
+ option deprecated = true;
int32 fromIndex = 1;
int64 targetRuleChainIdMSB = 2;
int64 targetRuleChainIdLSB = 3;
@@ -187,184 +192,196 @@ message DashboardUpdateMsg {
UpdateMsgType msgType = 1;
int64 idMSB = 2;
int64 idLSB = 3;
- optional int64 customerIdMSB = 4;
- optional int64 customerIdLSB = 5;
- string title = 6;
- string configuration = 7;
- optional string assignedCustomers = 8;
- optional string image = 9;
- optional int32 mobileOrder = 10;
- bool mobileHide = 11;
+ optional int64 customerIdMSB = 4 [deprecated = true];
+ optional int64 customerIdLSB = 5 [deprecated = true];
+ string title = 6 [deprecated = true];
+ string configuration = 7 [deprecated = true];
+ optional string assignedCustomers = 8 [deprecated = true];
+ optional string image = 9 [deprecated = true];
+ optional int32 mobileOrder = 10 [deprecated = true];
+ bool mobileHide = 11 [deprecated = true];
+ string entity = 12;
}
message DeviceUpdateMsg {
UpdateMsgType msgType = 1;
int64 idMSB = 2;
int64 idLSB = 3;
- optional int64 customerIdMSB = 4;
- optional int64 customerIdLSB = 5;
- optional int64 deviceProfileIdMSB = 6;
- optional int64 deviceProfileIdLSB = 7;
- string name = 8;
- string type = 9;
- optional string label = 10;
- optional string additionalInfo = 11;
+ optional int64 customerIdMSB = 4 [deprecated = true];
+ optional int64 customerIdLSB = 5 [deprecated = true];
+ optional int64 deviceProfileIdMSB = 6 [deprecated = true];
+ optional int64 deviceProfileIdLSB = 7 [deprecated = true];
+ string name = 8 [deprecated = true];
+ string type = 9 [deprecated = true];
+ optional string label = 10 [deprecated = true];
+ optional string additionalInfo = 11 [deprecated = true];
optional string conflictName = 12 [deprecated = true];
- optional int64 firmwareIdMSB = 13;
- optional int64 firmwareIdLSB = 14;
- optional bytes deviceDataBytes = 15;
- optional int64 softwareIdMSB = 16;
- optional int64 softwareIdLSB = 17;
+ optional int64 firmwareIdMSB = 13 [deprecated = true];
+ optional int64 firmwareIdLSB = 14 [deprecated = true];
+ optional bytes deviceDataBytes = 15 [deprecated = true];
+ optional int64 softwareIdMSB = 16 [deprecated = true];
+ optional int64 softwareIdLSB = 17 [deprecated = true];
+ string entity = 18;
}
message DeviceProfileUpdateMsg {
UpdateMsgType msgType = 1;
int64 idMSB = 2;
int64 idLSB = 3;
- string name = 4;
- optional string description = 5;
- bool default = 6;
- string type = 7;
- optional string transportType = 8;
- optional string provisionType = 9;
- int64 defaultRuleChainIdMSB = 10;
- int64 defaultRuleChainIdLSB = 11;
- string defaultQueueName = 12;
- bytes profileDataBytes = 13;
- optional string provisionDeviceKey = 14;
- optional bytes image = 15;
- optional int64 firmwareIdMSB = 16;
- optional int64 firmwareIdLSB = 17;
- optional int64 softwareIdMSB = 18;
- optional int64 softwareIdLSB = 19;
- optional int64 defaultDashboardIdMSB = 20;
- optional int64 defaultDashboardIdLSB = 21;
+ string name = 4 [deprecated = true];
+ optional string description = 5 [deprecated = true];
+ bool default = 6 [deprecated = true];
+ string type = 7 [deprecated = true];
+ optional string transportType = 8 [deprecated = true];
+ optional string provisionType = 9 [deprecated = true];
+ int64 defaultRuleChainIdMSB = 10 [deprecated = true];
+ int64 defaultRuleChainIdLSB = 11 [deprecated = true];
+ string defaultQueueName = 12 [deprecated = true];
+ bytes profileDataBytes = 13 [deprecated = true];
+ optional string provisionDeviceKey = 14 [deprecated = true];
+ optional bytes image = 15 [deprecated = true];
+ optional int64 firmwareIdMSB = 16 [deprecated = true];
+ optional int64 firmwareIdLSB = 17 [deprecated = true];
+ optional int64 softwareIdMSB = 18 [deprecated = true];
+ optional int64 softwareIdLSB = 19 [deprecated = true];
+ optional int64 defaultDashboardIdMSB = 20 [deprecated = true];
+ optional int64 defaultDashboardIdLSB = 21 [deprecated = true];
+ string entity = 22;
}
message AssetProfileUpdateMsg {
UpdateMsgType msgType = 1;
int64 idMSB = 2;
int64 idLSB = 3;
- string name = 4;
- optional string description = 5;
- bool default = 6;
- int64 defaultRuleChainIdMSB = 7;
- int64 defaultRuleChainIdLSB = 8;
- int64 defaultDashboardIdMSB = 9;
- int64 defaultDashboardIdLSB = 10;
- optional string defaultQueueName = 11;
- optional bytes image = 12;
+ string name = 4 [deprecated = true];
+ optional string description = 5 [deprecated = true];
+ bool default = 6 [deprecated = true];
+ int64 defaultRuleChainIdMSB = 7 [deprecated = true];
+ int64 defaultRuleChainIdLSB = 8 [deprecated = true];
+ int64 defaultDashboardIdMSB = 9 [deprecated = true];
+ int64 defaultDashboardIdLSB = 10 [deprecated = true];
+ optional string defaultQueueName = 11 [deprecated = true];
+ optional bytes image = 12 [deprecated = true];
+ string entity = 13;
}
message DeviceCredentialsUpdateMsg {
- int64 deviceIdMSB = 1;
- int64 deviceIdLSB = 2;
- string credentialsType = 3;
- string credentialsId = 4;
- optional string credentialsValue = 5;
+ int64 deviceIdMSB = 1 [deprecated = true];
+ int64 deviceIdLSB = 2 [deprecated = true];
+ string credentialsType = 3 [deprecated = true];
+ string credentialsId = 4 [deprecated = true];
+ optional string credentialsValue = 5 [deprecated = true];
+ string entity = 6;
}
message AssetUpdateMsg {
UpdateMsgType msgType = 1;
int64 idMSB = 2;
int64 idLSB = 3;
- optional int64 customerIdMSB = 4;
- optional int64 customerIdLSB = 5;
- string name = 6;
- string type = 7;
- optional string label = 8;
- optional string additionalInfo = 9;
- optional int64 assetProfileIdMSB = 10;
- optional int64 assetProfileIdLSB = 11;
+ optional int64 customerIdMSB = 4 [deprecated = true];
+ optional int64 customerIdLSB = 5 [deprecated = true];
+ string name = 6 [deprecated = true];
+ string type = 7 [deprecated = true];
+ optional string label = 8 [deprecated = true];
+ optional string additionalInfo = 9 [deprecated = true];
+ optional int64 assetProfileIdMSB = 10 [deprecated = true];
+ optional int64 assetProfileIdLSB = 11 [deprecated = true];
+ string entity = 12;
}
message EntityViewUpdateMsg {
UpdateMsgType msgType = 1;
int64 idMSB = 2;
int64 idLSB = 3;
- optional int64 customerIdMSB = 4;
- optional int64 customerIdLSB = 5;
- string name = 6;
- string type = 7;
- int64 entityIdMSB = 8;
- int64 entityIdLSB = 9;
- EdgeEntityType entityType = 10;
- optional string additionalInfo = 11;
+ optional int64 customerIdMSB = 4 [deprecated = true];
+ optional int64 customerIdLSB = 5 [deprecated = true];
+ string name = 6 [deprecated = true];
+ string type = 7 [deprecated = true];
+ int64 entityIdMSB = 8 [deprecated = true];
+ int64 entityIdLSB = 9 [deprecated = true];
+ EdgeEntityType entityType = 10 [deprecated = true];
+ optional string additionalInfo = 11 [deprecated = true];
+ string entity = 12;
}
message AlarmUpdateMsg {
UpdateMsgType msgType = 1;
int64 idMSB = 2;
int64 idLSB = 3;
- string name = 4;
- string type = 5;
- string originatorType = 6;
- string originatorName = 7;
- string severity = 8;
- string status = 9;
- int64 startTs = 10;
- int64 endTs = 11;
- int64 ackTs = 12;
- int64 clearTs = 13;
- string details = 14;
- bool propagate = 15;
- bool propagateToOwner = 16;
- bool propagateToTenant = 17;
+ string name = 4 [deprecated = true];
+ string type = 5 [deprecated = true];
+ string originatorType = 6 [deprecated = true];
+ string originatorName = 7 [deprecated = true];
+ string severity = 8 [deprecated = true];
+ string status = 9 [deprecated = true];
+ int64 startTs = 10 [deprecated = true];
+ int64 endTs = 11 [deprecated = true];
+ int64 ackTs = 12 [deprecated = true];
+ int64 clearTs = 13 [deprecated = true];
+ string details = 14 [deprecated = true];
+ bool propagate = 15 [deprecated = true];
+ bool propagateToOwner = 16 [deprecated = true];
+ bool propagateToTenant = 17 [deprecated = true];
+ string entity = 18;
}
message CustomerUpdateMsg {
UpdateMsgType msgType = 1;
int64 idMSB = 2;
int64 idLSB = 3;
- string title = 4;
- optional string country = 5;
- optional string state = 6;
- optional string city = 7;
- optional string address = 8;
- optional string address2 = 9;
- optional string zip = 10;
- optional string phone = 11;
- optional string email = 12;
- optional string additionalInfo = 13;
+ string title = 4 [deprecated = true];
+ optional string country = 5 [deprecated = true];
+ optional string state = 6 [deprecated = true];
+ optional string city = 7 [deprecated = true];
+ optional string address = 8 [deprecated = true];
+ optional string address2 = 9 [deprecated = true];
+ optional string zip = 10 [deprecated = true];
+ optional string phone = 11 [deprecated = true];
+ optional string email = 12 [deprecated = true];
+ optional string additionalInfo = 13 [deprecated = true];
+ string entity = 14;
}
message RelationUpdateMsg {
UpdateMsgType msgType = 1;
- int64 fromIdMSB = 2;
- int64 fromIdLSB = 3;
- string fromEntityType = 4;
- int64 toIdMSB = 5;
- int64 toIdLSB = 6;
- string toEntityType = 7;
- string type = 8;
- optional string typeGroup = 9;
- string additionalInfo = 10;
+ int64 fromIdMSB = 2 [deprecated = true];
+ int64 fromIdLSB = 3 [deprecated = true];
+ string fromEntityType = 4 [deprecated = true];
+ int64 toIdMSB = 5 [deprecated = true];
+ int64 toIdLSB = 6 [deprecated = true];
+ string toEntityType = 7 [deprecated = true];
+ string type = 8 [deprecated = true];
+ optional string typeGroup = 9 [deprecated = true];
+ string additionalInfo = 10 [deprecated = true];
+ string entity = 11;
}
message UserUpdateMsg {
UpdateMsgType msgType = 1;
int64 idMSB = 2;
int64 idLSB = 3;
- optional int64 customerIdMSB = 4;
- optional int64 customerIdLSB = 5;
- string email = 6;
- string authority = 7;
- optional string firstName = 8;
- optional string lastName = 9;
- optional string additionalInfo = 10;
+ optional int64 customerIdMSB = 4 [deprecated = true];
+ optional int64 customerIdLSB = 5 [deprecated = true];
+ string email = 6 [deprecated = true];
+ string authority = 7 [deprecated = true];
+ optional string firstName = 8 [deprecated = true];
+ optional string lastName = 9 [deprecated = true];
+ optional string additionalInfo = 10 [deprecated = true];
+ string entity = 11;
}
message WidgetsBundleUpdateMsg {
UpdateMsgType msgType = 1;
int64 idMSB = 2;
int64 idLSB = 3;
- string title = 4;
- string alias = 5;
- optional bytes image = 6;
- bool isSystem = 7;
- optional string description = 8;
+ string title = 4 [deprecated = true];
+ string alias = 5 [deprecated = true];
+ optional bytes image = 6 [deprecated = true];
+ bool isSystem = 7 [deprecated = true];
+ optional string description = 8 [deprecated = true];
optional string widgets = 9;
- optional int32 order = 10;
+ optional int32 order = 10 [deprecated = true];
+ string entity = 11;
}
message WidgetTypeUpdateMsg {
@@ -373,70 +390,76 @@ message WidgetTypeUpdateMsg {
int64 idLSB = 3;
optional string bundleAlias = 4 [deprecated = true];
optional string alias = 5 [deprecated = true];
- optional string name = 6;
- optional string descriptorJson = 7;
- bool isSystem = 8;
- optional string image = 9;
- optional string description = 10;
- optional string fqn = 11;
- bool deprecated = 12;
- repeated string tags = 13;
+ optional string name = 6 [deprecated = true];
+ optional string descriptorJson = 7 [deprecated = true];
+ bool isSystem = 8 [deprecated = true];
+ optional string image = 9 [deprecated = true];
+ optional string description = 10 [deprecated = true];
+ optional string fqn = 11 [deprecated = true];
+ bool deprecated = 12 [deprecated = true];
+ repeated string tags = 13 [deprecated = true];
+ string entity = 14;
}
message AdminSettingsUpdateMsg {
- bool isSystem = 1;
- string key = 2;
- string jsonValue = 3;
+ bool isSystem = 1 [deprecated = true];
+ string key = 2 [deprecated = true];
+ string jsonValue = 3 [deprecated = true];
+ string entity = 4;
}
message UserCredentialsUpdateMsg {
- int64 userIdMSB = 1;
- int64 userIdLSB = 2;
- bool enabled = 3;
- string password = 4;
+ int64 userIdMSB = 1 [deprecated = true];
+ int64 userIdLSB = 2 [deprecated = true];
+ bool enabled = 3 [deprecated = true];
+ string password = 4 [deprecated = true];
+ string entity = 5;
}
message TenantUpdateMsg {
UpdateMsgType msgType = 1;
- int64 idMSB = 2;
- int64 idLSB = 3;
- string title = 4;
- int64 profileIdMSB = 5;
- int64 profileIdLSB = 6;
- string region = 7;
- optional string country = 8;
- optional string state = 9;
- optional string city = 10;
- optional string address = 11;
- optional string address2 = 12;
- optional string zip = 13;
- optional string phone = 14;
- optional string email = 15;
- optional string additionalInfo = 16;
+ int64 idMSB = 2 [deprecated = true];
+ int64 idLSB = 3 [deprecated = true];
+ string title = 4 [deprecated = true];
+ int64 profileIdMSB = 5 [deprecated = true];
+ int64 profileIdLSB = 6 [deprecated = true];
+ string region = 7 [deprecated = true];
+ optional string country = 8 [deprecated = true];
+ optional string state = 9 [deprecated = true];
+ optional string city = 10 [deprecated = true];
+ optional string address = 11 [deprecated = true];
+ optional string address2 = 12 [deprecated = true];
+ optional string zip = 13 [deprecated = true];
+ optional string phone = 14 [deprecated = true];
+ optional string email = 15 [deprecated = true];
+ optional string additionalInfo = 16 [deprecated = true];
+ string entity = 17;
}
message TenantProfileUpdateMsg {
UpdateMsgType msgType = 1;
- int64 idMSB = 2;
- int64 idLSB = 3;
- string name = 4;
- optional string description = 5;
- bool default = 6;
- bool isolatedRuleChain = 7;
- bytes profileDataBytes = 8;
+ int64 idMSB = 2 [deprecated = true];
+ int64 idLSB = 3 [deprecated = true];
+ string name = 4 [deprecated = true];
+ optional string description = 5 [deprecated = true];
+ bool default = 6 [deprecated = true];
+ bool isolatedRuleChain = 7 [deprecated = true];
+ bytes profileDataBytes = 8 [deprecated = true];
+ string entity = 9;
}
message ResourceUpdateMsg {
UpdateMsgType msgType = 1;
int64 idMSB = 2;
int64 idLSB = 3;
- string title = 4;
- string resourceType = 5;
- string resourceKey = 6;
- string fileName = 7;
- optional string data = 8;
- optional string etag = 9;
- bool isSystem = 10;
+ string title = 4 [deprecated = true];
+ string resourceType = 5 [deprecated = true];
+ string resourceKey = 6 [deprecated = true];
+ string fileName = 7 [deprecated = true];
+ optional string data = 8 [deprecated = true];
+ optional string etag = 9 [deprecated = true];
+ bool isSystem = 10 [deprecated = true];
+ string entity = 11;
}
message RuleChainMetadataRequestMsg {
@@ -520,44 +543,48 @@ message OtaPackageUpdateMsg {
UpdateMsgType msgType = 1;
int64 idMSB = 2;
int64 idLSB = 3;
- int64 deviceProfileIdMSB = 4;
- int64 deviceProfileIdLSB = 5;
- string type = 6;
- string title = 7;
- string version = 8;
- string tag = 9;
- optional string url = 10;
- optional string fileName = 11;
- optional string contentType = 12;
- optional string checksumAlgorithm = 13;
- optional string checksum = 14;
- optional int64 dataSize = 15;
- optional bytes data = 16;
- optional string additionalInfo = 17;
+ int64 deviceProfileIdMSB = 4 [deprecated = true];
+ int64 deviceProfileIdLSB = 5 [deprecated = true];
+ string type = 6 [deprecated = true];
+ string title = 7 [deprecated = true];
+ string version = 8 [deprecated = true];
+ string tag = 9 [deprecated = true];
+ optional string url = 10 [deprecated = true];
+ optional string fileName = 11 [deprecated = true];
+ optional string contentType = 12 [deprecated = true];
+ optional string checksumAlgorithm = 13 [deprecated = true];
+ optional string checksum = 14 [deprecated = true];
+ optional int64 dataSize = 15 [deprecated = true];
+ optional bytes data = 16 [deprecated = true];
+ optional string additionalInfo = 17 [deprecated = true];
+ string entity = 18;
}
message QueueUpdateMsg {
UpdateMsgType msgType = 1;
int64 idMSB = 2;
int64 idLSB = 3;
- int64 tenantIdMSB = 4;
- int64 tenantIdLSB = 5;
- string name = 6;
- string topic = 7;
- int32 pollInterval = 8;
- int32 partitions = 9;
- bool consumerPerPartition = 10;
- int64 packProcessingTimeout = 11;
- SubmitStrategyProto submitStrategy = 12;
- ProcessingStrategyProto processingStrategy = 13;
+ int64 tenantIdMSB = 4 [deprecated = true];
+ int64 tenantIdLSB = 5 [deprecated = true];
+ string name = 6 [deprecated = true];
+ string topic = 7 [deprecated = true];
+ int32 pollInterval = 8 [deprecated = true];
+ int32 partitions = 9 [deprecated = true];
+ bool consumerPerPartition = 10 [deprecated = true];
+ int64 packProcessingTimeout = 11 [deprecated = true];
+ SubmitStrategyProto submitStrategy = 12 [deprecated = true];
+ ProcessingStrategyProto processingStrategy = 13 [deprecated = true];
+ string entity = 14;
}
message SubmitStrategyProto {
+ option deprecated = true;
string type = 1;
int32 batchSize = 2;
}
message ProcessingStrategyProto {
+ option deprecated = true;
string type = 1;
int32 retries = 2;
double failurePercentage = 3;
diff --git a/common/message/src/main/java/org/thingsboard/server/common/msg/MsgType.java b/common/message/src/main/java/org/thingsboard/server/common/msg/MsgType.java
index 0a39d8d51b..c3d3623d8e 100644
--- a/common/message/src/main/java/org/thingsboard/server/common/msg/MsgType.java
+++ b/common/message/src/main/java/org/thingsboard/server/common/msg/MsgType.java
@@ -93,6 +93,8 @@ public enum MsgType {
DEVICE_NAME_OR_TYPE_UPDATE_TO_DEVICE_ACTOR_MSG,
+ DEVICE_DELETE_TO_DEVICE_ACTOR_MSG,
+
DEVICE_EDGE_UPDATE_TO_DEVICE_ACTOR_MSG,
DEVICE_RPC_REQUEST_TO_DEVICE_ACTOR_MSG,
diff --git a/common/message/src/main/java/org/thingsboard/server/common/msg/rule/engine/DeviceDeleteMsg.java b/common/message/src/main/java/org/thingsboard/server/common/msg/rule/engine/DeviceDeleteMsg.java
new file mode 100644
index 0000000000..1bdab7409b
--- /dev/null
+++ b/common/message/src/main/java/org/thingsboard/server/common/msg/rule/engine/DeviceDeleteMsg.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright © 2016-2023 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.common.msg.rule.engine;
+
+import lombok.Data;
+import org.thingsboard.server.common.data.id.DeviceId;
+import org.thingsboard.server.common.data.id.TenantId;
+import org.thingsboard.server.common.msg.MsgType;
+import org.thingsboard.server.common.msg.ToDeviceActorNotificationMsg;
+
+@Data
+public class DeviceDeleteMsg implements ToDeviceActorNotificationMsg {
+
+ private static final long serialVersionUID = 4679029228395462172L;
+
+ private final TenantId tenantId;
+ private final DeviceId deviceId;
+
+ @Override
+ public MsgType getMsgType() {
+ return MsgType.DEVICE_DELETE_TO_DEVICE_ACTOR_MSG;
+ }
+}
diff --git a/common/pom.xml b/common/pom.xml
index b00b13db57..76387a1773 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -48,6 +48,7 @@
edge-api
version-control
script
+ proto
diff --git a/common/proto/pom.xml b/common/proto/pom.xml
new file mode 100644
index 0000000000..4ccf154ead
--- /dev/null
+++ b/common/proto/pom.xml
@@ -0,0 +1,94 @@
+
+
+ 4.0.0
+
+ org.thingsboard
+ 3.6.2-SNAPSHOT
+ common
+
+ org.thingsboard.common
+ proto
+ jar
+
+ Thingsboard Server Common Protobuf and gRPC structures
+ https://thingsboard.io
+
+
+ UTF-8
+ ${basedir}/../..
+
+
+
+
+ org.thingsboard.common
+ data
+
+
+ org.thingsboard.common
+ message
+
+
+ com.google.protobuf
+ protobuf-java
+
+
+ com.google.protobuf
+ protobuf-java-util
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ provided
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.junit.vintage
+ junit-vintage-engine
+ test
+
+
+ org.awaitility
+ awaitility
+ test
+
+
+
+
+
+
+ org.xolstice.maven.plugins
+ protobuf-maven-plugin
+
+
+
+
+
+
+ thingsboard-repo-deploy
+ ThingsBoard Repo Deployment
+ https://repo.thingsboard.io/artifactory/libs-release-public
+
+
+
+
\ No newline at end of file
diff --git a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/AdaptorException.java b/common/proto/src/main/java/org/thingsboard/server/common/adaptor/AdaptorException.java
similarity index 94%
rename from common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/AdaptorException.java
rename to common/proto/src/main/java/org/thingsboard/server/common/adaptor/AdaptorException.java
index 8b2908a4b5..1c22163c1f 100644
--- a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/AdaptorException.java
+++ b/common/proto/src/main/java/org/thingsboard/server/common/adaptor/AdaptorException.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.thingsboard.server.common.transport.adaptor;
+package org.thingsboard.server.common.adaptor;
public class AdaptorException extends Exception {
diff --git a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/JsonConverter.java b/common/proto/src/main/java/org/thingsboard/server/common/adaptor/JsonConverter.java
similarity index 99%
rename from common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/JsonConverter.java
rename to common/proto/src/main/java/org/thingsboard/server/common/adaptor/JsonConverter.java
index 51e74d5097..c51bc784a6 100644
--- a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/JsonConverter.java
+++ b/common/proto/src/main/java/org/thingsboard/server/common/adaptor/JsonConverter.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.thingsboard.server.common.transport.adaptor;
+package org.thingsboard.server.common.adaptor;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
diff --git a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/JsonConverterConfig.java b/common/proto/src/main/java/org/thingsboard/server/common/adaptor/JsonConverterConfig.java
similarity index 96%
rename from common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/JsonConverterConfig.java
rename to common/proto/src/main/java/org/thingsboard/server/common/adaptor/JsonConverterConfig.java
index 0a9df150e5..e160c051f5 100644
--- a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/JsonConverterConfig.java
+++ b/common/proto/src/main/java/org/thingsboard/server/common/adaptor/JsonConverterConfig.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.thingsboard.server.common.transport.adaptor;
+package org.thingsboard.server.common.adaptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
diff --git a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/ProtoConverter.java b/common/proto/src/main/java/org/thingsboard/server/common/adaptor/ProtoConverter.java
similarity index 99%
rename from common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/ProtoConverter.java
rename to common/proto/src/main/java/org/thingsboard/server/common/adaptor/ProtoConverter.java
index 54358709f0..098108c864 100644
--- a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/ProtoConverter.java
+++ b/common/proto/src/main/java/org/thingsboard/server/common/adaptor/ProtoConverter.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.thingsboard.server.common.transport.adaptor;
+package org.thingsboard.server.common.adaptor;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
diff --git a/application/src/main/java/org/thingsboard/server/service/queue/ProtoUtils.java b/common/proto/src/main/java/org/thingsboard/server/common/util/ProtoUtils.java
similarity index 95%
rename from application/src/main/java/org/thingsboard/server/service/queue/ProtoUtils.java
rename to common/proto/src/main/java/org/thingsboard/server/common/util/ProtoUtils.java
index 36038568bc..fd9e35b860 100644
--- a/application/src/main/java/org/thingsboard/server/service/queue/ProtoUtils.java
+++ b/common/proto/src/main/java/org/thingsboard/server/common/util/ProtoUtils.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.thingsboard.server.service.queue;
+package org.thingsboard.server.common.util;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.id.DeviceId;
@@ -46,6 +46,7 @@ import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest;
import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequestActorMsg;
import org.thingsboard.server.common.msg.rule.engine.DeviceAttributesEventNotificationMsg;
import org.thingsboard.server.common.msg.rule.engine.DeviceCredentialsUpdateNotificationMsg;
+import org.thingsboard.server.common.msg.rule.engine.DeviceDeleteMsg;
import org.thingsboard.server.common.msg.rule.engine.DeviceEdgeUpdateMsg;
import org.thingsboard.server.common.msg.rule.engine.DeviceNameOrTypeUpdateMsg;
import org.thingsboard.server.gen.transport.TransportProtos;
@@ -384,6 +385,21 @@ public class ProtoUtils {
);
}
+ private static TransportProtos.DeviceDeleteMsgProto toProto(DeviceDeleteMsg msg) {
+ return TransportProtos.DeviceDeleteMsgProto.newBuilder()
+ .setTenantIdMSB(msg.getTenantId().getId().getMostSignificantBits())
+ .setTenantIdLSB(msg.getTenantId().getId().getLeastSignificantBits())
+ .setDeviceIdMSB(msg.getDeviceId().getId().getMostSignificantBits())
+ .setDeviceIdLSB(msg.getDeviceId().getId().getLeastSignificantBits())
+ .build();
+ }
+
+ private static DeviceDeleteMsg fromProto(TransportProtos.DeviceDeleteMsgProto proto) {
+ return new DeviceDeleteMsg(
+ TenantId.fromUUID(new UUID(proto.getTenantIdMSB(), proto.getTenantIdLSB())),
+ new DeviceId(new UUID(proto.getDeviceIdMSB(), proto.getDeviceIdLSB())));
+ }
+
public static TransportProtos.ToDeviceActorNotificationMsgProto toProto(ToDeviceActorNotificationMsg msg) {
if (msg instanceof DeviceEdgeUpdateMsg) {
DeviceEdgeUpdateMsg updateMsg = (DeviceEdgeUpdateMsg) msg;
@@ -413,6 +429,10 @@ public class ProtoUtils {
RemoveRpcActorMsg updateMsg = (RemoveRpcActorMsg) msg;
TransportProtos.RemoveRpcActorMsgProto proto = toProto(updateMsg);
return TransportProtos.ToDeviceActorNotificationMsgProto.newBuilder().setRemoveRpcActorMsg(proto).build();
+ } else if (msg instanceof DeviceDeleteMsg) {
+ DeviceDeleteMsg updateMsg = (DeviceDeleteMsg) msg;
+ TransportProtos.DeviceDeleteMsgProto proto = toProto(updateMsg);
+ return TransportProtos.ToDeviceActorNotificationMsgProto.newBuilder().setDeviceDeleteMsg(proto).build();
}
return null;
}
@@ -432,6 +452,8 @@ public class ProtoUtils {
return fromProto(proto.getFromDeviceRpcResponseMsg());
} else if (proto.hasRemoveRpcActorMsg()) {
return fromProto(proto.getRemoveRpcActorMsg());
+ } else if (proto.hasDeviceDeleteMsg()) {
+ return fromProto(proto.getDeviceDeleteMsg());
}
return null;
}
diff --git a/common/cluster-api/src/main/proto/jsinvoke.proto b/common/proto/src/main/proto/jsinvoke.proto
similarity index 100%
rename from common/cluster-api/src/main/proto/jsinvoke.proto
rename to common/proto/src/main/proto/jsinvoke.proto
diff --git a/common/cluster-api/src/main/proto/queue.proto b/common/proto/src/main/proto/queue.proto
similarity index 99%
rename from common/cluster-api/src/main/proto/queue.proto
rename to common/proto/src/main/proto/queue.proto
index 0cb91faee0..ffae1048dd 100644
--- a/common/cluster-api/src/main/proto/queue.proto
+++ b/common/proto/src/main/proto/queue.proto
@@ -1010,6 +1010,13 @@ message RemoveRpcActorMsgProto {
int64 deviceIdLSB = 6;
}
+message DeviceDeleteMsgProto {
+ int64 tenantIdMSB = 1;
+ int64 tenantIdLSB = 2;
+ int64 deviceIdMSB = 3;
+ int64 deviceIdLSB = 4;
+}
+
message ToDeviceActorNotificationMsgProto {
DeviceEdgeUpdateMsgProto deviceEdgeUpdateMsg = 1;
DeviceNameOrTypeUpdateMsgProto deviceNameOrTypeMsg = 2;
@@ -1018,6 +1025,7 @@ message ToDeviceActorNotificationMsgProto {
ToDeviceRpcRequestActorMsgProto toDeviceRpcRequestMsg = 5;
FromDeviceRpcResponseActorMsgProto fromDeviceRpcResponseMsg = 6;
RemoveRpcActorMsgProto removeRpcActorMsg = 7;
+ DeviceDeleteMsgProto deviceDeleteMsg = 8;
}
/**
diff --git a/common/transport/transport-api/src/main/proto/transport.proto b/common/proto/src/main/proto/transport.proto
similarity index 100%
rename from common/transport/transport-api/src/main/proto/transport.proto
rename to common/proto/src/main/proto/transport.proto
diff --git a/common/transport/transport-api/src/test/java/JsonConverterTest.java b/common/proto/src/test/java/org/thingsboard/server/common/adaptor/JsonConverterTest.java
similarity index 98%
rename from common/transport/transport-api/src/test/java/JsonConverterTest.java
rename to common/proto/src/test/java/org/thingsboard/server/common/adaptor/JsonConverterTest.java
index 39ed04a29a..8c32677afb 100644
--- a/common/transport/transport-api/src/test/java/JsonConverterTest.java
+++ b/common/proto/src/test/java/org/thingsboard/server/common/adaptor/JsonConverterTest.java
@@ -13,13 +13,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+package org.thingsboard.server.common.adaptor;
+
import com.google.gson.JsonParser;
import com.google.gson.JsonSyntaxException;
import org.junit.Assert;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import org.thingsboard.server.common.transport.adaptor.JsonConverter;
import java.util.ArrayList;
diff --git a/application/src/test/java/org/thingsboard/server/service/queue/ProtoUtilsTest.java b/common/proto/src/test/java/org/thingsboard/server/common/util/ProtoUtilsTest.java
similarity index 99%
rename from application/src/test/java/org/thingsboard/server/service/queue/ProtoUtilsTest.java
rename to common/proto/src/test/java/org/thingsboard/server/common/util/ProtoUtilsTest.java
index 1a696b730d..a41b2be208 100644
--- a/application/src/test/java/org/thingsboard/server/service/queue/ProtoUtilsTest.java
+++ b/common/proto/src/test/java/org/thingsboard/server/common/util/ProtoUtilsTest.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.thingsboard.server.service.queue;
+package org.thingsboard.server.common.util;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/pubsub/TbPubSubConsumerTemplate.java b/common/queue/src/main/java/org/thingsboard/server/queue/pubsub/TbPubSubConsumerTemplate.java
index 97b7b47843..1a84b80cd2 100644
--- a/common/queue/src/main/java/org/thingsboard/server/queue/pubsub/TbPubSubConsumerTemplate.java
+++ b/common/queue/src/main/java/org/thingsboard/server/queue/pubsub/TbPubSubConsumerTemplate.java
@@ -17,6 +17,7 @@ package org.thingsboard.server.queue.pubsub;
import com.google.api.core.ApiFuture;
import com.google.api.core.ApiFutures;
+import com.google.api.gax.core.FixedExecutorProvider;
import com.google.cloud.pubsub.v1.stub.GrpcSubscriberStub;
import com.google.cloud.pubsub.v1.stub.SubscriberStub;
import com.google.cloud.pubsub.v1.stub.SubscriberStubSettings;
@@ -76,6 +77,7 @@ public class TbPubSubConsumerTemplate extends AbstractPara
SubscriberStubSettings.defaultGrpcTransportProviderBuilder()
.setMaxInboundMessageSize(pubSubSettings.getMaxMsgSize())
.build())
+ .setExecutorProvider(pubSubSettings.getExecutorProvider())
.build();
this.subscriber = GrpcSubscriberStub.create(subscriberStubSettings);
} catch (IOException e) {
diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/pubsub/TbPubSubProducerTemplate.java b/common/queue/src/main/java/org/thingsboard/server/queue/pubsub/TbPubSubProducerTemplate.java
index 0d84a8f839..3107855ab1 100644
--- a/common/queue/src/main/java/org/thingsboard/server/queue/pubsub/TbPubSubProducerTemplate.java
+++ b/common/queue/src/main/java/org/thingsboard/server/queue/pubsub/TbPubSubProducerTemplate.java
@@ -18,6 +18,7 @@ package org.thingsboard.server.queue.pubsub;
import com.google.api.core.ApiFuture;
import com.google.api.core.ApiFutureCallback;
import com.google.api.core.ApiFutures;
+import com.google.api.gax.core.FixedExecutorProvider;
import com.google.cloud.pubsub.v1.Publisher;
import com.google.gson.Gson;
import com.google.protobuf.ByteString;
@@ -120,7 +121,10 @@ public class TbPubSubProducerTemplate implements TbQueuePr
try {
admin.createTopicIfNotExists(topic);
ProjectTopicName topicName = ProjectTopicName.of(pubSubSettings.getProjectId(), topic);
- Publisher publisher = Publisher.newBuilder(topicName).setCredentialsProvider(pubSubSettings.getCredentialsProvider()).build();
+ Publisher publisher = Publisher.newBuilder(topicName)
+ .setCredentialsProvider(pubSubSettings.getCredentialsProvider())
+ .setExecutorProvider(pubSubSettings.getExecutorProvider())
+ .build();
publisherMap.put(topic, publisher);
return publisher;
} catch (IOException e) {
diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/pubsub/TbPubSubSettings.java b/common/queue/src/main/java/org/thingsboard/server/queue/pubsub/TbPubSubSettings.java
index fe9d85c306..145661fed1 100644
--- a/common/queue/src/main/java/org/thingsboard/server/queue/pubsub/TbPubSubSettings.java
+++ b/common/queue/src/main/java/org/thingsboard/server/queue/pubsub/TbPubSubSettings.java
@@ -17,16 +17,20 @@ package org.thingsboard.server.queue.pubsub;
import com.google.api.gax.core.CredentialsProvider;
import com.google.api.gax.core.FixedCredentialsProvider;
+import com.google.api.gax.core.FixedExecutorProvider;
import com.google.auth.oauth2.ServiceAccountCredentials;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.stereotype.Component;
+import org.thingsboard.common.util.ThingsBoardThreadFactory;
import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
import java.io.ByteArrayInputStream;
import java.io.IOException;
+import java.util.concurrent.Executors;
@Slf4j
@ConditionalOnExpression("'${queue.type:null}'=='pubsub'")
@@ -46,6 +50,16 @@ public class TbPubSubSettings {
@Value("${queue.pubsub.max_messages}")
private int maxMessages;
+ @Value("${queue.pubsub.executor_thread_pool_size:0}")
+ private int threadPoolSize;
+
+ /**
+ * Refers to com.google.cloud.pubsub.v1.Publisher default executor configuration
+ */
+ private static final int THREADS_PER_CPU = 5;
+
+ private FixedExecutorProvider executorProvider;
+
private CredentialsProvider credentialsProvider;
@PostConstruct
@@ -53,6 +67,17 @@ public class TbPubSubSettings {
ServiceAccountCredentials credentials = ServiceAccountCredentials.fromStream(
new ByteArrayInputStream(serviceAccount.getBytes()));
credentialsProvider = FixedCredentialsProvider.create(credentials);
+ if (threadPoolSize == 0) {
+ threadPoolSize = THREADS_PER_CPU * Runtime.getRuntime().availableProcessors();
+ }
+ executorProvider = FixedExecutorProvider
+ .create(Executors.newScheduledThreadPool(threadPoolSize, ThingsBoardThreadFactory.forName("pubsub-queue-executor")));
}
+ @PreDestroy
+ private void destroy() {
+ if (executorProvider != null) {
+ executorProvider.getExecutor().shutdownNow();
+ }
+ }
}
diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/util/ProtoWithFSTService.java b/common/queue/src/main/java/org/thingsboard/server/queue/util/ProtoWithFSTService.java
index b0d0b182e9..204502068c 100644
--- a/common/queue/src/main/java/org/thingsboard/server/queue/util/ProtoWithFSTService.java
+++ b/common/queue/src/main/java/org/thingsboard/server/queue/util/ProtoWithFSTService.java
@@ -17,8 +17,10 @@ package org.thingsboard.server.queue.util;
import lombok.extern.slf4j.Slf4j;
import org.nustaq.serialization.FSTConfiguration;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.FSTUtils;
+import org.thingsboard.server.common.data.FstStatsService;
import java.util.Optional;
@@ -26,12 +28,21 @@ import java.util.Optional;
@Service
public class ProtoWithFSTService implements DataDecodingEncodingService {
+ @Autowired
+ private FstStatsService fstStatsService;
+
public static final FSTConfiguration CONFIG = FSTConfiguration.createDefaultConfiguration();
@Override
public Optional decode(byte[] byteArray) {
try {
- return Optional.ofNullable(FSTUtils.decode(byteArray));
+ long startTime = System.nanoTime();
+ Optional optional = Optional.ofNullable(FSTUtils.decode(byteArray));
+ optional.ifPresent(obj -> {
+ fstStatsService.recordDecodeTime(obj.getClass(), startTime);
+ fstStatsService.incrementDecode(obj.getClass());
+ });
+ return optional;
} catch (IllegalArgumentException e) {
log.error("Error during deserialization message, [{}]", e.getMessage());
return Optional.empty();
@@ -41,7 +52,11 @@ public class ProtoWithFSTService implements DataDecodingEncodingService {
@Override
public byte[] encode(T msq) {
- return FSTUtils.encode(msq);
+ long startTime = System.nanoTime();
+ var bytes = FSTUtils.encode(msq);
+ fstStatsService.recordEncodeTime(msq.getClass(), startTime);
+ fstStatsService.incrementEncode(msq.getClass());
+ return bytes;
}
diff --git a/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbUtils.java b/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbUtils.java
index 31bd634221..4a3f2d306b 100644
--- a/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbUtils.java
+++ b/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbUtils.java
@@ -182,12 +182,12 @@ public class TbUtils {
return TbJson.parse(ctx, jsonStr);
}
- public static String bytesToString(List bytesList) {
+ public static String bytesToString(List> bytesList) {
byte[] bytes = bytesFromList(bytesList);
return new String(bytes);
}
- public static String bytesToString(List bytesList, String charsetName) throws UnsupportedEncodingException {
+ public static String bytesToString(List> bytesList, String charsetName) throws UnsupportedEncodingException {
byte[] bytes = bytesFromList(bytesList);
return new String(bytes, charsetName);
}
@@ -210,10 +210,20 @@ public class TbUtils {
}
}
- private static byte[] bytesFromList(List bytesList) {
+ private static byte[] bytesFromList(List> bytesList) {
byte[] bytes = new byte[bytesList.size()];
for (int i = 0; i < bytesList.size(); i++) {
- bytes[i] = bytesList.get(i);
+ Object objectVal = bytesList.get(i);
+ if (objectVal instanceof Integer) {
+ bytes[i] = isValidIntegerToByte((Integer) objectVal);
+ } else if (objectVal instanceof String) {
+ bytes[i] = isValidIntegerToByte(parseInt((String) objectVal));
+ } else if (objectVal instanceof Byte) {
+ bytes[i] = (byte) objectVal;
+ } else {
+ throw new NumberFormatException("The value '" + objectVal + "' could not be correctly converted to a byte. " +
+ "Must be a HexDecimal/String/Integer/Byte format !");
+ }
}
return bytes;
}
@@ -643,7 +653,7 @@ public class TbUtils {
}
}
- public static boolean isValidRadix(String value, int radix) {
+ private static boolean isValidRadix(String value, int radix) {
for (int i = 0; i < value.length(); i++) {
if (i == 0 && value.charAt(i) == '-') {
if (value.length() == 1)
@@ -657,4 +667,12 @@ public class TbUtils {
return true;
}
+ private static byte isValidIntegerToByte (Integer val) {
+ if (val > 255 || val.intValue() < -128) {
+ throw new NumberFormatException("The value '" + val + "' could not be correctly converted to a byte. " +
+ "Integer to byte conversion requires the use of only 8 bits (with a range of min/max = -128/255)!");
+ } else {
+ return val.byteValue();
+ }
+ }
}
diff --git a/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbUtilsTest.java b/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbUtilsTest.java
index d2900d6ec4..7d5ae00dcf 100644
--- a/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbUtilsTest.java
+++ b/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbUtilsTest.java
@@ -31,6 +31,7 @@ import java.io.IOException;
import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Calendar;
import java.util.List;
import java.util.Random;
@@ -385,6 +386,95 @@ public class TbUtilsTest {
Assert.assertThrows(IllegalAccessException.class, () -> TbUtils.stringToBytes(ctx, ((ExecutionHashMap) finalInputJson).get("hello"), "UTF-8"));
}
+ @Test
+ public void bytesFromList() {
+ byte[] arrayBytes = {(byte)0x00, (byte)0x08, (byte)0x10, (byte)0x1C, (byte)0xFF, (byte)0xFC, (byte)0xAD, (byte)0x88, (byte)0x75, (byte)0x74, (byte)0x8A, (byte)0x82};
+ Object[] arrayMix = { "0x00", 8, "16", "0x1C", 255, (byte)0xFC, 173, 136, 117, 116, -118, "-126"};
+
+ String expected = new String(arrayBytes);
+ ArrayList listBytes = new ArrayList<>(arrayBytes.length);
+ for (Byte element : arrayBytes) {
+ listBytes.add(element);
+ }
+ Assert.assertEquals(expected, TbUtils.bytesToString(listBytes));
+
+ ArrayList
+
+ org.thingsboard.common
+ proto
+ ${project.version}
+
org.thingsboard.common
cache
diff --git a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java b/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java
index e645110a9d..40ed2c378a 100644
--- a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java
+++ b/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java
@@ -16,6 +16,7 @@
package org.thingsboard.rule.engine.api;
import io.netty.channel.EventLoopGroup;
+import org.thingsboard.common.util.ExecutorProvider;
import org.thingsboard.common.util.ListeningExecutor;
import org.thingsboard.rule.engine.api.slack.SlackService;
import org.thingsboard.rule.engine.api.sms.SmsSenderFactory;
@@ -318,6 +319,8 @@ public interface TbContext {
ListeningExecutor getNotificationExecutor();
+ ExecutorProvider getPubSubRuleNodeExecutorProvider();
+
MailService getMailService(boolean isSystem);
SmsService getSmsService();
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCopyAttributesToEntityViewNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCopyAttributesToEntityViewNode.java
index c103dd4006..af4c7bc0c2 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCopyAttributesToEntityViewNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCopyAttributesToEntityViewNode.java
@@ -36,7 +36,7 @@ import org.thingsboard.server.common.data.objects.AttributesEntityView;
import org.thingsboard.server.common.data.plugin.ComponentType;
import org.thingsboard.server.common.data.util.CollectionsUtil;
import org.thingsboard.server.common.msg.TbMsg;
-import org.thingsboard.server.common.transport.adaptor.JsonConverter;
+import org.thingsboard.server.common.adaptor.JsonConverter;
import javax.annotation.Nullable;
import java.util.ArrayList;
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/gcp/pubsub/TbPubSubNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/gcp/pubsub/TbPubSubNode.java
index c55113783c..3067947445 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/gcp/pubsub/TbPubSubNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/gcp/pubsub/TbPubSubNode.java
@@ -20,6 +20,7 @@ import com.google.api.core.ApiFutureCallback;
import com.google.api.core.ApiFutures;
import com.google.api.gax.core.CredentialsProvider;
import com.google.api.gax.core.FixedCredentialsProvider;
+import com.google.api.gax.core.FixedExecutorProvider;
import com.google.api.gax.retrying.RetrySettings;
import com.google.auth.oauth2.ServiceAccountCredentials;
import com.google.cloud.pubsub.v1.Publisher;
@@ -68,7 +69,7 @@ public class TbPubSubNode extends TbAbstractExternalNode {
super.init(ctx);
this.config = TbNodeUtils.convert(configuration, TbPubSubNodeConfiguration.class);
try {
- this.pubSubClient = initPubSubClient();
+ this.pubSubClient = initPubSubClient(ctx);
} catch (Exception e) {
throw new TbNodeException(e);
}
@@ -128,7 +129,7 @@ public class TbPubSubNode extends TbAbstractExternalNode {
return TbMsg.transformMsgMetadata(origMsg, metaData);
}
- private Publisher initPubSubClient() throws IOException {
+ private Publisher initPubSubClient(TbContext ctx) throws IOException {
ProjectTopicName topicName = ProjectTopicName.of(config.getProjectId(), config.getTopicName());
ServiceAccountCredentials credentials =
ServiceAccountCredentials.fromStream(
@@ -148,6 +149,7 @@ public class TbPubSubNode extends TbAbstractExternalNode {
return Publisher.newBuilder(topicName)
.setCredentialsProvider(credProvider)
.setRetrySettings(retrySettings)
+ .setExecutorProvider(FixedExecutorProvider.create(ctx.getPubSubRuleNodeExecutorProvider().getExecutor()))
.build();
}
}
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/AlarmRuleState.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/AlarmRuleState.java
index f31896a8c9..6bb37438a1 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/AlarmRuleState.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/AlarmRuleState.java
@@ -41,7 +41,7 @@ import org.thingsboard.server.common.data.query.KeyFilterPredicate;
import org.thingsboard.server.common.data.query.NumericFilterPredicate;
import org.thingsboard.server.common.data.query.StringFilterPredicate;
import org.thingsboard.server.common.msg.tools.SchedulerUtils;
-import org.thingsboard.server.common.transport.adaptor.JsonConverter;
+import org.thingsboard.server.common.adaptor.JsonConverter;
import java.time.Instant;
import java.time.ZoneId;
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/DeviceState.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/DeviceState.java
index 2aeb4eedf5..b38fd29af7 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/DeviceState.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/DeviceState.java
@@ -40,7 +40,7 @@ import org.thingsboard.server.common.data.query.EntityKey;
import org.thingsboard.server.common.data.query.EntityKeyType;
import org.thingsboard.server.common.data.rule.RuleNodeState;
import org.thingsboard.server.common.msg.TbMsg;
-import org.thingsboard.server.common.transport.adaptor.JsonConverter;
+import org.thingsboard.server.common.adaptor.JsonConverter;
import org.thingsboard.server.dao.sql.query.EntityKeyMapping;
import java.util.ArrayList;
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/telemetry/TbMsgAttributesNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/telemetry/TbMsgAttributesNode.java
index 9bbee45477..06498241fb 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/telemetry/TbMsgAttributesNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/telemetry/TbMsgAttributesNode.java
@@ -34,7 +34,7 @@ import org.thingsboard.server.common.data.kv.KvEntry;
import org.thingsboard.server.common.data.plugin.ComponentType;
import org.thingsboard.server.common.data.util.TbPair;
import org.thingsboard.server.common.msg.TbMsg;
-import org.thingsboard.server.common.transport.adaptor.JsonConverter;
+import org.thingsboard.server.common.adaptor.JsonConverter;
import java.util.ArrayList;
import java.util.List;
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/telemetry/TbMsgTimeseriesNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/telemetry/TbMsgTimeseriesNode.java
index 799089d4a8..8762839c07 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/telemetry/TbMsgTimeseriesNode.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/telemetry/TbMsgTimeseriesNode.java
@@ -31,7 +31,7 @@ import org.thingsboard.server.common.data.kv.TsKvEntry;
import org.thingsboard.server.common.data.plugin.ComponentType;
import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration;
import org.thingsboard.server.common.msg.TbMsg;
-import org.thingsboard.server.common.transport.adaptor.JsonConverter;
+import org.thingsboard.server.common.adaptor.JsonConverter;
import java.util.ArrayList;
import java.util.List;
diff --git a/transport/coap/src/main/resources/tb-coap-transport.yml b/transport/coap/src/main/resources/tb-coap-transport.yml
index 959b3285de..a45b41803e 100644
--- a/transport/coap/src/main/resources/tb-coap-transport.yml
+++ b/transport/coap/src/main/resources/tb-coap-transport.yml
@@ -299,6 +299,8 @@ queue:
max_msg_size: "${TB_QUEUE_PUBSUB_MAX_MSG_SIZE:1048576}"
# Number of messages per consumer
max_messages: "${TB_QUEUE_PUBSUB_MAX_MESSAGES:1000}"
+ # Thread pool size for pubsub queue executor provider. If not set - default pubsub executor provider value will be used (5 * number of available processors)
+ executor_thread_pool_size: "${TB_QUEUE_PUBSUB_EXECUTOR_THREAD_POOL_SIZE:0}"
queue-properties:
# Pub/Sub properties for Rule Engine subscribers, messages which will commit after ackDeadlineInSec period can be consumed again
rule-engine: "${TB_QUEUE_PUBSUB_RE_QUEUE_PROPERTIES:ackDeadlineInSec:30;messageRetentionInSec:604800}"
diff --git a/transport/http/src/main/resources/tb-http-transport.yml b/transport/http/src/main/resources/tb-http-transport.yml
index 7edaa640a1..81fdf414bb 100644
--- a/transport/http/src/main/resources/tb-http-transport.yml
+++ b/transport/http/src/main/resources/tb-http-transport.yml
@@ -282,6 +282,8 @@ queue:
max_msg_size: "${TB_QUEUE_PUBSUB_MAX_MSG_SIZE:1048576}"
# Number of messages per a consumer
max_messages: "${TB_QUEUE_PUBSUB_MAX_MESSAGES:1000}"
+ # Thread pool size for pubsub queue executor provider. If not set - default pubsub executor provider value will be used (5 * number of available processors)
+ executor_thread_pool_size: "${TB_QUEUE_PUBSUB_EXECUTOR_THREAD_POOL_SIZE:0}"
queue-properties:
# Pub/Sub properties for Rule Engine subscribers, messages which will commit after ackDeadlineInSec period can be consume again
rule-engine: "${TB_QUEUE_PUBSUB_RE_QUEUE_PROPERTIES:ackDeadlineInSec:30;messageRetentionInSec:604800}"
diff --git a/transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml b/transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml
index cebc0425d5..f68f158dc1 100644
--- a/transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml
+++ b/transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml
@@ -378,6 +378,8 @@ queue:
max_msg_size: "${TB_QUEUE_PUBSUB_MAX_MSG_SIZE:1048576}"
# Number of messages per consumer
max_messages: "${TB_QUEUE_PUBSUB_MAX_MESSAGES:1000}"
+ # Thread pool size for pubsub queue executor provider. If not set - default pubsub executor provider value will be used (5 * number of available processors)
+ executor_thread_pool_size: "${TB_QUEUE_PUBSUB_EXECUTOR_THREAD_POOL_SIZE:0}"
queue-properties:
# Pub/Sub properties for Rule Engine subscribers, messages which will commit after ackDeadlineInSec period can be consumed again
rule-engine: "${TB_QUEUE_PUBSUB_RE_QUEUE_PROPERTIES:ackDeadlineInSec:30;messageRetentionInSec:604800}"
diff --git a/transport/mqtt/src/main/resources/tb-mqtt-transport.yml b/transport/mqtt/src/main/resources/tb-mqtt-transport.yml
index 330473a624..16c2c019df 100644
--- a/transport/mqtt/src/main/resources/tb-mqtt-transport.yml
+++ b/transport/mqtt/src/main/resources/tb-mqtt-transport.yml
@@ -315,6 +315,8 @@ queue:
max_msg_size: "${TB_QUEUE_PUBSUB_MAX_MSG_SIZE:1048576}"
# Number of messages per consumer
max_messages: "${TB_QUEUE_PUBSUB_MAX_MESSAGES:1000}"
+ # Thread pool size for pubsub queue executor provider. If not set - default pubsub executor provider value will be used (5 * number of available processors)
+ executor_thread_pool_size: "${TB_QUEUE_PUBSUB_EXECUTOR_THREAD_POOL_SIZE:0}"
queue-properties:
# Pub/Sub properties for Rule Engine subscribers, messages which will commit after ackDeadlineInSec period can be consumed again
rule-engine: "${TB_QUEUE_PUBSUB_RE_QUEUE_PROPERTIES:ackDeadlineInSec:30;messageRetentionInSec:604800}"
diff --git a/transport/snmp/src/main/resources/tb-snmp-transport.yml b/transport/snmp/src/main/resources/tb-snmp-transport.yml
index ca13212293..2b6cc17d9b 100644
--- a/transport/snmp/src/main/resources/tb-snmp-transport.yml
+++ b/transport/snmp/src/main/resources/tb-snmp-transport.yml
@@ -268,6 +268,8 @@ queue:
max_msg_size: "${TB_QUEUE_PUBSUB_MAX_MSG_SIZE:1048576}"
# Number of messages per consumer
max_messages: "${TB_QUEUE_PUBSUB_MAX_MESSAGES:1000}"
+ # Thread pool size for pubsub queue executor provider. If not set - default pubsub executor provider value will be used (5 * number of available processors)
+ executor_thread_pool_size: "${TB_QUEUE_PUBSUB_EXECUTOR_THREAD_POOL_SIZE:0}"
queue-properties:
# Pub/Sub properties for Rule Engine subscribers, messages which will commit after ackDeadlineInSec period can be consumed again
rule-engine: "${TB_QUEUE_PUBSUB_RE_QUEUE_PROPERTIES:ackDeadlineInSec:30;messageRetentionInSec:604800}"