Commit b978f0f7abe01dbb7fa79e301cab735029242f07

Authored by Andrew Shvayka
Committed by GitHub
2 parents 1f00ae83 4776e3b6

Merge pull request #4672 from thingsboard/merge-issue-fix

Merge issue fix
Showing 79 changed files with 1044 additions and 935 deletions

Too many changes to show.

To preserve performance only 79 of 130 files are displayed.

1 1 {
2 2 "title": "Firmware",
  3 + "image": null,
3 4 "configuration": {
4 5 "description": "",
5 6 "widgets": {
... ... @@ -247,7 +248,7 @@
247 248 "name": "Edit firmware",
248 249 "icon": "edit",
249 250 "type": "customPretty",
250   - "customHtml": "<form #editEntityForm=\"ngForm\" [formGroup]=\"editEntityFormGroup\"\n (ngSubmit)=\"save()\" class=\"edit-entity-form\">\n <mat-toolbar fxLayout=\"row\" color=\"primary\">\n <h2>Edit firmware {{entityName}}</h2>\n <span fxFlex></span>\n <button mat-icon-button (click)=\"cancel()\" type=\"button\">\n <mat-icon class=\"material-icons\">close</mat-icon>\n </button>\n </mat-toolbar>\n <mat-progress-bar color=\"warn\" mode=\"indeterminate\" *ngIf=\"isLoading$ | async\">\n </mat-progress-bar>\n <div style=\"height: 4px;\" *ngIf=\"!(isLoading$ | async)\"></div>\n <div *ngIf=\"entity.deviceProfileId\" mat-dialog-content fxLayout=\"column\">\n <tb-firmware-autocomplete\n [useFullEntityId]=\"true\"\n [deviceProfileId]=\"entity.deviceProfileId.id\"\n formControlName=\"firmwareId\">\n </tb-firmware-autocomplete>\n </div>\n <div mat-dialog-actions fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-button color=\"primary\"\n type=\"button\"\n [disabled]=\"(isLoading$ | async)\"\n (click)=\"cancel()\" cdkFocusInitial>\n Cancel\n </button>\n <button mat-button mat-raised-button color=\"primary\"\n type=\"submit\"\n [disabled]=\"(isLoading$ | async) || editEntityForm.invalid || !editEntityForm.dirty\">\n Save\n </button>\n </div>\n</form>",
  251 + "customHtml": "<form #editEntityForm=\"ngForm\" [formGroup]=\"editEntityFormGroup\"\n (ngSubmit)=\"save()\" class=\"edit-entity-form\">\n <mat-toolbar fxLayout=\"row\" color=\"primary\">\n <h2>Edit firmware {{entityName}}</h2>\n <span fxFlex></span>\n <button mat-icon-button (click)=\"cancel()\" type=\"button\">\n <mat-icon class=\"material-icons\">close</mat-icon>\n </button>\n </mat-toolbar>\n <mat-progress-bar color=\"warn\" mode=\"indeterminate\" *ngIf=\"isLoading$ | async\">\n </mat-progress-bar>\n <div style=\"height: 4px;\" *ngIf=\"!(isLoading$ | async)\"></div>\n <div *ngIf=\"entity.deviceProfileId\" mat-dialog-content fxLayout=\"column\">\n <tb-ota-package-autocomplete\n [useFullEntityId]=\"true\"\n [deviceProfileId]=\"entity.deviceProfileId.id\"\n formControlName=\"firmwareId\">\n </tb-ota-package-autocomplete>\n </div>\n <div mat-dialog-actions fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-button color=\"primary\"\n type=\"button\"\n [disabled]=\"(isLoading$ | async)\"\n (click)=\"cancel()\" cdkFocusInitial>\n Cancel\n </button>\n <button mat-button mat-raised-button color=\"primary\"\n type=\"submit\"\n [disabled]=\"(isLoading$ | async) || editEntityForm.invalid || !editEntityForm.dirty\">\n Save\n </button>\n </div>\n</form>",
251 252 "customCss": "",
252 253 "customFunction": "let $injector = widgetContext.$scope.$injector;\nlet customDialog = $injector.get(widgetContext.servicesMap.get('customDialog'));\nlet entityService = $injector.get(widgetContext.servicesMap.get('entityService'));\nlet deviceService = $injector.get(widgetContext.servicesMap.get('deviceService'));\n\nopenEditEntityDialog();\n\nfunction openEditEntityDialog() {\n customDialog.customDialog(htmlTemplate, EditEntityDialogController).subscribe();\n}\n\nfunction EditEntityDialogController(instance) {\n let vm = instance;\n\n vm.entityName = entityName;\n vm.entity = {};\n\n vm.editEntityFormGroup = vm.fb.group({\n firmwareId: [null]\n });\n\n getEntityInfo();\n\n vm.cancel = function() {\n vm.dialogRef.close(null);\n };\n\n vm.save = function() {\n vm.editEntityFormGroup.markAsPristine();\n saveEntity().subscribe(\n function () {\n // widgetContext.updateAliases();\n vm.dialogRef.close(null);\n }\n );\n };\n\n\n function getEntityInfo() {\n entityService.getEntity(entityId.entityType, entityId.id).subscribe(\n function (data) {\n vm.entity = data;\n vm.editEntityFormGroup.patchValue({\n firmwareId: vm.entity.firmwareId\n }, {emitEvent: false});\n }\n );\n }\n\n function saveEntity() {\n const formValues = vm.editEntityFormGroup.value;\n vm.entity.firmwareId = formValues.firmwareId;\n return deviceService.saveDevice(vm.entity);\n }\n}",
253 254 "customResources": [],
... ... @@ -257,7 +258,7 @@
257 258 "name": "Download firware",
258 259 "icon": "file_download",
259 260 "type": "custom",
260   - "customFunction": "let $injector = widgetContext.$scope.$injector;\nlet entityService = $injector.get(widgetContext.servicesMap.get('entityService'));\nlet firmwareService = $injector.get(widgetContext.servicesMap.get('firmwareService'));\nlet deviceProfileService = $injector.get(widgetContext.servicesMap.get('deviceProfileService'));\n\ngetDeviceFirmware();\n\nfunction getDeviceFirmware() {\n entityService.getEntity(entityId.entityType, entityId.id).subscribe(\n function (data) {\n if (data.firmwareId !== null) {\n firmwareService.downloadFirmware(data.firmwareId.id).subscribe(); \n } else {\n deviceProfileService.getDeviceProfile(data.deviceProfileId.id).subscribe(\n function (deviceProfile) {\n if (deviceProfile.firmwareId !== null) {\n firmwareService.downloadFirmware(deviceProfile.firmwareId.id).subscribe();\n } else {\n widgetContext.showToast('warn', 'Device ' + entityName +' has not firmware set.', 2000, 'top');\n\n }\n });\n }\n }\n );\n}",
  261 + "customFunction": "let $injector = widgetContext.$scope.$injector;\nlet entityService = $injector.get(widgetContext.servicesMap.get('entityService'));\nlet otaPackageService = $injector.get(widgetContext.servicesMap.get('otaPackageService'));\nlet deviceProfileService = $injector.get(widgetContext.servicesMap.get('deviceProfileService'));\n\ngetDeviceFirmware();\n\nfunction getDeviceFirmware() {\n entityService.getEntity(entityId.entityType, entityId.id).subscribe(\n function (data) {\n if (data.firmwareId !== null) {\n otaPackageService.downloadOtaPackage(data.firmwareId.id).subscribe(); \n } else {\n deviceProfileService.getDeviceProfile(data.deviceProfileId.id).subscribe(\n function (deviceProfile) {\n if (deviceProfile.firmwareId !== null) {\n otaPackageService.downloadOtaPackage(deviceProfile.firmwareId.id).subscribe();\n } else {\n widgetContext.showToast('warn', 'Device ' + entityName +' has not firmware set.', 2000, 'top');\n\n }\n });\n }\n }\n );\n}",
261 262 "id": "12533058-42f6-e75f-620c-219c48d01ec0"
262 263 },
263 264 {
... ... @@ -1021,7 +1022,7 @@
1021 1022 "name": "Edit firmware",
1022 1023 "icon": "edit",
1023 1024 "type": "customPretty",
1024   - "customHtml": "<form #editEntityForm=\"ngForm\" [formGroup]=\"editEntityFormGroup\"\n (ngSubmit)=\"save()\" class=\"edit-entity-form\">\n <mat-toolbar fxLayout=\"row\" color=\"primary\">\n <h2>Edit firmware {{entityName}}</h2>\n <span fxFlex></span>\n <button mat-icon-button (click)=\"cancel()\" type=\"button\">\n <mat-icon class=\"material-icons\">close</mat-icon>\n </button>\n </mat-toolbar>\n <mat-progress-bar color=\"warn\" mode=\"indeterminate\" *ngIf=\"isLoading$ | async\">\n </mat-progress-bar>\n <div style=\"height: 4px;\" *ngIf=\"!(isLoading$ | async)\"></div>\n <div mat-dialog-content fxLayout=\"column\">\n <tb-firmware-autocomplete\n [useFullEntityId]=\"true\"\n formControlName=\"firmwareId\">\n </tb-firmware-autocomplete>\n </div>\n <div mat-dialog-actions fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-button color=\"primary\"\n type=\"button\"\n [disabled]=\"(isLoading$ | async)\"\n (click)=\"cancel()\" cdkFocusInitial>\n Cancel\n </button>\n <button mat-button mat-raised-button color=\"primary\"\n type=\"submit\"\n [disabled]=\"(isLoading$ | async) || editEntityForm.invalid || !editEntityForm.dirty\">\n Save\n </button>\n </div>\n</form>",
  1025 + "customHtml": "<form #editEntityForm=\"ngForm\" [formGroup]=\"editEntityFormGroup\"\n (ngSubmit)=\"save()\" class=\"edit-entity-form\">\n <mat-toolbar fxLayout=\"row\" color=\"primary\">\n <h2>Edit firmware {{entityName}}</h2>\n <span fxFlex></span>\n <button mat-icon-button (click)=\"cancel()\" type=\"button\">\n <mat-icon class=\"material-icons\">close</mat-icon>\n </button>\n </mat-toolbar>\n <mat-progress-bar color=\"warn\" mode=\"indeterminate\" *ngIf=\"isLoading$ | async\">\n </mat-progress-bar>\n <div style=\"height: 4px;\" *ngIf=\"!(isLoading$ | async)\"></div>\n <div *ngIf=\"entity.deviceProfileId\" mat-dialog-content fxLayout=\"column\">\n <tb-ota-package-autocomplete\n [useFullEntityId]=\"true\"\n [deviceProfileId]=\"entity.deviceProfileId.id\"\n formControlName=\"firmwareId\">\n </tb-ota-package-autocomplete>\n </div>\n <div mat-dialog-actions fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-button color=\"primary\"\n type=\"button\"\n [disabled]=\"(isLoading$ | async)\"\n (click)=\"cancel()\" cdkFocusInitial>\n Cancel\n </button>\n <button mat-button mat-raised-button color=\"primary\"\n type=\"submit\"\n [disabled]=\"(isLoading$ | async) || editEntityForm.invalid || !editEntityForm.dirty\">\n Save\n </button>\n </div>\n</form>",
1025 1026 "customCss": "",
1026 1027 "customFunction": "let $injector = widgetContext.$scope.$injector;\nlet customDialog = $injector.get(widgetContext.servicesMap.get('customDialog'));\nlet entityService = $injector.get(widgetContext.servicesMap.get('entityService'));\nlet deviceService = $injector.get(widgetContext.servicesMap.get('deviceService'));\n\nopenEditEntityDialog();\n\nfunction openEditEntityDialog() {\n customDialog.customDialog(htmlTemplate, EditEntityDialogController).subscribe();\n}\n\nfunction EditEntityDialogController(instance) {\n let vm = instance;\n\n vm.entityName = entityName;\n vm.entity = {};\n\n vm.editEntityFormGroup = vm.fb.group({\n firmwareId: [null]\n });\n\n getEntityInfo();\n\n vm.cancel = function() {\n vm.dialogRef.close(null);\n };\n\n vm.save = function() {\n vm.editEntityFormGroup.markAsPristine();\n saveEntity().subscribe(\n function () {\n // widgetContext.updateAliases();\n vm.dialogRef.close(null);\n }\n );\n };\n\n\n function getEntityInfo() {\n entityService.getEntity(entityId.entityType, entityId.id).subscribe(\n function (data) {\n vm.entity = data;\n vm.editEntityFormGroup.patchValue({\n firmwareId: vm.entity.firmwareId\n }, {emitEvent: false});\n }\n );\n }\n\n function saveEntity() {\n const formValues = vm.editEntityFormGroup.value;\n vm.entity.firmwareId = formValues.firmwareId;\n return deviceService.saveDevice(vm.entity);\n }\n}",
1027 1028 "customResources": [],
... ... @@ -1031,7 +1032,7 @@
1031 1032 "name": "Download firware",
1032 1033 "icon": "file_download",
1033 1034 "type": "custom",
1034   - "customFunction": "let $injector = widgetContext.$scope.$injector;\nlet entityService = $injector.get(widgetContext.servicesMap.get('entityService'));\nlet firmwareService = $injector.get(widgetContext.servicesMap.get('firmwareService'));\nlet deviceProfileService = $injector.get(widgetContext.servicesMap.get('deviceProfileService'));\n\ngetDeviceFirmware();\n\nfunction getDeviceFirmware() {\n entityService.getEntity(entityId.entityType, entityId.id).subscribe(\n function (data) {\n if (data.firmwareId !== null) {\n firmwareService.downloadFirmware(data.firmwareId.id).subscribe(); \n } else {\n deviceProfileService.getDeviceProfile(data.deviceProfileId.id).subscribe(\n function (deviceProfile) {\n if (deviceProfile.firmwareId !== null) {\n firmwareService.downloadFirmware(deviceProfile.firmwareId.id).subscribe();\n } else {\n widgetContext.showToast('warn', 'Device ' + entityName +' has not firmware set.', 2000, 'top');\n\n }\n });\n }\n }\n );\n}",
  1035 + "customFunction": "let $injector = widgetContext.$scope.$injector;\nlet entityService = $injector.get(widgetContext.servicesMap.get('entityService'));\nlet otaPackageService = $injector.get(widgetContext.servicesMap.get('otaPackageService'));\nlet deviceProfileService = $injector.get(widgetContext.servicesMap.get('deviceProfileService'));\n\ngetDeviceFirmware();\n\nfunction getDeviceFirmware() {\n entityService.getEntity(entityId.entityType, entityId.id).subscribe(\n function (data) {\n if (data.firmwareId !== null) {\n otaPackageService.downloadOtaPackage(data.firmwareId.id).subscribe(); \n } else {\n deviceProfileService.getDeviceProfile(data.deviceProfileId.id).subscribe(\n function (deviceProfile) {\n if (deviceProfile.firmwareId !== null) {\n otaPackageService.downloadOtaPackage(deviceProfile.firmwareId.id).subscribe();\n } else {\n widgetContext.showToast('warn', 'Device ' + entityName +' has not firmware set.', 2000, 'top');\n\n }\n });\n }\n }\n );\n}",
1035 1036 "id": "12533058-42f6-e75f-620c-219c48d01ec0"
1036 1037 },
1037 1038 {
... ... @@ -1297,7 +1298,7 @@
1297 1298 "name": "Edit firmware",
1298 1299 "icon": "edit",
1299 1300 "type": "customPretty",
1300   - "customHtml": "<form #editEntityForm=\"ngForm\" [formGroup]=\"editEntityFormGroup\"\n (ngSubmit)=\"save()\" class=\"edit-entity-form\">\n <mat-toolbar fxLayout=\"row\" color=\"primary\">\n <h2>Edit firmware {{entityName}}</h2>\n <span fxFlex></span>\n <button mat-icon-button (click)=\"cancel()\" type=\"button\">\n <mat-icon class=\"material-icons\">close</mat-icon>\n </button>\n </mat-toolbar>\n <mat-progress-bar color=\"warn\" mode=\"indeterminate\" *ngIf=\"isLoading$ | async\">\n </mat-progress-bar>\n <div style=\"height: 4px;\" *ngIf=\"!(isLoading$ | async)\"></div>\n <div mat-dialog-content fxLayout=\"column\">\n <tb-firmware-autocomplete\n [useFullEntityId]=\"true\"\n formControlName=\"firmwareId\">\n </tb-firmware-autocomplete>\n </div>\n <div mat-dialog-actions fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-button color=\"primary\"\n type=\"button\"\n [disabled]=\"(isLoading$ | async)\"\n (click)=\"cancel()\" cdkFocusInitial>\n Cancel\n </button>\n <button mat-button mat-raised-button color=\"primary\"\n type=\"submit\"\n [disabled]=\"(isLoading$ | async) || editEntityForm.invalid || !editEntityForm.dirty\">\n Save\n </button>\n </div>\n</form>",
  1301 + "customHtml": "<form #editEntityForm=\"ngForm\" [formGroup]=\"editEntityFormGroup\"\n (ngSubmit)=\"save()\" class=\"edit-entity-form\">\n <mat-toolbar fxLayout=\"row\" color=\"primary\">\n <h2>Edit firmware {{entityName}}</h2>\n <span fxFlex></span>\n <button mat-icon-button (click)=\"cancel()\" type=\"button\">\n <mat-icon class=\"material-icons\">close</mat-icon>\n </button>\n </mat-toolbar>\n <mat-progress-bar color=\"warn\" mode=\"indeterminate\" *ngIf=\"isLoading$ | async\">\n </mat-progress-bar>\n <div style=\"height: 4px;\" *ngIf=\"!(isLoading$ | async)\"></div>\n <div *ngIf=\"entity.deviceProfileId\" mat-dialog-content fxLayout=\"column\">\n <tb-ota-package-autocomplete\n [useFullEntityId]=\"true\"\n [deviceProfileId]=\"entity.deviceProfileId.id\"\n formControlName=\"firmwareId\">\n </tb-ota-package-autocomplete>\n </div>\n <div mat-dialog-actions fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-button color=\"primary\"\n type=\"button\"\n [disabled]=\"(isLoading$ | async)\"\n (click)=\"cancel()\" cdkFocusInitial>\n Cancel\n </button>\n <button mat-button mat-raised-button color=\"primary\"\n type=\"submit\"\n [disabled]=\"(isLoading$ | async) || editEntityForm.invalid || !editEntityForm.dirty\">\n Save\n </button>\n </div>\n</form>",
1301 1302 "customCss": "",
1302 1303 "customFunction": "let $injector = widgetContext.$scope.$injector;\nlet customDialog = $injector.get(widgetContext.servicesMap.get('customDialog'));\nlet entityService = $injector.get(widgetContext.servicesMap.get('entityService'));\nlet deviceService = $injector.get(widgetContext.servicesMap.get('deviceService'));\n\nopenEditEntityDialog();\n\nfunction openEditEntityDialog() {\n customDialog.customDialog(htmlTemplate, EditEntityDialogController).subscribe();\n}\n\nfunction EditEntityDialogController(instance) {\n let vm = instance;\n\n vm.entityName = entityName;\n vm.entity = {};\n\n vm.editEntityFormGroup = vm.fb.group({\n firmwareId: [null]\n });\n\n getEntityInfo();\n\n vm.cancel = function() {\n vm.dialogRef.close(null);\n };\n\n vm.save = function() {\n vm.editEntityFormGroup.markAsPristine();\n saveEntity().subscribe(\n function () {\n // widgetContext.updateAliases();\n vm.dialogRef.close(null);\n }\n );\n };\n\n\n function getEntityInfo() {\n entityService.getEntity(entityId.entityType, entityId.id).subscribe(\n function (data) {\n vm.entity = data;\n vm.editEntityFormGroup.patchValue({\n firmwareId: vm.entity.firmwareId\n }, {emitEvent: false});\n }\n );\n }\n\n function saveEntity() {\n const formValues = vm.editEntityFormGroup.value;\n vm.entity.firmwareId = formValues.firmwareId;\n return deviceService.saveDevice(vm.entity);\n }\n}",
1303 1304 "customResources": [],
... ... @@ -1307,7 +1308,7 @@
1307 1308 "name": "Download firware",
1308 1309 "icon": "file_download",
1309 1310 "type": "custom",
1310   - "customFunction": "let $injector = widgetContext.$scope.$injector;\nlet entityService = $injector.get(widgetContext.servicesMap.get('entityService'));\nlet firmwareService = $injector.get(widgetContext.servicesMap.get('firmwareService'));\nlet deviceProfileService = $injector.get(widgetContext.servicesMap.get('deviceProfileService'));\n\ngetDeviceFirmware();\n\nfunction getDeviceFirmware() {\n entityService.getEntity(entityId.entityType, entityId.id).subscribe(\n function (data) {\n if (data.firmwareId !== null) {\n firmwareService.downloadFirmware(data.firmwareId.id).subscribe(); \n } else {\n deviceProfileService.getDeviceProfile(data.deviceProfileId.id).subscribe(\n function (deviceProfile) {\n if (deviceProfile.firmwareId !== null) {\n firmwareService.downloadFirmware(deviceProfile.firmwareId.id).subscribe();\n } else {\n widgetContext.showToast('warn', 'Device ' + entityName +' has not firmware set.', 2000, 'top');\n\n }\n });\n }\n }\n );\n}",
  1311 + "customFunction": "let $injector = widgetContext.$scope.$injector;\nlet entityService = $injector.get(widgetContext.servicesMap.get('entityService'));\nlet otaPackageService = $injector.get(widgetContext.servicesMap.get('otaPackageService'));\nlet deviceProfileService = $injector.get(widgetContext.servicesMap.get('deviceProfileService'));\n\ngetDeviceFirmware();\n\nfunction getDeviceFirmware() {\n entityService.getEntity(entityId.entityType, entityId.id).subscribe(\n function (data) {\n if (data.firmwareId !== null) {\n otaPackageService.downloadOtaPackage(data.firmwareId.id).subscribe(); \n } else {\n deviceProfileService.getDeviceProfile(data.deviceProfileId.id).subscribe(\n function (deviceProfile) {\n if (deviceProfile.firmwareId !== null) {\n otaPackageService.downloadOtaPackage(deviceProfile.firmwareId.id).subscribe();\n } else {\n widgetContext.showToast('warn', 'Device ' + entityName +' has not firmware set.', 2000, 'top');\n\n }\n });\n }\n }\n );\n}",
1311 1312 "id": "12533058-42f6-e75f-620c-219c48d01ec0"
1312 1313 },
1313 1314 {
... ... @@ -1573,7 +1574,7 @@
1573 1574 "name": "Edit firmware",
1574 1575 "icon": "edit",
1575 1576 "type": "customPretty",
1576   - "customHtml": "<form #editEntityForm=\"ngForm\" [formGroup]=\"editEntityFormGroup\"\n (ngSubmit)=\"save()\" class=\"edit-entity-form\">\n <mat-toolbar fxLayout=\"row\" color=\"primary\">\n <h2>Edit firmware {{entityName}}</h2>\n <span fxFlex></span>\n <button mat-icon-button (click)=\"cancel()\" type=\"button\">\n <mat-icon class=\"material-icons\">close</mat-icon>\n </button>\n </mat-toolbar>\n <mat-progress-bar color=\"warn\" mode=\"indeterminate\" *ngIf=\"isLoading$ | async\">\n </mat-progress-bar>\n <div style=\"height: 4px;\" *ngIf=\"!(isLoading$ | async)\"></div>\n <div mat-dialog-content fxLayout=\"column\">\n <tb-firmware-autocomplete\n [useFullEntityId]=\"true\"\n formControlName=\"firmwareId\">\n </tb-firmware-autocomplete>\n </div>\n <div mat-dialog-actions fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-button color=\"primary\"\n type=\"button\"\n [disabled]=\"(isLoading$ | async)\"\n (click)=\"cancel()\" cdkFocusInitial>\n Cancel\n </button>\n <button mat-button mat-raised-button color=\"primary\"\n type=\"submit\"\n [disabled]=\"(isLoading$ | async) || editEntityForm.invalid || !editEntityForm.dirty\">\n Save\n </button>\n </div>\n</form>",
  1577 + "customHtml": "<form #editEntityForm=\"ngForm\" [formGroup]=\"editEntityFormGroup\"\n (ngSubmit)=\"save()\" class=\"edit-entity-form\">\n <mat-toolbar fxLayout=\"row\" color=\"primary\">\n <h2>Edit firmware {{entityName}}</h2>\n <span fxFlex></span>\n <button mat-icon-button (click)=\"cancel()\" type=\"button\">\n <mat-icon class=\"material-icons\">close</mat-icon>\n </button>\n </mat-toolbar>\n <mat-progress-bar color=\"warn\" mode=\"indeterminate\" *ngIf=\"isLoading$ | async\">\n </mat-progress-bar>\n <div style=\"height: 4px;\" *ngIf=\"!(isLoading$ | async)\"></div>\n <div *ngIf=\"entity.deviceProfileId\" mat-dialog-content fxLayout=\"column\">\n <tb-ota-package-autocomplete\n [useFullEntityId]=\"true\"\n [deviceProfileId]=\"entity.deviceProfileId.id\"\n formControlName=\"firmwareId\">\n </tb-ota-package-autocomplete>\n </div>\n <div mat-dialog-actions fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-button color=\"primary\"\n type=\"button\"\n [disabled]=\"(isLoading$ | async)\"\n (click)=\"cancel()\" cdkFocusInitial>\n Cancel\n </button>\n <button mat-button mat-raised-button color=\"primary\"\n type=\"submit\"\n [disabled]=\"(isLoading$ | async) || editEntityForm.invalid || !editEntityForm.dirty\">\n Save\n </button>\n </div>\n</form>",
1577 1578 "customCss": "",
1578 1579 "customFunction": "let $injector = widgetContext.$scope.$injector;\nlet customDialog = $injector.get(widgetContext.servicesMap.get('customDialog'));\nlet entityService = $injector.get(widgetContext.servicesMap.get('entityService'));\nlet deviceService = $injector.get(widgetContext.servicesMap.get('deviceService'));\n\nopenEditEntityDialog();\n\nfunction openEditEntityDialog() {\n customDialog.customDialog(htmlTemplate, EditEntityDialogController).subscribe();\n}\n\nfunction EditEntityDialogController(instance) {\n let vm = instance;\n\n vm.entityName = entityName;\n vm.entity = {};\n\n vm.editEntityFormGroup = vm.fb.group({\n firmwareId: [null]\n });\n\n getEntityInfo();\n\n vm.cancel = function() {\n vm.dialogRef.close(null);\n };\n\n vm.save = function() {\n vm.editEntityFormGroup.markAsPristine();\n saveEntity().subscribe(\n function () {\n // widgetContext.updateAliases();\n vm.dialogRef.close(null);\n }\n );\n };\n\n\n function getEntityInfo() {\n entityService.getEntity(entityId.entityType, entityId.id).subscribe(\n function (data) {\n vm.entity = data;\n vm.editEntityFormGroup.patchValue({\n firmwareId: vm.entity.firmwareId\n }, {emitEvent: false});\n }\n );\n }\n\n function saveEntity() {\n const formValues = vm.editEntityFormGroup.value;\n vm.entity.firmwareId = formValues.firmwareId;\n return deviceService.saveDevice(vm.entity);\n }\n}",
1579 1580 "customResources": [],
... ... @@ -1583,7 +1584,7 @@
1583 1584 "name": "Download firware",
1584 1585 "icon": "file_download",
1585 1586 "type": "custom",
1586   - "customFunction": "let $injector = widgetContext.$scope.$injector;\nlet entityService = $injector.get(widgetContext.servicesMap.get('entityService'));\nlet firmwareService = $injector.get(widgetContext.servicesMap.get('firmwareService'));\nlet deviceProfileService = $injector.get(widgetContext.servicesMap.get('deviceProfileService'));\n\ngetDeviceFirmware();\n\nfunction getDeviceFirmware() {\n entityService.getEntity(entityId.entityType, entityId.id).subscribe(\n function (data) {\n if (data.firmwareId !== null) {\n firmwareService.downloadFirmware(data.firmwareId.id).subscribe(); \n } else {\n deviceProfileService.getDeviceProfile(data.deviceProfileId.id).subscribe(\n function (deviceProfile) {\n if (deviceProfile.firmwareId !== null) {\n firmwareService.downloadFirmware(deviceProfile.firmwareId.id).subscribe();\n } else {\n widgetContext.showToast('warn', 'Device ' + entityName +' has not firmware set.', 2000, 'top');\n\n }\n });\n }\n }\n );\n}",
  1587 + "customFunction": "let $injector = widgetContext.$scope.$injector;\nlet entityService = $injector.get(widgetContext.servicesMap.get('entityService'));\nlet otaPackageService = $injector.get(widgetContext.servicesMap.get('otaPackageService'));\nlet deviceProfileService = $injector.get(widgetContext.servicesMap.get('deviceProfileService'));\n\ngetDeviceFirmware();\n\nfunction getDeviceFirmware() {\n entityService.getEntity(entityId.entityType, entityId.id).subscribe(\n function (data) {\n if (data.firmwareId !== null) {\n otaPackageService.downloadOtaPackage(data.firmwareId.id).subscribe(); \n } else {\n deviceProfileService.getDeviceProfile(data.deviceProfileId.id).subscribe(\n function (deviceProfile) {\n if (deviceProfile.firmwareId !== null) {\n otaPackageService.downloadOtaPackage(deviceProfile.firmwareId.id).subscribe();\n } else {\n widgetContext.showToast('warn', 'Device ' + entityName +' has not firmware set.', 2000, 'top');\n\n }\n });\n }\n }\n );\n}",
1587 1588 "id": "12533058-42f6-e75f-620c-219c48d01ec0"
1588 1589 },
1589 1590 {
... ... @@ -1849,7 +1850,7 @@
1849 1850 "name": "Edit firmware",
1850 1851 "icon": "edit",
1851 1852 "type": "customPretty",
1852   - "customHtml": "<form #editEntityForm=\"ngForm\" [formGroup]=\"editEntityFormGroup\"\n (ngSubmit)=\"save()\" class=\"edit-entity-form\">\n <mat-toolbar fxLayout=\"row\" color=\"primary\">\n <h2>Edit firmware {{entityName}}</h2>\n <span fxFlex></span>\n <button mat-icon-button (click)=\"cancel()\" type=\"button\">\n <mat-icon class=\"material-icons\">close</mat-icon>\n </button>\n </mat-toolbar>\n <mat-progress-bar color=\"warn\" mode=\"indeterminate\" *ngIf=\"isLoading$ | async\">\n </mat-progress-bar>\n <div style=\"height: 4px;\" *ngIf=\"!(isLoading$ | async)\"></div>\n <div mat-dialog-content fxLayout=\"column\">\n <tb-firmware-autocomplete\n [useFullEntityId]=\"true\"\n formControlName=\"firmwareId\">\n </tb-firmware-autocomplete>\n </div>\n <div mat-dialog-actions fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-button color=\"primary\"\n type=\"button\"\n [disabled]=\"(isLoading$ | async)\"\n (click)=\"cancel()\" cdkFocusInitial>\n Cancel\n </button>\n <button mat-button mat-raised-button color=\"primary\"\n type=\"submit\"\n [disabled]=\"(isLoading$ | async) || editEntityForm.invalid || !editEntityForm.dirty\">\n Save\n </button>\n </div>\n</form>",
  1853 + "customHtml": "<form #editEntityForm=\"ngForm\" [formGroup]=\"editEntityFormGroup\"\n (ngSubmit)=\"save()\" class=\"edit-entity-form\">\n <mat-toolbar fxLayout=\"row\" color=\"primary\">\n <h2>Edit firmware {{entityName}}</h2>\n <span fxFlex></span>\n <button mat-icon-button (click)=\"cancel()\" type=\"button\">\n <mat-icon class=\"material-icons\">close</mat-icon>\n </button>\n </mat-toolbar>\n <mat-progress-bar color=\"warn\" mode=\"indeterminate\" *ngIf=\"isLoading$ | async\">\n </mat-progress-bar>\n <div style=\"height: 4px;\" *ngIf=\"!(isLoading$ | async)\"></div>\n <div *ngIf=\"entity.deviceProfileId\" mat-dialog-content fxLayout=\"column\">\n <tb-ota-package-autocomplete\n [useFullEntityId]=\"true\"\n [deviceProfileId]=\"entity.deviceProfileId.id\"\n formControlName=\"firmwareId\">\n </tb-ota-package-autocomplete>\n </div>\n <div mat-dialog-actions fxLayout=\"row\" fxLayoutAlign=\"end center\">\n <button mat-button color=\"primary\"\n type=\"button\"\n [disabled]=\"(isLoading$ | async)\"\n (click)=\"cancel()\" cdkFocusInitial>\n Cancel\n </button>\n <button mat-button mat-raised-button color=\"primary\"\n type=\"submit\"\n [disabled]=\"(isLoading$ | async) || editEntityForm.invalid || !editEntityForm.dirty\">\n Save\n </button>\n </div>\n</form>",
1853 1854 "customCss": "",
1854 1855 "customFunction": "let $injector = widgetContext.$scope.$injector;\nlet customDialog = $injector.get(widgetContext.servicesMap.get('customDialog'));\nlet entityService = $injector.get(widgetContext.servicesMap.get('entityService'));\nlet deviceService = $injector.get(widgetContext.servicesMap.get('deviceService'));\n\nopenEditEntityDialog();\n\nfunction openEditEntityDialog() {\n customDialog.customDialog(htmlTemplate, EditEntityDialogController).subscribe();\n}\n\nfunction EditEntityDialogController(instance) {\n let vm = instance;\n\n vm.entityName = entityName;\n vm.entity = {};\n\n vm.editEntityFormGroup = vm.fb.group({\n firmwareId: [null]\n });\n\n getEntityInfo();\n\n vm.cancel = function() {\n vm.dialogRef.close(null);\n };\n\n vm.save = function() {\n vm.editEntityFormGroup.markAsPristine();\n saveEntity().subscribe(\n function () {\n // widgetContext.updateAliases();\n vm.dialogRef.close(null);\n }\n );\n };\n\n\n function getEntityInfo() {\n entityService.getEntity(entityId.entityType, entityId.id).subscribe(\n function (data) {\n vm.entity = data;\n vm.editEntityFormGroup.patchValue({\n firmwareId: vm.entity.firmwareId\n }, {emitEvent: false});\n }\n );\n }\n\n function saveEntity() {\n const formValues = vm.editEntityFormGroup.value;\n vm.entity.firmwareId = formValues.firmwareId;\n return deviceService.saveDevice(vm.entity);\n }\n}",
1855 1856 "customResources": [],
... ... @@ -1859,7 +1860,7 @@
1859 1860 "name": "Download firware",
1860 1861 "icon": "file_download",
1861 1862 "type": "custom",
1862   - "customFunction": "let $injector = widgetContext.$scope.$injector;\nlet entityService = $injector.get(widgetContext.servicesMap.get('entityService'));\nlet firmwareService = $injector.get(widgetContext.servicesMap.get('firmwareService'));\nlet deviceProfileService = $injector.get(widgetContext.servicesMap.get('deviceProfileService'));\n\ngetDeviceFirmware();\n\nfunction getDeviceFirmware() {\n entityService.getEntity(entityId.entityType, entityId.id).subscribe(\n function (data) {\n if (data.firmwareId !== null) {\n firmwareService.downloadFirmware(data.firmwareId.id).subscribe(); \n } else {\n deviceProfileService.getDeviceProfile(data.deviceProfileId.id).subscribe(\n function (deviceProfile) {\n if (deviceProfile.firmwareId !== null) {\n firmwareService.downloadFirmware(deviceProfile.firmwareId.id).subscribe();\n } else {\n widgetContext.showToast('warn', 'Device ' + entityName +' has not firmware set.', 2000, 'top');\n\n }\n });\n }\n }\n );\n}",
  1863 + "customFunction": "let $injector = widgetContext.$scope.$injector;\nlet entityService = $injector.get(widgetContext.servicesMap.get('entityService'));\nlet otaPackageService = $injector.get(widgetContext.servicesMap.get('otaPackageService'));\nlet deviceProfileService = $injector.get(widgetContext.servicesMap.get('deviceProfileService'));\n\ngetDeviceFirmware();\n\nfunction getDeviceFirmware() {\n entityService.getEntity(entityId.entityType, entityId.id).subscribe(\n function (data) {\n if (data.firmwareId !== null) {\n otaPackageService.downloadOtaPackage(data.firmwareId.id).subscribe(); \n } else {\n deviceProfileService.getDeviceProfile(data.deviceProfileId.id).subscribe(\n function (deviceProfile) {\n if (deviceProfile.firmwareId !== null) {\n otaPackageService.downloadOtaPackage(deviceProfile.firmwareId.id).subscribe();\n } else {\n widgetContext.showToast('warn', 'Device ' + entityName +' has not firmware set.', 2000, 'top');\n\n }\n });\n }\n }\n );\n}",
1863 1864 "id": "12533058-42f6-e75f-620c-219c48d01ec0"
1864 1865 },
1865 1866 {
... ...
... ... @@ -59,8 +59,8 @@ CREATE TABLE IF NOT EXISTS resource (
59 59 CONSTRAINT resource_unq_key UNIQUE (tenant_id, resource_type, resource_key)
60 60 );
61 61
62   -CREATE TABLE IF NOT EXISTS firmware (
63   - id uuid NOT NULL CONSTRAINT firmware_pkey PRIMARY KEY,
  62 +CREATE TABLE IF NOT EXISTS ota_package (
  63 + id uuid NOT NULL CONSTRAINT ota_package_pkey PRIMARY KEY,
64 64 created_time bigint NOT NULL,
65 65 tenant_id uuid NOT NULL,
66 66 device_profile_id uuid,
... ... @@ -75,7 +75,7 @@ CREATE TABLE IF NOT EXISTS firmware (
75 75 data_size bigint,
76 76 additional_info varchar,
77 77 search_text varchar(255),
78   - CONSTRAINT firmware_tenant_title_version_unq_key UNIQUE (tenant_id, title, version)
  78 + CONSTRAINT ota_package_tenant_title_version_unq_key UNIQUE (tenant_id, title, version)
79 79 );
80 80
81 81 ALTER TABLE dashboard
... ... @@ -101,13 +101,13 @@ DO $$
101 101 IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_firmware_device_profile') THEN
102 102 ALTER TABLE device_profile
103 103 ADD CONSTRAINT fk_firmware_device_profile
104   - FOREIGN KEY (firmware_id) REFERENCES firmware(id);
  104 + FOREIGN KEY (firmware_id) REFERENCES ota_package(id);
105 105 END IF;
106 106
107 107 IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_software_device_profile') THEN
108 108 ALTER TABLE device_profile
109 109 ADD CONSTRAINT fk_software_device_profile
110   - FOREIGN KEY (firmware_id) REFERENCES firmware(id);
  110 + FOREIGN KEY (firmware_id) REFERENCES ota_package(id);
111 111 END IF;
112 112
113 113 IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_default_dashboard_device_profile') THEN
... ... @@ -119,13 +119,13 @@ DO $$
119 119 IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_firmware_device') THEN
120 120 ALTER TABLE device
121 121 ADD CONSTRAINT fk_firmware_device
122   - FOREIGN KEY (firmware_id) REFERENCES firmware(id);
  122 + FOREIGN KEY (firmware_id) REFERENCES ota_package(id);
123 123 END IF;
124 124
125 125 IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_software_device') THEN
126 126 ALTER TABLE device
127 127 ADD CONSTRAINT fk_software_device
128   - FOREIGN KEY (firmware_id) REFERENCES firmware(id);
  128 + FOREIGN KEY (firmware_id) REFERENCES ota_package(id);
129 129 END IF;
130 130 END;
131 131 $$;
... ...
... ... @@ -39,8 +39,8 @@ import org.thingsboard.server.common.data.EdgeUtils;
39 39 import org.thingsboard.server.common.data.EntityType;
40 40 import org.thingsboard.server.common.data.EntityView;
41 41 import org.thingsboard.server.common.data.EntityViewInfo;
42   -import org.thingsboard.server.common.data.Firmware;
43   -import org.thingsboard.server.common.data.FirmwareInfo;
  42 +import org.thingsboard.server.common.data.OtaPackage;
  43 +import org.thingsboard.server.common.data.OtaPackageInfo;
44 44 import org.thingsboard.server.common.data.HasName;
45 45 import org.thingsboard.server.common.data.HasTenantId;
46 46 import org.thingsboard.server.common.data.TbResourceInfo;
... ... @@ -70,7 +70,7 @@ import org.thingsboard.server.common.data.id.EdgeId;
70 70 import org.thingsboard.server.common.data.id.EntityId;
71 71 import org.thingsboard.server.common.data.id.EntityIdFactory;
72 72 import org.thingsboard.server.common.data.id.EntityViewId;
73   -import org.thingsboard.server.common.data.id.FirmwareId;
  73 +import org.thingsboard.server.common.data.id.OtaPackageId;
74 74 import org.thingsboard.server.common.data.id.TbResourceId;
75 75 import org.thingsboard.server.common.data.id.RuleChainId;
76 76 import org.thingsboard.server.common.data.id.RuleNodeId;
... ... @@ -110,7 +110,7 @@ import org.thingsboard.server.dao.edge.EdgeService;
110 110 import org.thingsboard.server.dao.entityview.EntityViewService;
111 111 import org.thingsboard.server.dao.exception.DataValidationException;
112 112 import org.thingsboard.server.dao.exception.IncorrectParameterException;
113   -import org.thingsboard.server.dao.firmware.FirmwareService;
  113 +import org.thingsboard.server.dao.ota.OtaPackageService;
114 114 import org.thingsboard.server.dao.model.ModelConstants;
115 115 import org.thingsboard.server.dao.oauth2.OAuth2ConfigTemplateService;
116 116 import org.thingsboard.server.dao.oauth2.OAuth2Service;
... ... @@ -128,7 +128,7 @@ import org.thingsboard.server.queue.discovery.PartitionService;
128 128 import org.thingsboard.server.queue.provider.TbQueueProducerProvider;
129 129 import org.thingsboard.server.queue.util.TbCoreComponent;
130 130 import org.thingsboard.server.service.component.ComponentDiscoveryService;
131   -import org.thingsboard.server.service.firmware.FirmwareStateService;
  131 +import org.thingsboard.server.service.ota.OtaPackageStateService;
132 132 import org.thingsboard.server.service.edge.EdgeNotificationService;
133 133 import org.thingsboard.server.service.edge.rpc.EdgeGrpcService;
134 134 import org.thingsboard.server.service.edge.rpc.init.SyncEdgeService;
... ... @@ -250,10 +250,10 @@ public abstract class BaseController {
250 250 protected TbResourceService resourceService;
251 251
252 252 @Autowired
253   - protected FirmwareService firmwareService;
  253 + protected OtaPackageService otaPackageService;
254 254
255 255 @Autowired
256   - protected FirmwareStateService firmwareStateService;
  256 + protected OtaPackageStateService otaPackageStateService;
257 257
258 258 @Autowired
259 259 protected TbQueueProducerProvider producerProvider;
... ... @@ -511,8 +511,8 @@ public abstract class BaseController {
511 511 case TB_RESOURCE:
512 512 checkResourceId(new TbResourceId(entityId.getId()), operation);
513 513 return;
514   - case FIRMWARE:
515   - checkFirmwareId(new FirmwareId(entityId.getId()), operation);
  514 + case OTA_PACKAGE:
  515 + checkOtaPackageId(new OtaPackageId(entityId.getId()), operation);
516 516 return;
517 517 default:
518 518 throw new IllegalArgumentException("Unsupported entity type: " + entityId.getEntityType());
... ... @@ -769,25 +769,25 @@ public abstract class BaseController {
769 769 }
770 770 }
771 771
772   - Firmware checkFirmwareId(FirmwareId firmwareId, Operation operation) throws ThingsboardException {
  772 + OtaPackage checkOtaPackageId(OtaPackageId otaPackageId, Operation operation) throws ThingsboardException {
773 773 try {
774   - validateId(firmwareId, "Incorrect firmwareId " + firmwareId);
775   - Firmware firmware = firmwareService.findFirmwareById(getCurrentUser().getTenantId(), firmwareId);
776   - checkNotNull(firmware);
777   - accessControlService.checkPermission(getCurrentUser(), Resource.FIRMWARE, operation, firmwareId, firmware);
778   - return firmware;
  774 + validateId(otaPackageId, "Incorrect otaPackageId " + otaPackageId);
  775 + OtaPackage otaPackage = otaPackageService.findOtaPackageById(getCurrentUser().getTenantId(), otaPackageId);
  776 + checkNotNull(otaPackage);
  777 + accessControlService.checkPermission(getCurrentUser(), Resource.OTA_PACKAGE, operation, otaPackageId, otaPackage);
  778 + return otaPackage;
779 779 } catch (Exception e) {
780 780 throw handleException(e, false);
781 781 }
782 782 }
783 783
784   - FirmwareInfo checkFirmwareInfoId(FirmwareId firmwareId, Operation operation) throws ThingsboardException {
  784 + OtaPackageInfo checkOtaPackageInfoId(OtaPackageId otaPackageId, Operation operation) throws ThingsboardException {
785 785 try {
786   - validateId(firmwareId, "Incorrect firmwareId " + firmwareId);
787   - FirmwareInfo firmwareInfo = firmwareService.findFirmwareInfoById(getCurrentUser().getTenantId(), firmwareId);
788   - checkNotNull(firmwareInfo);
789   - accessControlService.checkPermission(getCurrentUser(), Resource.FIRMWARE, operation, firmwareId, firmwareInfo);
790   - return firmwareInfo;
  786 + validateId(otaPackageId, "Incorrect otaPackageId " + otaPackageId);
  787 + OtaPackageInfo otaPackageIn = otaPackageService.findOtaPackageInfoById(getCurrentUser().getTenantId(), otaPackageId);
  788 + checkNotNull(otaPackageIn);
  789 + accessControlService.checkPermission(getCurrentUser(), Resource.OTA_PACKAGE, operation, otaPackageId, otaPackageIn);
  790 + return otaPackageIn;
791 791 } catch (Exception e) {
792 792 throw handleException(e, false);
793 793 }
... ...
... ... @@ -53,6 +53,7 @@ import org.thingsboard.server.common.data.id.DeviceId;
53 53 import org.thingsboard.server.common.data.id.DeviceProfileId;
54 54 import org.thingsboard.server.common.data.id.EdgeId;
55 55 import org.thingsboard.server.common.data.id.TenantId;
  56 +import org.thingsboard.server.common.data.ota.OtaPackageType;
56 57 import org.thingsboard.server.common.data.page.PageData;
57 58 import org.thingsboard.server.common.data.page.PageLink;
58 59 import org.thingsboard.server.common.data.page.TimePageLink;
... ... @@ -75,6 +76,7 @@ import javax.annotation.Nullable;
75 76 import java.io.IOException;
76 77 import java.util.ArrayList;
77 78 import java.util.List;
  79 +import java.util.UUID;
78 80 import java.util.stream.Collectors;
79 81
80 82 import static org.thingsboard.server.controller.EdgeController.EDGE_ID;
... ... @@ -153,7 +155,7 @@ public class DeviceController extends BaseController {
153 155 deviceStateService.onDeviceUpdated(savedDevice);
154 156 }
155 157
156   - firmwareStateService.update(savedDevice, oldDevice);
  158 + otaPackageStateService.update(savedDevice, oldDevice);
157 159
158 160 return savedDevice;
159 161 } catch (Exception e) {
... ... @@ -778,4 +780,19 @@ public class DeviceController extends BaseController {
778 780 throw handleException(e);
779 781 }
780 782 }
  783 +
  784 + @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
  785 + @RequestMapping(value = "/devices/count/{otaPackageType}", method = RequestMethod.GET)
  786 + @ResponseBody
  787 + public Long countDevicesByTenantIdAndDeviceProfileIdAndEmptyOtaPackage(@PathVariable("otaPackageType") String otaPackageType,
  788 + @RequestParam String deviceProfileId) throws ThingsboardException {
  789 + checkParameter("OtaPackageType", otaPackageType);
  790 + checkParameter("DeviceProfileId", deviceProfileId);
  791 + try {
  792 + return deviceService.countDevicesByTenantIdAndDeviceProfileIdAndEmptyOtaPackage(
  793 + getCurrentUser().getTenantId(), new DeviceProfileId(UUID.fromString(deviceProfileId)), OtaPackageType.valueOf(otaPackageType));
  794 + } catch (Exception e) {
  795 + throw handleException(e);
  796 + }
  797 + }
781 798 }
... ...
... ... @@ -168,7 +168,7 @@ public class DeviceProfileController extends BaseController {
168 168 null,
169 169 created ? ActionType.ADDED : ActionType.UPDATED, null);
170 170
171   - firmwareStateService.update(savedDeviceProfile, isFirmwareChanged, isSoftwareChanged);
  171 + otaPackageStateService.update(savedDeviceProfile, isFirmwareChanged, isSoftwareChanged);
172 172
173 173 sendEntityNotificationMsg(getTenantId(), savedDeviceProfile.getId(),
174 174 deviceProfile.getId() == null ? EdgeEventActionType.ADDED : EdgeEventActionType.UPDATED);
... ...
application/src/main/java/org/thingsboard/server/controller/OtaPackageController.java renamed from application/src/main/java/org/thingsboard/server/controller/FirmwareController.java
... ... @@ -30,14 +30,14 @@ import org.springframework.web.bind.annotation.ResponseBody;
30 30 import org.springframework.web.bind.annotation.RestController;
31 31 import org.springframework.web.multipart.MultipartFile;
32 32 import org.thingsboard.server.common.data.EntityType;
33   -import org.thingsboard.server.common.data.Firmware;
34   -import org.thingsboard.server.common.data.FirmwareInfo;
  33 +import org.thingsboard.server.common.data.OtaPackage;
  34 +import org.thingsboard.server.common.data.OtaPackageInfo;
35 35 import org.thingsboard.server.common.data.audit.ActionType;
36 36 import org.thingsboard.server.common.data.exception.ThingsboardException;
37   -import org.thingsboard.server.common.data.firmware.ChecksumAlgorithm;
38   -import org.thingsboard.server.common.data.firmware.FirmwareType;
  37 +import org.thingsboard.server.common.data.ota.ChecksumAlgorithm;
  38 +import org.thingsboard.server.common.data.ota.OtaPackageType;
39 39 import org.thingsboard.server.common.data.id.DeviceProfileId;
40   -import org.thingsboard.server.common.data.id.FirmwareId;
  40 +import org.thingsboard.server.common.data.id.OtaPackageId;
41 41 import org.thingsboard.server.common.data.page.PageData;
42 42 import org.thingsboard.server.common.data.page.PageLink;
43 43 import org.thingsboard.server.queue.util.TbCoreComponent;
... ... @@ -50,26 +50,26 @@ import java.nio.ByteBuffer;
50 50 @RestController
51 51 @TbCoreComponent
52 52 @RequestMapping("/api")
53   -public class FirmwareController extends BaseController {
  53 +public class OtaPackageController extends BaseController {
54 54
55   - public static final String FIRMWARE_ID = "firmwareId";
  55 + public static final String OTA_PACKAGE_ID = "otaPackageId";
56 56 public static final String CHECKSUM_ALGORITHM = "checksumAlgorithm";
57 57
58 58 @PreAuthorize("hasAnyAuthority( 'TENANT_ADMIN')")
59   - @RequestMapping(value = "/firmware/{firmwareId}/download", method = RequestMethod.GET)
  59 + @RequestMapping(value = "/otaPackage/{otaPackageId}/download", method = RequestMethod.GET)
60 60 @ResponseBody
61   - public ResponseEntity<org.springframework.core.io.Resource> downloadFirmware(@PathVariable(FIRMWARE_ID) String strFirmwareId) throws ThingsboardException {
62   - checkParameter(FIRMWARE_ID, strFirmwareId);
  61 + public ResponseEntity<org.springframework.core.io.Resource> downloadOtaPackage(@PathVariable(OTA_PACKAGE_ID) String strOtaPackageId) throws ThingsboardException {
  62 + checkParameter(OTA_PACKAGE_ID, strOtaPackageId);
63 63 try {
64   - FirmwareId firmwareId = new FirmwareId(toUUID(strFirmwareId));
65   - Firmware firmware = checkFirmwareId(firmwareId, Operation.READ);
  64 + OtaPackageId otaPackageId = new OtaPackageId(toUUID(strOtaPackageId));
  65 + OtaPackage otaPackage = checkOtaPackageId(otaPackageId, Operation.READ);
66 66
67   - ByteArrayResource resource = new ByteArrayResource(firmware.getData().array());
  67 + ByteArrayResource resource = new ByteArrayResource(otaPackage.getData().array());
68 68 return ResponseEntity.ok()
69   - .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + firmware.getFileName())
70   - .header("x-filename", firmware.getFileName())
  69 + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + otaPackage.getFileName())
  70 + .header("x-filename", otaPackage.getFileName())
71 71 .contentLength(resource.contentLength())
72   - .contentType(parseMediaType(firmware.getContentType()))
  72 + .contentType(parseMediaType(otaPackage.getContentType()))
73 73 .body(resource);
74 74 } catch (Exception e) {
75 75 throw handleException(e);
... ... @@ -77,144 +77,144 @@ public class FirmwareController extends BaseController {
77 77 }
78 78
79 79 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
80   - @RequestMapping(value = "/firmware/info/{firmwareId}", method = RequestMethod.GET)
  80 + @RequestMapping(value = "/otaPackage/info/{otaPackageId}", method = RequestMethod.GET)
81 81 @ResponseBody
82   - public FirmwareInfo getFirmwareInfoById(@PathVariable(FIRMWARE_ID) String strFirmwareId) throws ThingsboardException {
83   - checkParameter(FIRMWARE_ID, strFirmwareId);
  82 + public OtaPackageInfo getOtaPackageInfoById(@PathVariable(OTA_PACKAGE_ID) String strOtaPackageId) throws ThingsboardException {
  83 + checkParameter(OTA_PACKAGE_ID, strOtaPackageId);
84 84 try {
85   - FirmwareId firmwareId = new FirmwareId(toUUID(strFirmwareId));
86   - return checkNotNull(firmwareService.findFirmwareInfoById(getTenantId(), firmwareId));
  85 + OtaPackageId otaPackageId = new OtaPackageId(toUUID(strOtaPackageId));
  86 + return checkNotNull(otaPackageService.findOtaPackageInfoById(getTenantId(), otaPackageId));
87 87 } catch (Exception e) {
88 88 throw handleException(e);
89 89 }
90 90 }
91 91
92 92 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
93   - @RequestMapping(value = "/firmware/{firmwareId}", method = RequestMethod.GET)
  93 + @RequestMapping(value = "/otaPackage/{otaPackageId}", method = RequestMethod.GET)
94 94 @ResponseBody
95   - public Firmware getFirmwareById(@PathVariable(FIRMWARE_ID) String strFirmwareId) throws ThingsboardException {
96   - checkParameter(FIRMWARE_ID, strFirmwareId);
  95 + public OtaPackage getOtaPackageById(@PathVariable(OTA_PACKAGE_ID) String strOtaPackageId) throws ThingsboardException {
  96 + checkParameter(OTA_PACKAGE_ID, strOtaPackageId);
97 97 try {
98   - FirmwareId firmwareId = new FirmwareId(toUUID(strFirmwareId));
99   - return checkFirmwareId(firmwareId, Operation.READ);
  98 + OtaPackageId otaPackageId = new OtaPackageId(toUUID(strOtaPackageId));
  99 + return checkOtaPackageId(otaPackageId, Operation.READ);
100 100 } catch (Exception e) {
101 101 throw handleException(e);
102 102 }
103 103 }
104 104
105 105 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
106   - @RequestMapping(value = "/firmware", method = RequestMethod.POST)
  106 + @RequestMapping(value = "/otaPackage", method = RequestMethod.POST)
107 107 @ResponseBody
108   - public FirmwareInfo saveFirmwareInfo(@RequestBody FirmwareInfo firmwareInfo) throws ThingsboardException {
109   - boolean created = firmwareInfo.getId() == null;
  108 + public OtaPackageInfo saveOtaPackageInfo(@RequestBody OtaPackageInfo otaPackageInfo) throws ThingsboardException {
  109 + boolean created = otaPackageInfo.getId() == null;
110 110 try {
111   - firmwareInfo.setTenantId(getTenantId());
112   - checkEntity(firmwareInfo.getId(), firmwareInfo, Resource.FIRMWARE);
113   - FirmwareInfo savedFirmwareInfo = firmwareService.saveFirmwareInfo(firmwareInfo);
114   - logEntityAction(savedFirmwareInfo.getId(), savedFirmwareInfo,
  111 + otaPackageInfo.setTenantId(getTenantId());
  112 + checkEntity(otaPackageInfo.getId(), otaPackageInfo, Resource.OTA_PACKAGE);
  113 + OtaPackageInfo savedOtaPackageInfo = otaPackageService.saveOtaPackageInfo(otaPackageInfo);
  114 + logEntityAction(savedOtaPackageInfo.getId(), savedOtaPackageInfo,
115 115 null, created ? ActionType.ADDED : ActionType.UPDATED, null);
116   - return savedFirmwareInfo;
  116 + return savedOtaPackageInfo;
117 117 } catch (Exception e) {
118   - logEntityAction(emptyId(EntityType.FIRMWARE), firmwareInfo,
  118 + logEntityAction(emptyId(EntityType.OTA_PACKAGE), otaPackageInfo,
119 119 null, created ? ActionType.ADDED : ActionType.UPDATED, e);
120 120 throw handleException(e);
121 121 }
122 122 }
123 123
124 124 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
125   - @RequestMapping(value = "/firmware/{firmwareId}", method = RequestMethod.POST)
  125 + @RequestMapping(value = "/otaPackage/{otaPackageId}", method = RequestMethod.POST)
126 126 @ResponseBody
127   - public Firmware saveFirmwareData(@PathVariable(FIRMWARE_ID) String strFirmwareId,
128   - @RequestParam(required = false) String checksum,
129   - @RequestParam(CHECKSUM_ALGORITHM) String checksumAlgorithmStr,
130   - @RequestBody MultipartFile file) throws ThingsboardException {
131   - checkParameter(FIRMWARE_ID, strFirmwareId);
  127 + public OtaPackage saveOtaPackageData(@PathVariable(OTA_PACKAGE_ID) String strOtaPackageId,
  128 + @RequestParam(required = false) String checksum,
  129 + @RequestParam(CHECKSUM_ALGORITHM) String checksumAlgorithmStr,
  130 + @RequestBody MultipartFile file) throws ThingsboardException {
  131 + checkParameter(OTA_PACKAGE_ID, strOtaPackageId);
132 132 checkParameter(CHECKSUM_ALGORITHM, checksumAlgorithmStr);
133 133 try {
134   - FirmwareId firmwareId = new FirmwareId(toUUID(strFirmwareId));
135   - FirmwareInfo info = checkFirmwareInfoId(firmwareId, Operation.READ);
136   -
137   - Firmware firmware = new Firmware(firmwareId);
138   - firmware.setCreatedTime(info.getCreatedTime());
139   - firmware.setTenantId(getTenantId());
140   - firmware.setDeviceProfileId(info.getDeviceProfileId());
141   - firmware.setType(info.getType());
142   - firmware.setTitle(info.getTitle());
143   - firmware.setVersion(info.getVersion());
144   - firmware.setAdditionalInfo(info.getAdditionalInfo());
  134 + OtaPackageId otaPackageId = new OtaPackageId(toUUID(strOtaPackageId));
  135 + OtaPackageInfo info = checkOtaPackageInfoId(otaPackageId, Operation.READ);
  136 +
  137 + OtaPackage otaPackage = new OtaPackage(otaPackageId);
  138 + otaPackage.setCreatedTime(info.getCreatedTime());
  139 + otaPackage.setTenantId(getTenantId());
  140 + otaPackage.setDeviceProfileId(info.getDeviceProfileId());
  141 + otaPackage.setType(info.getType());
  142 + otaPackage.setTitle(info.getTitle());
  143 + otaPackage.setVersion(info.getVersion());
  144 + otaPackage.setAdditionalInfo(info.getAdditionalInfo());
145 145
146 146 ChecksumAlgorithm checksumAlgorithm = ChecksumAlgorithm.valueOf(checksumAlgorithmStr.toUpperCase());
147 147
148 148 byte[] bytes = file.getBytes();
149 149 if (StringUtils.isEmpty(checksum)) {
150   - checksum = firmwareService.generateChecksum(checksumAlgorithm, ByteBuffer.wrap(bytes));
  150 + checksum = otaPackageService.generateChecksum(checksumAlgorithm, ByteBuffer.wrap(bytes));
151 151 }
152 152
153   - firmware.setChecksumAlgorithm(checksumAlgorithm);
154   - firmware.setChecksum(checksum);
155   - firmware.setFileName(file.getOriginalFilename());
156   - firmware.setContentType(file.getContentType());
157   - firmware.setData(ByteBuffer.wrap(bytes));
158   - firmware.setDataSize((long) bytes.length);
159   - Firmware savedFirmware = firmwareService.saveFirmware(firmware);
160   - logEntityAction(savedFirmware.getId(), savedFirmware, null, ActionType.UPDATED, null);
161   - return savedFirmware;
  153 + otaPackage.setChecksumAlgorithm(checksumAlgorithm);
  154 + otaPackage.setChecksum(checksum);
  155 + otaPackage.setFileName(file.getOriginalFilename());
  156 + otaPackage.setContentType(file.getContentType());
  157 + otaPackage.setData(ByteBuffer.wrap(bytes));
  158 + otaPackage.setDataSize((long) bytes.length);
  159 + OtaPackage savedOtaPackage = otaPackageService.saveOtaPackage(otaPackage);
  160 + logEntityAction(savedOtaPackage.getId(), savedOtaPackage, null, ActionType.UPDATED, null);
  161 + return savedOtaPackage;
162 162 } catch (Exception e) {
163   - logEntityAction(emptyId(EntityType.FIRMWARE), null, null, ActionType.UPDATED, e, strFirmwareId);
  163 + logEntityAction(emptyId(EntityType.OTA_PACKAGE), null, null, ActionType.UPDATED, e, strOtaPackageId);
164 164 throw handleException(e);
165 165 }
166 166 }
167 167
168 168 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
169   - @RequestMapping(value = "/firmwares", method = RequestMethod.GET)
  169 + @RequestMapping(value = "/otaPackages", method = RequestMethod.GET)
170 170 @ResponseBody
171   - public PageData<FirmwareInfo> getFirmwares(@RequestParam int pageSize,
172   - @RequestParam int page,
173   - @RequestParam(required = false) String textSearch,
174   - @RequestParam(required = false) String sortProperty,
175   - @RequestParam(required = false) String sortOrder) throws ThingsboardException {
  171 + public PageData<OtaPackageInfo> getOtaPackages(@RequestParam int pageSize,
  172 + @RequestParam int page,
  173 + @RequestParam(required = false) String textSearch,
  174 + @RequestParam(required = false) String sortProperty,
  175 + @RequestParam(required = false) String sortOrder) throws ThingsboardException {
176 176 try {
177 177 PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder);
178   - return checkNotNull(firmwareService.findTenantFirmwaresByTenantId(getTenantId(), pageLink));
  178 + return checkNotNull(otaPackageService.findTenantOtaPackagesByTenantId(getTenantId(), pageLink));
179 179 } catch (Exception e) {
180 180 throw handleException(e);
181 181 }
182 182 }
183 183
184 184 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
185   - @RequestMapping(value = "/firmwares/{deviceProfileId}/{type}/{hasData}", method = RequestMethod.GET)
  185 + @RequestMapping(value = "/otaPackages/{deviceProfileId}/{type}/{hasData}", method = RequestMethod.GET)
186 186 @ResponseBody
187   - public PageData<FirmwareInfo> getFirmwares(@PathVariable("deviceProfileId") String strDeviceProfileId,
188   - @PathVariable("type") String strType,
189   - @PathVariable("hasData") boolean hasData,
190   - @RequestParam int pageSize,
191   - @RequestParam int page,
192   - @RequestParam(required = false) String textSearch,
193   - @RequestParam(required = false) String sortProperty,
194   - @RequestParam(required = false) String sortOrder) throws ThingsboardException {
  187 + public PageData<OtaPackageInfo> getOtaPackages(@PathVariable("deviceProfileId") String strDeviceProfileId,
  188 + @PathVariable("type") String strType,
  189 + @PathVariable("hasData") boolean hasData,
  190 + @RequestParam int pageSize,
  191 + @RequestParam int page,
  192 + @RequestParam(required = false) String textSearch,
  193 + @RequestParam(required = false) String sortProperty,
  194 + @RequestParam(required = false) String sortOrder) throws ThingsboardException {
195 195 checkParameter("deviceProfileId", strDeviceProfileId);
196 196 checkParameter("type", strType);
197 197 try {
198 198 PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder);
199   - return checkNotNull(firmwareService.findTenantFirmwaresByTenantIdAndDeviceProfileIdAndTypeAndHasData(getTenantId(),
200   - new DeviceProfileId(toUUID(strDeviceProfileId)), FirmwareType.valueOf(strType), hasData, pageLink));
  199 + return checkNotNull(otaPackageService.findTenantOtaPackagesByTenantIdAndDeviceProfileIdAndTypeAndHasData(getTenantId(),
  200 + new DeviceProfileId(toUUID(strDeviceProfileId)), OtaPackageType.valueOf(strType), hasData, pageLink));
201 201 } catch (Exception e) {
202 202 throw handleException(e);
203 203 }
204 204 }
205 205
206 206 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
207   - @RequestMapping(value = "/firmware/{firmwareId}", method = RequestMethod.DELETE)
  207 + @RequestMapping(value = "/otaPackage/{otaPackageId}", method = RequestMethod.DELETE)
208 208 @ResponseBody
209   - public void deleteFirmware(@PathVariable("firmwareId") String strFirmwareId) throws ThingsboardException {
210   - checkParameter(FIRMWARE_ID, strFirmwareId);
  209 + public void deleteOtaPackage(@PathVariable("otaPackageId") String strOtaPackageId) throws ThingsboardException {
  210 + checkParameter(OTA_PACKAGE_ID, strOtaPackageId);
211 211 try {
212   - FirmwareId firmwareId = new FirmwareId(toUUID(strFirmwareId));
213   - FirmwareInfo info = checkFirmwareInfoId(firmwareId, Operation.DELETE);
214   - firmwareService.deleteFirmware(getTenantId(), firmwareId);
215   - logEntityAction(firmwareId, info, null, ActionType.DELETED, null, strFirmwareId);
  212 + OtaPackageId otaPackageId = new OtaPackageId(toUUID(strOtaPackageId));
  213 + OtaPackageInfo info = checkOtaPackageInfoId(otaPackageId, Operation.DELETE);
  214 + otaPackageService.deleteOtaPackage(getTenantId(), otaPackageId);
  215 + logEntityAction(otaPackageId, info, null, ActionType.DELETED, null, strOtaPackageId);
216 216 } catch (Exception e) {
217   - logEntityAction(emptyId(EntityType.FIRMWARE), null, null, ActionType.DELETED, e, strFirmwareId);
  217 + logEntityAction(emptyId(EntityType.OTA_PACKAGE), null, null, ActionType.DELETED, e, strOtaPackageId);
218 218 throw handleException(e);
219 219 }
220 220 }
... ...
application/src/main/java/org/thingsboard/server/service/ota/DefaultOtaPackageStateService.java renamed from application/src/main/java/org/thingsboard/server/service/firmware/DefaultFirmwareStateService.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.service.firmware;
  16 +package org.thingsboard.server.service.ota;
17 17
18 18 import com.google.common.util.concurrent.FutureCallback;
19 19 import lombok.extern.slf4j.Slf4j;
... ... @@ -23,12 +23,9 @@ import org.thingsboard.rule.engine.api.msg.DeviceAttributesEventNotificationMsg;
23 23 import org.thingsboard.server.common.data.DataConstants;
24 24 import org.thingsboard.server.common.data.Device;
25 25 import org.thingsboard.server.common.data.DeviceProfile;
26   -import org.thingsboard.server.common.data.FirmwareInfo;
27   -import org.thingsboard.server.common.data.firmware.FirmwareType;
28   -import org.thingsboard.server.common.data.firmware.FirmwareUpdateStatus;
29   -import org.thingsboard.server.common.data.firmware.FirmwareUtil;
  26 +import org.thingsboard.server.common.data.OtaPackageInfo;
30 27 import org.thingsboard.server.common.data.id.DeviceId;
31   -import org.thingsboard.server.common.data.id.FirmwareId;
  28 +import org.thingsboard.server.common.data.id.OtaPackageId;
32 29 import org.thingsboard.server.common.data.id.TenantId;
33 30 import org.thingsboard.server.common.data.kv.AttributeKey;
34 31 import org.thingsboard.server.common.data.kv.AttributeKvEntry;
... ... @@ -37,13 +34,16 @@ import org.thingsboard.server.common.data.kv.BasicTsKvEntry;
37 34 import org.thingsboard.server.common.data.kv.LongDataEntry;
38 35 import org.thingsboard.server.common.data.kv.StringDataEntry;
39 36 import org.thingsboard.server.common.data.kv.TsKvEntry;
  37 +import org.thingsboard.server.common.data.ota.OtaPackageType;
  38 +import org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus;
  39 +import org.thingsboard.server.common.data.ota.OtaPackageUtil;
40 40 import org.thingsboard.server.common.data.page.PageData;
41 41 import org.thingsboard.server.common.data.page.PageLink;
42 42 import org.thingsboard.server.common.msg.queue.TopicPartitionInfo;
43 43 import org.thingsboard.server.dao.device.DeviceProfileService;
44 44 import org.thingsboard.server.dao.device.DeviceService;
45   -import org.thingsboard.server.dao.firmware.FirmwareService;
46   -import org.thingsboard.server.gen.transport.TransportProtos.ToFirmwareStateServiceMsg;
  45 +import org.thingsboard.server.dao.ota.OtaPackageService;
  46 +import org.thingsboard.server.gen.transport.TransportProtos.ToOtaPackageStateServiceMsg;
47 47 import org.thingsboard.server.queue.TbQueueProducer;
48 48 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
49 49 import org.thingsboard.server.queue.provider.TbCoreQueueFactory;
... ... @@ -58,44 +58,43 @@ import java.util.List;
58 58 import java.util.Set;
59 59 import java.util.UUID;
60 60 import java.util.function.Consumer;
61   -import java.util.function.Function;
62   -
63   -import static org.thingsboard.server.common.data.firmware.FirmwareKey.CHECKSUM;
64   -import static org.thingsboard.server.common.data.firmware.FirmwareKey.CHECKSUM_ALGORITHM;
65   -import static org.thingsboard.server.common.data.firmware.FirmwareKey.SIZE;
66   -import static org.thingsboard.server.common.data.firmware.FirmwareKey.STATE;
67   -import static org.thingsboard.server.common.data.firmware.FirmwareKey.TITLE;
68   -import static org.thingsboard.server.common.data.firmware.FirmwareKey.TS;
69   -import static org.thingsboard.server.common.data.firmware.FirmwareKey.VERSION;
70   -import static org.thingsboard.server.common.data.firmware.FirmwareType.FIRMWARE;
71   -import static org.thingsboard.server.common.data.firmware.FirmwareType.SOFTWARE;
72   -import static org.thingsboard.server.common.data.firmware.FirmwareUtil.getAttributeKey;
73   -import static org.thingsboard.server.common.data.firmware.FirmwareUtil.getTargetTelemetryKey;
74   -import static org.thingsboard.server.common.data.firmware.FirmwareUtil.getTelemetryKey;
  61 +
  62 +import static org.thingsboard.server.common.data.ota.OtaPackageKey.CHECKSUM;
  63 +import static org.thingsboard.server.common.data.ota.OtaPackageKey.CHECKSUM_ALGORITHM;
  64 +import static org.thingsboard.server.common.data.ota.OtaPackageKey.SIZE;
  65 +import static org.thingsboard.server.common.data.ota.OtaPackageKey.STATE;
  66 +import static org.thingsboard.server.common.data.ota.OtaPackageKey.TITLE;
  67 +import static org.thingsboard.server.common.data.ota.OtaPackageKey.TS;
  68 +import static org.thingsboard.server.common.data.ota.OtaPackageKey.VERSION;
  69 +import static org.thingsboard.server.common.data.ota.OtaPackageType.FIRMWARE;
  70 +import static org.thingsboard.server.common.data.ota.OtaPackageType.SOFTWARE;
  71 +import static org.thingsboard.server.common.data.ota.OtaPackageUtil.getAttributeKey;
  72 +import static org.thingsboard.server.common.data.ota.OtaPackageUtil.getTargetTelemetryKey;
  73 +import static org.thingsboard.server.common.data.ota.OtaPackageUtil.getTelemetryKey;
75 74
76 75 @Slf4j
77 76 @Service
78 77 @TbCoreComponent
79   -public class DefaultFirmwareStateService implements FirmwareStateService {
  78 +public class DefaultOtaPackageStateService implements OtaPackageStateService {
80 79
81 80 private final TbClusterService tbClusterService;
82   - private final FirmwareService firmwareService;
  81 + private final OtaPackageService otaPackageService;
83 82 private final DeviceService deviceService;
84 83 private final DeviceProfileService deviceProfileService;
85 84 private final RuleEngineTelemetryService telemetryService;
86   - private final TbQueueProducer<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> fwStateMsgProducer;
  85 + private final TbQueueProducer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> otaPackageStateMsgProducer;
87 86
88   - public DefaultFirmwareStateService(TbClusterService tbClusterService, FirmwareService firmwareService,
89   - DeviceService deviceService,
90   - DeviceProfileService deviceProfileService,
91   - RuleEngineTelemetryService telemetryService,
92   - TbCoreQueueFactory coreQueueFactory) {
  87 + public DefaultOtaPackageStateService(TbClusterService tbClusterService, OtaPackageService otaPackageService,
  88 + DeviceService deviceService,
  89 + DeviceProfileService deviceProfileService,
  90 + RuleEngineTelemetryService telemetryService,
  91 + TbCoreQueueFactory coreQueueFactory) {
93 92 this.tbClusterService = tbClusterService;
94   - this.firmwareService = firmwareService;
  93 + this.otaPackageService = otaPackageService;
95 94 this.deviceService = deviceService;
96 95 this.deviceProfileService = deviceProfileService;
97 96 this.telemetryService = telemetryService;
98   - this.fwStateMsgProducer = coreQueueFactory.createToFirmwareStateServiceMsgProducer();
  97 + this.otaPackageStateMsgProducer = coreQueueFactory.createToOtaPackageStateServiceMsgProducer();
99 98 }
100 99
101 100 @Override
... ... @@ -105,14 +104,14 @@ public class DefaultFirmwareStateService implements FirmwareStateService {
105 104 }
106 105
107 106 private void updateFirmware(Device device, Device oldDevice) {
108   - FirmwareId newFirmwareId = device.getFirmwareId();
  107 + OtaPackageId newFirmwareId = device.getFirmwareId();
109 108 if (newFirmwareId == null) {
110 109 DeviceProfile newDeviceProfile = deviceProfileService.findDeviceProfileById(device.getTenantId(), device.getDeviceProfileId());
111 110 newFirmwareId = newDeviceProfile.getFirmwareId();
112 111 }
113 112 if (oldDevice != null) {
114 113 if (newFirmwareId != null) {
115   - FirmwareId oldFirmwareId = oldDevice.getFirmwareId();
  114 + OtaPackageId oldFirmwareId = oldDevice.getFirmwareId();
116 115 if (oldFirmwareId == null) {
117 116 DeviceProfile oldDeviceProfile = deviceProfileService.findDeviceProfileById(oldDevice.getTenantId(), oldDevice.getDeviceProfileId());
118 117 oldFirmwareId = oldDeviceProfile.getFirmwareId();
... ... @@ -132,14 +131,14 @@ public class DefaultFirmwareStateService implements FirmwareStateService {
132 131 }
133 132
134 133 private void updateSoftware(Device device, Device oldDevice) {
135   - FirmwareId newSoftwareId = device.getSoftwareId();
  134 + OtaPackageId newSoftwareId = device.getSoftwareId();
136 135 if (newSoftwareId == null) {
137 136 DeviceProfile newDeviceProfile = deviceProfileService.findDeviceProfileById(device.getTenantId(), device.getDeviceProfileId());
138 137 newSoftwareId = newDeviceProfile.getSoftwareId();
139 138 }
140 139 if (oldDevice != null) {
141 140 if (newSoftwareId != null) {
142   - FirmwareId oldSoftwareId = oldDevice.getSoftwareId();
  141 + OtaPackageId oldSoftwareId = oldDevice.getSoftwareId();
143 142 if (oldSoftwareId == null) {
144 143 DeviceProfile oldDeviceProfile = deviceProfileService.findDeviceProfileById(oldDevice.getTenantId(), oldDevice.getDeviceProfileId());
145 144 oldSoftwareId = oldDeviceProfile.getSoftwareId();
... ... @@ -170,33 +169,20 @@ public class DefaultFirmwareStateService implements FirmwareStateService {
170 169 }
171 170 }
172 171
173   - private void update(TenantId tenantId, DeviceProfile deviceProfile, FirmwareType firmwareType) {
174   - Function<PageLink, PageData<Device>> getDevicesFunction;
  172 + private void update(TenantId tenantId, DeviceProfile deviceProfile, OtaPackageType otaPackageType) {
175 173 Consumer<Device> updateConsumer;
176 174
177   - switch (firmwareType) {
178   - case FIRMWARE:
179   - getDevicesFunction = pl -> deviceService.findDevicesByTenantIdAndTypeAndEmptyFirmware(tenantId, deviceProfile.getName(), pl);
180   - break;
181   - case SOFTWARE:
182   - getDevicesFunction = pl -> deviceService.findDevicesByTenantIdAndTypeAndEmptySoftware(tenantId, deviceProfile.getName(), pl);
183   - break;
184   - default:
185   - log.warn("Unsupported firmware type: [{}]", firmwareType);
186   - return;
187   - }
188   -
189 175 if (deviceProfile.getFirmwareId() != null) {
190 176 long ts = System.currentTimeMillis();
191   - updateConsumer = d -> send(d.getTenantId(), d.getId(), deviceProfile.getFirmwareId(), ts, firmwareType);
  177 + updateConsumer = d -> send(d.getTenantId(), d.getId(), deviceProfile.getFirmwareId(), ts, otaPackageType);
192 178 } else {
193   - updateConsumer = d -> remove(d, firmwareType);
  179 + updateConsumer = d -> remove(d, otaPackageType);
194 180 }
195 181
196 182 PageLink pageLink = new PageLink(100);
197 183 PageData<Device> pageData;
198 184 do {
199   - pageData = getDevicesFunction.apply(pageLink);
  185 + pageData = deviceService.findDevicesByTenantIdAndTypeAndEmptyOtaPackage(tenantId, deviceProfile.getId(), otaPackageType, pageLink);
200 186 pageData.getData().forEach(updateConsumer);
201 187
202 188 if (pageData.hasNext()) {
... ... @@ -206,60 +192,60 @@ public class DefaultFirmwareStateService implements FirmwareStateService {
206 192 }
207 193
208 194 @Override
209   - public boolean process(ToFirmwareStateServiceMsg msg) {
  195 + public boolean process(ToOtaPackageStateServiceMsg msg) {
210 196 boolean isSuccess = false;
211   - FirmwareId targetFirmwareId = new FirmwareId(new UUID(msg.getFirmwareIdMSB(), msg.getFirmwareIdLSB()));
  197 + OtaPackageId targetOtaPackageId = new OtaPackageId(new UUID(msg.getOtaPackageIdMSB(), msg.getOtaPackageIdLSB()));
212 198 DeviceId deviceId = new DeviceId(new UUID(msg.getDeviceIdMSB(), msg.getDeviceIdLSB()));
213 199 TenantId tenantId = new TenantId(new UUID(msg.getTenantIdMSB(), msg.getTenantIdLSB()));
214   - FirmwareType firmwareType = FirmwareType.valueOf(msg.getType());
  200 + OtaPackageType firmwareType = OtaPackageType.valueOf(msg.getType());
215 201 long ts = msg.getTs();
216 202
217 203 Device device = deviceService.findDeviceById(tenantId, deviceId);
218 204 if (device == null) {
219 205 log.warn("[{}] [{}] Device was removed during firmware update msg was queued!", tenantId, deviceId);
220 206 } else {
221   - FirmwareId currentFirmwareId = FirmwareUtil.getFirmwareId(device, firmwareType);
222   - if (currentFirmwareId == null) {
  207 + OtaPackageId currentOtaPackageId = OtaPackageUtil.getOtaPackageId(device, firmwareType);
  208 + if (currentOtaPackageId == null) {
223 209 DeviceProfile deviceProfile = deviceProfileService.findDeviceProfileById(tenantId, device.getDeviceProfileId());
224   - currentFirmwareId = FirmwareUtil.getFirmwareId(deviceProfile, firmwareType);
  210 + currentOtaPackageId = OtaPackageUtil.getOtaPackageId(deviceProfile, firmwareType);
225 211 }
226 212
227   - if (targetFirmwareId.equals(currentFirmwareId)) {
228   - update(device, firmwareService.findFirmwareInfoById(device.getTenantId(), targetFirmwareId), ts);
  213 + if (targetOtaPackageId.equals(currentOtaPackageId)) {
  214 + update(device, otaPackageService.findOtaPackageInfoById(device.getTenantId(), targetOtaPackageId), ts);
229 215 isSuccess = true;
230 216 } else {
231   - log.warn("[{}] [{}] Can`t update firmware for the device, target firmwareId: [{}], current firmwareId: [{}]!", tenantId, deviceId, targetFirmwareId, currentFirmwareId);
  217 + log.warn("[{}] [{}] Can`t update firmware for the device, target firmwareId: [{}], current firmwareId: [{}]!", tenantId, deviceId, targetOtaPackageId, currentOtaPackageId);
232 218 }
233 219 }
234 220 return isSuccess;
235 221 }
236 222
237   - private void send(TenantId tenantId, DeviceId deviceId, FirmwareId firmwareId, long ts, FirmwareType firmwareType) {
238   - ToFirmwareStateServiceMsg msg = ToFirmwareStateServiceMsg.newBuilder()
  223 + private void send(TenantId tenantId, DeviceId deviceId, OtaPackageId firmwareId, long ts, OtaPackageType firmwareType) {
  224 + ToOtaPackageStateServiceMsg msg = ToOtaPackageStateServiceMsg.newBuilder()
239 225 .setTenantIdMSB(tenantId.getId().getMostSignificantBits())
240 226 .setTenantIdLSB(tenantId.getId().getLeastSignificantBits())
241 227 .setDeviceIdMSB(deviceId.getId().getMostSignificantBits())
242 228 .setDeviceIdLSB(deviceId.getId().getLeastSignificantBits())
243   - .setFirmwareIdMSB(firmwareId.getId().getMostSignificantBits())
244   - .setFirmwareIdLSB(firmwareId.getId().getLeastSignificantBits())
  229 + .setOtaPackageIdMSB(firmwareId.getId().getMostSignificantBits())
  230 + .setOtaPackageIdLSB(firmwareId.getId().getLeastSignificantBits())
245 231 .setType(firmwareType.name())
246 232 .setTs(ts)
247 233 .build();
248 234
249   - FirmwareInfo firmware = firmwareService.findFirmwareInfoById(tenantId, firmwareId);
  235 + OtaPackageInfo firmware = otaPackageService.findOtaPackageInfoById(tenantId, firmwareId);
250 236 if (firmware == null) {
251 237 log.warn("[{}] Failed to send firmware update because firmware was already deleted", firmwareId);
252 238 return;
253 239 }
254 240
255   - TopicPartitionInfo tpi = new TopicPartitionInfo(fwStateMsgProducer.getDefaultTopic(), null, null, false);
256   - fwStateMsgProducer.send(tpi, new TbProtoQueueMsg<>(UUID.randomUUID(), msg), null);
  241 + TopicPartitionInfo tpi = new TopicPartitionInfo(otaPackageStateMsgProducer.getDefaultTopic(), null, null, false);
  242 + otaPackageStateMsgProducer.send(tpi, new TbProtoQueueMsg<>(UUID.randomUUID(), msg), null);
257 243
258 244 List<TsKvEntry> telemetry = new ArrayList<>();
259 245 telemetry.add(new BasicTsKvEntry(ts, new StringDataEntry(getTargetTelemetryKey(firmware.getType(), TITLE), firmware.getTitle())));
260 246 telemetry.add(new BasicTsKvEntry(ts, new StringDataEntry(getTargetTelemetryKey(firmware.getType(), VERSION), firmware.getVersion())));
261 247 telemetry.add(new BasicTsKvEntry(ts, new LongDataEntry(getTargetTelemetryKey(firmware.getType(), TS), ts)));
262   - telemetry.add(new BasicTsKvEntry(ts, new StringDataEntry(getTelemetryKey(firmware.getType(), STATE), FirmwareUpdateStatus.QUEUED.name())));
  248 + telemetry.add(new BasicTsKvEntry(ts, new StringDataEntry(getTelemetryKey(firmware.getType(), STATE), OtaPackageUpdateStatus.QUEUED.name())));
263 249
264 250 telemetryService.saveAndNotify(tenantId, deviceId, telemetry, new FutureCallback<>() {
265 251 @Override
... ... @@ -275,11 +261,11 @@ public class DefaultFirmwareStateService implements FirmwareStateService {
275 261 }
276 262
277 263
278   - private void update(Device device, FirmwareInfo firmware, long ts) {
  264 + private void update(Device device, OtaPackageInfo firmware, long ts) {
279 265 TenantId tenantId = device.getTenantId();
280 266 DeviceId deviceId = device.getId();
281 267
282   - BasicTsKvEntry status = new BasicTsKvEntry(System.currentTimeMillis(), new StringDataEntry(getTelemetryKey(firmware.getType(), STATE), FirmwareUpdateStatus.INITIATED.name()));
  268 + BasicTsKvEntry status = new BasicTsKvEntry(System.currentTimeMillis(), new StringDataEntry(getTelemetryKey(firmware.getType(), STATE), OtaPackageUpdateStatus.INITIATED.name()));
283 269
284 270 telemetryService.saveAndNotify(tenantId, deviceId, Collections.singletonList(status), new FutureCallback<>() {
285 271 @Override
... ... @@ -313,14 +299,14 @@ public class DefaultFirmwareStateService implements FirmwareStateService {
313 299 });
314 300 }
315 301
316   - private void remove(Device device, FirmwareType firmwareType) {
317   - telemetryService.deleteAndNotify(device.getTenantId(), device.getId(), DataConstants.SHARED_SCOPE, FirmwareUtil.getAttributeKeys(firmwareType),
  302 + private void remove(Device device, OtaPackageType firmwareType) {
  303 + telemetryService.deleteAndNotify(device.getTenantId(), device.getId(), DataConstants.SHARED_SCOPE, OtaPackageUtil.getAttributeKeys(firmwareType),
318 304 new FutureCallback<>() {
319 305 @Override
320 306 public void onSuccess(@Nullable Void tmp) {
321 307 log.trace("[{}] Success remove target firmware attributes!", device.getId());
322 308 Set<AttributeKey> keysToNotify = new HashSet<>();
323   - FirmwareUtil.ALL_FW_ATTRIBUTE_KEYS.forEach(key -> keysToNotify.add(new AttributeKey(DataConstants.SHARED_SCOPE, key)));
  309 + OtaPackageUtil.ALL_FW_ATTRIBUTE_KEYS.forEach(key -> keysToNotify.add(new AttributeKey(DataConstants.SHARED_SCOPE, key)));
324 310 tbClusterService.pushMsgToCore(DeviceAttributesEventNotificationMsg.onDelete(device.getTenantId(), device.getId(), keysToNotify), null);
325 311 }
326 312
... ...
application/src/main/java/org/thingsboard/server/service/ota/OtaPackageStateService.java renamed from application/src/main/java/org/thingsboard/server/service/firmware/FirmwareStateService.java
... ... @@ -13,18 +13,18 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.service.firmware;
  16 +package org.thingsboard.server.service.ota;
17 17
18 18 import org.thingsboard.server.common.data.Device;
19 19 import org.thingsboard.server.common.data.DeviceProfile;
20   -import org.thingsboard.server.gen.transport.TransportProtos.ToFirmwareStateServiceMsg;
  20 +import org.thingsboard.server.gen.transport.TransportProtos.ToOtaPackageStateServiceMsg;
21 21
22   -public interface FirmwareStateService {
  22 +public interface OtaPackageStateService {
23 23
24 24 void update(Device device, Device oldDevice);
25 25
26 26 void update(DeviceProfile deviceProfile, boolean isFirmwareChanged, boolean isSoftwareChanged);
27 27
28   - boolean process(ToFirmwareStateServiceMsg msg);
  28 + boolean process(ToOtaPackageStateServiceMsg msg);
29 29
30 30 }
... ...
... ... @@ -50,7 +50,7 @@ import org.thingsboard.server.gen.transport.TransportProtos.TbSubscriptionCloseP
50 50 import org.thingsboard.server.gen.transport.TransportProtos.TbTimeSeriesUpdateProto;
51 51 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
52 52 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
53   -import org.thingsboard.server.gen.transport.TransportProtos.ToFirmwareStateServiceMsg;
  53 +import org.thingsboard.server.gen.transport.TransportProtos.ToOtaPackageStateServiceMsg;
54 54 import org.thingsboard.server.gen.transport.TransportProtos.ToUsageStatsServiceMsg;
55 55 import org.thingsboard.server.gen.transport.TransportProtos.TransportToDeviceActorMsg;
56 56 import org.thingsboard.server.queue.TbQueueConsumer;
... ... @@ -60,7 +60,7 @@ import org.thingsboard.server.queue.provider.TbCoreQueueFactory;
60 60 import org.thingsboard.server.queue.util.TbCoreComponent;
61 61 import org.thingsboard.server.service.apiusage.TbApiUsageStateService;
62 62 import org.thingsboard.server.service.edge.EdgeNotificationService;
63   -import org.thingsboard.server.service.firmware.FirmwareStateService;
  63 +import org.thingsboard.server.service.ota.OtaPackageStateService;
64 64 import org.thingsboard.server.service.profile.TbDeviceProfileCache;
65 65 import org.thingsboard.server.service.queue.processing.AbstractConsumerService;
66 66 import org.thingsboard.server.service.queue.processing.IdMsgPair;
... ... @@ -75,7 +75,6 @@ import org.thingsboard.server.service.transport.msg.TransportToDeviceActorMsgWra
75 75
76 76 import javax.annotation.PostConstruct;
77 77 import javax.annotation.PreDestroy;
78   -import java.util.ArrayList;
79 78 import java.util.List;
80 79 import java.util.Optional;
81 80 import java.util.UUID;
... ... @@ -101,9 +100,9 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCore
101 100 @Value("${queue.core.stats.enabled:false}")
102 101 private boolean statsEnabled;
103 102
104   - @Value("${queue.core.firmware.pack-interval-ms:60000}")
  103 + @Value("${queue.core.ota.pack-interval-ms:60000}")
105 104 private long firmwarePackInterval;
106   - @Value("${queue.core.firmware.pack-size:100}")
  105 + @Value("${queue.core.ota.pack-size:100}")
107 106 private int firmwarePackSize;
108 107
109 108 private final TbQueueConsumer<TbProtoQueueMsg<ToCoreMsg>> mainConsumer;
... ... @@ -113,10 +112,10 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCore
113 112 private final SubscriptionManagerService subscriptionManagerService;
114 113 private final TbCoreDeviceRpcService tbCoreDeviceRpcService;
115 114 private final EdgeNotificationService edgeNotificationService;
116   - private final FirmwareStateService firmwareStateService;
  115 + private final OtaPackageStateService firmwareStateService;
117 116 private final TbCoreConsumerStats stats;
118 117 protected final TbQueueConsumer<TbProtoQueueMsg<ToUsageStatsServiceMsg>> usageStatsConsumer;
119   - private final TbQueueConsumer<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> firmwareStatesConsumer;
  118 + private final TbQueueConsumer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> firmwareStatesConsumer;
120 119
121 120 protected volatile ExecutorService usageStatsExecutor;
122 121
... ... @@ -135,11 +134,11 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCore
135 134 TbTenantProfileCache tenantProfileCache,
136 135 TbApiUsageStateService apiUsageStateService,
137 136 EdgeNotificationService edgeNotificationService,
138   - FirmwareStateService firmwareStateService) {
  137 + OtaPackageStateService firmwareStateService) {
139 138 super(actorContext, encodingService, tenantProfileCache, deviceProfileCache, apiUsageStateService, tbCoreQueueFactory.createToCoreNotificationsMsgConsumer());
140 139 this.mainConsumer = tbCoreQueueFactory.createToCoreMsgConsumer();
141 140 this.usageStatsConsumer = tbCoreQueueFactory.createToUsageStatsServiceMsgConsumer();
142   - this.firmwareStatesConsumer = tbCoreQueueFactory.createToFirmwareStateServiceMsgConsumer();
  141 + this.firmwareStatesConsumer = tbCoreQueueFactory.createToOtaPackageStateServiceMsgConsumer();
143 142 this.stateService = stateService;
144 143 this.localSubscriptionService = localSubscriptionService;
145 144 this.subscriptionManagerService = subscriptionManagerService;
... ... @@ -173,7 +172,7 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCore
173 172 public void onApplicationEvent(ApplicationReadyEvent event) {
174 173 super.onApplicationEvent(event);
175 174 launchUsageStatsConsumer();
176   - launchFirmwareUpdateNotificationConsumer();
  175 + launchOtaPackageUpdateNotificationConsumer();
177 176 }
178 177
179 178 @Override
... ... @@ -361,20 +360,20 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCore
361 360 });
362 361 }
363 362
364   - private void launchFirmwareUpdateNotificationConsumer() {
  363 + private void launchOtaPackageUpdateNotificationConsumer() {
365 364 long maxProcessingTimeoutPerRecord = firmwarePackInterval / firmwarePackSize;
366 365 firmwareStatesExecutor.submit(() -> {
367 366 while (!stopped) {
368 367 try {
369   - List<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> msgs = firmwareStatesConsumer.poll(getNotificationPollDuration());
  368 + List<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> msgs = firmwareStatesConsumer.poll(getNotificationPollDuration());
370 369 if (msgs.isEmpty()) {
371 370 continue;
372 371 }
373 372 long timeToSleep = maxProcessingTimeoutPerRecord;
374   - for (TbProtoQueueMsg<ToFirmwareStateServiceMsg> msg : msgs) {
  373 + for (TbProtoQueueMsg<ToOtaPackageStateServiceMsg> msg : msgs) {
375 374 try {
376 375 long startTime = System.currentTimeMillis();
377   - boolean isSuccessUpdate = handleFirmwareUpdates(msg);
  376 + boolean isSuccessUpdate = handleOtaPackageUpdates(msg);
378 377 long endTime = System.currentTimeMillis();
379 378 long spentTime = endTime - startTime;
380 379 timeToSleep = timeToSleep - spentTime;
... ... @@ -402,7 +401,7 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCore
402 401 }
403 402 }
404 403 }
405   - log.info("TB Firmware States Consumer stopped.");
  404 + log.info("TB Ota Package States Consumer stopped.");
406 405 });
407 406 }
408 407
... ... @@ -410,7 +409,7 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCore
410 409 statsService.process(msg, callback);
411 410 }
412 411
413   - private boolean handleFirmwareUpdates(TbProtoQueueMsg<ToFirmwareStateServiceMsg> msg) {
  412 + private boolean handleOtaPackageUpdates(TbProtoQueueMsg<ToOtaPackageStateServiceMsg> msg) {
414 413 return firmwareStateService.process(msg.getValue());
415 414 }
416 415
... ...
... ... @@ -30,7 +30,7 @@ import org.thingsboard.server.common.data.Customer;
30 30 import org.thingsboard.server.common.data.Device;
31 31 import org.thingsboard.server.common.data.DeviceProfile;
32 32 import org.thingsboard.server.common.data.EntityView;
33   -import org.thingsboard.server.common.data.FirmwareInfo;
  33 +import org.thingsboard.server.common.data.OtaPackageInfo;
34 34 import org.thingsboard.server.common.data.TbResourceInfo;
35 35 import org.thingsboard.server.common.data.Tenant;
36 36 import org.thingsboard.server.common.data.User;
... ... @@ -46,7 +46,7 @@ import org.thingsboard.server.common.data.id.EdgeId;
46 46 import org.thingsboard.server.common.data.id.EntityId;
47 47 import org.thingsboard.server.common.data.id.EntityIdFactory;
48 48 import org.thingsboard.server.common.data.id.EntityViewId;
49   -import org.thingsboard.server.common.data.id.FirmwareId;
  49 +import org.thingsboard.server.common.data.id.OtaPackageId;
50 50 import org.thingsboard.server.common.data.id.RuleChainId;
51 51 import org.thingsboard.server.common.data.id.RuleNodeId;
52 52 import org.thingsboard.server.common.data.id.TbResourceId;
... ... @@ -63,7 +63,7 @@ import org.thingsboard.server.dao.device.DeviceService;
63 63 import org.thingsboard.server.dao.edge.EdgeService;
64 64 import org.thingsboard.server.dao.entityview.EntityViewService;
65 65 import org.thingsboard.server.dao.exception.IncorrectParameterException;
66   -import org.thingsboard.server.dao.firmware.FirmwareService;
  66 +import org.thingsboard.server.dao.ota.OtaPackageService;
67 67 import org.thingsboard.server.dao.resource.ResourceService;
68 68 import org.thingsboard.server.dao.rule.RuleChainService;
69 69 import org.thingsboard.server.dao.tenant.TenantService;
... ... @@ -135,7 +135,7 @@ public class AccessValidator {
135 135 protected ResourceService resourceService;
136 136
137 137 @Autowired
138   - protected FirmwareService firmwareService;
  138 + protected OtaPackageService otaPackageService;
139 139
140 140 private ExecutorService executor;
141 141
... ... @@ -232,8 +232,8 @@ public class AccessValidator {
232 232 case TB_RESOURCE:
233 233 validateResource(currentUser, operation, entityId, callback);
234 234 return;
235   - case FIRMWARE:
236   - validateFirmware(currentUser, operation, entityId, callback);
  235 + case OTA_PACKAGE:
  236 + validateOtaPackage(currentUser, operation, entityId, callback);
237 237 return;
238 238 default:
239 239 //TODO: add support of other entities
... ... @@ -300,20 +300,20 @@ public class AccessValidator {
300 300 }
301 301 }
302 302
303   - private void validateFirmware(final SecurityUser currentUser, Operation operation, EntityId entityId, FutureCallback<ValidationResult> callback) {
  303 + private void validateOtaPackage(final SecurityUser currentUser, Operation operation, EntityId entityId, FutureCallback<ValidationResult> callback) {
304 304 if (currentUser.isSystemAdmin()) {
305 305 callback.onSuccess(ValidationResult.accessDenied(SYSTEM_ADMINISTRATOR_IS_NOT_ALLOWED_TO_PERFORM_THIS_OPERATION));
306 306 } else {
307   - FirmwareInfo firmware = firmwareService.findFirmwareInfoById(currentUser.getTenantId(), new FirmwareId(entityId.getId()));
308   - if (firmware == null) {
309   - callback.onSuccess(ValidationResult.entityNotFound("Firmware with requested id wasn't found!"));
  307 + OtaPackageInfo otaPackage = otaPackageService.findOtaPackageInfoById(currentUser.getTenantId(), new OtaPackageId(entityId.getId()));
  308 + if (otaPackage == null) {
  309 + callback.onSuccess(ValidationResult.entityNotFound("OtaPackage with requested id wasn't found!"));
310 310 } else {
311 311 try {
312   - accessControlService.checkPermission(currentUser, Resource.FIRMWARE, operation, entityId, firmware);
  312 + accessControlService.checkPermission(currentUser, Resource.OTA_PACKAGE, operation, entityId, otaPackage);
313 313 } catch (ThingsboardException e) {
314 314 callback.onSuccess(ValidationResult.accessDenied(e.getMessage()));
315 315 }
316   - callback.onSuccess(ValidationResult.ok(firmware));
  316 + callback.onSuccess(ValidationResult.ok(otaPackage));
317 317 }
318 318 }
319 319 }
... ...
... ... @@ -38,7 +38,7 @@ public enum Resource {
38 38 DEVICE_PROFILE(EntityType.DEVICE_PROFILE),
39 39 API_USAGE_STATE(EntityType.API_USAGE_STATE),
40 40 TB_RESOURCE(EntityType.TB_RESOURCE),
41   - FIRMWARE(EntityType.FIRMWARE),
  41 + OTA_PACKAGE(EntityType.OTA_PACKAGE),
42 42 EDGE(EntityType.EDGE);
43 43
44 44 private final EntityType entityType;
... ...
... ... @@ -42,7 +42,7 @@ public class TenantAdminPermissions extends AbstractPermissions {
42 42 put(Resource.DEVICE_PROFILE, tenantEntityPermissionChecker);
43 43 put(Resource.API_USAGE_STATE, tenantEntityPermissionChecker);
44 44 put(Resource.TB_RESOURCE, tbResourcePermissionChecker);
45   - put(Resource.FIRMWARE, tenantEntityPermissionChecker);
  45 + put(Resource.OTA_PACKAGE, tenantEntityPermissionChecker);
46 46 put(Resource.EDGE, tenantEntityPermissionChecker);
47 47 }
48 48
... ...
... ... @@ -26,27 +26,27 @@ import lombok.extern.slf4j.Slf4j;
26 26 import org.springframework.stereotype.Service;
27 27 import org.springframework.util.StringUtils;
28 28 import org.thingsboard.common.util.JacksonUtil;
29   -import org.thingsboard.server.cache.firmware.FirmwareDataCache;
  29 +import org.thingsboard.server.cache.ota.OtaPackageDataCache;
30 30 import org.thingsboard.server.common.data.ApiUsageState;
31 31 import org.thingsboard.server.common.data.DataConstants;
32 32 import org.thingsboard.server.common.data.Device;
33 33 import org.thingsboard.server.common.data.DeviceProfile;
34 34 import org.thingsboard.server.common.data.DeviceTransportType;
35 35 import org.thingsboard.server.common.data.EntityType;
36   -import org.thingsboard.server.common.data.Firmware;
37   -import org.thingsboard.server.common.data.FirmwareInfo;
  36 +import org.thingsboard.server.common.data.OtaPackage;
  37 +import org.thingsboard.server.common.data.OtaPackageInfo;
38 38 import org.thingsboard.server.common.data.ResourceType;
39 39 import org.thingsboard.server.common.data.TbResource;
40 40 import org.thingsboard.server.common.data.TenantProfile;
41 41 import org.thingsboard.server.common.data.device.credentials.BasicMqttCredentials;
42 42 import org.thingsboard.server.common.data.device.credentials.ProvisionDeviceCredentialsData;
43 43 import org.thingsboard.server.common.data.device.profile.ProvisionDeviceProfileCredentials;
44   -import org.thingsboard.server.common.data.firmware.FirmwareType;
45   -import org.thingsboard.server.common.data.firmware.FirmwareUtil;
  44 +import org.thingsboard.server.common.data.ota.OtaPackageType;
  45 +import org.thingsboard.server.common.data.ota.OtaPackageUtil;
46 46 import org.thingsboard.server.common.data.id.CustomerId;
47 47 import org.thingsboard.server.common.data.id.DeviceId;
48 48 import org.thingsboard.server.common.data.id.DeviceProfileId;
49   -import org.thingsboard.server.common.data.id.FirmwareId;
  49 +import org.thingsboard.server.common.data.id.OtaPackageId;
50 50 import org.thingsboard.server.common.data.id.TenantId;
51 51 import org.thingsboard.server.common.data.page.PageData;
52 52 import org.thingsboard.server.common.data.page.PageLink;
... ... @@ -64,7 +64,7 @@ import org.thingsboard.server.dao.device.DeviceService;
64 64 import org.thingsboard.server.dao.device.provision.ProvisionFailedException;
65 65 import org.thingsboard.server.dao.device.provision.ProvisionRequest;
66 66 import org.thingsboard.server.dao.device.provision.ProvisionResponse;
67   -import org.thingsboard.server.dao.firmware.FirmwareService;
  67 +import org.thingsboard.server.dao.ota.OtaPackageService;
68 68 import org.thingsboard.server.dao.relation.RelationService;
69 69 import org.thingsboard.server.dao.tenant.TbTenantProfileCache;
70 70 import org.thingsboard.server.gen.transport.TransportProtos;
... ... @@ -124,8 +124,8 @@ public class DefaultTransportApiService implements TransportApiService {
124 124 private final DataDecodingEncodingService dataDecodingEncodingService;
125 125 private final DeviceProvisionService deviceProvisionService;
126 126 private final TbResourceService resourceService;
127   - private final FirmwareService firmwareService;
128   - private final FirmwareDataCache firmwareDataCache;
  127 + private final OtaPackageService otaPackageService;
  128 + private final OtaPackageDataCache otaPackageDataCache;
129 129
130 130 private final ConcurrentMap<String, ReentrantLock> deviceCreationLocks = new ConcurrentHashMap<>();
131 131
... ... @@ -134,7 +134,7 @@ public class DefaultTransportApiService implements TransportApiService {
134 134 RelationService relationService, DeviceCredentialsService deviceCredentialsService,
135 135 DeviceStateService deviceStateService, DbCallbackExecutorService dbCallbackExecutorService,
136 136 TbClusterService tbClusterService, DataDecodingEncodingService dataDecodingEncodingService,
137   - DeviceProvisionService deviceProvisionService, TbResourceService resourceService, FirmwareService firmwareService, FirmwareDataCache firmwareDataCache) {
  137 + DeviceProvisionService deviceProvisionService, TbResourceService resourceService, OtaPackageService otaPackageService, OtaPackageDataCache otaPackageDataCache) {
138 138 this.deviceProfileCache = deviceProfileCache;
139 139 this.tenantProfileCache = tenantProfileCache;
140 140 this.apiUsageStateService = apiUsageStateService;
... ... @@ -147,8 +147,8 @@ public class DefaultTransportApiService implements TransportApiService {
147 147 this.dataDecodingEncodingService = dataDecodingEncodingService;
148 148 this.deviceProvisionService = deviceProvisionService;
149 149 this.resourceService = resourceService;
150   - this.firmwareService = firmwareService;
151   - this.firmwareDataCache = firmwareDataCache;
  150 + this.otaPackageService = otaPackageService;
  151 + this.otaPackageDataCache = otaPackageDataCache;
152 152 }
153 153
154 154 @Override
... ... @@ -184,8 +184,8 @@ public class DefaultTransportApiService implements TransportApiService {
184 184 result = handle(transportApiRequestMsg.getDeviceRequestMsg());
185 185 } else if (transportApiRequestMsg.hasDeviceCredentialsRequestMsg()) {
186 186 result = handle(transportApiRequestMsg.getDeviceCredentialsRequestMsg());
187   - } else if (transportApiRequestMsg.hasFirmwareRequestMsg()) {
188   - result = handle(transportApiRequestMsg.getFirmwareRequestMsg());
  187 + } else if (transportApiRequestMsg.hasOtaPackageRequestMsg()) {
  188 + result = handle(transportApiRequestMsg.getOtaPackageRequestMsg());
189 189 }
190 190
191 191 return Futures.transform(Optional.ofNullable(result).orElseGet(this::getEmptyTransportApiResponseFuture),
... ... @@ -511,50 +511,50 @@ public class DefaultTransportApiService implements TransportApiService {
511 511 }
512 512 }
513 513
514   - private ListenableFuture<TransportApiResponseMsg> handle(TransportProtos.GetFirmwareRequestMsg requestMsg) {
  514 + private ListenableFuture<TransportApiResponseMsg> handle(TransportProtos.GetOtaPackageRequestMsg requestMsg) {
515 515 TenantId tenantId = new TenantId(new UUID(requestMsg.getTenantIdMSB(), requestMsg.getTenantIdLSB()));
516 516 DeviceId deviceId = new DeviceId(new UUID(requestMsg.getDeviceIdMSB(), requestMsg.getDeviceIdLSB()));
517   - FirmwareType firmwareType = FirmwareType.valueOf(requestMsg.getType());
  517 + OtaPackageType otaPackageType = OtaPackageType.valueOf(requestMsg.getType());
518 518 Device device = deviceService.findDeviceById(tenantId, deviceId);
519 519
520 520 if (device == null) {
521 521 return getEmptyTransportApiResponseFuture();
522 522 }
523 523
524   - FirmwareId firmwareId = FirmwareUtil.getFirmwareId(device, firmwareType);
525   - if (firmwareId == null) {
  524 + OtaPackageId otaPackageId = OtaPackageUtil.getOtaPackageId(device, otaPackageType);
  525 + if (otaPackageId == null) {
526 526 DeviceProfile deviceProfile = deviceProfileCache.find(device.getDeviceProfileId());
527   - firmwareId = FirmwareUtil.getFirmwareId(deviceProfile, firmwareType);
  527 + otaPackageId = OtaPackageUtil.getOtaPackageId(deviceProfile, otaPackageType);
528 528 }
529 529
530   - TransportProtos.GetFirmwareResponseMsg.Builder builder = TransportProtos.GetFirmwareResponseMsg.newBuilder();
  530 + TransportProtos.GetOtaPackageResponseMsg.Builder builder = TransportProtos.GetOtaPackageResponseMsg.newBuilder();
531 531
532   - if (firmwareId == null) {
  532 + if (otaPackageId == null) {
533 533 builder.setResponseStatus(TransportProtos.ResponseStatus.NOT_FOUND);
534 534 } else {
535   - FirmwareInfo firmwareInfo = firmwareService.findFirmwareInfoById(tenantId, firmwareId);
  535 + OtaPackageInfo otaPackageInfo = otaPackageService.findOtaPackageInfoById(tenantId, otaPackageId);
536 536
537   - if (firmwareInfo == null) {
  537 + if (otaPackageInfo == null) {
538 538 builder.setResponseStatus(TransportProtos.ResponseStatus.NOT_FOUND);
539 539 } else {
540 540 builder.setResponseStatus(TransportProtos.ResponseStatus.SUCCESS);
541   - builder.setFirmwareIdMSB(firmwareId.getId().getMostSignificantBits());
542   - builder.setFirmwareIdLSB(firmwareId.getId().getLeastSignificantBits());
543   - builder.setType(firmwareInfo.getType().name());
544   - builder.setTitle(firmwareInfo.getTitle());
545   - builder.setVersion(firmwareInfo.getVersion());
546   - builder.setFileName(firmwareInfo.getFileName());
547   - builder.setContentType(firmwareInfo.getContentType());
548   - if (!firmwareDataCache.has(firmwareId.toString())) {
549   - Firmware firmware = firmwareService.findFirmwareById(tenantId, firmwareId);
550   - firmwareDataCache.put(firmwareId.toString(), firmware.getData().array());
  541 + builder.setOtaPackageIdMSB(otaPackageId.getId().getMostSignificantBits());
  542 + builder.setOtaPackageIdLSB(otaPackageId.getId().getLeastSignificantBits());
  543 + builder.setType(otaPackageInfo.getType().name());
  544 + builder.setTitle(otaPackageInfo.getTitle());
  545 + builder.setVersion(otaPackageInfo.getVersion());
  546 + builder.setFileName(otaPackageInfo.getFileName());
  547 + builder.setContentType(otaPackageInfo.getContentType());
  548 + if (!otaPackageDataCache.has(otaPackageId.toString())) {
  549 + OtaPackage otaPackage = otaPackageService.findOtaPackageById(tenantId, otaPackageId);
  550 + otaPackageDataCache.put(otaPackageId.toString(), otaPackage.getData().array());
551 551 }
552 552 }
553 553 }
554 554
555 555 return Futures.immediateFuture(
556 556 TransportApiResponseMsg.newBuilder()
557   - .setFirmwareResponseMsg(builder.build())
  557 + .setOtaPackageResponseMsg(builder.build())
558 558 .build());
559 559 }
560 560
... ...
... ... @@ -371,7 +371,10 @@ caffeine:
371 371 tokensOutdatageTime:
372 372 timeToLiveInMinutes: 20000
373 373 maxSize: 10000
374   - firmwares:
  374 + otaPackages:
  375 + timeToLiveInMinutes: 60
  376 + maxSize: 10
  377 + otaPackagesData:
375 378 timeToLiveInMinutes: 60
376 379 maxSize: 10
377 380 edges:
... ... @@ -497,7 +500,7 @@ audit-log:
497 500 "device_profile": "${AUDIT_LOG_MASK_DEVICE_PROFILE:W}"
498 501 "edge": "${AUDIT_LOG_MASK_EDGE:W}"
499 502 "tb_resource": "${AUDIT_LOG_MASK_RESOURCE:W}"
500   - "firmware": "${AUDIT_LOG_MASK_FIRMWARE:W}"
  503 + "ota_package": "${AUDIT_LOG_MASK_OTA_PACKAGE:W}"
501 504 sink:
502 505 # Type of external sink. possible options: none, elasticsearch
503 506 type: "${AUDIT_LOG_SINK_TYPE:none}"
... ... @@ -749,7 +752,7 @@ queue:
749 752 sasl.config: "${TB_QUEUE_KAFKA_CONFLUENT_SASL_JAAS_CONFIG:org.apache.kafka.common.security.plain.PlainLoginModule required username=\"CLUSTER_API_KEY\" password=\"CLUSTER_API_SECRET\";}"
750 753 security.protocol: "${TB_QUEUE_KAFKA_CONFLUENT_SECURITY_PROTOCOL:SASL_SSL}"
751 754 consumer-properties-per-topic:
752   - tb_firmware:
  755 + tb_ota_package:
753 756 - key: max.poll.records
754 757 value: 10
755 758 other:
... ... @@ -759,7 +762,7 @@ queue:
759 762 transport-api: "${TB_QUEUE_KAFKA_TA_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:26214400;retention.bytes:1048576000;partitions:1;min.insync.replicas:1}"
760 763 notifications: "${TB_QUEUE_KAFKA_NOTIFICATIONS_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:26214400;retention.bytes:1048576000;partitions:1;min.insync.replicas:1}"
761 764 js-executor: "${TB_QUEUE_KAFKA_JE_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:26214400;retention.bytes:104857600;partitions:100;min.insync.replicas:1}"
762   - fw-updates: "${TB_QUEUE_KAFKA_FW_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:26214400;retention.bytes:1048576000;partitions:10;min.insync.replicas:1}"
  765 + ota-updates: "${TB_QUEUE_KAFKA_OTA_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:26214400;retention.bytes:1048576000;partitions:10;min.insync.replicas:1}"
763 766 consumer-stats:
764 767 enabled: "${TB_QUEUE_KAFKA_CONSUMER_STATS_ENABLED:true}"
765 768 print-interval-ms: "${TB_QUEUE_KAFKA_CONSUMER_STATS_MIN_PRINT_INTERVAL_MS:60000}"
... ... @@ -830,10 +833,10 @@ queue:
830 833 poll-interval: "${TB_QUEUE_CORE_POLL_INTERVAL_MS:25}"
831 834 partitions: "${TB_QUEUE_CORE_PARTITIONS:10}"
832 835 pack-processing-timeout: "${TB_QUEUE_CORE_PACK_PROCESSING_TIMEOUT_MS:2000}"
833   - firmware:
834   - topic: "${TB_QUEUE_CORE_FW_TOPIC:tb_firmware}"
835   - pack-interval-ms: "${TB_QUEUE_CORE_FW_PACK_INTERVAL_MS:60000}"
836   - pack-size: "${TB_QUEUE_CORE_FW_PACK_SIZE:100}"
  836 + ota:
  837 + topic: "${TB_QUEUE_CORE_OTA_TOPIC:tb_ota_package}"
  838 + pack-interval-ms: "${TB_QUEUE_CORE_OTA_PACK_INTERVAL_MS:60000}"
  839 + pack-size: "${TB_QUEUE_CORE_OTA_PACK_SIZE:100}"
837 840 usage-stats-topic: "${TB_QUEUE_US_TOPIC:tb_usage_stats}"
838 841 stats:
839 842 enabled: "${TB_QUEUE_CORE_STATS_ENABLED:true}"
... ...
application/src/test/java/org/thingsboard/server/controller/BaseOtaPackageControllerTest.java renamed from application/src/test/java/org/thingsboard/server/controller/BaseFirmwareControllerTest.java
... ... @@ -25,11 +25,10 @@ import org.springframework.test.web.servlet.request.MockMultipartHttpServletRequ
25 25 import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
26 26 import org.thingsboard.common.util.JacksonUtil;
27 27 import org.thingsboard.server.common.data.DeviceProfile;
28   -import org.thingsboard.server.common.data.Firmware;
29   -import org.thingsboard.server.common.data.FirmwareInfo;
  28 +import org.thingsboard.server.common.data.OtaPackage;
  29 +import org.thingsboard.server.common.data.OtaPackageInfo;
30 30 import org.thingsboard.server.common.data.Tenant;
31 31 import org.thingsboard.server.common.data.User;
32   -import org.thingsboard.server.common.data.firmware.FirmwareType;
33 32 import org.thingsboard.server.common.data.id.DeviceProfileId;
34 33 import org.thingsboard.server.common.data.page.PageData;
35 34 import org.thingsboard.server.common.data.page.PageLink;
... ... @@ -41,11 +40,11 @@ import java.util.Collections;
41 40 import java.util.List;
42 41
43 42 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
44   -import static org.thingsboard.server.common.data.firmware.FirmwareType.FIRMWARE;
  43 +import static org.thingsboard.server.common.data.ota.OtaPackageType.FIRMWARE;
45 44
46   -public abstract class BaseFirmwareControllerTest extends AbstractControllerTest {
  45 +public abstract class BaseOtaPackageControllerTest extends AbstractControllerTest {
47 46
48   - private IdComparator<FirmwareInfo> idComparator = new IdComparator<>();
  47 + private IdComparator<OtaPackageInfo> idComparator = new IdComparator<>();
49 48
50 49 public static final String TITLE = "My firmware";
51 50 private static final String FILE_NAME = "filename.txt";
... ... @@ -93,13 +92,13 @@ public abstract class BaseFirmwareControllerTest extends AbstractControllerTest
93 92
94 93 @Test
95 94 public void testSaveFirmware() throws Exception {
96   - FirmwareInfo firmwareInfo = new FirmwareInfo();
  95 + OtaPackageInfo firmwareInfo = new OtaPackageInfo();
97 96 firmwareInfo.setDeviceProfileId(deviceProfileId);
98 97 firmwareInfo.setType(FIRMWARE);
99 98 firmwareInfo.setTitle(TITLE);
100 99 firmwareInfo.setVersion(VERSION);
101 100
102   - FirmwareInfo savedFirmwareInfo = save(firmwareInfo);
  101 + OtaPackageInfo savedFirmwareInfo = save(firmwareInfo);
103 102
104 103 Assert.assertNotNull(savedFirmwareInfo);
105 104 Assert.assertNotNull(savedFirmwareInfo.getId());
... ... @@ -112,19 +111,19 @@ public abstract class BaseFirmwareControllerTest extends AbstractControllerTest
112 111
113 112 save(savedFirmwareInfo);
114 113
115   - FirmwareInfo foundFirmwareInfo = doGet("/api/firmware/info/" + savedFirmwareInfo.getId().getId().toString(), FirmwareInfo.class);
  114 + OtaPackageInfo foundFirmwareInfo = doGet("/api/otaPackage/info/" + savedFirmwareInfo.getId().getId().toString(), OtaPackageInfo.class);
116 115 Assert.assertEquals(foundFirmwareInfo.getTitle(), savedFirmwareInfo.getTitle());
117 116 }
118 117
119 118 @Test
120 119 public void testSaveFirmwareData() throws Exception {
121   - FirmwareInfo firmwareInfo = new FirmwareInfo();
  120 + OtaPackageInfo firmwareInfo = new OtaPackageInfo();
122 121 firmwareInfo.setDeviceProfileId(deviceProfileId);
123 122 firmwareInfo.setType(FIRMWARE);
124 123 firmwareInfo.setTitle(TITLE);
125 124 firmwareInfo.setVersion(VERSION);
126 125
127   - FirmwareInfo savedFirmwareInfo = save(firmwareInfo);
  126 + OtaPackageInfo savedFirmwareInfo = save(firmwareInfo);
128 127
129 128 Assert.assertNotNull(savedFirmwareInfo);
130 129 Assert.assertNotNull(savedFirmwareInfo.getId());
... ... @@ -137,12 +136,12 @@ public abstract class BaseFirmwareControllerTest extends AbstractControllerTest
137 136
138 137 save(savedFirmwareInfo);
139 138
140   - FirmwareInfo foundFirmwareInfo = doGet("/api/firmware/info/" + savedFirmwareInfo.getId().getId().toString(), FirmwareInfo.class);
  139 + OtaPackageInfo foundFirmwareInfo = doGet("/api/otaPackage/info/" + savedFirmwareInfo.getId().getId().toString(), OtaPackageInfo.class);
141 140 Assert.assertEquals(foundFirmwareInfo.getTitle(), savedFirmwareInfo.getTitle());
142 141
143 142 MockMultipartFile testData = new MockMultipartFile("file", FILE_NAME, CONTENT_TYPE, DATA.array());
144 143
145   - Firmware savedFirmware = savaData("/api/firmware/" + savedFirmwareInfo.getId().getId().toString() + "?checksum={checksum}&checksumAlgorithm={checksumAlgorithm}", testData, CHECKSUM, CHECKSUM_ALGORITHM);
  144 + OtaPackage savedFirmware = savaData("/api/otaPackage/" + savedFirmwareInfo.getId().getId().toString() + "?checksum={checksum}&checksumAlgorithm={checksumAlgorithm}", testData, CHECKSUM, CHECKSUM_ALGORITHM);
146 145
147 146 Assert.assertEquals(FILE_NAME, savedFirmware.getFileName());
148 147 Assert.assertEquals(CONTENT_TYPE, savedFirmware.getContentType());
... ... @@ -150,97 +149,97 @@ public abstract class BaseFirmwareControllerTest extends AbstractControllerTest
150 149
151 150 @Test
152 151 public void testUpdateFirmwareFromDifferentTenant() throws Exception {
153   - FirmwareInfo firmwareInfo = new FirmwareInfo();
  152 + OtaPackageInfo firmwareInfo = new OtaPackageInfo();
154 153 firmwareInfo.setDeviceProfileId(deviceProfileId);
155 154 firmwareInfo.setType(FIRMWARE);
156 155 firmwareInfo.setTitle(TITLE);
157 156 firmwareInfo.setVersion(VERSION);
158 157
159   - FirmwareInfo savedFirmwareInfo = save(firmwareInfo);
  158 + OtaPackageInfo savedFirmwareInfo = save(firmwareInfo);
160 159
161 160 loginDifferentTenant();
162   - doPost("/api/firmware", savedFirmwareInfo, FirmwareInfo.class, status().isForbidden());
  161 + doPost("/api/otaPackage", savedFirmwareInfo, OtaPackageInfo.class, status().isForbidden());
163 162 deleteDifferentTenant();
164 163 }
165 164
166 165 @Test
167 166 public void testFindFirmwareInfoById() throws Exception {
168   - FirmwareInfo firmwareInfo = new FirmwareInfo();
  167 + OtaPackageInfo firmwareInfo = new OtaPackageInfo();
169 168 firmwareInfo.setDeviceProfileId(deviceProfileId);
170 169 firmwareInfo.setType(FIRMWARE);
171 170 firmwareInfo.setTitle(TITLE);
172 171 firmwareInfo.setVersion(VERSION);
173 172
174   - FirmwareInfo savedFirmwareInfo = save(firmwareInfo);
  173 + OtaPackageInfo savedFirmwareInfo = save(firmwareInfo);
175 174
176   - FirmwareInfo foundFirmware = doGet("/api/firmware/info/" + savedFirmwareInfo.getId().getId().toString(), FirmwareInfo.class);
  175 + OtaPackageInfo foundFirmware = doGet("/api/otaPackage/info/" + savedFirmwareInfo.getId().getId().toString(), OtaPackageInfo.class);
177 176 Assert.assertNotNull(foundFirmware);
178 177 Assert.assertEquals(savedFirmwareInfo, foundFirmware);
179 178 }
180 179
181 180 @Test
182 181 public void testFindFirmwareById() throws Exception {
183   - FirmwareInfo firmwareInfo = new FirmwareInfo();
  182 + OtaPackageInfo firmwareInfo = new OtaPackageInfo();
184 183 firmwareInfo.setDeviceProfileId(deviceProfileId);
185 184 firmwareInfo.setType(FIRMWARE);
186 185 firmwareInfo.setTitle(TITLE);
187 186 firmwareInfo.setVersion(VERSION);
188 187
189   - FirmwareInfo savedFirmwareInfo = save(firmwareInfo);
  188 + OtaPackageInfo savedFirmwareInfo = save(firmwareInfo);
190 189
191 190 MockMultipartFile testData = new MockMultipartFile("file", FILE_NAME, CONTENT_TYPE, DATA.array());
192 191
193   - Firmware savedFirmware = savaData("/api/firmware/" + savedFirmwareInfo.getId().getId().toString() + "?checksum={checksum}&checksumAlgorithm={checksumAlgorithm}", testData, CHECKSUM, CHECKSUM_ALGORITHM);
  192 + OtaPackage savedFirmware = savaData("/api/otaPackage/" + savedFirmwareInfo.getId().getId().toString() + "?checksum={checksum}&checksumAlgorithm={checksumAlgorithm}", testData, CHECKSUM, CHECKSUM_ALGORITHM);
194 193
195   - Firmware foundFirmware = doGet("/api/firmware/" + savedFirmwareInfo.getId().getId().toString(), Firmware.class);
  194 + OtaPackage foundFirmware = doGet("/api/otaPackage/" + savedFirmwareInfo.getId().getId().toString(), OtaPackage.class);
196 195 Assert.assertNotNull(foundFirmware);
197 196 Assert.assertEquals(savedFirmware, foundFirmware);
198 197 }
199 198
200 199 @Test
201 200 public void testDeleteFirmware() throws Exception {
202   - FirmwareInfo firmwareInfo = new FirmwareInfo();
  201 + OtaPackageInfo firmwareInfo = new OtaPackageInfo();
203 202 firmwareInfo.setDeviceProfileId(deviceProfileId);
204 203 firmwareInfo.setType(FIRMWARE);
205 204 firmwareInfo.setTitle(TITLE);
206 205 firmwareInfo.setVersion(VERSION);
207 206
208   - FirmwareInfo savedFirmwareInfo = save(firmwareInfo);
  207 + OtaPackageInfo savedFirmwareInfo = save(firmwareInfo);
209 208
210   - doDelete("/api/firmware/" + savedFirmwareInfo.getId().getId().toString())
  209 + doDelete("/api/otaPackage/" + savedFirmwareInfo.getId().getId().toString())
211 210 .andExpect(status().isOk());
212 211
213   - doGet("/api/firmware/info/" + savedFirmwareInfo.getId().getId().toString())
  212 + doGet("/api/otaPackage/info/" + savedFirmwareInfo.getId().getId().toString())
214 213 .andExpect(status().isNotFound());
215 214 }
216 215
217 216 @Test
218 217 public void testFindTenantFirmwares() throws Exception {
219   - List<FirmwareInfo> firmwares = new ArrayList<>();
  218 + List<OtaPackageInfo> otaPackages = new ArrayList<>();
220 219 for (int i = 0; i < 165; i++) {
221   - FirmwareInfo firmwareInfo = new FirmwareInfo();
  220 + OtaPackageInfo firmwareInfo = new OtaPackageInfo();
222 221 firmwareInfo.setDeviceProfileId(deviceProfileId);
223 222 firmwareInfo.setType(FIRMWARE);
224 223 firmwareInfo.setTitle(TITLE);
225 224 firmwareInfo.setVersion(VERSION + i);
226 225
227   - FirmwareInfo savedFirmwareInfo = save(firmwareInfo);
  226 + OtaPackageInfo savedFirmwareInfo = save(firmwareInfo);
228 227
229 228 if (i > 100) {
230 229 MockMultipartFile testData = new MockMultipartFile("file", FILE_NAME, CONTENT_TYPE, DATA.array());
231 230
232   - Firmware savedFirmware = savaData("/api/firmware/" + savedFirmwareInfo.getId().getId().toString() + "?checksum={checksum}&checksumAlgorithm={checksumAlgorithm}", testData, CHECKSUM, CHECKSUM_ALGORITHM);
233   - firmwares.add(new FirmwareInfo(savedFirmware));
  231 + OtaPackage savedFirmware = savaData("/api/otaPackage/" + savedFirmwareInfo.getId().getId().toString() + "?checksum={checksum}&checksumAlgorithm={checksumAlgorithm}", testData, CHECKSUM, CHECKSUM_ALGORITHM);
  232 + otaPackages.add(new OtaPackageInfo(savedFirmware));
234 233 } else {
235   - firmwares.add(savedFirmwareInfo);
  234 + otaPackages.add(savedFirmwareInfo);
236 235 }
237 236 }
238 237
239   - List<FirmwareInfo> loadedFirmwares = new ArrayList<>();
  238 + List<OtaPackageInfo> loadedFirmwares = new ArrayList<>();
240 239 PageLink pageLink = new PageLink(24);
241   - PageData<FirmwareInfo> pageData;
  240 + PageData<OtaPackageInfo> pageData;
242 241 do {
243   - pageData = doGetTypedWithPageLink("/api/firmwares?",
  242 + pageData = doGetTypedWithPageLink("/api/otaPackages?",
244 243 new TypeReference<>() {
245 244 }, pageLink);
246 245 loadedFirmwares.addAll(pageData.getData());
... ... @@ -249,41 +248,41 @@ public abstract class BaseFirmwareControllerTest extends AbstractControllerTest
249 248 }
250 249 } while (pageData.hasNext());
251 250
252   - Collections.sort(firmwares, idComparator);
  251 + Collections.sort(otaPackages, idComparator);
253 252 Collections.sort(loadedFirmwares, idComparator);
254 253
255   - Assert.assertEquals(firmwares, loadedFirmwares);
  254 + Assert.assertEquals(otaPackages, loadedFirmwares);
256 255 }
257 256
258 257 @Test
259 258 public void testFindTenantFirmwaresByHasData() throws Exception {
260   - List<FirmwareInfo> firmwaresWithData = new ArrayList<>();
261   - List<FirmwareInfo> firmwaresWithoutData = new ArrayList<>();
  259 + List<OtaPackageInfo> otaPackagesWithData = new ArrayList<>();
  260 + List<OtaPackageInfo> otaPackagesWithoutData = new ArrayList<>();
262 261
263 262 for (int i = 0; i < 165; i++) {
264   - FirmwareInfo firmwareInfo = new FirmwareInfo();
  263 + OtaPackageInfo firmwareInfo = new OtaPackageInfo();
265 264 firmwareInfo.setDeviceProfileId(deviceProfileId);
266 265 firmwareInfo.setType(FIRMWARE);
267 266 firmwareInfo.setTitle(TITLE);
268 267 firmwareInfo.setVersion(VERSION + i);
269 268
270   - FirmwareInfo savedFirmwareInfo = save(firmwareInfo);
  269 + OtaPackageInfo savedFirmwareInfo = save(firmwareInfo);
271 270
272 271 if (i > 100) {
273 272 MockMultipartFile testData = new MockMultipartFile("file", FILE_NAME, CONTENT_TYPE, DATA.array());
274 273
275   - Firmware savedFirmware = savaData("/api/firmware/" + savedFirmwareInfo.getId().getId().toString() + "?checksum={checksum}&checksumAlgorithm={checksumAlgorithm}", testData, CHECKSUM, CHECKSUM_ALGORITHM);
276   - firmwaresWithData.add(new FirmwareInfo(savedFirmware));
  274 + OtaPackage savedFirmware = savaData("/api/otaPackage/" + savedFirmwareInfo.getId().getId().toString() + "?checksum={checksum}&checksumAlgorithm={checksumAlgorithm}", testData, CHECKSUM, CHECKSUM_ALGORITHM);
  275 + otaPackagesWithData.add(new OtaPackageInfo(savedFirmware));
277 276 } else {
278   - firmwaresWithoutData.add(savedFirmwareInfo);
  277 + otaPackagesWithoutData.add(savedFirmwareInfo);
279 278 }
280 279 }
281 280
282   - List<FirmwareInfo> loadedFirmwaresWithData = new ArrayList<>();
  281 + List<OtaPackageInfo> loadedFirmwaresWithData = new ArrayList<>();
283 282 PageLink pageLink = new PageLink(24);
284   - PageData<FirmwareInfo> pageData;
  283 + PageData<OtaPackageInfo> pageData;
285 284 do {
286   - pageData = doGetTypedWithPageLink("/api/firmwares/" + deviceProfileId.toString() + "/FIRMWARE/true?",
  285 + pageData = doGetTypedWithPageLink("/api/otaPackages/" + deviceProfileId.toString() + "/FIRMWARE/true?",
287 286 new TypeReference<>() {
288 287 }, pageLink);
289 288 loadedFirmwaresWithData.addAll(pageData.getData());
... ... @@ -292,10 +291,10 @@ public abstract class BaseFirmwareControllerTest extends AbstractControllerTest
292 291 }
293 292 } while (pageData.hasNext());
294 293
295   - List<FirmwareInfo> loadedFirmwaresWithoutData = new ArrayList<>();
  294 + List<OtaPackageInfo> loadedFirmwaresWithoutData = new ArrayList<>();
296 295 pageLink = new PageLink(24);
297 296 do {
298   - pageData = doGetTypedWithPageLink("/api/firmwares/" + deviceProfileId.toString() + "/FIRMWARE/false?",
  297 + pageData = doGetTypedWithPageLink("/api/otaPackages/" + deviceProfileId.toString() + "/FIRMWARE/false?",
299 298 new TypeReference<>() {
300 299 }, pageLink);
301 300 loadedFirmwaresWithoutData.addAll(pageData.getData());
... ... @@ -304,25 +303,25 @@ public abstract class BaseFirmwareControllerTest extends AbstractControllerTest
304 303 }
305 304 } while (pageData.hasNext());
306 305
307   - Collections.sort(firmwaresWithData, idComparator);
308   - Collections.sort(firmwaresWithoutData, idComparator);
  306 + Collections.sort(otaPackagesWithData, idComparator);
  307 + Collections.sort(otaPackagesWithoutData, idComparator);
309 308 Collections.sort(loadedFirmwaresWithData, idComparator);
310 309 Collections.sort(loadedFirmwaresWithoutData, idComparator);
311 310
312   - Assert.assertEquals(firmwaresWithData, loadedFirmwaresWithData);
313   - Assert.assertEquals(firmwaresWithoutData, loadedFirmwaresWithoutData);
  311 + Assert.assertEquals(otaPackagesWithData, loadedFirmwaresWithData);
  312 + Assert.assertEquals(otaPackagesWithoutData, loadedFirmwaresWithoutData);
314 313 }
315 314
316 315
317   - private FirmwareInfo save(FirmwareInfo firmwareInfo) throws Exception {
318   - return doPost("/api/firmware", firmwareInfo, FirmwareInfo.class);
  316 + private OtaPackageInfo save(OtaPackageInfo firmwareInfo) throws Exception {
  317 + return doPost("/api/otaPackage", firmwareInfo, OtaPackageInfo.class);
319 318 }
320 319
321   - protected Firmware savaData(String urlTemplate, MockMultipartFile content, String... params) throws Exception {
  320 + protected OtaPackage savaData(String urlTemplate, MockMultipartFile content, String... params) throws Exception {
322 321 MockMultipartHttpServletRequestBuilder postRequest = MockMvcRequestBuilders.multipart(urlTemplate, params);
323 322 postRequest.file(content);
324 323 setJwtToken(postRequest);
325   - return readResponse(mockMvc.perform(postRequest).andExpect(status().isOk()), Firmware.class);
  324 + return readResponse(mockMvc.perform(postRequest).andExpect(status().isOk()), OtaPackage.class);
326 325 }
327 326
328 327 }
... ...
application/src/test/java/org/thingsboard/server/controller/sql/OtaPackageControllerSqlTest.java renamed from application/src/test/java/org/thingsboard/server/controller/sql/FirmwareControllerSqlTest.java
... ... @@ -15,9 +15,9 @@
15 15 */
16 16 package org.thingsboard.server.controller.sql;
17 17
18   -import org.thingsboard.server.controller.BaseFirmwareControllerTest;
  18 +import org.thingsboard.server.controller.BaseOtaPackageControllerTest;
19 19 import org.thingsboard.server.dao.service.DaoSqlTest;
20 20
21 21 @DaoSqlTest
22   -public class FirmwareControllerSqlTest extends BaseFirmwareControllerTest {
  22 +public class OtaPackageControllerSqlTest extends BaseOtaPackageControllerTest {
23 23 }
... ...
common/cache/src/main/java/org/thingsboard/server/cache/ota/CaffeineOtaPackageCache.java renamed from common/cache/src/main/java/org/thingsboard/server/cache/firmware/CaffeineFirmwareCache.java
... ... @@ -13,19 +13,20 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.cache.firmware;
  16 +package org.thingsboard.server.cache.ota;
17 17
18 18 import lombok.RequiredArgsConstructor;
19 19 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
20 20 import org.springframework.cache.CacheManager;
21 21 import org.springframework.stereotype.Service;
22 22
23   -import static org.thingsboard.server.common.data.CacheConstants.FIRMWARE_CACHE;
  23 +import static org.thingsboard.server.common.data.CacheConstants.OTA_PACKAGE_CACHE;
  24 +import static org.thingsboard.server.common.data.CacheConstants.OTA_PACKAGE_DATA_CACHE;
24 25
25 26 @Service
26 27 @ConditionalOnProperty(prefix = "cache", value = "type", havingValue = "caffeine", matchIfMissing = true)
27 28 @RequiredArgsConstructor
28   -public class CaffeineFirmwareCache implements FirmwareDataCache {
  29 +public class CaffeineOtaPackageCache implements OtaPackageDataCache {
29 30
30 31 private final CacheManager cacheManager;
31 32
... ... @@ -36,7 +37,7 @@ public class CaffeineFirmwareCache implements FirmwareDataCache {
36 37
37 38 @Override
38 39 public byte[] get(String key, int chunkSize, int chunk) {
39   - byte[] data = cacheManager.getCache(FIRMWARE_CACHE).get(key, byte[].class);
  40 + byte[] data = cacheManager.getCache(OTA_PACKAGE_DATA_CACHE).get(key, byte[].class);
40 41
41 42 if (chunkSize < 1) {
42 43 return data;
... ... @@ -58,11 +59,11 @@ public class CaffeineFirmwareCache implements FirmwareDataCache {
58 59
59 60 @Override
60 61 public void put(String key, byte[] value) {
61   - cacheManager.getCache(FIRMWARE_CACHE).putIfAbsent(key, value);
  62 + cacheManager.getCache(OTA_PACKAGE_DATA_CACHE).putIfAbsent(key, value);
62 63 }
63 64
64 65 @Override
65 66 public void evict(String key) {
66   - cacheManager.getCache(FIRMWARE_CACHE).evict(key);
  67 + cacheManager.getCache(OTA_PACKAGE_DATA_CACHE).evict(key);
67 68 }
68 69 }
... ...
common/cache/src/main/java/org/thingsboard/server/cache/ota/OtaPackageDataCache.java renamed from common/cache/src/main/java/org/thingsboard/server/cache/firmware/FirmwareDataCache.java
... ... @@ -13,9 +13,9 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.cache.firmware;
  16 +package org.thingsboard.server.cache.ota;
17 17
18   -public interface FirmwareDataCache {
  18 +public interface OtaPackageDataCache {
19 19
20 20 byte[] get(String key);
21 21
... ... @@ -25,8 +25,8 @@ public interface FirmwareDataCache {
25 25
26 26 void evict(String key);
27 27
28   - default boolean has(String firmwareId) {
29   - byte[] data = get(firmwareId, 1, 0);
  28 + default boolean has(String otaPackageId) {
  29 + byte[] data = get(otaPackageId, 1, 0);
30 30 return data != null && data.length > 0;
31 31 }
32 32 }
... ...
common/cache/src/main/java/org/thingsboard/server/cache/ota/RedisOtaPackageDataCache.java renamed from common/cache/src/main/java/org/thingsboard/server/cache/firmware/RedisFirmwareDataCache.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.cache.firmware;
  16 +package org.thingsboard.server.cache.ota;
17 17
18 18 import lombok.RequiredArgsConstructor;
19 19 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
... ... @@ -21,12 +21,13 @@ import org.springframework.data.redis.connection.RedisConnection;
21 21 import org.springframework.data.redis.connection.RedisConnectionFactory;
22 22 import org.springframework.stereotype.Service;
23 23
24   -import static org.thingsboard.server.common.data.CacheConstants.FIRMWARE_CACHE;
  24 +import static org.thingsboard.server.common.data.CacheConstants.OTA_PACKAGE_CACHE;
  25 +import static org.thingsboard.server.common.data.CacheConstants.OTA_PACKAGE_DATA_CACHE;
25 26
26 27 @Service
27 28 @ConditionalOnProperty(prefix = "cache", value = "type", havingValue = "redis")
28 29 @RequiredArgsConstructor
29   -public class RedisFirmwareDataCache implements FirmwareDataCache {
  30 +public class RedisOtaPackageDataCache implements OtaPackageDataCache {
30 31
31 32 private final RedisConnectionFactory redisConnectionFactory;
32 33
... ... @@ -39,30 +40,30 @@ public class RedisFirmwareDataCache implements FirmwareDataCache {
39 40 public byte[] get(String key, int chunkSize, int chunk) {
40 41 try (RedisConnection connection = redisConnectionFactory.getConnection()) {
41 42 if (chunkSize == 0) {
42   - return connection.get(toFirmwareCacheKey(key));
  43 + return connection.get(toOtaPackageCacheKey(key));
43 44 }
44 45
45 46 int startIndex = chunkSize * chunk;
46 47 int endIndex = startIndex + chunkSize - 1;
47   - return connection.getRange(toFirmwareCacheKey(key), startIndex, endIndex);
  48 + return connection.getRange(toOtaPackageCacheKey(key), startIndex, endIndex);
48 49 }
49 50 }
50 51
51 52 @Override
52 53 public void put(String key, byte[] value) {
53 54 try (RedisConnection connection = redisConnectionFactory.getConnection()) {
54   - connection.set(toFirmwareCacheKey(key), value);
  55 + connection.set(toOtaPackageCacheKey(key), value);
55 56 }
56 57 }
57 58
58 59 @Override
59 60 public void evict(String key) {
60 61 try (RedisConnection connection = redisConnectionFactory.getConnection()) {
61   - connection.del(toFirmwareCacheKey(key));
  62 + connection.del(toOtaPackageCacheKey(key));
62 63 }
63 64 }
64 65
65   - private byte[] toFirmwareCacheKey(String key) {
66   - return String.format("%s::%s", FIRMWARE_CACHE, key).getBytes();
  66 + private byte[] toOtaPackageCacheKey(String key) {
  67 + return String.format("%s::%s", OTA_PACKAGE_DATA_CACHE, key).getBytes();
67 68 }
68 69 }
... ...
... ... @@ -27,6 +27,7 @@ import org.thingsboard.server.common.data.id.DeviceId;
27 27 import org.thingsboard.server.common.data.id.DeviceProfileId;
28 28 import org.thingsboard.server.common.data.id.EdgeId;
29 29 import org.thingsboard.server.common.data.id.TenantId;
  30 +import org.thingsboard.server.common.data.ota.OtaPackageType;
30 31 import org.thingsboard.server.common.data.page.PageData;
31 32 import org.thingsboard.server.common.data.page.PageLink;
32 33 import org.thingsboard.server.common.data.security.DeviceCredentials;
... ... @@ -63,9 +64,9 @@ public interface DeviceService {
63 64
64 65 PageData<Device> findDevicesByTenantIdAndType(TenantId tenantId, String type, PageLink pageLink);
65 66
66   - PageData<Device> findDevicesByTenantIdAndTypeAndEmptyFirmware(TenantId tenantId, String type, PageLink pageLink);
  67 + PageData<Device> findDevicesByTenantIdAndTypeAndEmptyOtaPackage(TenantId tenantId, DeviceProfileId deviceProfileId, OtaPackageType type, PageLink pageLink);
67 68
68   - PageData<Device> findDevicesByTenantIdAndTypeAndEmptySoftware(TenantId tenantId, String type, PageLink pageLink);
  69 + Long countDevicesByTenantIdAndDeviceProfileIdAndEmptyOtaPackage(TenantId tenantId, DeviceProfileId deviceProfileId, OtaPackageType otaPackageType);
69 70
70 71 PageData<DeviceInfo> findDeviceInfosByTenantIdAndType(TenantId tenantId, String type, PageLink pageLink);
71 72
... ...
common/dao-api/src/main/java/org/thingsboard/server/dao/ota/OtaPackageService.java renamed from common/dao-api/src/main/java/org/thingsboard/server/dao/firmware/FirmwareService.java
... ... @@ -13,40 +13,40 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.dao.firmware;
  16 +package org.thingsboard.server.dao.ota;
17 17
18 18 import com.google.common.util.concurrent.ListenableFuture;
19   -import org.thingsboard.server.common.data.Firmware;
20   -import org.thingsboard.server.common.data.FirmwareInfo;
21   -import org.thingsboard.server.common.data.firmware.ChecksumAlgorithm;
22   -import org.thingsboard.server.common.data.firmware.FirmwareType;
  19 +import org.thingsboard.server.common.data.OtaPackage;
  20 +import org.thingsboard.server.common.data.OtaPackageInfo;
  21 +import org.thingsboard.server.common.data.ota.ChecksumAlgorithm;
  22 +import org.thingsboard.server.common.data.ota.OtaPackageType;
23 23 import org.thingsboard.server.common.data.id.DeviceProfileId;
24   -import org.thingsboard.server.common.data.id.FirmwareId;
  24 +import org.thingsboard.server.common.data.id.OtaPackageId;
25 25 import org.thingsboard.server.common.data.id.TenantId;
26 26 import org.thingsboard.server.common.data.page.PageData;
27 27 import org.thingsboard.server.common.data.page.PageLink;
28 28
29 29 import java.nio.ByteBuffer;
30 30
31   -public interface FirmwareService {
  31 +public interface OtaPackageService {
32 32
33   - FirmwareInfo saveFirmwareInfo(FirmwareInfo firmwareInfo);
  33 + OtaPackageInfo saveOtaPackageInfo(OtaPackageInfo otaPackageInfo);
34 34
35   - Firmware saveFirmware(Firmware firmware);
  35 + OtaPackage saveOtaPackage(OtaPackage otaPackage);
36 36
37 37 String generateChecksum(ChecksumAlgorithm checksumAlgorithm, ByteBuffer data);
38 38
39   - Firmware findFirmwareById(TenantId tenantId, FirmwareId firmwareId);
  39 + OtaPackage findOtaPackageById(TenantId tenantId, OtaPackageId otaPackageId);
40 40
41   - FirmwareInfo findFirmwareInfoById(TenantId tenantId, FirmwareId firmwareId);
  41 + OtaPackageInfo findOtaPackageInfoById(TenantId tenantId, OtaPackageId otaPackageId);
42 42
43   - ListenableFuture<FirmwareInfo> findFirmwareInfoByIdAsync(TenantId tenantId, FirmwareId firmwareId);
  43 + ListenableFuture<OtaPackageInfo> findOtaPackageInfoByIdAsync(TenantId tenantId, OtaPackageId otaPackageId);
44 44
45   - PageData<FirmwareInfo> findTenantFirmwaresByTenantId(TenantId tenantId, PageLink pageLink);
  45 + PageData<OtaPackageInfo> findTenantOtaPackagesByTenantId(TenantId tenantId, PageLink pageLink);
46 46
47   - PageData<FirmwareInfo> findTenantFirmwaresByTenantIdAndDeviceProfileIdAndTypeAndHasData(TenantId tenantId, DeviceProfileId deviceProfileId, FirmwareType firmwareType, boolean hasData, PageLink pageLink);
  47 + PageData<OtaPackageInfo> findTenantOtaPackagesByTenantIdAndDeviceProfileIdAndTypeAndHasData(TenantId tenantId, DeviceProfileId deviceProfileId, OtaPackageType otaPackageType, boolean hasData, PageLink pageLink);
48 48
49   - void deleteFirmware(TenantId tenantId, FirmwareId firmwareId);
  49 + void deleteOtaPackage(TenantId tenantId, OtaPackageId otaPackageId);
50 50
51   - void deleteFirmwaresByTenantId(TenantId tenantId);
  51 + void deleteOtaPackagesByTenantId(TenantId tenantId);
52 52 }
... ...
... ... @@ -29,5 +29,6 @@ public class CacheConstants {
29 29 public static final String DEVICE_PROFILE_CACHE = "deviceProfiles";
30 30 public static final String ATTRIBUTES_CACHE = "attributes";
31 31 public static final String TOKEN_OUTDATAGE_TIME_CACHE = "tokensOutdatageTime";
32   - public static final String FIRMWARE_CACHE = "firmwares";
  32 + public static final String OTA_PACKAGE_CACHE = "otaPackages";
  33 + public static final String OTA_PACKAGE_DATA_CACHE = "otaPackagesData";
33 34 }
... ...
... ... @@ -23,7 +23,7 @@ import org.thingsboard.server.common.data.device.data.DeviceData;
23 23 import org.thingsboard.server.common.data.id.CustomerId;
24 24 import org.thingsboard.server.common.data.id.DeviceId;
25 25 import org.thingsboard.server.common.data.id.DeviceProfileId;
26   -import org.thingsboard.server.common.data.id.FirmwareId;
  26 +import org.thingsboard.server.common.data.id.OtaPackageId;
27 27 import org.thingsboard.server.common.data.id.TenantId;
28 28 import org.thingsboard.server.common.data.validation.NoXss;
29 29
... ... @@ -32,7 +32,7 @@ import java.io.IOException;
32 32
33 33 @EqualsAndHashCode(callSuper = true)
34 34 @Slf4j
35   -public class Device extends SearchTextBasedWithAdditionalInfo<DeviceId> implements HasName, HasTenantId, HasCustomerId, HasFirmware {
  35 +public class Device extends SearchTextBasedWithAdditionalInfo<DeviceId> implements HasName, HasTenantId, HasCustomerId, HasOtaPackage {
36 36
37 37 private static final long serialVersionUID = 2807343040519543363L;
38 38
... ... @@ -49,8 +49,8 @@ public class Device extends SearchTextBasedWithAdditionalInfo<DeviceId> implemen
49 49 @JsonIgnore
50 50 private byte[] deviceDataBytes;
51 51
52   - private FirmwareId firmwareId;
53   - private FirmwareId softwareId;
  52 + private OtaPackageId firmwareId;
  53 + private OtaPackageId softwareId;
54 54
55 55 public Device() {
56 56 super();
... ... @@ -167,19 +167,19 @@ public class Device extends SearchTextBasedWithAdditionalInfo<DeviceId> implemen
167 167 return getName();
168 168 }
169 169
170   - public FirmwareId getFirmwareId() {
  170 + public OtaPackageId getFirmwareId() {
171 171 return firmwareId;
172 172 }
173 173
174   - public void setFirmwareId(FirmwareId firmwareId) {
  174 + public void setFirmwareId(OtaPackageId firmwareId) {
175 175 this.firmwareId = firmwareId;
176 176 }
177 177
178   - public FirmwareId getSoftwareId() {
  178 + public OtaPackageId getSoftwareId() {
179 179 return softwareId;
180 180 }
181 181
182   - public void setSoftwareId(FirmwareId softwareId) {
  182 + public void setSoftwareId(OtaPackageId softwareId) {
183 183 this.softwareId = softwareId;
184 184 }
185 185
... ...
... ... @@ -23,7 +23,7 @@ import lombok.extern.slf4j.Slf4j;
23 23 import org.thingsboard.server.common.data.device.profile.DeviceProfileData;
24 24 import org.thingsboard.server.common.data.id.DashboardId;
25 25 import org.thingsboard.server.common.data.id.DeviceProfileId;
26   -import org.thingsboard.server.common.data.id.FirmwareId;
  26 +import org.thingsboard.server.common.data.id.OtaPackageId;
27 27 import org.thingsboard.server.common.data.id.RuleChainId;
28 28 import org.thingsboard.server.common.data.id.TenantId;
29 29 import org.thingsboard.server.common.data.validation.NoXss;
... ... @@ -37,7 +37,7 @@ import static org.thingsboard.server.common.data.SearchTextBasedWithAdditionalIn
37 37 @Data
38 38 @EqualsAndHashCode(callSuper = true)
39 39 @Slf4j
40   -public class DeviceProfile extends SearchTextBased<DeviceProfileId> implements HasName, HasTenantId, HasFirmware {
  40 +public class DeviceProfile extends SearchTextBased<DeviceProfileId> implements HasName, HasTenantId, HasOtaPackage {
41 41
42 42 private TenantId tenantId;
43 43 @NoXss
... ... @@ -60,9 +60,9 @@ public class DeviceProfile extends SearchTextBased<DeviceProfileId> implements H
60 60 @NoXss
61 61 private String provisionDeviceKey;
62 62
63   - private FirmwareId firmwareId;
  63 + private OtaPackageId firmwareId;
64 64
65   - private FirmwareId softwareId;
  65 + private OtaPackageId softwareId;
66 66
67 67 public DeviceProfile() {
68 68 super();
... ...
... ... @@ -19,5 +19,5 @@ package org.thingsboard.server.common.data;
19 19 * @author Andrew Shvayka
20 20 */
21 21 public enum EntityType {
22   - TENANT, CUSTOMER, USER, DASHBOARD, ASSET, DEVICE, ALARM, RULE_CHAIN, RULE_NODE, ENTITY_VIEW, WIDGETS_BUNDLE, WIDGET_TYPE, TENANT_PROFILE, DEVICE_PROFILE, API_USAGE_STATE, TB_RESOURCE, FIRMWARE, EDGE;
  22 + TENANT, CUSTOMER, USER, DASHBOARD, ASSET, DEVICE, ALARM, RULE_CHAIN, RULE_NODE, ENTITY_VIEW, WIDGETS_BUNDLE, WIDGET_TYPE, TENANT_PROFILE, DEVICE_PROFILE, API_USAGE_STATE, TB_RESOURCE, OTA_PACKAGE, EDGE;
23 23 }
... ...
common/data/src/main/java/org/thingsboard/server/common/data/HasOtaPackage.java renamed from common/data/src/main/java/org/thingsboard/server/common/data/HasFirmware.java
... ... @@ -15,11 +15,11 @@
15 15 */
16 16 package org.thingsboard.server.common.data;
17 17
18   -import org.thingsboard.server.common.data.id.FirmwareId;
  18 +import org.thingsboard.server.common.data.id.OtaPackageId;
19 19
20   -public interface HasFirmware {
  20 +public interface HasOtaPackage {
21 21
22   - FirmwareId getFirmwareId();
  22 + OtaPackageId getFirmwareId();
23 23
24   - FirmwareId getSoftwareId();
  24 + OtaPackageId getSoftwareId();
25 25 }
... ...
common/data/src/main/java/org/thingsboard/server/common/data/OtaPackage.java renamed from common/data/src/main/java/org/thingsboard/server/common/data/Firmware.java
... ... @@ -17,27 +17,27 @@ package org.thingsboard.server.common.data;
17 17
18 18 import lombok.Data;
19 19 import lombok.EqualsAndHashCode;
20   -import org.thingsboard.server.common.data.id.FirmwareId;
  20 +import org.thingsboard.server.common.data.id.OtaPackageId;
21 21
22 22 import java.nio.ByteBuffer;
23 23
24 24 @Data
25 25 @EqualsAndHashCode(callSuper = true)
26   -public class Firmware extends FirmwareInfo {
  26 +public class OtaPackage extends OtaPackageInfo {
27 27
28 28 private static final long serialVersionUID = 3091601761339422546L;
29 29
30 30 private transient ByteBuffer data;
31 31
32   - public Firmware() {
  32 + public OtaPackage() {
33 33 super();
34 34 }
35 35
36   - public Firmware(FirmwareId id) {
  36 + public OtaPackage(OtaPackageId id) {
37 37 super(id);
38 38 }
39 39
40   - public Firmware(Firmware firmware) {
  40 + public OtaPackage(OtaPackage firmware) {
41 41 super(firmware);
42 42 this.data = firmware.getData();
43 43 }
... ...
common/data/src/main/java/org/thingsboard/server/common/data/OtaPackageInfo.java renamed from common/data/src/main/java/org/thingsboard/server/common/data/FirmwareInfo.java
... ... @@ -19,22 +19,22 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
19 19 import lombok.Data;
20 20 import lombok.EqualsAndHashCode;
21 21 import lombok.extern.slf4j.Slf4j;
22   -import org.thingsboard.server.common.data.firmware.ChecksumAlgorithm;
23   -import org.thingsboard.server.common.data.firmware.FirmwareType;
  22 +import org.thingsboard.server.common.data.ota.ChecksumAlgorithm;
  23 +import org.thingsboard.server.common.data.ota.OtaPackageType;
24 24 import org.thingsboard.server.common.data.id.DeviceProfileId;
25   -import org.thingsboard.server.common.data.id.FirmwareId;
  25 +import org.thingsboard.server.common.data.id.OtaPackageId;
26 26 import org.thingsboard.server.common.data.id.TenantId;
27 27
28 28 @Slf4j
29 29 @Data
30 30 @EqualsAndHashCode(callSuper = true)
31   -public class FirmwareInfo extends SearchTextBasedWithAdditionalInfo<FirmwareId> implements HasName, HasTenantId {
  31 +public class OtaPackageInfo extends SearchTextBasedWithAdditionalInfo<OtaPackageId> implements HasName, HasTenantId {
32 32
33 33 private static final long serialVersionUID = 3168391583570815419L;
34 34
35 35 private TenantId tenantId;
36 36 private DeviceProfileId deviceProfileId;
37   - private FirmwareType type;
  37 + private OtaPackageType type;
38 38 private String title;
39 39 private String version;
40 40 private boolean hasData;
... ... @@ -45,27 +45,27 @@ public class FirmwareInfo extends SearchTextBasedWithAdditionalInfo<FirmwareId>
45 45 private Long dataSize;
46 46
47 47
48   - public FirmwareInfo() {
  48 + public OtaPackageInfo() {
49 49 super();
50 50 }
51 51
52   - public FirmwareInfo(FirmwareId id) {
  52 + public OtaPackageInfo(OtaPackageId id) {
53 53 super(id);
54 54 }
55 55
56   - public FirmwareInfo(FirmwareInfo firmwareInfo) {
57   - super(firmwareInfo);
58   - this.tenantId = firmwareInfo.getTenantId();
59   - this.deviceProfileId = firmwareInfo.getDeviceProfileId();
60   - this.type = firmwareInfo.getType();
61   - this.title = firmwareInfo.getTitle();
62   - this.version = firmwareInfo.getVersion();
63   - this.hasData = firmwareInfo.isHasData();
64   - this.fileName = firmwareInfo.getFileName();
65   - this.contentType = firmwareInfo.getContentType();
66   - this.checksumAlgorithm = firmwareInfo.getChecksumAlgorithm();
67   - this.checksum = firmwareInfo.getChecksum();
68   - this.dataSize = firmwareInfo.getDataSize();
  56 + public OtaPackageInfo(OtaPackageInfo otaPackageInfo) {
  57 + super(otaPackageInfo);
  58 + this.tenantId = otaPackageInfo.getTenantId();
  59 + this.deviceProfileId = otaPackageInfo.getDeviceProfileId();
  60 + this.type = otaPackageInfo.getType();
  61 + this.title = otaPackageInfo.getTitle();
  62 + this.version = otaPackageInfo.getVersion();
  63 + this.hasData = otaPackageInfo.isHasData();
  64 + this.fileName = otaPackageInfo.getFileName();
  65 + this.contentType = otaPackageInfo.getContentType();
  66 + this.checksumAlgorithm = otaPackageInfo.getChecksumAlgorithm();
  67 + this.checksum = otaPackageInfo.getChecksum();
  68 + this.dataSize = otaPackageInfo.getDataSize();
69 69 }
70 70
71 71 @Override
... ...
... ... @@ -71,8 +71,8 @@ public class EntityIdFactory {
71 71 return new ApiUsageStateId(uuid);
72 72 case TB_RESOURCE:
73 73 return new TbResourceId(uuid);
74   - case FIRMWARE:
75   - return new FirmwareId(uuid);
  74 + case OTA_PACKAGE:
  75 + return new OtaPackageId(uuid);
76 76 case EDGE:
77 77 return new EdgeId(uuid);
78 78 }
... ...
common/data/src/main/java/org/thingsboard/server/common/data/id/OtaPackageId.java renamed from common/data/src/main/java/org/thingsboard/server/common/data/id/FirmwareId.java
... ... @@ -22,23 +22,23 @@ import org.thingsboard.server.common.data.EntityType;
22 22
23 23 import java.util.UUID;
24 24
25   -public class FirmwareId extends UUIDBased implements EntityId {
  25 +public class OtaPackageId extends UUIDBased implements EntityId {
26 26
27 27 private static final long serialVersionUID = 1L;
28 28
29 29 @JsonCreator
30   - public FirmwareId(@JsonProperty("id") UUID id) {
  30 + public OtaPackageId(@JsonProperty("id") UUID id) {
31 31 super(id);
32 32 }
33 33
34   - public static FirmwareId fromString(String firmwareId) {
35   - return new FirmwareId(UUID.fromString(firmwareId));
  34 + public static OtaPackageId fromString(String firmwareId) {
  35 + return new OtaPackageId(UUID.fromString(firmwareId));
36 36 }
37 37
38 38 @JsonIgnore
39 39 @Override
40 40 public EntityType getEntityType() {
41   - return EntityType.FIRMWARE;
  41 + return EntityType.OTA_PACKAGE;
42 42 }
43 43
44 44 }
... ...
common/data/src/main/java/org/thingsboard/server/common/data/ota/ChecksumAlgorithm.java renamed from common/data/src/main/java/org/thingsboard/server/common/data/firmware/ChecksumAlgorithm.java
... ... @@ -13,7 +13,7 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.common.data.firmware;
  16 +package org.thingsboard.server.common.data.ota;
17 17
18 18 public enum ChecksumAlgorithm {
19 19 MD5,
... ...
common/data/src/main/java/org/thingsboard/server/common/data/ota/OtaPackageKey.java renamed from common/data/src/main/java/org/thingsboard/server/common/data/firmware/FirmwareKey.java
... ... @@ -13,18 +13,18 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.common.data.firmware;
  16 +package org.thingsboard.server.common.data.ota;
17 17
18 18 import lombok.Getter;
19 19
20   -public enum FirmwareKey {
  20 +public enum OtaPackageKey {
21 21
22 22 TITLE("title"), VERSION("version"), TS("ts"), STATE("state"), SIZE("size"), CHECKSUM("checksum"), CHECKSUM_ALGORITHM("checksum_algorithm");
23 23
24 24 @Getter
25 25 private final String value;
26 26
27   - FirmwareKey(String value) {
  27 + OtaPackageKey(String value) {
28 28 this.value = value;
29 29 }
30 30 }
... ...
common/data/src/main/java/org/thingsboard/server/common/data/ota/OtaPackageType.java renamed from common/data/src/main/java/org/thingsboard/server/common/data/firmware/FirmwareType.java
... ... @@ -13,18 +13,18 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.common.data.firmware;
  16 +package org.thingsboard.server.common.data.ota;
17 17
18 18 import lombok.Getter;
19 19
20   -public enum FirmwareType {
  20 +public enum OtaPackageType {
21 21
22 22 FIRMWARE("fw"), SOFTWARE("sw");
23 23
24 24 @Getter
25 25 private final String keyPrefix;
26 26
27   - FirmwareType(String keyPrefix) {
  27 + OtaPackageType(String keyPrefix) {
28 28 this.keyPrefix = keyPrefix;
29 29 }
30 30 }
... ...
common/data/src/main/java/org/thingsboard/server/common/data/ota/OtaPackageUpdateStatus.java renamed from common/data/src/main/java/org/thingsboard/server/common/data/firmware/FirmwareUpdateStatus.java
... ... @@ -13,8 +13,8 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.common.data.firmware;
  16 +package org.thingsboard.server.common.data.ota;
17 17
18   -public enum FirmwareUpdateStatus {
  18 +public enum OtaPackageUpdateStatus {
19 19 QUEUED, INITIATED, DOWNLOADING, DOWNLOADED, VERIFIED, UPDATING, UPDATED, FAILED
20 20 }
... ...
common/data/src/main/java/org/thingsboard/server/common/data/ota/OtaPackageUtil.java renamed from common/data/src/main/java/org/thingsboard/server/common/data/firmware/FirmwareUtil.java
... ... @@ -13,21 +13,19 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.common.data.firmware;
  16 +package org.thingsboard.server.common.data.ota;
17 17
18 18 import lombok.extern.slf4j.Slf4j;
19   -import org.thingsboard.server.common.data.HasFirmware;
20   -import org.thingsboard.server.common.data.id.FirmwareId;
  19 +import org.thingsboard.server.common.data.HasOtaPackage;
  20 +import org.thingsboard.server.common.data.id.OtaPackageId;
21 21
22 22 import java.util.ArrayList;
23 23 import java.util.Collections;
24 24 import java.util.List;
25   -
26   -import static org.thingsboard.server.common.data.firmware.FirmwareType.FIRMWARE;
27   -import static org.thingsboard.server.common.data.firmware.FirmwareType.SOFTWARE;
  25 +import java.util.function.Supplier;
28 26
29 27 @Slf4j
30   -public class FirmwareUtil {
  28 +public class OtaPackageUtil {
31 29
32 30 public static final List<String> ALL_FW_ATTRIBUTE_KEYS;
33 31
... ... @@ -35,19 +33,19 @@ public class FirmwareUtil {
35 33
36 34 static {
37 35 ALL_FW_ATTRIBUTE_KEYS = new ArrayList<>();
38   - for (FirmwareKey key : FirmwareKey.values()) {
39   - ALL_FW_ATTRIBUTE_KEYS.add(getAttributeKey(FIRMWARE, key));
  36 + for (OtaPackageKey key : OtaPackageKey.values()) {
  37 + ALL_FW_ATTRIBUTE_KEYS.add(getAttributeKey(OtaPackageType.FIRMWARE, key));
40 38
41 39 }
42 40
43 41 ALL_SW_ATTRIBUTE_KEYS = new ArrayList<>();
44   - for (FirmwareKey key : FirmwareKey.values()) {
45   - ALL_SW_ATTRIBUTE_KEYS.add(getAttributeKey(SOFTWARE, key));
  42 + for (OtaPackageKey key : OtaPackageKey.values()) {
  43 + ALL_SW_ATTRIBUTE_KEYS.add(getAttributeKey(OtaPackageType.SOFTWARE, key));
46 44
47 45 }
48 46 }
49 47
50   - public static List<String> getAttributeKeys(FirmwareType firmwareType) {
  48 + public static List<String> getAttributeKeys(OtaPackageType firmwareType) {
51 49 switch (firmwareType) {
52 50 case FIRMWARE:
53 51 return ALL_FW_ATTRIBUTE_KEYS;
... ... @@ -57,35 +55,46 @@ public class FirmwareUtil {
57 55 return Collections.emptyList();
58 56 }
59 57
60   - public static String getAttributeKey(FirmwareType type, FirmwareKey key) {
  58 + public static String getAttributeKey(OtaPackageType type, OtaPackageKey key) {
61 59 return type.getKeyPrefix() + "_" + key.getValue();
62 60 }
63 61
64   - public static String getTargetTelemetryKey(FirmwareType type, FirmwareKey key) {
  62 + public static String getTargetTelemetryKey(OtaPackageType type, OtaPackageKey key) {
65 63 return getTelemetryKey("target_", type, key);
66 64 }
67 65
68   - public static String getCurrentTelemetryKey(FirmwareType type, FirmwareKey key) {
  66 + public static String getCurrentTelemetryKey(OtaPackageType type, OtaPackageKey key) {
69 67 return getTelemetryKey("current_", type, key);
70 68 }
71 69
72   - private static String getTelemetryKey(String prefix, FirmwareType type, FirmwareKey key) {
  70 + private static String getTelemetryKey(String prefix, OtaPackageType type, OtaPackageKey key) {
73 71 return prefix + type.getKeyPrefix() + "_" + key.getValue();
74 72 }
75 73
76   - public static String getTelemetryKey(FirmwareType type, FirmwareKey key) {
  74 + public static String getTelemetryKey(OtaPackageType type, OtaPackageKey key) {
77 75 return type.getKeyPrefix() + "_" + key.getValue();
78 76 }
79 77
80   - public static FirmwareId getFirmwareId(HasFirmware entity, FirmwareType firmwareType) {
81   - switch (firmwareType) {
  78 + public static OtaPackageId getOtaPackageId(HasOtaPackage entity, OtaPackageType type) {
  79 + switch (type) {
82 80 case FIRMWARE:
83 81 return entity.getFirmwareId();
84 82 case SOFTWARE:
85 83 return entity.getSoftwareId();
86 84 default:
87   - log.warn("Unsupported firmware type: [{}]", firmwareType);
  85 + log.warn("Unsupported ota package type: [{}]", type);
88 86 return null;
89 87 }
90 88 }
  89 +
  90 + public static <T> T getByOtaPackageType(Supplier<T> firmwareSupplier, Supplier<T> softwareSupplier, OtaPackageType type) {
  91 + switch (type) {
  92 + case FIRMWARE:
  93 + return firmwareSupplier.get();
  94 + case SOFTWARE:
  95 + return softwareSupplier.get();
  96 + default:
  97 + throw new RuntimeException("Unsupported OtaPackage type: " + type);
  98 + }
  99 + }
91 100 }
... ...
... ... @@ -38,7 +38,7 @@ public class TbKafkaTopicConfigs {
38 38 private String notificationsProperties;
39 39 @Value("${queue.kafka.topic-properties.js-executor}")
40 40 private String jsExecutorProperties;
41   - @Value("${queue.kafka.topic-properties.fw-updates:}")
  41 + @Value("${queue.kafka.topic-properties.ota-updates:}")
42 42 private String fwUpdatesProperties;
43 43
44 44 @Getter
... ...
... ... @@ -187,14 +187,14 @@ public class AwsSqsMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng
187 187 }
188 188
189 189 @Override
190   - public TbQueueConsumer<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> createToFirmwareStateServiceMsgConsumer() {
191   - return new TbAwsSqsConsumerTemplate<>(transportApiAdmin, sqsSettings, coreSettings.getFirmwareTopic(),
192   - msg -> new TbProtoQueueMsg<>(msg.getKey(), ToFirmwareStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders()));
  190 + public TbQueueConsumer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> createToOtaPackageStateServiceMsgConsumer() {
  191 + return new TbAwsSqsConsumerTemplate<>(transportApiAdmin, sqsSettings, coreSettings.getOtaPackageTopic(),
  192 + msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders()));
193 193 }
194 194
195 195 @Override
196   - public TbQueueProducer<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> createToFirmwareStateServiceMsgProducer() {
197   - return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, coreSettings.getFirmwareTopic());
  196 + public TbQueueProducer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> createToOtaPackageStateServiceMsgProducer() {
  197 + return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, coreSettings.getOtaPackageTopic());
198 198 }
199 199
200 200 @PreDestroy
... ...
... ... @@ -23,7 +23,7 @@ import org.thingsboard.server.common.msg.queue.ServiceType;
23 23 import org.thingsboard.server.gen.js.JsInvokeProtos;
24 24 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
25 25 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
26   -import org.thingsboard.server.gen.transport.TransportProtos.ToFirmwareStateServiceMsg;
  26 +import org.thingsboard.server.gen.transport.TransportProtos.ToOtaPackageStateServiceMsg;
27 27 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
28 28 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineNotificationMsg;
29 29 import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg;
... ... @@ -177,14 +177,14 @@ public class AwsSqsTbCoreQueueFactory implements TbCoreQueueFactory {
177 177 }
178 178
179 179 @Override
180   - public TbQueueConsumer<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> createToFirmwareStateServiceMsgConsumer() {
181   - return new TbAwsSqsConsumerTemplate<>(transportApiAdmin, sqsSettings, coreSettings.getFirmwareTopic(),
182   - msg -> new TbProtoQueueMsg<>(msg.getKey(), ToFirmwareStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders()));
  180 + public TbQueueConsumer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> createToOtaPackageStateServiceMsgConsumer() {
  181 + return new TbAwsSqsConsumerTemplate<>(transportApiAdmin, sqsSettings, coreSettings.getOtaPackageTopic(),
  182 + msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders()));
183 183 }
184 184
185 185 @Override
186   - public TbQueueProducer<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> createToFirmwareStateServiceMsgProducer() {
187   - return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, coreSettings.getFirmwareTopic());
  186 + public TbQueueProducer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> createToOtaPackageStateServiceMsgProducer() {
  187 + return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, coreSettings.getOtaPackageTopic());
188 188 }
189 189
190 190 @PreDestroy
... ...
... ... @@ -131,13 +131,13 @@ public class InMemoryMonolithQueueFactory implements TbCoreQueueFactory, TbRuleE
131 131 }
132 132
133 133 @Override
134   - public TbQueueConsumer<TbProtoQueueMsg<TransportProtos.ToFirmwareStateServiceMsg>> createToFirmwareStateServiceMsgConsumer() {
135   - return new InMemoryTbQueueConsumer<>(coreSettings.getFirmwareTopic());
  134 + public TbQueueConsumer<TbProtoQueueMsg<TransportProtos.ToOtaPackageStateServiceMsg>> createToOtaPackageStateServiceMsgConsumer() {
  135 + return new InMemoryTbQueueConsumer<>(coreSettings.getOtaPackageTopic());
136 136 }
137 137
138 138 @Override
139   - public TbQueueProducer<TbProtoQueueMsg<TransportProtos.ToFirmwareStateServiceMsg>> createToFirmwareStateServiceMsgProducer() {
140   - return new InMemoryTbQueueProducer<>(coreSettings.getFirmwareTopic());
  139 + public TbQueueProducer<TbProtoQueueMsg<TransportProtos.ToOtaPackageStateServiceMsg>> createToOtaPackageStateServiceMsgProducer() {
  140 + return new InMemoryTbQueueProducer<>(coreSettings.getOtaPackageTopic());
141 141 }
142 142
143 143 @Override
... ...
... ... @@ -23,7 +23,7 @@ import org.thingsboard.server.common.msg.queue.ServiceType;
23 23 import org.thingsboard.server.gen.js.JsInvokeProtos;
24 24 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
25 25 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
26   -import org.thingsboard.server.gen.transport.TransportProtos.ToFirmwareStateServiceMsg;
  26 +import org.thingsboard.server.gen.transport.TransportProtos.ToOtaPackageStateServiceMsg;
27 27 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
28 28 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineNotificationMsg;
29 29 import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg;
... ... @@ -277,24 +277,24 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi
277 277 }
278 278
279 279 @Override
280   - public TbQueueConsumer<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> createToFirmwareStateServiceMsgConsumer() {
281   - TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> consumerBuilder = TbKafkaConsumerTemplate.builder();
  280 + public TbQueueConsumer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> createToOtaPackageStateServiceMsgConsumer() {
  281 + TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> consumerBuilder = TbKafkaConsumerTemplate.builder();
282 282 consumerBuilder.settings(kafkaSettings);
283   - consumerBuilder.topic(coreSettings.getFirmwareTopic());
284   - consumerBuilder.clientId("monolith-fw-consumer-" + serviceInfoProvider.getServiceId());
285   - consumerBuilder.groupId("monolith-fw-consumer");
286   - consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToFirmwareStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders()));
  283 + consumerBuilder.topic(coreSettings.getOtaPackageTopic());
  284 + consumerBuilder.clientId("monolith-ota-consumer-" + serviceInfoProvider.getServiceId());
  285 + consumerBuilder.groupId("monolith-ota-consumer");
  286 + consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders()));
287 287 consumerBuilder.admin(fwUpdatesAdmin);
288 288 consumerBuilder.statsService(consumerStatsService);
289 289 return consumerBuilder.build();
290 290 }
291 291
292 292 @Override
293   - public TbQueueProducer<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> createToFirmwareStateServiceMsgProducer() {
294   - TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> requestBuilder = TbKafkaProducerTemplate.builder();
  293 + public TbQueueProducer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> createToOtaPackageStateServiceMsgProducer() {
  294 + TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> requestBuilder = TbKafkaProducerTemplate.builder();
295 295 requestBuilder.settings(kafkaSettings);
296   - requestBuilder.clientId("monolith-fw-producer-" + serviceInfoProvider.getServiceId());
297   - requestBuilder.defaultTopic(coreSettings.getFirmwareTopic());
  296 + requestBuilder.clientId("monolith-ota-producer-" + serviceInfoProvider.getServiceId());
  297 + requestBuilder.defaultTopic(coreSettings.getOtaPackageTopic());
298 298 requestBuilder.admin(fwUpdatesAdmin);
299 299 return requestBuilder.build();
300 300 }
... ...
... ... @@ -23,7 +23,7 @@ import org.thingsboard.server.common.msg.queue.ServiceType;
23 23 import org.thingsboard.server.gen.js.JsInvokeProtos;
24 24 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
25 25 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
26   -import org.thingsboard.server.gen.transport.TransportProtos.ToFirmwareStateServiceMsg;
  26 +import org.thingsboard.server.gen.transport.TransportProtos.ToOtaPackageStateServiceMsg;
27 27 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
28 28 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineNotificationMsg;
29 29 import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg;
... ... @@ -245,24 +245,24 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory {
245 245 }
246 246
247 247 @Override
248   - public TbQueueConsumer<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> createToFirmwareStateServiceMsgConsumer() {
249   - TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> consumerBuilder = TbKafkaConsumerTemplate.builder();
  248 + public TbQueueConsumer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> createToOtaPackageStateServiceMsgConsumer() {
  249 + TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> consumerBuilder = TbKafkaConsumerTemplate.builder();
250 250 consumerBuilder.settings(kafkaSettings);
251   - consumerBuilder.topic(coreSettings.getFirmwareTopic());
252   - consumerBuilder.clientId("tb-core-fw-consumer-" + serviceInfoProvider.getServiceId());
253   - consumerBuilder.groupId("tb-core-fw-consumer");
254   - consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToFirmwareStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders()));
  251 + consumerBuilder.topic(coreSettings.getOtaPackageTopic());
  252 + consumerBuilder.clientId("tb-core-ota-consumer-" + serviceInfoProvider.getServiceId());
  253 + consumerBuilder.groupId("tb-core-ota-consumer");
  254 + consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders()));
255 255 consumerBuilder.admin(fwUpdatesAdmin);
256 256 consumerBuilder.statsService(consumerStatsService);
257 257 return consumerBuilder.build();
258 258 }
259 259
260 260 @Override
261   - public TbQueueProducer<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> createToFirmwareStateServiceMsgProducer() {
262   - TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> requestBuilder = TbKafkaProducerTemplate.builder();
  261 + public TbQueueProducer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> createToOtaPackageStateServiceMsgProducer() {
  262 + TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> requestBuilder = TbKafkaProducerTemplate.builder();
263 263 requestBuilder.settings(kafkaSettings);
264   - requestBuilder.clientId("tb-core-fw-producer-" + serviceInfoProvider.getServiceId());
265   - requestBuilder.defaultTopic(coreSettings.getFirmwareTopic());
  264 + requestBuilder.clientId("tb-core-ota-producer-" + serviceInfoProvider.getServiceId());
  265 + requestBuilder.defaultTopic(coreSettings.getOtaPackageTopic());
266 266 requestBuilder.admin(fwUpdatesAdmin);
267 267 return requestBuilder.build();
268 268 }
... ...
... ... @@ -22,9 +22,9 @@ import org.springframework.stereotype.Component;
22 22 import org.thingsboard.server.common.msg.queue.ServiceType;
23 23 import org.thingsboard.server.gen.js.JsInvokeProtos.RemoteJsRequest;
24 24 import org.thingsboard.server.gen.js.JsInvokeProtos.RemoteJsResponse;
25   -import org.thingsboard.server.gen.transport.TransportProtos.*;
26 25 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
27 26 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
  27 +import org.thingsboard.server.gen.transport.TransportProtos.ToOtaPackageStateServiceMsg;
28 28 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
29 29 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineNotificationMsg;
30 30 import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg;
... ... @@ -192,14 +192,14 @@ public class PubSubMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng
192 192 }
193 193
194 194 @Override
195   - public TbQueueConsumer<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> createToFirmwareStateServiceMsgConsumer() {
196   - return new TbPubSubConsumerTemplate<>(coreAdmin, pubSubSettings, coreSettings.getFirmwareTopic(),
197   - msg -> new TbProtoQueueMsg<>(msg.getKey(), ToFirmwareStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders()));
  195 + public TbQueueConsumer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> createToOtaPackageStateServiceMsgConsumer() {
  196 + return new TbPubSubConsumerTemplate<>(coreAdmin, pubSubSettings, coreSettings.getOtaPackageTopic(),
  197 + msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders()));
198 198 }
199 199
200 200 @Override
201   - public TbQueueProducer<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> createToFirmwareStateServiceMsgProducer() {
202   - return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, coreSettings.getFirmwareTopic());
  201 + public TbQueueProducer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> createToOtaPackageStateServiceMsgProducer() {
  202 + return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, coreSettings.getOtaPackageTopic());
203 203 }
204 204
205 205 @Override
... ...
... ... @@ -23,7 +23,7 @@ import org.thingsboard.server.common.msg.queue.ServiceType;
23 23 import org.thingsboard.server.gen.js.JsInvokeProtos;
24 24 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
25 25 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
26   -import org.thingsboard.server.gen.transport.TransportProtos.ToFirmwareStateServiceMsg;
  26 +import org.thingsboard.server.gen.transport.TransportProtos.ToOtaPackageStateServiceMsg;
27 27 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
28 28 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineNotificationMsg;
29 29 import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg;
... ... @@ -166,14 +166,14 @@ public class PubSubTbCoreQueueFactory implements TbCoreQueueFactory {
166 166 }
167 167
168 168 @Override
169   - public TbQueueConsumer<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> createToFirmwareStateServiceMsgConsumer() {
170   - return new TbPubSubConsumerTemplate<>(coreAdmin, pubSubSettings, coreSettings.getFirmwareTopic(),
171   - msg -> new TbProtoQueueMsg<>(msg.getKey(), ToFirmwareStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders()));
  169 + public TbQueueConsumer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> createToOtaPackageStateServiceMsgConsumer() {
  170 + return new TbPubSubConsumerTemplate<>(coreAdmin, pubSubSettings, coreSettings.getOtaPackageTopic(),
  171 + msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders()));
172 172 }
173 173
174 174 @Override
175   - public TbQueueProducer<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> createToFirmwareStateServiceMsgProducer() {
176   - return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, coreSettings.getFirmwareTopic());
  175 + public TbQueueProducer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> createToOtaPackageStateServiceMsgProducer() {
  176 + return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, coreSettings.getOtaPackageTopic());
177 177 }
178 178
179 179 @Override
... ...
... ... @@ -24,7 +24,7 @@ import org.thingsboard.server.gen.js.JsInvokeProtos.RemoteJsRequest;
24 24 import org.thingsboard.server.gen.js.JsInvokeProtos.RemoteJsResponse;
25 25 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
26 26 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
27   -import org.thingsboard.server.gen.transport.TransportProtos.ToFirmwareStateServiceMsg;
  27 +import org.thingsboard.server.gen.transport.TransportProtos.ToOtaPackageStateServiceMsg;
28 28 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
29 29 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineNotificationMsg;
30 30 import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg;
... ... @@ -190,14 +190,14 @@ public class RabbitMqMonolithQueueFactory implements TbCoreQueueFactory, TbRuleE
190 190 }
191 191
192 192 @Override
193   - public TbQueueConsumer<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> createToFirmwareStateServiceMsgConsumer() {
194   - return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getFirmwareTopic(),
195   - msg -> new TbProtoQueueMsg<>(msg.getKey(), ToFirmwareStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders()));
  193 + public TbQueueConsumer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> createToOtaPackageStateServiceMsgConsumer() {
  194 + return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getOtaPackageTopic(),
  195 + msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders()));
196 196 }
197 197
198 198 @Override
199   - public TbQueueProducer<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> createToFirmwareStateServiceMsgProducer() {
200   - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getFirmwareTopic());
  199 + public TbQueueProducer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> createToOtaPackageStateServiceMsgProducer() {
  200 + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getOtaPackageTopic());
201 201 }
202 202
203 203 @Override
... ...
... ... @@ -23,7 +23,7 @@ import org.thingsboard.server.common.msg.queue.ServiceType;
23 23 import org.thingsboard.server.gen.js.JsInvokeProtos;
24 24 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
25 25 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
26   -import org.thingsboard.server.gen.transport.TransportProtos.ToFirmwareStateServiceMsg;
  26 +import org.thingsboard.server.gen.transport.TransportProtos.ToOtaPackageStateServiceMsg;
27 27 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
28 28 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineNotificationMsg;
29 29 import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg;
... ... @@ -172,14 +172,14 @@ public class RabbitMqTbCoreQueueFactory implements TbCoreQueueFactory {
172 172 }
173 173
174 174 @Override
175   - public TbQueueConsumer<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> createToFirmwareStateServiceMsgConsumer() {
176   - return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getFirmwareTopic(),
177   - msg -> new TbProtoQueueMsg<>(msg.getKey(), ToFirmwareStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders()));
  175 + public TbQueueConsumer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> createToOtaPackageStateServiceMsgConsumer() {
  176 + return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getOtaPackageTopic(),
  177 + msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders()));
178 178 }
179 179
180 180 @Override
181   - public TbQueueProducer<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> createToFirmwareStateServiceMsgProducer() {
182   - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getFirmwareTopic());
  181 + public TbQueueProducer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> createToOtaPackageStateServiceMsgProducer() {
  182 + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getOtaPackageTopic());
183 183 }
184 184
185 185 @Override
... ...
... ... @@ -23,7 +23,7 @@ import org.thingsboard.server.common.msg.queue.ServiceType;
23 23 import org.thingsboard.server.gen.js.JsInvokeProtos;
24 24 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
25 25 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
26   -import org.thingsboard.server.gen.transport.TransportProtos.ToFirmwareStateServiceMsg;
  26 +import org.thingsboard.server.gen.transport.TransportProtos.ToOtaPackageStateServiceMsg;
27 27 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
28 28 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineNotificationMsg;
29 29 import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg;
... ... @@ -189,14 +189,14 @@ public class ServiceBusMonolithQueueFactory implements TbCoreQueueFactory, TbRul
189 189 }
190 190
191 191 @Override
192   - public TbQueueConsumer<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> createToFirmwareStateServiceMsgConsumer() {
193   - return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getFirmwareTopic(),
194   - msg -> new TbProtoQueueMsg<>(msg.getKey(), ToFirmwareStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders()));
  192 + public TbQueueConsumer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> createToOtaPackageStateServiceMsgConsumer() {
  193 + return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getOtaPackageTopic(),
  194 + msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders()));
195 195 }
196 196
197 197 @Override
198   - public TbQueueProducer<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> createToFirmwareStateServiceMsgProducer() {
199   - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getFirmwareTopic());
  198 + public TbQueueProducer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> createToOtaPackageStateServiceMsgProducer() {
  199 + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getOtaPackageTopic());
200 200 }
201 201
202 202 @Override
... ...
... ... @@ -23,7 +23,7 @@ import org.thingsboard.server.common.msg.queue.ServiceType;
23 23 import org.thingsboard.server.gen.js.JsInvokeProtos;
24 24 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
25 25 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
26   -import org.thingsboard.server.gen.transport.TransportProtos.ToFirmwareStateServiceMsg;
  26 +import org.thingsboard.server.gen.transport.TransportProtos.ToOtaPackageStateServiceMsg;
27 27 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
28 28 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineNotificationMsg;
29 29 import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg;
... ... @@ -172,14 +172,14 @@ public class ServiceBusTbCoreQueueFactory implements TbCoreQueueFactory {
172 172 }
173 173
174 174 @Override
175   - public TbQueueConsumer<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> createToFirmwareStateServiceMsgConsumer() {
176   - return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getFirmwareTopic(),
177   - msg -> new TbProtoQueueMsg<>(msg.getKey(), ToFirmwareStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders()));
  175 + public TbQueueConsumer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> createToOtaPackageStateServiceMsgConsumer() {
  176 + return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getOtaPackageTopic(),
  177 + msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders()));
178 178 }
179 179
180 180 @Override
181   - public TbQueueProducer<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> createToFirmwareStateServiceMsgProducer() {
182   - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getFirmwareTopic());
  181 + public TbQueueProducer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> createToOtaPackageStateServiceMsgProducer() {
  182 + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getOtaPackageTopic());
183 183 }
184 184
185 185 @Override
... ...
... ... @@ -16,7 +16,7 @@
16 16 package org.thingsboard.server.queue.provider;
17 17
18 18 import org.thingsboard.server.gen.js.JsInvokeProtos;
19   -import org.thingsboard.server.gen.transport.TransportProtos.ToFirmwareStateServiceMsg;
  19 +import org.thingsboard.server.gen.transport.TransportProtos.ToOtaPackageStateServiceMsg;
20 20 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
21 21 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
22 22 import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg;
... ... @@ -91,14 +91,14 @@ public interface TbCoreQueueFactory extends TbUsageStatsClientQueueFactory {
91 91 *
92 92 * @return
93 93 */
94   - TbQueueConsumer<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> createToFirmwareStateServiceMsgConsumer();
  94 + TbQueueConsumer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> createToOtaPackageStateServiceMsgConsumer();
95 95
96 96 /**
97 97 * Used to consume messages about firmware update notifications by TB Core Service
98 98 *
99 99 * @return
100 100 */
101   - TbQueueProducer<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> createToFirmwareStateServiceMsgProducer();
  101 + TbQueueProducer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> createToOtaPackageStateServiceMsgProducer();
102 102
103 103 /**
104 104 * Used to consume high priority messages by TB Core Service
... ...
... ... @@ -15,7 +15,6 @@
15 15 */
16 16 package org.thingsboard.server.queue.provider;
17 17
18   -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
19 18 import org.springframework.stereotype.Service;
20 19 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg;
21 20 import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg;
... ... @@ -25,11 +24,12 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg;
25 24 import org.thingsboard.server.gen.transport.TransportProtos.ToUsageStatsServiceMsg;
26 25 import org.thingsboard.server.queue.TbQueueProducer;
27 26 import org.thingsboard.server.queue.common.TbProtoQueueMsg;
  27 +import org.thingsboard.server.queue.util.TbCoreComponent;
28 28
29 29 import javax.annotation.PostConstruct;
30 30
31 31 @Service
32   -@ConditionalOnExpression("'${service.type:null}'=='monolith' || '${service.type:null}'=='tb-core'")
  32 +@TbCoreComponent
33 33 public class TbCoreQueueProducerProvider implements TbQueueProducerProvider {
34 34
35 35 private final TbCoreQueueFactory tbQueueProvider;
... ...
... ... @@ -26,8 +26,8 @@ public class TbQueueCoreSettings {
26 26 @Value("${queue.core.topic}")
27 27 private String topic;
28 28
29   - @Value("${queue.core.firmware.topic:tb_firmware}")
30   - private String firmwareTopic;
  29 + @Value("${queue.core.ota.topic:tb_ota_package}")
  30 + private String otaPackageTopic;
31 31
32 32 @Value("${queue.core.usage-stats-topic:tb_usage_stats}")
33 33 private String usageStatsTopic;
... ...
... ... @@ -388,7 +388,7 @@ enum ResponseStatus {
388 388 FAILURE = 3;
389 389 }
390 390
391   -message GetFirmwareRequestMsg {
  391 +message GetOtaPackageRequestMsg {
392 392 int64 deviceIdMSB = 1;
393 393 int64 deviceIdLSB = 2;
394 394 int64 tenantIdMSB = 3;
... ... @@ -396,10 +396,10 @@ message GetFirmwareRequestMsg {
396 396 string type = 5;
397 397 }
398 398
399   -message GetFirmwareResponseMsg {
  399 +message GetOtaPackageResponseMsg {
400 400 ResponseStatus responseStatus = 1;
401   - int64 firmwareIdMSB = 2;
402   - int64 firmwareIdLSB = 3;
  401 + int64 otaPackageIdMSB = 2;
  402 + int64 otaPackageIdLSB = 3;
403 403 string type = 4;
404 404 string title = 5;
405 405 string version = 6;
... ... @@ -627,7 +627,7 @@ message TransportApiRequestMsg {
627 627 ProvisionDeviceRequestMsg provisionDeviceRequestMsg = 7;
628 628 ValidateDeviceLwM2MCredentialsRequestMsg validateDeviceLwM2MCredentialsRequestMsg = 8;
629 629 GetResourceRequestMsg resourceRequestMsg = 9;
630   - GetFirmwareRequestMsg firmwareRequestMsg = 10;
  630 + GetOtaPackageRequestMsg otaPackageRequestMsg = 10;
631 631 GetSnmpDevicesRequestMsg snmpDevicesRequestMsg = 11;
632 632 GetDeviceRequestMsg deviceRequestMsg = 12;
633 633 GetDeviceCredentialsRequestMsg deviceCredentialsRequestMsg = 13;
... ... @@ -642,7 +642,7 @@ message TransportApiResponseMsg {
642 642 GetSnmpDevicesResponseMsg snmpDevicesResponseMsg = 5;
643 643 LwM2MResponseMsg lwM2MResponseMsg = 6;
644 644 GetResourceResponseMsg resourceResponseMsg = 7;
645   - GetFirmwareResponseMsg firmwareResponseMsg = 8;
  645 + GetOtaPackageResponseMsg otaPackageResponseMsg = 8;
646 646 GetDeviceResponseMsg deviceResponseMsg = 9;
647 647 GetDeviceCredentialsResponseMsg deviceCredentialsResponseMsg = 10;
648 648 }
... ... @@ -710,13 +710,13 @@ message ToUsageStatsServiceMsg {
710 710 int64 customerIdLSB = 7;
711 711 }
712 712
713   -message ToFirmwareStateServiceMsg {
  713 +message ToOtaPackageStateServiceMsg {
714 714 int64 ts = 1;
715 715 int64 tenantIdMSB = 2;
716 716 int64 tenantIdLSB = 3;
717 717 int64 deviceIdMSB = 4;
718 718 int64 deviceIdLSB = 5;
719   - int64 firmwareIdMSB = 6;
720   - int64 firmwareIdLSB = 7;
  719 + int64 otaPackageIdMSB = 6;
  720 + int64 otaPackageIdLSB = 7;
721 721 string type = 8;
722 722 }
... ...
... ... @@ -44,7 +44,7 @@ import org.thingsboard.server.common.data.device.profile.DeviceProfileTransportC
44 44 import org.thingsboard.server.common.data.device.profile.JsonTransportPayloadConfiguration;
45 45 import org.thingsboard.server.common.data.device.profile.ProtoTransportPayloadConfiguration;
46 46 import org.thingsboard.server.common.data.device.profile.TransportPayloadTypeConfiguration;
47   -import org.thingsboard.server.common.data.firmware.FirmwareType;
  47 +import org.thingsboard.server.common.data.ota.OtaPackageType;
48 48 import org.thingsboard.server.common.data.security.DeviceTokenCredentials;
49 49 import org.thingsboard.server.common.msg.session.FeatureType;
50 50 import org.thingsboard.server.common.msg.session.SessionMsgType;
... ... @@ -350,10 +350,10 @@ public class CoapTransportResource extends AbstractCoapTransportResource {
350 350 new CoapNoOpCallback(exchange));
351 351 break;
352 352 case GET_FIRMWARE_REQUEST:
353   - getFirmwareCallback(sessionInfo, exchange, FirmwareType.FIRMWARE);
  353 + getOtaPackageCallback(sessionInfo, exchange, OtaPackageType.FIRMWARE);
354 354 break;
355 355 case GET_SOFTWARE_REQUEST:
356   - getFirmwareCallback(sessionInfo, exchange, FirmwareType.SOFTWARE);
  356 + getOtaPackageCallback(sessionInfo, exchange, OtaPackageType.SOFTWARE);
357 357 break;
358 358 }
359 359 } catch (AdaptorException e) {
... ... @@ -366,14 +366,14 @@ public class CoapTransportResource extends AbstractCoapTransportResource {
366 366 return new UUID(sessionInfoProto.getSessionIdMSB(), sessionInfoProto.getSessionIdLSB());
367 367 }
368 368
369   - private void getFirmwareCallback(TransportProtos.SessionInfoProto sessionInfo, CoapExchange exchange, FirmwareType firmwareType) {
370   - TransportProtos.GetFirmwareRequestMsg requestMsg = TransportProtos.GetFirmwareRequestMsg.newBuilder()
  369 + private void getOtaPackageCallback(TransportProtos.SessionInfoProto sessionInfo, CoapExchange exchange, OtaPackageType firmwareType) {
  370 + TransportProtos.GetOtaPackageRequestMsg requestMsg = TransportProtos.GetOtaPackageRequestMsg.newBuilder()
371 371 .setTenantIdMSB(sessionInfo.getTenantIdMSB())
372 372 .setTenantIdLSB(sessionInfo.getTenantIdLSB())
373 373 .setDeviceIdMSB(sessionInfo.getDeviceIdMSB())
374 374 .setDeviceIdLSB(sessionInfo.getDeviceIdLSB())
375 375 .setType(firmwareType.name()).build();
376   - transportContext.getTransportService().process(sessionInfo, requestMsg, new FirmwareCallback(exchange));
  376 + transportContext.getTransportService().process(sessionInfo, requestMsg, new OtaPackageCallback(exchange));
377 377 }
378 378
379 379 private TransportProtos.SessionInfoProto lookupAsyncSessionInfo(String token) {
... ... @@ -470,25 +470,25 @@ public class CoapTransportResource extends AbstractCoapTransportResource {
470 470 }
471 471 }
472 472
473   - private class FirmwareCallback implements TransportServiceCallback<TransportProtos.GetFirmwareResponseMsg> {
  473 + private class OtaPackageCallback implements TransportServiceCallback<TransportProtos.GetOtaPackageResponseMsg> {
474 474 private final CoapExchange exchange;
475 475
476   - FirmwareCallback(CoapExchange exchange) {
  476 + OtaPackageCallback(CoapExchange exchange) {
477 477 this.exchange = exchange;
478 478 }
479 479
480 480 @Override
481   - public void onSuccess(TransportProtos.GetFirmwareResponseMsg msg) {
  481 + public void onSuccess(TransportProtos.GetOtaPackageResponseMsg msg) {
482 482 String title = exchange.getQueryParameter("title");
483 483 String version = exchange.getQueryParameter("version");
484 484 if (msg.getResponseStatus().equals(TransportProtos.ResponseStatus.SUCCESS)) {
485 485 if (msg.getTitle().equals(title) && msg.getVersion().equals(version)) {
486   - String firmwareId = new UUID(msg.getFirmwareIdMSB(), msg.getFirmwareIdLSB()).toString();
  486 + String firmwareId = new UUID(msg.getOtaPackageIdMSB(), msg.getOtaPackageIdLSB()).toString();
487 487 String strChunkSize = exchange.getQueryParameter("size");
488 488 String strChunk = exchange.getQueryParameter("chunk");
489 489 int chunkSize = StringUtils.isEmpty(strChunkSize) ? 0 : Integer.parseInt(strChunkSize);
490 490 int chunk = StringUtils.isEmpty(strChunk) ? 0 : Integer.parseInt(strChunk);
491   - exchange.respond(CoAP.ResponseCode.CONTENT, transportContext.getFirmwareDataCache().get(firmwareId, chunkSize, chunk));
  491 + exchange.respond(CoAP.ResponseCode.CONTENT, transportContext.getOtaPackageDataCache().get(firmwareId, chunkSize, chunk));
492 492 } else {
493 493 exchange.respond(CoAP.ResponseCode.BAD_REQUEST);
494 494 }
... ...
... ... @@ -34,7 +34,7 @@ import org.springframework.web.bind.annotation.RequestParam;
34 34 import org.springframework.web.bind.annotation.RestController;
35 35 import org.springframework.web.context.request.async.DeferredResult;
36 36 import org.thingsboard.server.common.data.DeviceTransportType;
37   -import org.thingsboard.server.common.data.firmware.FirmwareType;
  37 +import org.thingsboard.server.common.data.ota.OtaPackageType;
38 38 import org.thingsboard.server.common.data.TbTransportService;
39 39 import org.thingsboard.server.common.data.id.DeviceId;
40 40 import org.thingsboard.server.common.transport.SessionMsgListener;
... ... @@ -213,7 +213,7 @@ public class DeviceApiController implements TbTransportService {
213 213 @RequestParam(value = "version") String version,
214 214 @RequestParam(value = "size", required = false, defaultValue = "0") int size,
215 215 @RequestParam(value = "chunk", required = false, defaultValue = "0") int chunk) {
216   - return getFirmwareCallback(deviceToken, title, version, size, chunk, FirmwareType.FIRMWARE);
  216 + return getOtaPackageCallback(deviceToken, title, version, size, chunk, OtaPackageType.FIRMWARE);
217 217 }
218 218
219 219 @RequestMapping(value = "/{deviceToken}/software", method = RequestMethod.GET)
... ... @@ -222,7 +222,7 @@ public class DeviceApiController implements TbTransportService {
222 222 @RequestParam(value = "version") String version,
223 223 @RequestParam(value = "size", required = false, defaultValue = "0") int size,
224 224 @RequestParam(value = "chunk", required = false, defaultValue = "0") int chunk) {
225   - return getFirmwareCallback(deviceToken, title, version, size, chunk, FirmwareType.SOFTWARE);
  225 + return getOtaPackageCallback(deviceToken, title, version, size, chunk, OtaPackageType.SOFTWARE);
226 226 }
227 227
228 228 @RequestMapping(value = "/provision", method = RequestMethod.POST)
... ... @@ -233,17 +233,17 @@ public class DeviceApiController implements TbTransportService {
233 233 return responseWriter;
234 234 }
235 235
236   - private DeferredResult<ResponseEntity> getFirmwareCallback(String deviceToken, String title, String version, int size, int chunk, FirmwareType firmwareType) {
  236 + private DeferredResult<ResponseEntity> getOtaPackageCallback(String deviceToken, String title, String version, int size, int chunk, OtaPackageType firmwareType) {
237 237 DeferredResult<ResponseEntity> responseWriter = new DeferredResult<>();
238 238 transportContext.getTransportService().process(DeviceTransportType.DEFAULT, ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(),
239 239 new DeviceAuthCallback(transportContext, responseWriter, sessionInfo -> {
240   - TransportProtos.GetFirmwareRequestMsg requestMsg = TransportProtos.GetFirmwareRequestMsg.newBuilder()
  240 + TransportProtos.GetOtaPackageRequestMsg requestMsg = TransportProtos.GetOtaPackageRequestMsg.newBuilder()
241 241 .setTenantIdMSB(sessionInfo.getTenantIdMSB())
242 242 .setTenantIdLSB(sessionInfo.getTenantIdLSB())
243 243 .setDeviceIdMSB(sessionInfo.getDeviceIdMSB())
244 244 .setDeviceIdLSB(sessionInfo.getDeviceIdLSB())
245 245 .setType(firmwareType.name()).build();
246   - transportContext.getTransportService().process(sessionInfo, requestMsg, new GetFirmwareCallback(responseWriter, title, version, size, chunk));
  246 + transportContext.getTransportService().process(sessionInfo, requestMsg, new GetOtaPackageCallback(responseWriter, title, version, size, chunk));
247 247 }));
248 248 return responseWriter;
249 249 }
... ... @@ -294,14 +294,14 @@ public class DeviceApiController implements TbTransportService {
294 294 }
295 295 }
296 296
297   - private class GetFirmwareCallback implements TransportServiceCallback<TransportProtos.GetFirmwareResponseMsg> {
  297 + private class GetOtaPackageCallback implements TransportServiceCallback<TransportProtos.GetOtaPackageResponseMsg> {
298 298 private final DeferredResult<ResponseEntity> responseWriter;
299 299 private final String title;
300 300 private final String version;
301 301 private final int chuckSize;
302 302 private final int chuck;
303 303
304   - GetFirmwareCallback(DeferredResult<ResponseEntity> responseWriter, String title, String version, int chuckSize, int chuck) {
  304 + GetOtaPackageCallback(DeferredResult<ResponseEntity> responseWriter, String title, String version, int chuckSize, int chuck) {
305 305 this.responseWriter = responseWriter;
306 306 this.title = title;
307 307 this.version = version;
... ... @@ -310,17 +310,17 @@ public class DeviceApiController implements TbTransportService {
310 310 }
311 311
312 312 @Override
313   - public void onSuccess(TransportProtos.GetFirmwareResponseMsg firmwareResponseMsg) {
314   - if (!TransportProtos.ResponseStatus.SUCCESS.equals(firmwareResponseMsg.getResponseStatus())) {
  313 + public void onSuccess(TransportProtos.GetOtaPackageResponseMsg otaPackageResponseMsg) {
  314 + if (!TransportProtos.ResponseStatus.SUCCESS.equals(otaPackageResponseMsg.getResponseStatus())) {
315 315 responseWriter.setResult(new ResponseEntity<>(HttpStatus.NOT_FOUND));
316   - } else if (title.equals(firmwareResponseMsg.getTitle()) && version.equals(firmwareResponseMsg.getVersion())) {
317   - String firmwareId = new UUID(firmwareResponseMsg.getFirmwareIdMSB(), firmwareResponseMsg.getFirmwareIdLSB()).toString();
318   - ByteArrayResource resource = new ByteArrayResource(transportContext.getFirmwareDataCache().get(firmwareId, chuckSize, chuck));
  316 + } else if (title.equals(otaPackageResponseMsg.getTitle()) && version.equals(otaPackageResponseMsg.getVersion())) {
  317 + String otaPackageId = new UUID(otaPackageResponseMsg.getOtaPackageIdMSB(), otaPackageResponseMsg.getOtaPackageIdLSB()).toString();
  318 + ByteArrayResource resource = new ByteArrayResource(transportContext.getOtaPackageDataCache().get(otaPackageId, chuckSize, chuck));
319 319 ResponseEntity<ByteArrayResource> response = ResponseEntity.ok()
320   - .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + firmwareResponseMsg.getFileName())
321   - .header("x-filename", firmwareResponseMsg.getFileName())
  320 + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + otaPackageResponseMsg.getFileName())
  321 + .header("x-filename", otaPackageResponseMsg.getFileName())
322 322 .contentLength(resource.contentLength())
323   - .contentType(parseMediaType(firmwareResponseMsg.getContentType()))
  323 + .contentType(parseMediaType(otaPackageResponseMsg.getContentType()))
324 324 .body(resource);
325 325 responseWriter.setResult(response);
326 326 } else {
... ...
... ... @@ -39,13 +39,13 @@ import org.springframework.context.annotation.Lazy;
39 39 import org.springframework.stereotype.Service;
40 40 import org.thingsboard.common.util.JacksonUtil;
41 41 import org.thingsboard.common.util.ThingsBoardExecutors;
42   -import org.thingsboard.server.cache.firmware.FirmwareDataCache;
  42 +import org.thingsboard.server.cache.ota.OtaPackageDataCache;
43 43 import org.thingsboard.server.common.data.Device;
44 44 import org.thingsboard.server.common.data.DeviceProfile;
45   -import org.thingsboard.server.common.data.firmware.FirmwareKey;
46   -import org.thingsboard.server.common.data.firmware.FirmwareType;
47   -import org.thingsboard.server.common.data.firmware.FirmwareUtil;
48   -import org.thingsboard.server.common.data.id.FirmwareId;
  45 +import org.thingsboard.server.common.data.ota.OtaPackageKey;
  46 +import org.thingsboard.server.common.data.ota.OtaPackageType;
  47 +import org.thingsboard.server.common.data.ota.OtaPackageUtil;
  48 +import org.thingsboard.server.common.data.id.OtaPackageId;
49 49 import org.thingsboard.server.common.transport.TransportService;
50 50 import org.thingsboard.server.common.transport.TransportServiceCallback;
51 51 import org.thingsboard.server.common.transport.adaptor.AdaptorException;
... ... @@ -87,8 +87,8 @@ import java.util.stream.Collectors;
87 87
88 88 import static org.eclipse.californium.core.coap.CoAP.ResponseCode.BAD_REQUEST;
89 89 import static org.eclipse.leshan.core.attributes.Attribute.OBJECT_VERSION;
90   -import static org.thingsboard.server.common.data.firmware.FirmwareUpdateStatus.DOWNLOADED;
91   -import static org.thingsboard.server.common.data.firmware.FirmwareUpdateStatus.UPDATING;
  90 +import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.DOWNLOADED;
  91 +import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.UPDATING;
92 92 import static org.thingsboard.server.common.data.lwm2m.LwM2mConstants.LWM2M_SEPARATOR_PATH;
93 93 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportServerHelper.getValueFromKvProto;
94 94 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.CLIENT_NOT_AUTHORIZED;
... ... @@ -132,7 +132,7 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler
132 132 private final TransportService transportService;
133 133 private final LwM2mTransportContext context;
134 134 public final LwM2MTransportServerConfig config;
135   - public final FirmwareDataCache firmwareDataCache;
  135 + public final OtaPackageDataCache otaPackageDataCache;
136 136 public final LwM2mTransportServerHelper helper;
137 137 private final LwM2MJsonAdaptor adaptor;
138 138 private final TbLwM2MDtlsSessionStore sessionStore;
... ... @@ -143,14 +143,14 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler
143 143 public DefaultLwM2MTransportMsgHandler(TransportService transportService, LwM2MTransportServerConfig config, LwM2mTransportServerHelper helper,
144 144 LwM2mClientContext clientContext,
145 145 @Lazy LwM2mTransportRequest lwM2mTransportRequest,
146   - FirmwareDataCache firmwareDataCache,
  146 + OtaPackageDataCache otaPackageDataCache,
147 147 LwM2mTransportContext context, LwM2MJsonAdaptor adaptor, TbLwM2MDtlsSessionStore sessionStore) {
148 148 this.transportService = transportService;
149 149 this.config = config;
150 150 this.helper = helper;
151 151 this.clientContext = clientContext;
152 152 this.lwM2mTransportRequest = lwM2mTransportRequest;
153   - this.firmwareDataCache = firmwareDataCache;
  153 + this.otaPackageDataCache = otaPackageDataCache;
154 154 this.context = context;
155 155 this.adaptor = adaptor;
156 156 this.rpcSubscriptions = new ConcurrentHashMap<>();
... ... @@ -196,8 +196,8 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler
196 196 .setSubscribeToRPC(TransportProtos.SubscribeToRPCMsg.newBuilder().build())
197 197 .build();
198 198 transportService.process(msg, null);
199   - this.getInfoFirmwareUpdate(lwM2MClient);
200   - this.getInfoSoftwareUpdate(lwM2MClient);
  199 + this.getInfoFirmwareUpdate(lwM2MClient, null);
  200 + this.getInfoSoftwareUpdate(lwM2MClient, null);
201 201 this.initLwM2mFromClientValue(registration, lwM2MClient);
202 202 this.sendLogsToThingsboard(LOG_LW2M_INFO + ": Client create after Registration", registration.getId());
203 203 } else {
... ... @@ -247,7 +247,6 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler
247 247 * @param observations - !!! Warn: if have not finishing unReg, then this operation will be finished on next Client`s connect
248 248 */
249 249 public void unReg(Registration registration, Collection<Observation> observations) {
250   - log.error("Client unRegistration -> test", new RuntimeException());
251 250 unRegistrationExecutor.submit(() -> {
252 251 try {
253 252 this.sendLogsToThingsboard(LOG_LW2M_INFO + ": Client unRegistration", registration.getId());
... ... @@ -286,7 +285,7 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler
286 285 @Override
287 286 public void setCancelObservationsAll(Registration registration) {
288 287 if (registration != null) {
289   - lwM2mTransportRequest.sendAllRequest(registration, null, OBSERVE_CANCEL_ALL,
  288 + this.lwM2mTransportRequest.sendAllRequest(registration, null, OBSERVE_CANCEL_ALL,
290 289 null, null, this.config.getTimeout(), null);
291 290 }
292 291 }
... ... @@ -335,7 +334,7 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler
335 334 READ, pathIdVer, value);
336 335 this.sendLogsToThingsboard(msg, registration.getId());
337 336 rpcRequest.setValueMsg(String.format("%s", value));
338   - this.sentRpcRequest(rpcRequest, response.getCode().getName(), (String) value, LOG_LW2M_VALUE);
  337 + this.sentRpcResponse(rpcRequest, response.getCode().getName(), (String) value, LOG_LW2M_VALUE);
339 338 }
340 339
341 340 /**
... ... @@ -352,21 +351,22 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler
352 351 @Override
353 352 public void onAttributeUpdate(AttributeUpdateNotificationMsg msg, TransportProtos.SessionInfoProto sessionInfo) {
354 353 LwM2mClient lwM2MClient = clientContext.getClient(sessionInfo);
355   - if (msg.getSharedUpdatedCount() > 0) {
  354 + if (msg.getSharedUpdatedCount() > 0 && lwM2MClient != null) {
  355 + log.warn ("2) OnAttributeUpdate, SharedUpdatedList() [{}]", msg.getSharedUpdatedList());
356 356 msg.getSharedUpdatedList().forEach(tsKvProto -> {
357 357 String pathName = tsKvProto.getKv().getKey();
358 358 String pathIdVer = this.getPresentPathIntoProfile(sessionInfo, pathName);
359 359 Object valueNew = getValueFromKvProto(tsKvProto.getKv());
360   - if ((FirmwareUtil.getAttributeKey(FirmwareType.FIRMWARE, FirmwareKey.VERSION).equals(pathName)
  360 + if ((OtaPackageUtil.getAttributeKey(OtaPackageType.FIRMWARE, OtaPackageKey.VERSION).equals(pathName)
361 361 && (!valueNew.equals(lwM2MClient.getFwUpdate().getCurrentVersion())))
362   - || (FirmwareUtil.getAttributeKey(FirmwareType.FIRMWARE, FirmwareKey.TITLE).equals(pathName)
  362 + || (OtaPackageUtil.getAttributeKey(OtaPackageType.FIRMWARE, OtaPackageKey.TITLE).equals(pathName)
363 363 && (!valueNew.equals(lwM2MClient.getFwUpdate().getCurrentTitle())))) {
364   - this.getInfoFirmwareUpdate(lwM2MClient);
365   - } else if ((FirmwareUtil.getAttributeKey(FirmwareType.SOFTWARE, FirmwareKey.VERSION).equals(pathName)
  364 + this.getInfoFirmwareUpdate(lwM2MClient, null);
  365 + } else if ((OtaPackageUtil.getAttributeKey(OtaPackageType.SOFTWARE, OtaPackageKey.VERSION).equals(pathName)
366 366 && (!valueNew.equals(lwM2MClient.getSwUpdate().getCurrentVersion())))
367   - || (FirmwareUtil.getAttributeKey(FirmwareType.SOFTWARE, FirmwareKey.TITLE).equals(pathName)
  367 + || (OtaPackageUtil.getAttributeKey(OtaPackageType.SOFTWARE, OtaPackageKey.TITLE).equals(pathName)
368 368 && (!valueNew.equals(lwM2MClient.getSwUpdate().getCurrentTitle())))) {
369   - this.getInfoSoftwareUpdate(lwM2MClient);
  369 + this.getInfoSoftwareUpdate(lwM2MClient, null);
370 370 }
371 371 if (pathIdVer != null) {
372 372 ResourceModel resourceModel = lwM2MClient.getResourceModel(pathIdVer, this.config
... ... @@ -387,16 +387,19 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler
387 387 }
388 388
389 389 });
390   - } else if (msg.getSharedDeletedCount() > 0) {
  390 + } else if (msg.getSharedDeletedCount() > 0 && lwM2MClient != null) {
391 391 msg.getSharedUpdatedList().forEach(tsKvProto -> {
392 392 String pathName = tsKvProto.getKv().getKey();
393 393 Object valueNew = getValueFromKvProto(tsKvProto.getKv());
394   - if (FirmwareUtil.getAttributeKey(FirmwareType.FIRMWARE, FirmwareKey.VERSION).equals(pathName) && !valueNew.equals(lwM2MClient.getFwUpdate().getCurrentVersion())) {
  394 + if (OtaPackageUtil.getAttributeKey(OtaPackageType.FIRMWARE, OtaPackageKey.VERSION).equals(pathName) && !valueNew.equals(lwM2MClient.getFwUpdate().getCurrentVersion())) {
395 395 lwM2MClient.getFwUpdate().setCurrentVersion((String) valueNew);
396 396 }
397 397 });
398 398 log.info("[{}] delete [{}] onAttributeUpdate", msg.getSharedDeletedList(), sessionInfo);
399 399 }
  400 + else if (lwM2MClient == null) {
  401 + log.error ("OnAttributeUpdate, lwM2MClient is null");
  402 + }
400 403 }
401 404
402 405 /**
... ... @@ -443,6 +446,7 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler
443 446 public void onToDeviceRpcRequest(TransportProtos.ToDeviceRpcRequestMsg toDeviceRpcRequestMsg, SessionInfoProto sessionInfo) {
444 447 // #1
445 448 this.checkRpcRequestTimeout();
  449 + log.warn ("4) toDeviceRpcRequestMsg: [{}], sessionUUID: [{}]", toDeviceRpcRequestMsg, new UUID(sessionInfo.getSessionIdMSB(), sessionInfo.getSessionIdLSB()));
446 450 String bodyParams = StringUtils.trimToNull(toDeviceRpcRequestMsg.getParams()) != null ? toDeviceRpcRequestMsg.getParams() : "null";
447 451 LwM2mTypeOper lwM2mTypeOper = setValidTypeOper(toDeviceRpcRequestMsg.getMethodName());
448 452 UUID requestUUID = new UUID(toDeviceRpcRequestMsg.getRequestIdMSB(), toDeviceRpcRequestMsg.getRequestIdLSB());
... ... @@ -479,7 +483,7 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler
479 483 rpcSubscriptionsToRemove.forEach(rpcSubscriptions::remove);
480 484 }
481 485
482   - public void sentRpcRequest(Lwm2mClientRpcRequest rpcRequest, String requestCode, String msg, String typeMsg) {
  486 + public void sentRpcResponse(Lwm2mClientRpcRequest rpcRequest, String requestCode, String msg, String typeMsg) {
483 487 rpcRequest.setResponseCode(requestCode);
484 488 if (LOG_LW2M_ERROR.equals(typeMsg)) {
485 489 rpcRequest.setInfoMsg(null);
... ... @@ -502,6 +506,7 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler
502 506
503 507 @Override
504 508 public void onToDeviceRpcResponse(TransportProtos.ToDeviceRpcResponseMsg toDeviceResponse, SessionInfoProto sessionInfo) {
  509 + log.warn ("5) onToDeviceRpcResponse: [{}], sessionUUID: [{}]", toDeviceResponse, new UUID(sessionInfo.getSessionIdMSB(), sessionInfo.getSessionIdLSB()));
505 510 transportService.process(sessionInfo, toDeviceResponse, null);
506 511 }
507 512
... ... @@ -882,10 +887,16 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler
882 887 */
883 888 private Object getResourceValueFormatKv(LwM2mClient lwM2MClient, String pathIdVer) {
884 889 LwM2mResource resourceValue = this.getResourceValueFromLwM2MClient(lwM2MClient, pathIdVer);
885   - ResourceModel.Type currentType = resourceValue.getType();
886   - ResourceModel.Type expectedType = this.helper.getResourceModelTypeEqualsKvProtoValueType(currentType, pathIdVer);
887   - return this.converter.convertValue(resourceValue.getValue(), currentType, expectedType,
888   - new LwM2mPath(convertPathFromIdVerToObjectId(pathIdVer)));
  890 + if (resourceValue != null) {
  891 + ResourceModel.Type currentType = resourceValue.getType();
  892 + ResourceModel.Type expectedType = this.helper.getResourceModelTypeEqualsKvProtoValueType(currentType, pathIdVer);
  893 + return this.converter.convertValue(resourceValue.getValue(), currentType, expectedType,
  894 + new LwM2mPath(convertPathFromIdVerToObjectId(pathIdVer)));
  895 + }
  896 +
  897 + else {
  898 + return null;
  899 + }
889 900 }
890 901
891 902 /**
... ... @@ -1246,22 +1257,28 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler
1246 1257 */
1247 1258 public void updateAttributeFromThingsboard(List<TransportProtos.TsKvProto> tsKvProtos, TransportProtos.SessionInfoProto sessionInfo) {
1248 1259 LwM2mClient lwM2MClient = clientContext.getClient(sessionInfo);
1249   - tsKvProtos.forEach(tsKvProto -> {
1250   - String pathIdVer = this.getPresentPathIntoProfile(sessionInfo, tsKvProto.getKv().getKey());
1251   - if (pathIdVer != null) {
1252   - // #1.1
1253   - if (lwM2MClient.getDelayedRequests().containsKey(pathIdVer) && tsKvProto.getTs() > lwM2MClient.getDelayedRequests().get(pathIdVer).getTs()) {
1254   - lwM2MClient.getDelayedRequests().put(pathIdVer, tsKvProto);
1255   - } else if (!lwM2MClient.getDelayedRequests().containsKey(pathIdVer)) {
1256   - lwM2MClient.getDelayedRequests().put(pathIdVer, tsKvProto);
  1260 + if (lwM2MClient != null) {
  1261 + log.warn("1) UpdateAttributeFromThingsboard, tsKvProtos [{}]", tsKvProtos);
  1262 + tsKvProtos.forEach(tsKvProto -> {
  1263 + String pathIdVer = this.getPresentPathIntoProfile(sessionInfo, tsKvProto.getKv().getKey());
  1264 + if (pathIdVer != null) {
  1265 + // #1.1
  1266 + if (lwM2MClient.getDelayedRequests().containsKey(pathIdVer) && tsKvProto.getTs() > lwM2MClient.getDelayedRequests().get(pathIdVer).getTs()) {
  1267 + lwM2MClient.getDelayedRequests().put(pathIdVer, tsKvProto);
  1268 + } else if (!lwM2MClient.getDelayedRequests().containsKey(pathIdVer)) {
  1269 + lwM2MClient.getDelayedRequests().put(pathIdVer, tsKvProto);
  1270 + }
1257 1271 }
1258   - }
1259   - });
1260   - // #2.1
1261   - lwM2MClient.getDelayedRequests().forEach((pathIdVer, tsKvProto) -> {
1262   - this.updateResourcesValueToClient(lwM2MClient, this.getResourceValueFormatKv(lwM2MClient, pathIdVer),
1263   - getValueFromKvProto(tsKvProto.getKv()), pathIdVer);
1264   - });
  1272 + });
  1273 + // #2.1
  1274 + lwM2MClient.getDelayedRequests().forEach((pathIdVer, tsKvProto) -> {
  1275 + this.updateResourcesValueToClient(lwM2MClient, this.getResourceValueFormatKv(lwM2MClient, pathIdVer),
  1276 + getValueFromKvProto(tsKvProto.getKv()), pathIdVer);
  1277 + });
  1278 + }
  1279 + else {
  1280 + log.error("UpdateAttributeFromThingsboard, lwM2MClient is null");
  1281 + }
1265 1282 }
1266 1283
1267 1284 /**
... ... @@ -1340,22 +1357,30 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler
1340 1357 }
1341 1358 }
1342 1359
1343   - public void getInfoFirmwareUpdate(LwM2mClient lwM2MClient) {
  1360 + public void getInfoFirmwareUpdate(LwM2mClient lwM2MClient, Lwm2mClientRpcRequest rpcRequest) {
1344 1361 if (lwM2MClient.getRegistration().getSupportedVersion(FW_ID) != null) {
1345 1362 SessionInfoProto sessionInfo = this.getSessionInfoOrCloseSession(lwM2MClient);
1346 1363 if (sessionInfo != null) {
1347   - transportService.process(sessionInfo, createFirmwareRequestMsg(sessionInfo, FirmwareType.FIRMWARE.name()),
  1364 + DefaultLwM2MTransportMsgHandler handler = this;
  1365 + this.transportService.process(sessionInfo, createOtaPackageRequestMsg(sessionInfo, OtaPackageType.FIRMWARE.name()),
1348 1366 new TransportServiceCallback<>() {
1349 1367 @Override
1350   - public void onSuccess(TransportProtos.GetFirmwareResponseMsg response) {
  1368 + public void onSuccess(TransportProtos.GetOtaPackageResponseMsg response) {
1351 1369 if (TransportProtos.ResponseStatus.SUCCESS.equals(response.getResponseStatus())
1352   - && response.getType().equals(FirmwareType.FIRMWARE.name())) {
  1370 + && response.getType().equals(OtaPackageType.FIRMWARE.name())) {
  1371 + log.warn ("7) firmware start with ver: [{}]", response.getVersion());
  1372 + lwM2MClient.getFwUpdate().setRpcRequest(rpcRequest);
1353 1373 lwM2MClient.getFwUpdate().setCurrentVersion(response.getVersion());
1354 1374 lwM2MClient.getFwUpdate().setCurrentTitle(response.getTitle());
1355   - lwM2MClient.getFwUpdate().setCurrentId(new FirmwareId(new UUID(response.getFirmwareIdMSB(), response.getFirmwareIdLSB())).getId());
1356   - lwM2MClient.getFwUpdate().sendReadObserveInfo(lwM2mTransportRequest);
  1375 + lwM2MClient.getFwUpdate().setCurrentId(new OtaPackageId(new UUID(response.getOtaPackageIdMSB(), response.getOtaPackageIdLSB())).getId());
  1376 + if (rpcRequest == null) {
  1377 + lwM2MClient.getFwUpdate().sendReadObserveInfo(lwM2mTransportRequest);
  1378 + }
  1379 + else {
  1380 + lwM2MClient.getFwUpdate().writeFwSwWare(handler, lwM2mTransportRequest);
  1381 + }
1357 1382 } else {
1358   - log.trace("Firmware [{}] [{}]", lwM2MClient.getDeviceName(), response.getResponseStatus().toString());
  1383 + log.trace("OtaPackage [{}] [{}]", lwM2MClient.getDeviceName(), response.getResponseStatus().toString());
1359 1384 }
1360 1385 }
1361 1386
... ... @@ -1368,21 +1393,28 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler
1368 1393 }
1369 1394 }
1370 1395
1371   - public void getInfoSoftwareUpdate(LwM2mClient lwM2MClient) {
  1396 + public void getInfoSoftwareUpdate(LwM2mClient lwM2MClient, Lwm2mClientRpcRequest rpcRequest) {
1372 1397 if (lwM2MClient.getRegistration().getSupportedVersion(SW_ID) != null) {
1373 1398 SessionInfoProto sessionInfo = this.getSessionInfoOrCloseSession(lwM2MClient);
1374 1399 if (sessionInfo != null) {
1375   - DefaultLwM2MTransportMsgHandler serviceImpl = this;
1376   - transportService.process(sessionInfo, createFirmwareRequestMsg(sessionInfo, FirmwareType.SOFTWARE.name()),
  1400 + DefaultLwM2MTransportMsgHandler handler = this;
  1401 + transportService.process(sessionInfo, createOtaPackageRequestMsg(sessionInfo, OtaPackageType.SOFTWARE.name()),
1377 1402 new TransportServiceCallback<>() {
1378 1403 @Override
1379   - public void onSuccess(TransportProtos.GetFirmwareResponseMsg response) {
  1404 + public void onSuccess(TransportProtos.GetOtaPackageResponseMsg response) {
1380 1405 if (TransportProtos.ResponseStatus.SUCCESS.equals(response.getResponseStatus())
1381   - && response.getType().equals(FirmwareType.SOFTWARE.name())) {
  1406 + && response.getType().equals(OtaPackageType.SOFTWARE.name())) {
  1407 + lwM2MClient.getSwUpdate().setRpcRequest(rpcRequest);
1382 1408 lwM2MClient.getSwUpdate().setCurrentVersion(response.getVersion());
1383 1409 lwM2MClient.getSwUpdate().setCurrentTitle(response.getTitle());
1384   - lwM2MClient.getSwUpdate().setCurrentId(new FirmwareId(new UUID(response.getFirmwareIdMSB(), response.getFirmwareIdLSB())).getId());
  1410 + lwM2MClient.getSwUpdate().setCurrentId(new OtaPackageId(new UUID(response.getOtaPackageIdMSB(), response.getOtaPackageIdLSB())).getId());
1385 1411 lwM2MClient.getSwUpdate().sendReadObserveInfo(lwM2mTransportRequest);
  1412 + if (rpcRequest == null) {
  1413 + lwM2MClient.getSwUpdate().sendReadObserveInfo(lwM2mTransportRequest);
  1414 + }
  1415 + else {
  1416 + lwM2MClient.getSwUpdate().writeFwSwWare(handler, lwM2mTransportRequest);
  1417 + }
1386 1418 } else {
1387 1419 log.trace("Software [{}] [{}]", lwM2MClient.getDeviceName(), response.getResponseStatus().toString());
1388 1420 }
... ... @@ -1397,8 +1429,8 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler
1397 1429 }
1398 1430 }
1399 1431
1400   - private TransportProtos.GetFirmwareRequestMsg createFirmwareRequestMsg(SessionInfoProto sessionInfo, String nameFwSW) {
1401   - return TransportProtos.GetFirmwareRequestMsg.newBuilder()
  1432 + private TransportProtos.GetOtaPackageRequestMsg createOtaPackageRequestMsg(SessionInfoProto sessionInfo, String nameFwSW) {
  1433 + return TransportProtos.GetOtaPackageRequestMsg.newBuilder()
1402 1434 .setDeviceIdMSB(sessionInfo.getDeviceIdMSB())
1403 1435 .setDeviceIdLSB(sessionInfo.getDeviceIdLSB())
1404 1436 .setTenantIdMSB(sessionInfo.getTenantIdMSB())
... ...
... ... @@ -71,8 +71,8 @@ import java.util.stream.Collectors;
71 71 import static org.eclipse.californium.core.coap.CoAP.ResponseCode.CONTENT;
72 72 import static org.eclipse.leshan.core.ResponseCode.BAD_REQUEST;
73 73 import static org.eclipse.leshan.core.ResponseCode.NOT_FOUND;
74   -import static org.thingsboard.server.common.data.firmware.FirmwareUpdateStatus.DOWNLOADED;
75   -import static org.thingsboard.server.common.data.firmware.FirmwareUpdateStatus.FAILED;
  74 +import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.DOWNLOADED;
  75 +import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.FAILED;
76 76 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportServerHelper.getContentFormatByResourceModelType;
77 77 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.DEFAULT_TIMEOUT;
78 78 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.FW_PACKAGE_ID;
... ... @@ -82,10 +82,8 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.L
82 82 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LOG_LW2M_VALUE;
83 83 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper;
84 84 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.DISCOVER;
85   -import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.DISCOVER_ALL;
86 85 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.EXECUTE;
87 86 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.OBSERVE_CANCEL;
88   -import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.OBSERVE_CANCEL_ALL;
89 87 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.OBSERVE_READ_ALL;
90 88 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.WRITE_ATTRIBUTES;
91 89 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.WRITE_REPLACE;
... ... @@ -134,7 +132,7 @@ public class LwM2mTransportRequest {
134 132 ContentFormat contentFormat = contentFormatName != null ? ContentFormat.fromName(contentFormatName.toUpperCase()) : ContentFormat.DEFAULT;
135 133 LwM2mClient lwM2MClient = this.lwM2mClientContext.getOrRegister(registration);
136 134 LwM2mPath resultIds = target != null ? new LwM2mPath(target) : null;
137   - if (!OBSERVE_READ_ALL.name().equals(typeOper.name()) && resultIds != null && registration != null && resultIds.getObjectId() >= 0 && lwM2MClient != null) {
  135 + if (!OBSERVE_CANCEL.name().equals(typeOper.name()) && resultIds != null && registration != null && resultIds.getObjectId() >= 0 && lwM2MClient != null) {
138 136 if (lwM2MClient.isValidObjectVersion(targetIdVer)) {
139 137 timeoutInMs = timeoutInMs > 0 ? timeoutInMs : DEFAULT_TIMEOUT;
140 138 DownlinkRequest request = createRequest(registration, lwM2MClient, typeOper, contentFormat, target,
... ... @@ -153,47 +151,66 @@ public class LwM2mTransportRequest {
153 151 } else if (WRITE_UPDATE.name().equals(typeOper.name())) {
154 152 if (lwm2mClientRpcRequest != null) {
155 153 String errorMsg = String.format("Path %s params is not valid", targetIdVer);
156   - handler.sentRpcRequest(lwm2mClientRpcRequest, BAD_REQUEST.getName(), errorMsg, LOG_LW2M_ERROR);
  154 + handler.sentRpcResponse(lwm2mClientRpcRequest, BAD_REQUEST.getName(), errorMsg, LOG_LW2M_ERROR);
157 155 }
158 156 } else if (WRITE_REPLACE.name().equals(typeOper.name()) || EXECUTE.name().equals(typeOper.name())) {
159 157 if (lwm2mClientRpcRequest != null) {
160 158 String errorMsg = String.format("Path %s object model is absent", targetIdVer);
161   - handler.sentRpcRequest(lwm2mClientRpcRequest, BAD_REQUEST.getName(), errorMsg, LOG_LW2M_ERROR);
  159 + handler.sentRpcResponse(lwm2mClientRpcRequest, BAD_REQUEST.getName(), errorMsg, LOG_LW2M_ERROR);
162 160 }
163 161 } else if (!OBSERVE_CANCEL.name().equals(typeOper.name())) {
164 162 log.error("[{}], [{}] - [{}] error SendRequest", registration.getEndpoint(), typeOper.name(), targetIdVer);
165 163 if (lwm2mClientRpcRequest != null) {
166 164 ResourceModel resourceModel = lwM2MClient.getResourceModel(targetIdVer, this.config.getModelProvider());
167 165 String errorMsg = resourceModel == null ? String.format("Path %s not found in object version", targetIdVer) : "SendRequest - null";
168   - this.handler.sentRpcRequest(lwm2mClientRpcRequest, NOT_FOUND.getName(), errorMsg, LOG_LW2M_ERROR);
  166 + this.handler.sentRpcResponse(lwm2mClientRpcRequest, NOT_FOUND.getName(), errorMsg, LOG_LW2M_ERROR);
169 167 }
170 168 }
171 169 } else if (lwm2mClientRpcRequest != null) {
172 170 String errorMsg = String.format("Path %s not found in object version", targetIdVer);
173   - this.handler.sentRpcRequest(lwm2mClientRpcRequest, NOT_FOUND.getName(), errorMsg, LOG_LW2M_ERROR);
  171 + this.handler.sentRpcResponse(lwm2mClientRpcRequest, NOT_FOUND.getName(), errorMsg, LOG_LW2M_ERROR);
174 172 }
175   - } else if (OBSERVE_READ_ALL.name().equals(typeOper.name()) || DISCOVER_ALL.name().equals(typeOper.name())) {
176   - Set<String> paths;
177   - if (OBSERVE_READ_ALL.name().equals(typeOper.name())) {
178   - Set<Observation> observations = context.getServer().getObservationService().getObservations(registration);
179   - paths = observations.stream().map(observation -> observation.getPath().toString()).collect(Collectors.toUnmodifiableSet());
180   - } else {
181   - assert registration != null;
182   - Link[] objectLinks = registration.getSortedObjectLinks();
183   - paths = Arrays.stream(objectLinks).map(Link::toString).collect(Collectors.toUnmodifiableSet());
184   - }
185   - String msg = String.format("%s: type operation %s paths - %s", LOG_LW2M_INFO,
186   - typeOper.name(), paths);
187   - this.handler.sendLogsToThingsboard(msg, registration.getId());
188   - if (lwm2mClientRpcRequest != null) {
189   - String valueMsg = String.format("Paths - %s", paths);
190   - this.handler.sentRpcRequest(lwm2mClientRpcRequest, CONTENT.name(), valueMsg, LOG_LW2M_VALUE);
  173 + } else {
  174 + switch (typeOper) {
  175 + case OBSERVE_READ_ALL:
  176 + case DISCOVER_ALL:
  177 + Set<String> paths;
  178 + if (OBSERVE_READ_ALL.name().equals(typeOper.name())) {
  179 + Set<Observation> observations = context.getServer().getObservationService().getObservations(registration);
  180 + paths = observations.stream().map(observation -> observation.getPath().toString()).collect(Collectors.toUnmodifiableSet());
  181 + } else {
  182 + assert registration != null;
  183 + Link[] objectLinks = registration.getSortedObjectLinks();
  184 + paths = Arrays.stream(objectLinks).map(Link::toString).collect(Collectors.toUnmodifiableSet());
  185 + }
  186 + String msg = String.format("%s: type operation %s paths - %s", LOG_LW2M_INFO,
  187 + typeOper.name(), paths);
  188 + this.handler.sendLogsToThingsboard(msg, registration.getId());
  189 + if (lwm2mClientRpcRequest != null) {
  190 + String valueMsg = String.format("Paths - %s", paths);
  191 + this.handler.sentRpcResponse(lwm2mClientRpcRequest, CONTENT.name(), valueMsg, LOG_LW2M_VALUE);
  192 + }
  193 + break;
  194 + case OBSERVE_CANCEL:
  195 + case OBSERVE_CANCEL_ALL:
  196 + int observeCancelCnt = 0;
  197 + String observeCancelMsg = null;
  198 + if (OBSERVE_CANCEL.name().equals(typeOper)) {
  199 + observeCancelCnt = context.getServer().getObservationService().cancelObservations(registration, target);
  200 + observeCancelMsg = String.format("%s: type operation %s paths: %s count: %d", LOG_LW2M_INFO,
  201 + OBSERVE_CANCEL.name(), target, observeCancelCnt);
  202 + } else {
  203 + observeCancelCnt = context.getServer().getObservationService().cancelObservations(registration);
  204 + observeCancelMsg = String.format("%s: type operation %s paths: All count: %d", LOG_LW2M_INFO,
  205 + OBSERVE_CANCEL.name(), observeCancelCnt);
  206 + }
  207 + this.afterObserveCancel(registration, observeCancelCnt, observeCancelMsg, lwm2mClientRpcRequest);
  208 + break;
  209 + // lwm2mClientRpcRequest != null
  210 + case FW_UPDATE:
  211 + this.handler.getInfoFirmwareUpdate(lwM2MClient, lwm2mClientRpcRequest);
  212 + break;
191 213 }
192   - } else if (OBSERVE_CANCEL_ALL.name().equals(typeOper.name())) {
193   - int observeCancelCnt = context.getServer().getObservationService().cancelObservations(registration);
194   - String observeCancelMsgAll = String.format("%s: type operation %s paths: All count: %d", LOG_LW2M_INFO,
195   - OBSERVE_CANCEL.name(), observeCancelCnt);
196   - this.afterObserveCancel(registration, observeCancelCnt, observeCancelMsgAll, lwm2mClientRpcRequest);
197 214 }
198 215 } catch (Exception e) {
199 216 String msg = String.format("%s: type operation %s %s", LOG_LW2M_ERROR,
... ... @@ -201,7 +218,7 @@ public class LwM2mTransportRequest {
201 218 handler.sendLogsToThingsboard(msg, registration.getId());
202 219 if (lwm2mClientRpcRequest != null) {
203 220 String errorMsg = String.format("Path %s type operation %s %s", targetIdVer, typeOper.name(), e.getMessage());
204   - handler.sentRpcRequest(lwm2mClientRpcRequest, NOT_FOUND.getName(), errorMsg, LOG_LW2M_ERROR);
  221 + handler.sentRpcResponse(lwm2mClientRpcRequest, NOT_FOUND.getName(), errorMsg, LOG_LW2M_ERROR);
205 222 }
206 223 }
207 224 }
... ... @@ -234,17 +251,6 @@ public class LwM2mTransportRequest {
234 251 request = new ObserveRequest(contentFormat, resultIds.getObjectId());
235 252 }
236 253 break;
237   - case OBSERVE_CANCEL:
238   - /*
239   - lwM2MTransportRequest.sendAllRequest(lwServer, registration, path, POST_TYPE_OPER_OBSERVE_CANCEL, null, null, null, null, context.getTimeout());
240   - At server side this will not remove the observation from the observation store, to do it you need to use
241   - {@code ObservationService#cancelObservation()}
242   - */
243   - int observeCancelCnt = context.getServer().getObservationService().cancelObservations(registration, target);
244   - String observeCancelMsg = String.format("%s: type operation %s paths: %s count: %d", LOG_LW2M_INFO,
245   - OBSERVE_CANCEL.name(), target, observeCancelCnt);
246   - this.afterObserveCancel(registration, observeCancelCnt, observeCancelMsg, rpcRequest);
247   - break;
248 254 case EXECUTE:
249 255 ResourceModel resourceModelExecute = lwM2MClient.getResourceModel(targetIdVer, this.config.getModelProvider());
250 256 if (resourceModelExecute != null) {
... ... @@ -343,7 +349,7 @@ public class LwM2mTransportRequest {
343 349 }
344 350 /** Not Found */
345 351 if (rpcRequest != null) {
346   - handler.sentRpcRequest(rpcRequest, response.getCode().getName(), response.getErrorMessage(), LOG_LW2M_ERROR);
  352 + handler.sentRpcResponse(rpcRequest, response.getCode().getName(), response.getErrorMessage(), LOG_LW2M_ERROR);
347 353 }
348 354 /** Not Found
349 355 set setClient_fw_info... = empty
... ... @@ -385,7 +391,7 @@ public class LwM2mTransportRequest {
385 391 handler.sendLogsToThingsboard(msg, registration.getId());
386 392 log.error("[{}] [{}] - [{}] error SendRequest", request.getClass().getName().toString(), request.getPath().toString(), e.toString());
387 393 if (rpcRequest != null) {
388   - handler.sentRpcRequest(rpcRequest, CoAP.CodeClass.ERROR_RESPONSE.name(), e.getMessage(), LOG_LW2M_ERROR);
  394 + handler.sentRpcResponse(rpcRequest, CoAP.CodeClass.ERROR_RESPONSE.name(), e.getMessage(), LOG_LW2M_ERROR);
389 395 }
390 396 });
391 397 }
... ... @@ -431,7 +437,7 @@ public class LwM2mTransportRequest {
431 437 log.error("Path: [{}] type: [{}] value: [{}] errorMsg: [{}]]", patn, type, value, e.toString());
432 438 if (rpcRequest != null) {
433 439 String errorMsg = String.format("NumberFormatException: Resource path - %s type - %s value - %s", patn, type, value);
434   - handler.sentRpcRequest(rpcRequest, BAD_REQUEST.getName(), errorMsg, LOG_LW2M_ERROR);
  440 + handler.sentRpcResponse(rpcRequest, BAD_REQUEST.getName(), errorMsg, LOG_LW2M_ERROR);
435 441 }
436 442 return null;
437 443 }
... ... @@ -462,44 +468,48 @@ public class LwM2mTransportRequest {
462 468 if (response instanceof ReadResponse) {
463 469 handler.onUpdateValueAfterReadResponse(registration, pathIdVer, (ReadResponse) response, rpcRequest);
464 470 } else if (response instanceof DeleteResponse) {
465   - log.warn("[{}] Path [{}] DeleteResponse 5_Send", pathIdVer, response);
  471 + log.warn("11) [{}] Path [{}] DeleteResponse", pathIdVer, response);
  472 + if (rpcRequest != null) {
  473 + rpcRequest.setInfoMsg(null);
  474 + handler.sentRpcResponse(rpcRequest, response.getCode().getName(), null, null);
  475 + }
466 476 } else if (response instanceof DiscoverResponse) {
467   - String discoverValue = Link.serialize(((DiscoverResponse)response).getObjectLinks());
  477 + String discoverValue = Link.serialize(((DiscoverResponse) response).getObjectLinks());
468 478 msgLog = String.format("%s: type operation: %s path: %s value: %s",
469 479 LOG_LW2M_INFO, DISCOVER.name(), request.getPath().toString(), discoverValue);
470 480 handler.sendLogsToThingsboard(msgLog, registration.getId());
471 481 log.warn("DiscoverResponse: [{}]", (DiscoverResponse) response);
472 482 if (rpcRequest != null) {
473   - handler.sentRpcRequest(rpcRequest, response.getCode().getName(), discoverValue, LOG_LW2M_VALUE);
  483 + handler.sentRpcResponse(rpcRequest, response.getCode().getName(), discoverValue, LOG_LW2M_VALUE);
474 484 }
475 485 } else if (response instanceof ExecuteResponse) {
476   - log.warn("[{}] Path [{}] ExecuteResponse 7_Send", pathIdVer, response);
  486 + msgLog = String.format("%s: type operation: %s path: %s",
  487 + LOG_LW2M_INFO, EXECUTE.name(), request.getPath().toString());
  488 + log.warn("9) [{}] ", msgLog);
  489 + handler.sendLogsToThingsboard(msgLog, registration.getId());
  490 + if (rpcRequest != null) {
  491 + msgLog = String.format("Start %s path: %S. Preparation finished: %s", EXECUTE.name(), path, rpcRequest.getInfoMsg());
  492 + rpcRequest.setInfoMsg(msgLog);
  493 + handler.sentRpcResponse(rpcRequest, response.getCode().getName(), path, LOG_LW2M_INFO);
  494 + }
  495 +
477 496 } else if (response instanceof WriteAttributesResponse) {
478 497 msgLog = String.format("%s: type operation: %s path: %s value: %s",
479 498 LOG_LW2M_INFO, WRITE_ATTRIBUTES.name(), request.getPath().toString(), ((WriteAttributesRequest) request).getAttributes().toString());
480 499 handler.sendLogsToThingsboard(msgLog, registration.getId());
481   - log.warn("[{}] Path [{}] WriteAttributesResponse 8_Send", pathIdVer, response);
  500 + log.warn("12) [{}] Path [{}] WriteAttributesResponse", pathIdVer, response);
482 501 if (rpcRequest != null) {
483   - handler.sentRpcRequest(rpcRequest, response.getCode().getName(), response.toString(), LOG_LW2M_VALUE);
  502 + handler.sentRpcResponse(rpcRequest, response.getCode().getName(), response.toString(), LOG_LW2M_VALUE);
484 503 }
485 504 } else if (response instanceof WriteResponse) {
486   - log.warn("[{}] Path [{}] WriteResponse 9_Send", pathIdVer, response);
487   - this.infoWriteResponse(registration, response, request);
  505 + msgLog = String.format("Type operation: Write path: %s", pathIdVer);
  506 + log.warn("10) [{}] response: [{}]", msgLog, response);
  507 + this.infoWriteResponse(registration, response, request, rpcRequest);
488 508 handler.onWriteResponseOk(registration, pathIdVer, (WriteRequest) request);
489 509 }
490   - if (rpcRequest != null) {
491   - if (response instanceof ExecuteResponse
492   - || response instanceof WriteAttributesResponse
493   - || response instanceof DeleteResponse) {
494   - rpcRequest.setInfoMsg(null);
495   - handler.sentRpcRequest(rpcRequest, response.getCode().getName(), null, null);
496   - } else if (response instanceof WriteResponse) {
497   - handler.sentRpcRequest(rpcRequest, response.getCode().getName(), null, LOG_LW2M_INFO);
498   - }
499   - }
500 510 }
501 511
502   - private void infoWriteResponse(Registration registration, LwM2mResponse response, DownlinkRequest request) {
  512 + private void infoWriteResponse(Registration registration, LwM2mResponse response, DownlinkRequest request, Lwm2mClientRpcRequest rpcRequest) {
503 513 try {
504 514 LwM2mNode node = ((WriteRequest) request).getNode();
505 515 String msg = null;
... ... @@ -517,12 +527,12 @@ public class LwM2mTransportRequest {
517 527 if (singleResource.getType() == ResourceModel.Type.STRING) {
518 528 valueLength = ((String) singleResource.getValue()).length();
519 529 value = ((String) singleResource.getValue())
520   - .substring(Math.min(valueLength, config.getLogMaxLength()));
  530 + .substring(Math.min(valueLength, config.getLogMaxLength())).trim();
521 531
522 532 } else {
523 533 valueLength = ((byte[]) singleResource.getValue()).length;
524 534 value = new String(Arrays.copyOf(((byte[]) singleResource.getValue()),
525   - Math.min(valueLength, config.getLogMaxLength())));
  535 + Math.min(valueLength, config.getLogMaxLength()))).trim();
526 536 }
527 537 value = valueLength > config.getLogMaxLength() ? value + "..." : value;
528 538 msg = String.format("%s: Update finished successfully: Lwm2m code - %d Resource path: %s length: %s value: %s",
... ... @@ -538,6 +548,12 @@ public class LwM2mTransportRequest {
538 548 handler.sendLogsToThingsboard(msg, registration.getId());
539 549 if (request.getPath().toString().equals(FW_PACKAGE_ID) || request.getPath().toString().equals(SW_PACKAGE_ID)) {
540 550 this.afterWriteSuccessFwSwUpdate(registration, request);
  551 + if (rpcRequest != null) {
  552 + rpcRequest.setInfoMsg(msg);
  553 + }
  554 + }
  555 + else if (rpcRequest != null) {
  556 + handler.sentRpcResponse(rpcRequest, response.getCode().getName(), msg, LOG_LW2M_INFO);
541 557 }
542 558 }
543 559 } catch (Exception e) {
... ... @@ -558,7 +574,7 @@ public class LwM2mTransportRequest {
558 574 }
559 575 if (request.getPath().toString().equals(SW_PACKAGE_ID) && lwM2MClient.getSwUpdate() != null) {
560 576 lwM2MClient.getSwUpdate().setStateUpdate(DOWNLOADED.name());
561   - lwM2MClient.getSwUpdate().sendLogs(this.handler,WRITE_REPLACE.name(), LOG_LW2M_INFO, null);
  577 + lwM2MClient.getSwUpdate().sendLogs(this.handler, WRITE_REPLACE.name(), LOG_LW2M_INFO, null);
562 578 }
563 579 }
564 580
... ... @@ -592,7 +608,7 @@ public class LwM2mTransportRequest {
592 608 log.warn("[{}]", observeCancelMsg);
593 609 if (rpcRequest != null) {
594 610 rpcRequest.setInfoMsg(String.format("Count: %d", observeCancelCnt));
595   - handler.sentRpcRequest(rpcRequest, CONTENT.name(), null, LOG_LW2M_INFO);
  611 + handler.sentRpcResponse(rpcRequest, CONTENT.name(), null, LOG_LW2M_INFO);
596 612 }
597 613 }
598 614 }
... ...
... ... @@ -53,6 +53,8 @@ import java.io.ByteArrayInputStream;
53 53 import java.io.IOException;
54 54 import java.util.ArrayList;
55 55 import java.util.List;
  56 +import java.util.concurrent.TimeUnit;
  57 +import java.util.concurrent.atomic.AtomicInteger;
56 58
57 59 import static org.thingsboard.server.gen.transport.TransportProtos.KeyValueType.BOOLEAN_V;
58 60
... ... @@ -64,6 +66,13 @@ public class LwM2mTransportServerHelper {
64 66
65 67 private final LwM2mTransportContext context;
66 68 private final LwM2MJsonAdaptor adaptor;
  69 + private final AtomicInteger atomicTs = new AtomicInteger(0);
  70 +
  71 +
  72 + public long getTS() {
  73 + int addTs = atomicTs.getAndIncrement() >= 1000 ? atomicTs.getAndSet(0) : atomicTs.get();
  74 + return TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()) * 1000L + addTs;
  75 + }
67 76
68 77 /**
69 78 * send to Thingsboard Attribute || Telemetry
... ... @@ -96,7 +105,7 @@ public class LwM2mTransportServerHelper {
96 105 public void sendParametersOnThingsboardTelemetry(List<TransportProtos.KeyValueProto> result, SessionInfoProto sessionInfo) {
97 106 PostTelemetryMsg.Builder request = PostTelemetryMsg.newBuilder();
98 107 TransportProtos.TsKvListProto.Builder builder = TransportProtos.TsKvListProto.newBuilder();
99   - builder.setTs(System.currentTimeMillis());
  108 + builder.setTs(this.getTS());
100 109 builder.addAllKv(result);
101 110 request.addTsKvList(builder.build());
102 111 PostTelemetryMsg postTelemetryMsg = request.build();
... ...
... ... @@ -43,10 +43,10 @@ import org.eclipse.leshan.server.registration.Registration;
43 43 import org.nustaq.serialization.FSTConfiguration;
44 44 import org.thingsboard.server.common.data.DeviceProfile;
45 45 import org.thingsboard.server.common.data.device.profile.Lwm2mDeviceProfileTransportConfiguration;
46   -import org.thingsboard.server.common.data.firmware.FirmwareKey;
47   -import org.thingsboard.server.common.data.firmware.FirmwareType;
48   -import org.thingsboard.server.common.data.firmware.FirmwareUpdateStatus;
49   -import org.thingsboard.server.common.data.firmware.FirmwareUtil;
  46 +import org.thingsboard.server.common.data.ota.OtaPackageKey;
  47 +import org.thingsboard.server.common.data.ota.OtaPackageType;
  48 +import org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus;
  49 +import org.thingsboard.server.common.data.ota.OtaPackageUtil;
50 50 import org.thingsboard.server.common.data.id.TenantId;
51 51 import org.thingsboard.server.common.transport.TransportServiceCallback;
52 52 import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient;
... ... @@ -77,12 +77,12 @@ import static org.eclipse.leshan.core.model.ResourceModel.Type.OBJLNK;
77 77 import static org.eclipse.leshan.core.model.ResourceModel.Type.OPAQUE;
78 78 import static org.eclipse.leshan.core.model.ResourceModel.Type.STRING;
79 79 import static org.eclipse.leshan.core.model.ResourceModel.Type.TIME;
80   -import static org.thingsboard.server.common.data.firmware.FirmwareUpdateStatus.DOWNLOADED;
81   -import static org.thingsboard.server.common.data.firmware.FirmwareUpdateStatus.DOWNLOADING;
82   -import static org.thingsboard.server.common.data.firmware.FirmwareUpdateStatus.FAILED;
83   -import static org.thingsboard.server.common.data.firmware.FirmwareUpdateStatus.UPDATED;
84   -import static org.thingsboard.server.common.data.firmware.FirmwareUpdateStatus.UPDATING;
85   -import static org.thingsboard.server.common.data.firmware.FirmwareUpdateStatus.VERIFIED;
  80 +import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.DOWNLOADED;
  81 +import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.DOWNLOADING;
  82 +import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.FAILED;
  83 +import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.UPDATED;
  84 +import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.UPDATING;
  85 +import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.VERIFIED;
86 86 import static org.thingsboard.server.common.data.lwm2m.LwM2mConstants.LWM2M_SEPARATOR_KEY;
87 87 import static org.thingsboard.server.common.data.lwm2m.LwM2mConstants.LWM2M_SEPARATOR_PATH;
88 88
... ... @@ -139,7 +139,7 @@ public class LwM2mTransportUtil {
139 139 public static final String ERROR_KEY = "error";
140 140 public static final String METHOD_KEY = "methodName";
141 141
142   - // FirmWare
  142 + // Firmware
143 143 public static final String FW_UPDATE = "Firmware update";
144 144 public static final Integer FW_ID = 5;
145 145 // Package W
... ... @@ -155,7 +155,7 @@ public class LwM2mTransportUtil {
155 155 // Update E
156 156 public static final String FW_UPDATE_ID = "/5/0/2";
157 157
158   - // SoftWare
  158 + // Software
159 159 public static final String SW_UPDATE = "Software update";
160 160 public static final Integer SW_ID = 9;
161 161 // Package W
... ... @@ -229,11 +229,12 @@ public class LwM2mTransportUtil {
229 229 */
230 230 WRITE_UPDATE(9, "WriteUpdate"),
231 231 WRITE_ATTRIBUTES(10, "WriteAttributes"),
232   - DELETE(11, "Delete");
  232 + DELETE(11, "Delete"),
233 233
234 234 // only for RPC
  235 + FW_UPDATE(12,"FirmwareUpdate");
235 236 // FW_READ_INFO(12, "FirmwareReadInfo"),
236   -// FW_UPDATE(13, "FirmwareUpdate"),
  237 +
237 238 // SW_READ_INFO(15, "SoftwareReadInfo"),
238 239 // SW_UPDATE(16, "SoftwareUpdate"),
239 240 // SW_UNINSTALL(18, "SoftwareUninstall");
... ... @@ -354,7 +355,7 @@ public class LwM2mTransportUtil {
354 355 * FirmwareUpdateStatus {
355 356 * DOWNLOADING, DOWNLOADED, VERIFIED, UPDATING, UPDATED, FAILED
356 357 */
357   - public static FirmwareUpdateStatus EqualsFwSateToFirmwareUpdateStatus(StateFw stateFw, UpdateResultFw updateResultFw) {
  358 + public static OtaPackageUpdateStatus EqualsFwSateToFirmwareUpdateStatus(StateFw stateFw, UpdateResultFw updateResultFw) {
358 359 switch (updateResultFw) {
359 360 case INITIAL:
360 361 switch (stateFw) {
... ... @@ -500,7 +501,7 @@ public class LwM2mTransportUtil {
500 501 * FirmwareUpdateStatus {
501 502 * DOWNLOADING, DOWNLOADED, VERIFIED, UPDATING, UPDATED, FAILED
502 503 */
503   - public static FirmwareUpdateStatus EqualsSwSateToFirmwareUpdateStatus(UpdateStateSw updateStateSw, UpdateResultSw updateResultSw) {
  504 + public static OtaPackageUpdateStatus EqualsSwSateToFirmwareUpdateStatus(UpdateStateSw updateStateSw, UpdateResultSw updateResultSw) {
504 505 switch (updateResultSw) {
505 506 case INITIAL:
506 507 switch (updateStateSw) {
... ... @@ -932,15 +933,15 @@ public class LwM2mTransportUtil {
932 933 }
933 934
934 935 public static boolean isFwSwWords (String pathName) {
935   - return FirmwareUtil.getAttributeKey(FirmwareType.FIRMWARE, FirmwareKey.VERSION).equals(pathName)
936   - || FirmwareUtil.getAttributeKey(FirmwareType.FIRMWARE, FirmwareKey.TITLE).equals(pathName)
937   - || FirmwareUtil.getAttributeKey(FirmwareType.FIRMWARE, FirmwareKey.CHECKSUM).equals(pathName)
938   - || FirmwareUtil.getAttributeKey(FirmwareType.FIRMWARE, FirmwareKey.CHECKSUM_ALGORITHM).equals(pathName)
939   - || FirmwareUtil.getAttributeKey(FirmwareType.FIRMWARE, FirmwareKey.SIZE).equals(pathName)
940   - || FirmwareUtil.getAttributeKey(FirmwareType.SOFTWARE, FirmwareKey.VERSION).equals(pathName)
941   - || FirmwareUtil.getAttributeKey(FirmwareType.SOFTWARE, FirmwareKey.TITLE).equals(pathName)
942   - || FirmwareUtil.getAttributeKey(FirmwareType.SOFTWARE, FirmwareKey.CHECKSUM).equals(pathName)
943   - || FirmwareUtil.getAttributeKey(FirmwareType.SOFTWARE, FirmwareKey.CHECKSUM_ALGORITHM).equals(pathName)
944   - || FirmwareUtil.getAttributeKey(FirmwareType.SOFTWARE, FirmwareKey.SIZE).equals(pathName);
  936 + return OtaPackageUtil.getAttributeKey(OtaPackageType.FIRMWARE, OtaPackageKey.VERSION).equals(pathName)
  937 + || OtaPackageUtil.getAttributeKey(OtaPackageType.FIRMWARE, OtaPackageKey.TITLE).equals(pathName)
  938 + || OtaPackageUtil.getAttributeKey(OtaPackageType.FIRMWARE, OtaPackageKey.CHECKSUM).equals(pathName)
  939 + || OtaPackageUtil.getAttributeKey(OtaPackageType.FIRMWARE, OtaPackageKey.CHECKSUM_ALGORITHM).equals(pathName)
  940 + || OtaPackageUtil.getAttributeKey(OtaPackageType.FIRMWARE, OtaPackageKey.SIZE).equals(pathName)
  941 + || OtaPackageUtil.getAttributeKey(OtaPackageType.SOFTWARE, OtaPackageKey.VERSION).equals(pathName)
  942 + || OtaPackageUtil.getAttributeKey(OtaPackageType.SOFTWARE, OtaPackageKey.TITLE).equals(pathName)
  943 + || OtaPackageUtil.getAttributeKey(OtaPackageType.SOFTWARE, OtaPackageKey.CHECKSUM).equals(pathName)
  944 + || OtaPackageUtil.getAttributeKey(OtaPackageType.SOFTWARE, OtaPackageKey.CHECKSUM_ALGORITHM).equals(pathName)
  945 + || OtaPackageUtil.getAttributeKey(OtaPackageType.SOFTWARE, OtaPackageKey.SIZE).equals(pathName);
945 946 }
946 947 }
... ...
... ... @@ -31,7 +31,7 @@ import org.eclipse.leshan.server.registration.Registration;
31 31 import org.eclipse.leshan.server.security.SecurityInfo;
32 32 import org.thingsboard.server.common.data.Device;
33 33 import org.thingsboard.server.common.data.DeviceProfile;
34   -import org.thingsboard.server.common.data.firmware.FirmwareType;
  34 +import org.thingsboard.server.common.data.ota.OtaPackageType;
35 35 import org.thingsboard.server.common.transport.auth.ValidateDeviceCredentialsResponse;
36 36 import org.thingsboard.server.gen.transport.TransportProtos.SessionInfoProto;
37 37 import org.thingsboard.server.gen.transport.TransportProtos.TsKvProto;
... ... @@ -120,8 +120,8 @@ public class LwM2mClient implements Cloneable {
120 120 this.init = false;
121 121 this.queuedRequests = new ConcurrentLinkedQueue<>();
122 122
123   - this.fwUpdate = new LwM2mFwSwUpdate(this, FirmwareType.FIRMWARE);
124   - this.swUpdate = new LwM2mFwSwUpdate(this, FirmwareType.SOFTWARE);
  123 + this.fwUpdate = new LwM2mFwSwUpdate(this, OtaPackageType.FIRMWARE);
  124 + this.swUpdate = new LwM2mFwSwUpdate(this, OtaPackageType.SOFTWARE);
125 125 if (this.credentials != null && this.credentials.hasDeviceInfo()) {
126 126 this.session = createSession(nodeId, sessionId, credentials);
127 127 this.deviceId = new UUID(session.getDeviceIdMSB(), session.getDeviceIdLSB());
... ...
... ... @@ -83,11 +83,17 @@ public class LwM2mClientContextImpl implements LwM2mClientContext {
83 83
84 84 @Override
85 85 public LwM2mClient getClient(TransportProtos.SessionInfoProto sessionInfo) {
86   - return lwM2mClientsByEndpoint.values().stream().filter(c ->
  86 + LwM2mClient lwM2mClient = lwM2mClientsByEndpoint.values().stream().filter(c ->
87 87 (new UUID(sessionInfo.getSessionIdMSB(), sessionInfo.getSessionIdLSB()))
88 88 .equals((new UUID(c.getSession().getSessionIdMSB(), c.getSession().getSessionIdLSB())))
89 89
90 90 ).findAny().get();
  91 + if (lwM2mClient == null) {
  92 + log.warn("Device TimeOut? lwM2mClient is null.");
  93 + log.warn("SessionInfo input [{}], lwM2mClientsByEndpoint size: [{}]", sessionInfo, lwM2mClientsByEndpoint.values().size());
  94 + log.error("", new RuntimeException());
  95 + }
  96 + return lwM2mClient;
91 97 }
92 98
93 99 @Override
... ...
... ... @@ -20,8 +20,8 @@ import lombok.Setter;
20 20 import lombok.extern.slf4j.Slf4j;
21 21 import org.apache.commons.lang3.StringUtils;
22 22 import org.eclipse.leshan.core.request.ContentFormat;
23   -import org.thingsboard.server.common.data.firmware.FirmwareType;
24   -import org.thingsboard.server.common.data.firmware.FirmwareUpdateStatus;
  23 +import org.thingsboard.server.common.data.ota.OtaPackageType;
  24 +import org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus;
25 25 import org.thingsboard.server.gen.transport.TransportProtos;
26 26 import org.thingsboard.server.transport.lwm2m.server.DefaultLwM2MTransportMsgHandler;
27 27 import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportRequest;
... ... @@ -32,11 +32,12 @@ import java.util.List;
32 32 import java.util.UUID;
33 33 import java.util.concurrent.CopyOnWriteArrayList;
34 34
35   -import static org.thingsboard.server.common.data.firmware.FirmwareKey.STATE;
36   -import static org.thingsboard.server.common.data.firmware.FirmwareType.FIRMWARE;
37   -import static org.thingsboard.server.common.data.firmware.FirmwareType.SOFTWARE;
38   -import static org.thingsboard.server.common.data.firmware.FirmwareUpdateStatus.UPDATING;
39   -import static org.thingsboard.server.common.data.firmware.FirmwareUtil.getAttributeKey;
  35 +import static org.thingsboard.server.common.data.ota.OtaPackageKey.STATE;
  36 +import static org.thingsboard.server.common.data.ota.OtaPackageType.FIRMWARE;
  37 +import static org.thingsboard.server.common.data.ota.OtaPackageType.SOFTWARE;
  38 +import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.UPDATING;
  39 +import static org.thingsboard.server.common.data.ota.OtaPackageUtil.getAttributeKey;
  40 +import static org.eclipse.californium.core.coap.CoAP.ResponseCode.CONTENT;
40 41 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.FW_NAME_ID;
41 42 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.FW_PACKAGE_ID;
42 43 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.FW_RESULT_ID;
... ... @@ -97,14 +98,17 @@ public class LwM2mFwSwUpdate {
97 98 @Getter
98 99 @Setter
99 100 private volatile boolean infoFwSwUpdate = false;
100   - private final FirmwareType type;
  101 + private final OtaPackageType type;
101 102 @Getter
102 103 LwM2mClient lwM2MClient;
103 104 @Getter
104 105 @Setter
105 106 private final List<String> pendingInfoRequestsStart;
  107 + @Getter
  108 + @Setter
  109 + private volatile Lwm2mClientRpcRequest rpcRequest;
106 110
107   - public LwM2mFwSwUpdate(LwM2mClient lwM2MClient, FirmwareType type) {
  111 + public LwM2mFwSwUpdate(LwM2mClient lwM2MClient, OtaPackageType type) {
108 112 this.lwM2MClient = lwM2MClient;
109 113 this.pendingInfoRequestsStart = new CopyOnWriteArrayList<>();
110 114 this.type = type;
... ... @@ -139,7 +143,7 @@ public class LwM2mFwSwUpdate {
139 143 }
140 144 if (this.pendingInfoRequestsStart.size() == 0) {
141 145 this.infoFwSwUpdate = false;
142   - if (!FirmwareUpdateStatus.DOWNLOADING.name().equals(this.stateUpdate)) {
  146 + if (!OtaPackageUpdateStatus.DOWNLOADING.name().equals(this.stateUpdate)) {
143 147 boolean conditionalStart = this.type.equals(FIRMWARE) ? this.conditionalFwUpdateStart() :
144 148 this.conditionalSwUpdateStart();
145 149 if (conditionalStart) {
... ... @@ -153,16 +157,30 @@ public class LwM2mFwSwUpdate {
153 157 * Send FsSw to Lwm2mClient:
154 158 * before operation Write: fw_state = DOWNLOADING
155 159 */
156   - private void writeFwSwWare(DefaultLwM2MTransportMsgHandler handler, LwM2mTransportRequest request) {
157   - this.stateUpdate = FirmwareUpdateStatus.DOWNLOADING.name();
158   -// this.observeStateUpdate();
159   - this.sendLogs(handler, WRITE_REPLACE.name(), LOG_LW2M_INFO, null);
160   - int chunkSize = 0;
161   - int chunk = 0;
162   - byte[] firmwareChunk = handler.firmwareDataCache.get(this.currentId.toString(), chunkSize, chunk);
163   - String targetIdVer = convertPathFromObjectIdToIdVer(this.pathPackageId, this.lwM2MClient.getRegistration());
164   - request.sendAllRequest(lwM2MClient.getRegistration(), targetIdVer, WRITE_REPLACE, ContentFormat.OPAQUE.getName(),
165   - firmwareChunk, handler.config.getTimeout(), null);
  160 + public void writeFwSwWare(DefaultLwM2MTransportMsgHandler handler, LwM2mTransportRequest request) {
  161 + if (this.currentId != null) {
  162 + this.stateUpdate = OtaPackageUpdateStatus.DOWNLOADING.name();
  163 + this.sendLogs(handler, WRITE_REPLACE.name(), LOG_LW2M_INFO, null);
  164 + int chunkSize = 0;
  165 + int chunk = 0;
  166 + byte[] firmwareChunk = handler.otaPackageDataCache.get(this.currentId.toString(), chunkSize, chunk);
  167 + String targetIdVer = convertPathFromObjectIdToIdVer(this.pathPackageId, this.lwM2MClient.getRegistration());
  168 + String fwMsg = String.format("%s: Start type operation %s paths: %s", LOG_LW2M_INFO,
  169 + LwM2mTransportUtil.LwM2mTypeOper.FW_UPDATE.name(), FW_PACKAGE_ID);
  170 + handler.sendLogsToThingsboard(fwMsg, lwM2MClient.getRegistration().getId());
  171 + log.warn("8) Start firmware Update. Send save to: [{}] ver: [{}] path: [{}]", this.lwM2MClient.getDeviceName(), this.currentVersion, targetIdVer);
  172 + request.sendAllRequest(this.lwM2MClient.getRegistration(), targetIdVer, WRITE_REPLACE, ContentFormat.OPAQUE.getName(),
  173 + firmwareChunk, handler.config.getTimeout(), this.rpcRequest);
  174 + }
  175 + else {
  176 + String msgError = "FirmWareId is null.";
  177 + log.warn("6) [{}]", msgError);
  178 + if (this.rpcRequest != null) {
  179 + handler.sentRpcResponse(this.rpcRequest, CONTENT.name(), msgError, LOG_LW2M_ERROR);
  180 + }
  181 + log.error (msgError);
  182 + this.sendLogs(handler, WRITE_REPLACE.name(), LOG_LW2M_ERROR, msgError);
  183 + }
166 184 }
167 185
168 186 public void sendLogs(DefaultLwM2MTransportMsgHandler handler, String typeOper, String typeInfo, String msgError) {
... ... @@ -185,7 +203,7 @@ public class LwM2mFwSwUpdate {
185 203 this.setStateUpdate(UPDATING.name());
186 204 this.sendLogs(handler, EXECUTE.name(), LOG_LW2M_INFO, null);
187 205 request.sendAllRequest(this.lwM2MClient.getRegistration(), this.pathInstallId, EXECUTE, ContentFormat.TLV.getName(),
188   - null, 0, null);
  206 + null, 0, this.rpcRequest);
189 207 }
190 208
191 209 /**
... ... @@ -287,10 +305,10 @@ public class LwM2mFwSwUpdate {
287 305 LwM2mTransportUtil.UpdateResultSw.fromUpdateResultSwByCode(updateResult.intValue()).type;
288 306 String key = splitCamelCaseString((String) this.lwM2MClient.getResourceNameByRezId(null, this.pathResultId));
289 307 if (success) {
290   - this.stateUpdate = FirmwareUpdateStatus.UPDATED.name();
  308 + this.stateUpdate = OtaPackageUpdateStatus.UPDATED.name();
291 309 this.sendLogs(handler, EXECUTE.name(), LOG_LW2M_INFO, null);
292 310 } else {
293   - this.stateUpdate = FirmwareUpdateStatus.FAILED.name();
  311 + this.stateUpdate = OtaPackageUpdateStatus.FAILED.name();
294 312 this.sendLogs(handler, EXECUTE.name(), LOG_LW2M_ERROR, value);
295 313 }
296 314 handler.helper.sendParametersOnThingsboardTelemetry(
... ... @@ -347,7 +365,7 @@ public class LwM2mFwSwUpdate {
347 365 this.pathResultId, this.lwM2MClient.getRegistration()));
348 366 this.pendingInfoRequestsStart.forEach(pathIdVer -> {
349 367 request.sendAllRequest(this.lwM2MClient.getRegistration(), pathIdVer, OBSERVE, ContentFormat.TLV.getName(),
350   - null, 0, null);
  368 + null, 0, this.rpcRequest);
351 369 });
352 370
353 371 }
... ...
... ... @@ -39,6 +39,7 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.K
39 39 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper;
40 40 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.DISCOVER_ALL;
41 41 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.EXECUTE;
  42 +import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.FW_UPDATE;
42 43 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.OBSERVE_CANCEL;
43 44 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.OBSERVE_READ_ALL;
44 45 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.WRITE_ATTRIBUTES;
... ... @@ -140,7 +141,8 @@ public class Lwm2mClientRpcRequest {
140 141 if (this.getTargetIdVer() == null
141 142 && !(OBSERVE_READ_ALL == this.getTypeOper()
142 143 || DISCOVER_ALL == this.getTypeOper()
143   - || OBSERVE_CANCEL == this.getTypeOper())) {
  144 + || OBSERVE_CANCEL == this.getTypeOper()
  145 + || FW_UPDATE == this.getTypeOper())) {
144 146 this.setErrorMsg(TARGET_ID_VER_KEY + " and " +
145 147 KEY_NAME_KEY + " is null or bad format");
146 148 }
... ...
... ... @@ -337,23 +337,24 @@ public class TbLwM2mRedisRegistrationStore implements CaliforniumRegistrationSto
337 337 }
338 338 }
339 339
  340 + //TODO: JedisCluster didn't implement Transaction, maybe should use some advanced key creation strategies
340 341 private void removeAddrIndex(RedisConnection connection, Registration registration) {
341 342 // Watch the key to remove.
342 343 byte[] regAddrKey = toRegAddrKey(registration.getSocketAddress());
343   - connection.watch(regAddrKey);
  344 +// connection.watch(regAddrKey);
344 345
345 346 byte[] epFromAddr = connection.get(regAddrKey);
346 347 // Delete the key if needed.
347 348 if (Arrays.equals(epFromAddr, registration.getEndpoint().getBytes(UTF_8))) {
348 349 // Try to delete the key
349   - connection.multi();
  350 +// connection.multi();
350 351 connection.del(regAddrKey);
351   - connection.exec();
  352 +// connection.exec();
352 353 // if transaction failed this is not an issue as the socket address is probably reused and we don't neeed to
353 354 // delete it anymore.
354 355 } else {
355 356 // the key must not be deleted.
356   - connection.unwatch();
  357 +// connection.unwatch();
357 358 }
358 359 }
359 360
... ...
... ... @@ -43,6 +43,9 @@ public class LwM2mValueConverterImpl implements LwM2mValueConverter {
43 43 @Override
44 44 public Object convertValue(Object value, Type currentType, Type expectedType, LwM2mPath resourcePath)
45 45 throws CodecException {
  46 + if (value == null) {
  47 + return null;
  48 + }
46 49 if (expectedType == null) {
47 50 /** unknown resource, trusted value */
48 51 return value;
... ...
... ... @@ -47,8 +47,8 @@ import org.thingsboard.server.common.data.DeviceProfile;
47 47 import org.thingsboard.server.common.data.DeviceTransportType;
48 48 import org.thingsboard.server.common.data.TransportPayloadType;
49 49 import org.thingsboard.server.common.data.device.profile.MqttTopics;
50   -import org.thingsboard.server.common.data.firmware.FirmwareType;
51   -import org.thingsboard.server.common.data.id.FirmwareId;
  50 +import org.thingsboard.server.common.data.ota.OtaPackageType;
  51 +import org.thingsboard.server.common.data.id.OtaPackageId;
52 52 import org.thingsboard.server.common.msg.EncryptionUtil;
53 53 import org.thingsboard.server.common.msg.tools.TbRateLimitsException;
54 54 import org.thingsboard.server.common.transport.SessionMsgListener;
... ... @@ -126,8 +126,8 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
126 126 private volatile InetSocketAddress address;
127 127 private volatile GatewaySessionHandler gatewaySessionHandler;
128 128
129   - private final ConcurrentHashMap<String, String> fwSessions;
130   - private final ConcurrentHashMap<String, Integer> fwChunkSizes;
  129 + private final ConcurrentHashMap<String, String> otaPackSessions;
  130 + private final ConcurrentHashMap<String, Integer> chunkSizes;
131 131
132 132 MqttTransportHandler(MqttTransportContext context, SslHandler sslHandler) {
133 133 this.sessionId = UUID.randomUUID();
... ... @@ -137,8 +137,8 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
137 137 this.sslHandler = sslHandler;
138 138 this.mqttQoSMap = new ConcurrentHashMap<>();
139 139 this.deviceSessionCtx = new DeviceSessionCtx(sessionId, mqttQoSMap, context);
140   - this.fwSessions = new ConcurrentHashMap<>();
141   - this.fwChunkSizes = new ConcurrentHashMap<>();
  140 + this.otaPackSessions = new ConcurrentHashMap<>();
  141 + this.chunkSizes = new ConcurrentHashMap<>();
142 142 }
143 143
144 144 @Override
... ... @@ -320,9 +320,9 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
320 320 TransportProtos.ClaimDeviceMsg claimDeviceMsg = payloadAdaptor.convertToClaimDevice(deviceSessionCtx, mqttMsg);
321 321 transportService.process(deviceSessionCtx.getSessionInfo(), claimDeviceMsg, getPubAckCallback(ctx, msgId, claimDeviceMsg));
322 322 } else if ((fwMatcher = FW_REQUEST_PATTERN.matcher(topicName)).find()) {
323   - getFirmwareCallback(ctx, mqttMsg, msgId, fwMatcher, FirmwareType.FIRMWARE);
  323 + getOtaPackageCallback(ctx, mqttMsg, msgId, fwMatcher, OtaPackageType.FIRMWARE);
324 324 } else if ((fwMatcher = SW_REQUEST_PATTERN.matcher(topicName)).find()) {
325   - getFirmwareCallback(ctx, mqttMsg, msgId, fwMatcher, FirmwareType.SOFTWARE);
  325 + getOtaPackageCallback(ctx, mqttMsg, msgId, fwMatcher, OtaPackageType.SOFTWARE);
326 326 } else {
327 327 transportService.reportActivity(deviceSessionCtx.getSessionInfo());
328 328 ack(ctx, msgId);
... ... @@ -334,38 +334,38 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
334 334 }
335 335 }
336 336
337   - private void getFirmwareCallback(ChannelHandlerContext ctx, MqttPublishMessage mqttMsg, int msgId, Matcher fwMatcher, FirmwareType type) {
  337 + private void getOtaPackageCallback(ChannelHandlerContext ctx, MqttPublishMessage mqttMsg, int msgId, Matcher fwMatcher, OtaPackageType type) {
338 338 String payload = mqttMsg.content().toString(UTF8);
339 339 int chunkSize = StringUtils.isNotEmpty(payload) ? Integer.parseInt(payload) : 0;
340 340 String requestId = fwMatcher.group("requestId");
341 341 int chunk = Integer.parseInt(fwMatcher.group("chunk"));
342 342
343 343 if (chunkSize > 0) {
344   - this.fwChunkSizes.put(requestId, chunkSize);
  344 + this.chunkSizes.put(requestId, chunkSize);
345 345 } else {
346   - chunkSize = fwChunkSizes.getOrDefault(requestId, 0);
  346 + chunkSize = chunkSizes.getOrDefault(requestId, 0);
347 347 }
348 348
349 349 if (chunkSize > context.getMaxPayloadSize()) {
350   - sendFirmwareError(ctx, PAYLOAD_TOO_LARGE);
  350 + sendOtaPackageError(ctx, PAYLOAD_TOO_LARGE);
351 351 return;
352 352 }
353 353
354   - String firmwareId = fwSessions.get(requestId);
  354 + String otaPackageId = otaPackSessions.get(requestId);
355 355
356   - if (firmwareId != null) {
357   - sendFirmware(ctx, mqttMsg.variableHeader().packetId(), firmwareId, requestId, chunkSize, chunk, type);
  356 + if (otaPackageId != null) {
  357 + sendOtaPackage(ctx, mqttMsg.variableHeader().packetId(), otaPackageId, requestId, chunkSize, chunk, type);
358 358 } else {
359 359 TransportProtos.SessionInfoProto sessionInfo = deviceSessionCtx.getSessionInfo();
360   - TransportProtos.GetFirmwareRequestMsg getFirmwareRequestMsg = TransportProtos.GetFirmwareRequestMsg.newBuilder()
  360 + TransportProtos.GetOtaPackageRequestMsg getOtaPackageRequestMsg = TransportProtos.GetOtaPackageRequestMsg.newBuilder()
361 361 .setDeviceIdMSB(sessionInfo.getDeviceIdMSB())
362 362 .setDeviceIdLSB(sessionInfo.getDeviceIdLSB())
363 363 .setTenantIdMSB(sessionInfo.getTenantIdMSB())
364 364 .setTenantIdLSB(sessionInfo.getTenantIdLSB())
365 365 .setType(type.name())
366 366 .build();
367   - transportService.process(deviceSessionCtx.getSessionInfo(), getFirmwareRequestMsg,
368   - new FirmwareCallback(ctx, msgId, getFirmwareRequestMsg, requestId, chunkSize, chunk));
  367 + transportService.process(deviceSessionCtx.getSessionInfo(), getOtaPackageRequestMsg,
  368 + new OtaPackageCallback(ctx, msgId, getOtaPackageRequestMsg, requestId, chunkSize, chunk));
369 369 }
370 370 }
371 371
... ... @@ -425,15 +425,15 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
425 425 }
426 426 }
427 427
428   - private class FirmwareCallback implements TransportServiceCallback<TransportProtos.GetFirmwareResponseMsg> {
  428 + private class OtaPackageCallback implements TransportServiceCallback<TransportProtos.GetOtaPackageResponseMsg> {
429 429 private final ChannelHandlerContext ctx;
430 430 private final int msgId;
431   - private final TransportProtos.GetFirmwareRequestMsg msg;
  431 + private final TransportProtos.GetOtaPackageRequestMsg msg;
432 432 private final String requestId;
433 433 private final int chunkSize;
434 434 private final int chunk;
435 435
436   - FirmwareCallback(ChannelHandlerContext ctx, int msgId, TransportProtos.GetFirmwareRequestMsg msg, String requestId, int chunkSize, int chunk) {
  436 + OtaPackageCallback(ChannelHandlerContext ctx, int msgId, TransportProtos.GetOtaPackageRequestMsg msg, String requestId, int chunkSize, int chunk) {
437 437 this.ctx = ctx;
438 438 this.msgId = msgId;
439 439 this.msg = msg;
... ... @@ -443,13 +443,13 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
443 443 }
444 444
445 445 @Override
446   - public void onSuccess(TransportProtos.GetFirmwareResponseMsg response) {
  446 + public void onSuccess(TransportProtos.GetOtaPackageResponseMsg response) {
447 447 if (TransportProtos.ResponseStatus.SUCCESS.equals(response.getResponseStatus())) {
448   - FirmwareId firmwareId = new FirmwareId(new UUID(response.getFirmwareIdMSB(), response.getFirmwareIdLSB()));
449   - fwSessions.put(requestId, firmwareId.toString());
450   - sendFirmware(ctx, msgId, firmwareId.toString(), requestId, chunkSize, chunk, FirmwareType.valueOf(response.getType()));
  448 + OtaPackageId firmwareId = new OtaPackageId(new UUID(response.getOtaPackageIdMSB(), response.getOtaPackageIdLSB()));
  449 + otaPackSessions.put(requestId, firmwareId.toString());
  450 + sendOtaPackage(ctx, msgId, firmwareId.toString(), requestId, chunkSize, chunk, OtaPackageType.valueOf(response.getType()));
451 451 } else {
452   - sendFirmwareError(ctx, response.getResponseStatus().toString());
  452 + sendOtaPackageError(ctx, response.getResponseStatus().toString());
453 453 }
454 454 }
455 455
... ... @@ -460,11 +460,11 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
460 460 }
461 461 }
462 462
463   - private void sendFirmware(ChannelHandlerContext ctx, int msgId, String firmwareId, String requestId, int chunkSize, int chunk, FirmwareType type) {
  463 + private void sendOtaPackage(ChannelHandlerContext ctx, int msgId, String firmwareId, String requestId, int chunkSize, int chunk, OtaPackageType type) {
464 464 log.trace("[{}] Send firmware [{}] to device!", sessionId, firmwareId);
465 465 ack(ctx, msgId);
466 466 try {
467   - byte[] firmwareChunk = context.getFirmwareDataCache().get(firmwareId, chunkSize, chunk);
  467 + byte[] firmwareChunk = context.getOtaPackageDataCache().get(firmwareId, chunkSize, chunk);
468 468 deviceSessionCtx.getPayloadAdaptor()
469 469 .convertToPublish(deviceSessionCtx, firmwareChunk, requestId, chunk, type)
470 470 .ifPresent(deviceSessionCtx.getChannel()::writeAndFlush);
... ... @@ -473,7 +473,7 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
473 473 }
474 474 }
475 475
476   - private void sendFirmwareError(ChannelHandlerContext ctx, String error) {
  476 + private void sendOtaPackageError(ChannelHandlerContext ctx, String error) {
477 477 log.warn("[{}] {}", sessionId, error);
478 478 deviceSessionCtx.getChannel().writeAndFlush(deviceSessionCtx
479 479 .getPayloadAdaptor()
... ...
... ... @@ -30,7 +30,7 @@ import lombok.extern.slf4j.Slf4j;
30 30 import org.springframework.stereotype.Component;
31 31 import org.springframework.util.StringUtils;
32 32 import org.thingsboard.server.common.data.device.profile.MqttTopics;
33   -import org.thingsboard.server.common.data.firmware.FirmwareType;
  33 +import org.thingsboard.server.common.data.ota.OtaPackageType;
34 34 import org.thingsboard.server.common.transport.adaptor.AdaptorException;
35 35 import org.thingsboard.server.common.transport.adaptor.JsonConverter;
36 36 import org.thingsboard.server.gen.transport.TransportProtos;
... ... @@ -155,7 +155,7 @@ public class JsonMqttAdaptor implements MqttTransportAdaptor {
155 155 }
156 156
157 157 @Override
158   - public Optional<MqttMessage> convertToPublish(MqttDeviceAwareSessionContext ctx, byte[] firmwareChunk, String requestId, int chunk, FirmwareType firmwareType) {
  158 + public Optional<MqttMessage> convertToPublish(MqttDeviceAwareSessionContext ctx, byte[] firmwareChunk, String requestId, int chunk, OtaPackageType firmwareType) {
159 159 return Optional.of(createMqttPublishMsg(ctx, String.format(DEVICE_SOFTWARE_FIRMWARE_RESPONSES_TOPIC_FORMAT, firmwareType.getKeyPrefix(), requestId, chunk), firmwareChunk));
160 160 }
161 161
... ...
... ... @@ -23,7 +23,7 @@ import io.netty.handler.codec.mqtt.MqttMessage;
23 23 import io.netty.handler.codec.mqtt.MqttMessageType;
24 24 import io.netty.handler.codec.mqtt.MqttPublishMessage;
25 25 import io.netty.handler.codec.mqtt.MqttPublishVariableHeader;
26   -import org.thingsboard.server.common.data.firmware.FirmwareType;
  26 +import org.thingsboard.server.common.data.ota.OtaPackageType;
27 27 import org.thingsboard.server.common.transport.adaptor.AdaptorException;
28 28 import org.thingsboard.server.gen.transport.TransportProtos.AttributeUpdateNotificationMsg;
29 29 import org.thingsboard.server.gen.transport.TransportProtos.ClaimDeviceMsg;
... ... @@ -78,7 +78,7 @@ public interface MqttTransportAdaptor {
78 78
79 79 Optional<MqttMessage> convertToPublish(MqttDeviceAwareSessionContext ctx, ProvisionDeviceResponseMsg provisionResponse) throws AdaptorException;
80 80
81   - Optional<MqttMessage> convertToPublish(MqttDeviceAwareSessionContext ctx, byte[] firmwareChunk, String requestId, int chunk, FirmwareType firmwareType) throws AdaptorException;
  81 + Optional<MqttMessage> convertToPublish(MqttDeviceAwareSessionContext ctx, byte[] firmwareChunk, String requestId, int chunk, OtaPackageType firmwareType) throws AdaptorException;
82 82
83 83 default MqttPublishMessage createMqttPublishMsg(MqttDeviceAwareSessionContext ctx, String topic, byte[] payloadInBytes) {
84 84 MqttFixedHeader mqttFixedHeader =
... ...
... ... @@ -28,7 +28,7 @@ import lombok.extern.slf4j.Slf4j;
28 28 import org.springframework.stereotype.Component;
29 29 import org.springframework.util.StringUtils;
30 30 import org.thingsboard.server.common.data.device.profile.MqttTopics;
31   -import org.thingsboard.server.common.data.firmware.FirmwareType;
  31 +import org.thingsboard.server.common.data.ota.OtaPackageType;
32 32 import org.thingsboard.server.common.transport.adaptor.AdaptorException;
33 33 import org.thingsboard.server.common.transport.adaptor.JsonConverter;
34 34 import org.thingsboard.server.common.transport.adaptor.ProtoConverter;
... ... @@ -168,7 +168,7 @@ public class ProtoMqttAdaptor implements MqttTransportAdaptor {
168 168 }
169 169
170 170 @Override
171   - public Optional<MqttMessage> convertToPublish(MqttDeviceAwareSessionContext ctx, byte[] firmwareChunk, String requestId, int chunk, FirmwareType firmwareType) throws AdaptorException {
  171 + public Optional<MqttMessage> convertToPublish(MqttDeviceAwareSessionContext ctx, byte[] firmwareChunk, String requestId, int chunk, OtaPackageType firmwareType) throws AdaptorException {
172 172 return Optional.of(createMqttPublishMsg(ctx, String.format(DEVICE_SOFTWARE_FIRMWARE_RESPONSES_TOPIC_FORMAT, firmwareType.getKeyPrefix(), requestId, chunk), firmwareChunk));
173 173 }
174 174
... ...
... ... @@ -21,14 +21,13 @@ import lombok.Getter;
21 21 import lombok.extern.slf4j.Slf4j;
22 22 import org.springframework.beans.factory.annotation.Autowired;
23 23 import org.thingsboard.common.util.ThingsBoardExecutors;
24   -import org.thingsboard.server.cache.firmware.FirmwareDataCache;
  24 +import org.thingsboard.server.cache.ota.OtaPackageDataCache;
25 25 import org.thingsboard.server.queue.discovery.TbServiceInfoProvider;
26 26 import org.thingsboard.server.queue.scheduler.SchedulerComponent;
27 27
28 28 import javax.annotation.PostConstruct;
29 29 import javax.annotation.PreDestroy;
30 30 import java.util.concurrent.ExecutorService;
31   -import java.util.concurrent.Executors;
32 31
33 32 /**
34 33 * Created by ashvayka on 15.10.18.
... ... @@ -53,7 +52,7 @@ public abstract class TransportContext {
53 52
54 53 @Getter
55 54 @Autowired
56   - private FirmwareDataCache firmwareDataCache;
  55 + private OtaPackageDataCache otaPackageDataCache;
57 56
58 57 @Autowired
59 58 private TransportResourceCache transportResourceCache;
... ...
... ... @@ -29,8 +29,8 @@ import org.thingsboard.server.gen.transport.TransportProtos.GetDeviceRequestMsg;
29 29 import org.thingsboard.server.gen.transport.TransportProtos.GetDeviceResponseMsg;
30 30 import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileRequestMsg;
31 31 import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileResponseMsg;
32   -import org.thingsboard.server.gen.transport.TransportProtos.GetFirmwareRequestMsg;
33   -import org.thingsboard.server.gen.transport.TransportProtos.GetFirmwareResponseMsg;
  32 +import org.thingsboard.server.gen.transport.TransportProtos.GetOtaPackageRequestMsg;
  33 +import org.thingsboard.server.gen.transport.TransportProtos.GetOtaPackageResponseMsg;
34 34 import org.thingsboard.server.gen.transport.TransportProtos.GetOrCreateDeviceFromGatewayRequestMsg;
35 35 import org.thingsboard.server.gen.transport.TransportProtos.GetResourceRequestMsg;
36 36 import org.thingsboard.server.gen.transport.TransportProtos.GetResourceResponseMsg;
... ... @@ -115,7 +115,7 @@ public interface TransportService {
115 115
116 116 void process(TransportToDeviceActorMsg msg, TransportServiceCallback<Void> callback);
117 117
118   - void process(SessionInfoProto sessionInfoProto, GetFirmwareRequestMsg msg, TransportServiceCallback<GetFirmwareResponseMsg> callback);
  118 + void process(SessionInfoProto sessionInfoProto, GetOtaPackageRequestMsg msg, TransportServiceCallback<GetOtaPackageResponseMsg> callback);
119 119
120 120 SessionMetaData registerAsyncSession(SessionInfoProto sessionInfo, SessionMsgListener listener);
121 121
... ...
... ... @@ -614,13 +614,13 @@ public class DefaultTransportService implements TransportService {
614 614 }
615 615
616 616 @Override
617   - public void process(TransportProtos.SessionInfoProto sessionInfo, TransportProtos.GetFirmwareRequestMsg msg, TransportServiceCallback<TransportProtos.GetFirmwareResponseMsg> callback) {
  617 + public void process(TransportProtos.SessionInfoProto sessionInfo, TransportProtos.GetOtaPackageRequestMsg msg, TransportServiceCallback<TransportProtos.GetOtaPackageResponseMsg> callback) {
618 618 if (checkLimits(sessionInfo, msg, callback)) {
619 619 TbProtoQueueMsg<TransportProtos.TransportApiRequestMsg> protoMsg =
620   - new TbProtoQueueMsg<>(UUID.randomUUID(), TransportProtos.TransportApiRequestMsg.newBuilder().setFirmwareRequestMsg(msg).build());
  620 + new TbProtoQueueMsg<>(UUID.randomUUID(), TransportProtos.TransportApiRequestMsg.newBuilder().setOtaPackageRequestMsg(msg).build());
621 621
622 622 AsyncCallbackTemplate.withCallback(transportApiRequestTemplate.send(protoMsg), response -> {
623   - callback.onSuccess(response.getValue().getFirmwareResponseMsg());
  623 + callback.onSuccess(response.getValue().getOtaPackageResponseMsg());
624 624 }, callback::onError, transportCallbackExecutor);
625 625 }
626 626 }
... ...
... ... @@ -21,6 +21,7 @@ import org.thingsboard.server.common.data.DeviceInfo;
21 21 import org.thingsboard.server.common.data.DeviceTransportType;
22 22 import org.thingsboard.server.common.data.EntitySubtype;
23 23 import org.thingsboard.server.common.data.id.TenantId;
  24 +import org.thingsboard.server.common.data.ota.OtaPackageType;
24 25 import org.thingsboard.server.common.data.page.PageData;
25 26 import org.thingsboard.server.common.data.page.PageLink;
26 27 import org.thingsboard.server.dao.Dao;
... ... @@ -81,9 +82,12 @@ public interface DeviceDao extends Dao<Device>, TenantEntityDao {
81 82 */
82 83 PageData<Device> findDevicesByTenantIdAndType(UUID tenantId, String type, PageLink pageLink);
83 84
84   - PageData<Device> findDevicesByTenantIdAndTypeAndEmptyFirmware(UUID tenantId, String type, PageLink pageLink);
  85 + PageData<Device> findDevicesByTenantIdAndTypeAndEmptyOtaPackage(UUID tenantId,
  86 + UUID deviceProfileId,
  87 + OtaPackageType type,
  88 + PageLink pageLink);
85 89
86   - PageData<Device> findDevicesByTenantIdAndTypeAndEmptySoftware(UUID tenantId, String type, PageLink pageLink);
  90 + Long countDevicesByTenantIdAndDeviceProfileIdAndEmptyOtaPackage(UUID tenantId, UUID deviceProfileId, OtaPackageType otaPackageType);
87 91
88 92 /**
89 93 * Find device infos by tenantId, type and page link.
... ...
... ... @@ -43,7 +43,7 @@ import org.thingsboard.server.common.data.DeviceProfileInfo;
43 43 import org.thingsboard.server.common.data.DeviceProfileProvisionType;
44 44 import org.thingsboard.server.common.data.DeviceProfileType;
45 45 import org.thingsboard.server.common.data.DeviceTransportType;
46   -import org.thingsboard.server.common.data.Firmware;
  46 +import org.thingsboard.server.common.data.OtaPackage;
47 47 import org.thingsboard.server.common.data.Tenant;
48 48 import org.thingsboard.server.common.data.device.profile.CoapDeviceProfileTransportConfiguration;
49 49 import org.thingsboard.server.common.data.device.profile.CoapDeviceTypeConfiguration;
... ... @@ -57,7 +57,7 @@ import org.thingsboard.server.common.data.device.profile.DisabledDeviceProfilePr
57 57 import org.thingsboard.server.common.data.device.profile.MqttDeviceProfileTransportConfiguration;
58 58 import org.thingsboard.server.common.data.device.profile.ProtoTransportPayloadConfiguration;
59 59 import org.thingsboard.server.common.data.device.profile.TransportPayloadTypeConfiguration;
60   -import org.thingsboard.server.common.data.firmware.FirmwareType;
  60 +import org.thingsboard.server.common.data.ota.OtaPackageType;
61 61 import org.thingsboard.server.common.data.id.DeviceProfileId;
62 62 import org.thingsboard.server.common.data.id.TenantId;
63 63 import org.thingsboard.server.common.data.page.PageData;
... ... @@ -66,7 +66,7 @@ import org.thingsboard.server.common.data.rule.RuleChain;
66 66 import org.thingsboard.server.dao.dashboard.DashboardService;
67 67 import org.thingsboard.server.dao.entity.AbstractEntityService;
68 68 import org.thingsboard.server.dao.exception.DataValidationException;
69   -import org.thingsboard.server.dao.firmware.FirmwareService;
  69 +import org.thingsboard.server.dao.ota.OtaPackageService;
70 70 import org.thingsboard.server.dao.rule.RuleChainService;
71 71 import org.thingsboard.server.dao.service.DataValidator;
72 72 import org.thingsboard.server.dao.service.PaginatedRemover;
... ... @@ -119,7 +119,7 @@ public class DeviceProfileServiceImpl extends AbstractEntityService implements D
119 119 private CacheManager cacheManager;
120 120
121 121 @Autowired
122   - private FirmwareService firmwareService;
  122 + private OtaPackageService otaPackageService;
123 123
124 124 @Autowired
125 125 private RuleChainService ruleChainService;
... ... @@ -427,11 +427,11 @@ public class DeviceProfileServiceImpl extends AbstractEntityService implements D
427 427 }
428 428
429 429 if (deviceProfile.getFirmwareId() != null) {
430   - Firmware firmware = firmwareService.findFirmwareById(tenantId, deviceProfile.getFirmwareId());
  430 + OtaPackage firmware = otaPackageService.findOtaPackageById(tenantId, deviceProfile.getFirmwareId());
431 431 if (firmware == null) {
432 432 throw new DataValidationException("Can't assign non-existent firmware!");
433 433 }
434   - if (!firmware.getType().equals(FirmwareType.FIRMWARE)) {
  434 + if (!firmware.getType().equals(OtaPackageType.FIRMWARE)) {
435 435 throw new DataValidationException("Can't assign firmware with type: " + firmware.getType());
436 436 }
437 437 if (firmware.getData() == null) {
... ... @@ -443,11 +443,11 @@ public class DeviceProfileServiceImpl extends AbstractEntityService implements D
443 443 }
444 444
445 445 if (deviceProfile.getSoftwareId() != null) {
446   - Firmware software = firmwareService.findFirmwareById(tenantId, deviceProfile.getSoftwareId());
  446 + OtaPackage software = otaPackageService.findOtaPackageById(tenantId, deviceProfile.getSoftwareId());
447 447 if (software == null) {
448 448 throw new DataValidationException("Can't assign non-existent software!");
449 449 }
450   - if (!software.getType().equals(FirmwareType.SOFTWARE)) {
  450 + if (!software.getType().equals(OtaPackageType.SOFTWARE)) {
451 451 throw new DataValidationException("Can't assign software with type: " + software.getType());
452 452 }
453 453 if (software.getData() == null) {
... ...
... ... @@ -41,7 +41,7 @@ import org.thingsboard.server.common.data.DeviceTransportType;
41 41 import org.thingsboard.server.common.data.EntitySubtype;
42 42 import org.thingsboard.server.common.data.EntityType;
43 43 import org.thingsboard.server.common.data.EntityView;
44   -import org.thingsboard.server.common.data.Firmware;
  44 +import org.thingsboard.server.common.data.OtaPackage;
45 45 import org.thingsboard.server.common.data.Tenant;
46 46 import org.thingsboard.server.common.data.device.DeviceSearchQuery;
47 47 import org.thingsboard.server.common.data.device.credentials.BasicMqttCredentials;
... ... @@ -54,13 +54,13 @@ import org.thingsboard.server.common.data.device.data.Lwm2mDeviceTransportConfig
54 54 import org.thingsboard.server.common.data.device.data.MqttDeviceTransportConfiguration;
55 55 import org.thingsboard.server.common.data.device.data.SnmpDeviceTransportConfiguration;
56 56 import org.thingsboard.server.common.data.edge.Edge;
57   -import org.thingsboard.server.common.data.firmware.FirmwareType;
58 57 import org.thingsboard.server.common.data.id.CustomerId;
59 58 import org.thingsboard.server.common.data.id.DeviceId;
60 59 import org.thingsboard.server.common.data.id.DeviceProfileId;
61 60 import org.thingsboard.server.common.data.id.EdgeId;
62 61 import org.thingsboard.server.common.data.id.EntityId;
63 62 import org.thingsboard.server.common.data.id.TenantId;
  63 +import org.thingsboard.server.common.data.ota.OtaPackageType;
64 64 import org.thingsboard.server.common.data.page.PageData;
65 65 import org.thingsboard.server.common.data.page.PageLink;
66 66 import org.thingsboard.server.common.data.relation.EntityRelation;
... ... @@ -76,7 +76,7 @@ import org.thingsboard.server.dao.device.provision.ProvisionResponseStatus;
76 76 import org.thingsboard.server.dao.entity.AbstractEntityService;
77 77 import org.thingsboard.server.dao.event.EventService;
78 78 import org.thingsboard.server.dao.exception.DataValidationException;
79   -import org.thingsboard.server.dao.firmware.FirmwareService;
  79 +import org.thingsboard.server.dao.ota.OtaPackageService;
80 80 import org.thingsboard.server.dao.service.DataValidator;
81 81 import org.thingsboard.server.dao.service.PaginatedRemover;
82 82 import org.thingsboard.server.dao.tenant.TbTenantProfileCache;
... ... @@ -138,7 +138,7 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe
138 138 private TbTenantProfileCache tenantProfileCache;
139 139
140 140 @Autowired
141   - private FirmwareService firmwareService;
  141 + private OtaPackageService otaPackageService;
142 142
143 143 @Override
144 144 public DeviceInfo findDeviceInfoById(TenantId tenantId, DeviceId deviceId) {
... ... @@ -201,14 +201,12 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe
201 201 deviceCredentials.setDeviceId(savedDevice.getId());
202 202 if (device.getId() == null) {
203 203 deviceCredentialsService.createDeviceCredentials(savedDevice.getTenantId(), deviceCredentials);
204   - }
205   - else {
  204 + } else {
206 205 DeviceCredentials foundDeviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(device.getTenantId(), savedDevice.getId());
207 206 if (foundDeviceCredentials == null) {
208 207 deviceCredentialsService.createDeviceCredentials(savedDevice.getTenantId(), deviceCredentials);
209   - }
210   - else {
211   - deviceCredentialsService.updateDeviceCredentials(device.getTenantId(), deviceCredentials);
  208 + } else {
  209 + deviceCredentialsService.updateDeviceCredentials(device.getTenantId(), deviceCredentials);
212 210 }
213 211 }
214 212 return savedDevice;
... ... @@ -364,21 +362,24 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe
364 362 }
365 363
366 364 @Override
367   - public PageData<Device> findDevicesByTenantIdAndTypeAndEmptyFirmware(TenantId tenantId, String type, PageLink pageLink) {
368   - log.trace("Executing findDevicesByTenantIdAndTypeAndEmptyFirmware, tenantId [{}], type [{}], pageLink [{}]", tenantId, type, pageLink);
  365 + public PageData<Device> findDevicesByTenantIdAndTypeAndEmptyOtaPackage(TenantId tenantId,
  366 + DeviceProfileId deviceProfileId,
  367 + OtaPackageType type,
  368 + PageLink pageLink) {
  369 + log.trace("Executing findDevicesByTenantIdAndTypeAndEmptyOtaPackage, tenantId [{}], deviceProfileId [{}], type [{}], pageLink [{}]",
  370 + tenantId, deviceProfileId, type, pageLink);
369 371 validateId(tenantId, INCORRECT_TENANT_ID + tenantId);
370   - validateString(type, "Incorrect type " + type);
  372 + validateId(tenantId, INCORRECT_DEVICE_PROFILE_ID + deviceProfileId);
371 373 validatePageLink(pageLink);
372   - return deviceDao.findDevicesByTenantIdAndTypeAndEmptyFirmware(tenantId.getId(), type, pageLink);
  374 + return deviceDao.findDevicesByTenantIdAndTypeAndEmptyOtaPackage(tenantId.getId(), deviceProfileId.getId(), type, pageLink);
373 375 }
374 376
375 377 @Override
376   - public PageData<Device> findDevicesByTenantIdAndTypeAndEmptySoftware(TenantId tenantId, String type, PageLink pageLink) {
377   - log.trace("Executing findDevicesByTenantIdAndTypeAndEmptySoftware, tenantId [{}], type [{}], pageLink [{}]", tenantId, type, pageLink);
  378 + public Long countDevicesByTenantIdAndDeviceProfileIdAndEmptyOtaPackage(TenantId tenantId, DeviceProfileId deviceProfileId, OtaPackageType type) {
  379 + log.trace("Executing countDevicesByTenantIdAndDeviceProfileIdAndEmptyOtaPackage, tenantId [{}], deviceProfileId [{}], type [{}]", tenantId, deviceProfileId, type);
378 380 validateId(tenantId, INCORRECT_TENANT_ID + tenantId);
379   - validateString(type, "Incorrect type " + type);
380   - validatePageLink(pageLink);
381   - return deviceDao.findDevicesByTenantIdAndTypeAndEmptySoftware(tenantId.getId(), type, pageLink);
  381 + validateId(tenantId, INCORRECT_DEVICE_PROFILE_ID + deviceProfileId);
  382 + return deviceDao.countDevicesByTenantIdAndDeviceProfileIdAndEmptyOtaPackage(tenantId.getId(), deviceProfileId.getId(), type);
382 383 }
383 384
384 385 @Override
... ... @@ -708,11 +709,11 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe
708 709 .ifPresent(DeviceTransportConfiguration::validate);
709 710
710 711 if (device.getFirmwareId() != null) {
711   - Firmware firmware = firmwareService.findFirmwareById(tenantId, device.getFirmwareId());
  712 + OtaPackage firmware = otaPackageService.findOtaPackageById(tenantId, device.getFirmwareId());
712 713 if (firmware == null) {
713 714 throw new DataValidationException("Can't assign non-existent firmware!");
714 715 }
715   - if (!firmware.getType().equals(FirmwareType.FIRMWARE)) {
  716 + if (!firmware.getType().equals(OtaPackageType.FIRMWARE)) {
716 717 throw new DataValidationException("Can't assign firmware with type: " + firmware.getType());
717 718 }
718 719 if (firmware.getData() == null) {
... ... @@ -724,11 +725,11 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe
724 725 }
725 726
726 727 if (device.getSoftwareId() != null) {
727   - Firmware software = firmwareService.findFirmwareById(tenantId, device.getSoftwareId());
  728 + OtaPackage software = otaPackageService.findOtaPackageById(tenantId, device.getSoftwareId());
728 729 if (software == null) {
729 730 throw new DataValidationException("Can't assign non-existent software!");
730 731 }
731   - if (!software.getType().equals(FirmwareType.SOFTWARE)) {
  732 + if (!software.getType().equals(OtaPackageType.SOFTWARE)) {
732 733 throw new DataValidationException("Can't assign software with type: " + software.getType());
733 734 }
734 735 if (software.getData() == null) {
... ...
... ... @@ -32,7 +32,7 @@ import org.thingsboard.server.common.data.id.DeviceId;
32 32 import org.thingsboard.server.common.data.id.EdgeId;
33 33 import org.thingsboard.server.common.data.id.EntityId;
34 34 import org.thingsboard.server.common.data.id.EntityViewId;
35   -import org.thingsboard.server.common.data.id.FirmwareId;
  35 +import org.thingsboard.server.common.data.id.OtaPackageId;
36 36 import org.thingsboard.server.common.data.id.RuleChainId;
37 37 import org.thingsboard.server.common.data.id.TbResourceId;
38 38 import org.thingsboard.server.common.data.id.TenantId;
... ... @@ -49,7 +49,7 @@ import org.thingsboard.server.dao.dashboard.DashboardService;
49 49 import org.thingsboard.server.dao.device.DeviceService;
50 50 import org.thingsboard.server.dao.entityview.EntityViewService;
51 51 import org.thingsboard.server.dao.exception.IncorrectParameterException;
52   -import org.thingsboard.server.dao.firmware.FirmwareService;
  52 +import org.thingsboard.server.dao.ota.OtaPackageService;
53 53 import org.thingsboard.server.dao.resource.ResourceService;
54 54 import org.thingsboard.server.dao.rule.RuleChainService;
55 55 import org.thingsboard.server.dao.tenant.TenantService;
... ... @@ -102,7 +102,7 @@ public class BaseEntityService extends AbstractEntityService implements EntitySe
102 102 private ResourceService resourceService;
103 103
104 104 @Autowired
105   - private FirmwareService firmwareService;
  105 + private OtaPackageService otaPackageService;
106 106
107 107 @Override
108 108 public void deleteEntityRelations(TenantId tenantId, EntityId entityId) {
... ... @@ -167,8 +167,8 @@ public class BaseEntityService extends AbstractEntityService implements EntitySe
167 167 case TB_RESOURCE:
168 168 hasName = resourceService.findResourceInfoByIdAsync(tenantId, new TbResourceId(entityId.getId()));
169 169 break;
170   - case FIRMWARE:
171   - hasName = firmwareService.findFirmwareInfoByIdAsync(tenantId, new FirmwareId(entityId.getId()));
  170 + case OTA_PACKAGE:
  171 + hasName = otaPackageService.findOtaPackageInfoByIdAsync(tenantId, new OtaPackageId(entityId.getId()));
172 172 break;
173 173 default:
174 174 throw new IllegalStateException("Not Implemented!");
... ... @@ -192,7 +192,7 @@ public class BaseEntityService extends AbstractEntityService implements EntitySe
192 192 case DEVICE_PROFILE:
193 193 case API_USAGE_STATE:
194 194 case TB_RESOURCE:
195   - case FIRMWARE:
  195 + case OTA_PACKAGE:
196 196 break;
197 197 case CUSTOMER:
198 198 hasCustomerId = () -> new CustomerId(entityId.getId());
... ...
... ... @@ -479,22 +479,21 @@ public class ModelConstants {
479 479 public static final String RESOURCE_DATA_COLUMN = "data";
480 480
481 481 /**
482   - * Firmware constants.
483   - */
484   - public static final String FIRMWARE_TABLE_NAME = "firmware";
485   - public static final String FIRMWARE_TENANT_ID_COLUMN = TENANT_ID_COLUMN;
486   - public static final String FIRMWARE_DEVICE_PROFILE_ID_COLUMN = "device_profile_id";
487   - public static final String FIRMWARE_TYPE_COLUMN = "type";
488   - public static final String FIRMWARE_TITLE_COLUMN = TITLE_PROPERTY;
489   - public static final String FIRMWARE_VERSION_COLUMN = "version";
490   - public static final String FIRMWARE_FILE_NAME_COLUMN = "file_name";
491   - public static final String FIRMWARE_CONTENT_TYPE_COLUMN = "content_type";
492   - public static final String FIRMWARE_CHECKSUM_ALGORITHM_COLUMN = "checksum_algorithm";
493   - public static final String FIRMWARE_CHECKSUM_COLUMN = "checksum";
494   - public static final String FIRMWARE_DATA_COLUMN = "data";
495   - public static final String FIRMWARE_DATA_SIZE_COLUMN = "data_size";
496   - public static final String FIRMWARE_ADDITIONAL_INFO_COLUMN = ADDITIONAL_INFO_PROPERTY;
497   - public static final String FIRMWARE_HAS_DATA_PROPERTY = "has_data";
  482 + * Ota Package constants.
  483 + */
  484 + public static final String OTA_PACKAGE_TABLE_NAME = "ota_package";
  485 + public static final String OTA_PACKAGE_TENANT_ID_COLUMN = TENANT_ID_COLUMN;
  486 + public static final String OTA_PACKAGE_DEVICE_PROFILE_ID_COLUMN = "device_profile_id";
  487 + public static final String OTA_PACKAGE_TYPE_COLUMN = "type";
  488 + public static final String OTA_PACKAGE_TILE_COLUMN = TITLE_PROPERTY;
  489 + public static final String OTA_PACKAGE_VERSION_COLUMN = "version";
  490 + public static final String OTA_PACKAGE_FILE_NAME_COLUMN = "file_name";
  491 + public static final String OTA_PACKAGE_CONTENT_TYPE_COLUMN = "content_type";
  492 + public static final String OTA_PACKAGE_CHECKSUM_ALGORITHM_COLUMN = "checksum_algorithm";
  493 + public static final String OTA_PACKAGE_CHECKSUM_COLUMN = "checksum";
  494 + public static final String OTA_PACKAGE_DATA_COLUMN = "data";
  495 + public static final String OTA_PACKAGE_DATA_SIZE_COLUMN = "data_size";
  496 + public static final String OTA_PACKAGE_ADDITIONAL_INFO_COLUMN = ADDITIONAL_INFO_PROPERTY;
498 497
499 498 /**
500 499 * Edge constants.
... ...
... ... @@ -28,7 +28,7 @@ import org.thingsboard.server.common.data.device.data.DeviceData;
28 28 import org.thingsboard.server.common.data.id.CustomerId;
29 29 import org.thingsboard.server.common.data.id.DeviceId;
30 30 import org.thingsboard.server.common.data.id.DeviceProfileId;
31   -import org.thingsboard.server.common.data.id.FirmwareId;
  31 +import org.thingsboard.server.common.data.id.OtaPackageId;
32 32 import org.thingsboard.server.common.data.id.TenantId;
33 33 import org.thingsboard.server.dao.model.BaseSqlEntity;
34 34 import org.thingsboard.server.dao.model.ModelConstants;
... ... @@ -154,10 +154,10 @@ public abstract class AbstractDeviceEntity<T extends Device> extends BaseSqlEnti
154 154 device.setDeviceProfileId(new DeviceProfileId(deviceProfileId));
155 155 }
156 156 if (firmwareId != null) {
157   - device.setFirmwareId(new FirmwareId(firmwareId));
  157 + device.setFirmwareId(new OtaPackageId(firmwareId));
158 158 }
159 159 if (softwareId != null) {
160   - device.setSoftwareId(new FirmwareId(softwareId));
  160 + device.setSoftwareId(new OtaPackageId(softwareId));
161 161 }
162 162 device.setDeviceData(JacksonUtil.convertValue(deviceData, DeviceData.class));
163 163 device.setName(name);
... ...
... ... @@ -29,7 +29,7 @@ import org.thingsboard.server.common.data.DeviceTransportType;
29 29 import org.thingsboard.server.common.data.device.profile.DeviceProfileData;
30 30 import org.thingsboard.server.common.data.id.DashboardId;
31 31 import org.thingsboard.server.common.data.id.DeviceProfileId;
32   -import org.thingsboard.server.common.data.id.FirmwareId;
  32 +import org.thingsboard.server.common.data.id.OtaPackageId;
33 33 import org.thingsboard.server.common.data.id.RuleChainId;
34 34 import org.thingsboard.server.common.data.id.TenantId;
35 35 import org.thingsboard.server.dao.model.BaseSqlEntity;
... ... @@ -178,11 +178,11 @@ public final class DeviceProfileEntity extends BaseSqlEntity<DeviceProfile> impl
178 178 deviceProfile.setProvisionDeviceKey(provisionDeviceKey);
179 179
180 180 if (firmwareId != null) {
181   - deviceProfile.setFirmwareId(new FirmwareId(firmwareId));
  181 + deviceProfile.setFirmwareId(new OtaPackageId(firmwareId));
182 182 }
183 183
184 184 if (softwareId != null) {
185   - deviceProfile.setSoftwareId(new FirmwareId(softwareId));
  185 + deviceProfile.setSoftwareId(new OtaPackageId(softwareId));
186 186 }
187 187
188 188 return deviceProfile;
... ...
dao/src/main/java/org/thingsboard/server/dao/model/sql/OtaPackageEntity.java renamed from dao/src/main/java/org/thingsboard/server/dao/model/sql/FirmwareEntity.java
... ... @@ -20,11 +20,11 @@ import lombok.Data;
20 20 import lombok.EqualsAndHashCode;
21 21 import org.hibernate.annotations.Type;
22 22 import org.hibernate.annotations.TypeDef;
23   -import org.thingsboard.server.common.data.Firmware;
24   -import org.thingsboard.server.common.data.firmware.ChecksumAlgorithm;
25   -import org.thingsboard.server.common.data.firmware.FirmwareType;
  23 +import org.thingsboard.server.common.data.OtaPackage;
  24 +import org.thingsboard.server.common.data.ota.ChecksumAlgorithm;
  25 +import org.thingsboard.server.common.data.ota.OtaPackageType;
26 26 import org.thingsboard.server.common.data.id.DeviceProfileId;
27   -import org.thingsboard.server.common.data.id.FirmwareId;
  27 +import org.thingsboard.server.common.data.id.OtaPackageId;
28 28 import org.thingsboard.server.common.data.id.TenantId;
29 29 import org.thingsboard.server.dao.model.BaseSqlEntity;
30 30 import org.thingsboard.server.dao.model.ModelConstants;
... ... @@ -40,75 +40,75 @@ import javax.persistence.Table;
40 40 import java.nio.ByteBuffer;
41 41 import java.util.UUID;
42 42
43   -import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_CHECKSUM_ALGORITHM_COLUMN;
44   -import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_CHECKSUM_COLUMN;
45   -import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_CONTENT_TYPE_COLUMN;
46   -import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_DATA_COLUMN;
47   -import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_DATA_SIZE_COLUMN;
48   -import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_DEVICE_PROFILE_ID_COLUMN;
49   -import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_FILE_NAME_COLUMN;
50   -import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_TABLE_NAME;
51   -import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_TENANT_ID_COLUMN;
52   -import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_TITLE_COLUMN;
53   -import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_TYPE_COLUMN;
54   -import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_VERSION_COLUMN;
  43 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_CHECKSUM_ALGORITHM_COLUMN;
  44 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_CHECKSUM_COLUMN;
  45 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_CONTENT_TYPE_COLUMN;
  46 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_DATA_COLUMN;
  47 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_DATA_SIZE_COLUMN;
  48 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_DEVICE_PROFILE_ID_COLUMN;
  49 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_FILE_NAME_COLUMN;
  50 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TABLE_NAME;
  51 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TENANT_ID_COLUMN;
  52 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TILE_COLUMN;
  53 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TYPE_COLUMN;
  54 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_VERSION_COLUMN;
55 55 import static org.thingsboard.server.dao.model.ModelConstants.SEARCH_TEXT_PROPERTY;
56 56
57 57 @Data
58 58 @EqualsAndHashCode(callSuper = true)
59 59 @Entity
60 60 @TypeDef(name = "json", typeClass = JsonStringType.class)
61   -@Table(name = FIRMWARE_TABLE_NAME)
62   -public class FirmwareEntity extends BaseSqlEntity<Firmware> implements SearchTextEntity<Firmware> {
  61 +@Table(name = OTA_PACKAGE_TABLE_NAME)
  62 +public class OtaPackageEntity extends BaseSqlEntity<OtaPackage> implements SearchTextEntity<OtaPackage> {
63 63
64   - @Column(name = FIRMWARE_TENANT_ID_COLUMN)
  64 + @Column(name = OTA_PACKAGE_TENANT_ID_COLUMN)
65 65 private UUID tenantId;
66 66
67   - @Column(name = FIRMWARE_DEVICE_PROFILE_ID_COLUMN)
  67 + @Column(name = OTA_PACKAGE_DEVICE_PROFILE_ID_COLUMN)
68 68 private UUID deviceProfileId;
69 69
70 70 @Enumerated(EnumType.STRING)
71   - @Column(name = FIRMWARE_TYPE_COLUMN)
72   - private FirmwareType type;
  71 + @Column(name = OTA_PACKAGE_TYPE_COLUMN)
  72 + private OtaPackageType type;
73 73
74   - @Column(name = FIRMWARE_TITLE_COLUMN)
  74 + @Column(name = OTA_PACKAGE_TILE_COLUMN)
75 75 private String title;
76 76
77   - @Column(name = FIRMWARE_VERSION_COLUMN)
  77 + @Column(name = OTA_PACKAGE_VERSION_COLUMN)
78 78 private String version;
79 79
80   - @Column(name = FIRMWARE_FILE_NAME_COLUMN)
  80 + @Column(name = OTA_PACKAGE_FILE_NAME_COLUMN)
81 81 private String fileName;
82 82
83   - @Column(name = FIRMWARE_CONTENT_TYPE_COLUMN)
  83 + @Column(name = OTA_PACKAGE_CONTENT_TYPE_COLUMN)
84 84 private String contentType;
85 85
86 86 @Enumerated(EnumType.STRING)
87   - @Column(name = FIRMWARE_CHECKSUM_ALGORITHM_COLUMN)
  87 + @Column(name = OTA_PACKAGE_CHECKSUM_ALGORITHM_COLUMN)
88 88 private ChecksumAlgorithm checksumAlgorithm;
89 89
90   - @Column(name = FIRMWARE_CHECKSUM_COLUMN)
  90 + @Column(name = OTA_PACKAGE_CHECKSUM_COLUMN)
91 91 private String checksum;
92 92
93 93 @Lob
94   - @Column(name = FIRMWARE_DATA_COLUMN, columnDefinition = "BINARY")
  94 + @Column(name = OTA_PACKAGE_DATA_COLUMN, columnDefinition = "BINARY")
95 95 private byte[] data;
96 96
97   - @Column(name = FIRMWARE_DATA_SIZE_COLUMN)
  97 + @Column(name = OTA_PACKAGE_DATA_SIZE_COLUMN)
98 98 private Long dataSize;
99 99
100 100 @Type(type = "json")
101   - @Column(name = ModelConstants.FIRMWARE_ADDITIONAL_INFO_COLUMN)
  101 + @Column(name = ModelConstants.OTA_PACKAGE_ADDITIONAL_INFO_COLUMN)
102 102 private JsonNode additionalInfo;
103 103
104 104 @Column(name = SEARCH_TEXT_PROPERTY)
105 105 private String searchText;
106 106
107   - public FirmwareEntity() {
  107 + public OtaPackageEntity() {
108 108 super();
109 109 }
110 110
111   - public FirmwareEntity(Firmware firmware) {
  111 + public OtaPackageEntity(OtaPackage firmware) {
112 112 this.createdTime = firmware.getCreatedTime();
113 113 this.setUuid(firmware.getUuidId());
114 114 this.tenantId = firmware.getTenantId().getId();
... ... @@ -138,8 +138,8 @@ public class FirmwareEntity extends BaseSqlEntity<Firmware> implements SearchTex
138 138 }
139 139
140 140 @Override
141   - public Firmware toData() {
142   - Firmware firmware = new Firmware(new FirmwareId(id));
  141 + public OtaPackage toData() {
  142 + OtaPackage firmware = new OtaPackage(new OtaPackageId(id));
143 143 firmware.setCreatedTime(createdTime);
144 144 firmware.setTenantId(new TenantId(tenantId));
145 145 if (deviceProfileId != null) {
... ...
dao/src/main/java/org/thingsboard/server/dao/model/sql/OtaPackageInfoEntity.java renamed from dao/src/main/java/org/thingsboard/server/dao/model/sql/FirmwareInfoEntity.java
... ... @@ -21,11 +21,11 @@ import lombok.EqualsAndHashCode;
21 21 import org.hibernate.annotations.Type;
22 22 import org.hibernate.annotations.TypeDef;
23 23 import org.thingsboard.common.util.JacksonUtil;
24   -import org.thingsboard.server.common.data.FirmwareInfo;
25   -import org.thingsboard.server.common.data.firmware.ChecksumAlgorithm;
26   -import org.thingsboard.server.common.data.firmware.FirmwareType;
  24 +import org.thingsboard.server.common.data.OtaPackageInfo;
  25 +import org.thingsboard.server.common.data.ota.ChecksumAlgorithm;
  26 +import org.thingsboard.server.common.data.ota.OtaPackageType;
27 27 import org.thingsboard.server.common.data.id.DeviceProfileId;
28   -import org.thingsboard.server.common.data.id.FirmwareId;
  28 +import org.thingsboard.server.common.data.id.OtaPackageId;
29 29 import org.thingsboard.server.common.data.id.TenantId;
30 30 import org.thingsboard.server.dao.model.BaseSqlEntity;
31 31 import org.thingsboard.server.dao.model.ModelConstants;
... ... @@ -40,60 +40,60 @@ import javax.persistence.Table;
40 40 import javax.persistence.Transient;
41 41 import java.util.UUID;
42 42
43   -import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_CHECKSUM_ALGORITHM_COLUMN;
44   -import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_CHECKSUM_COLUMN;
45   -import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_CONTENT_TYPE_COLUMN;
46   -import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_DATA_SIZE_COLUMN;
47   -import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_DEVICE_PROFILE_ID_COLUMN;
48   -import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_FILE_NAME_COLUMN;
49   -import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_TABLE_NAME;
50   -import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_TENANT_ID_COLUMN;
51   -import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_TITLE_COLUMN;
52   -import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_TYPE_COLUMN;
53   -import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_VERSION_COLUMN;
  43 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_CHECKSUM_ALGORITHM_COLUMN;
  44 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_CHECKSUM_COLUMN;
  45 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_CONTENT_TYPE_COLUMN;
  46 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_DATA_SIZE_COLUMN;
  47 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_DEVICE_PROFILE_ID_COLUMN;
  48 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_FILE_NAME_COLUMN;
  49 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TABLE_NAME;
  50 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TENANT_ID_COLUMN;
  51 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TILE_COLUMN;
  52 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TYPE_COLUMN;
  53 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_VERSION_COLUMN;
54 54 import static org.thingsboard.server.dao.model.ModelConstants.SEARCH_TEXT_PROPERTY;
55 55
56 56 @Data
57 57 @EqualsAndHashCode(callSuper = true)
58 58 @Entity
59 59 @TypeDef(name = "json", typeClass = JsonStringType.class)
60   -@Table(name = FIRMWARE_TABLE_NAME)
61   -public class FirmwareInfoEntity extends BaseSqlEntity<FirmwareInfo> implements SearchTextEntity<FirmwareInfo> {
  60 +@Table(name = OTA_PACKAGE_TABLE_NAME)
  61 +public class OtaPackageInfoEntity extends BaseSqlEntity<OtaPackageInfo> implements SearchTextEntity<OtaPackageInfo> {
62 62
63   - @Column(name = FIRMWARE_TENANT_ID_COLUMN)
  63 + @Column(name = OTA_PACKAGE_TENANT_ID_COLUMN)
64 64 private UUID tenantId;
65 65
66   - @Column(name = FIRMWARE_DEVICE_PROFILE_ID_COLUMN)
  66 + @Column(name = OTA_PACKAGE_DEVICE_PROFILE_ID_COLUMN)
67 67 private UUID deviceProfileId;
68 68
69 69 @Enumerated(EnumType.STRING)
70   - @Column(name = FIRMWARE_TYPE_COLUMN)
71   - private FirmwareType type;
  70 + @Column(name = OTA_PACKAGE_TYPE_COLUMN)
  71 + private OtaPackageType type;
72 72
73   - @Column(name = FIRMWARE_TITLE_COLUMN)
  73 + @Column(name = OTA_PACKAGE_TILE_COLUMN)
74 74 private String title;
75 75
76   - @Column(name = FIRMWARE_VERSION_COLUMN)
  76 + @Column(name = OTA_PACKAGE_VERSION_COLUMN)
77 77 private String version;
78 78
79   - @Column(name = FIRMWARE_FILE_NAME_COLUMN)
  79 + @Column(name = OTA_PACKAGE_FILE_NAME_COLUMN)
80 80 private String fileName;
81 81
82   - @Column(name = FIRMWARE_CONTENT_TYPE_COLUMN)
  82 + @Column(name = OTA_PACKAGE_CONTENT_TYPE_COLUMN)
83 83 private String contentType;
84 84
85 85 @Enumerated(EnumType.STRING)
86   - @Column(name = FIRMWARE_CHECKSUM_ALGORITHM_COLUMN)
  86 + @Column(name = OTA_PACKAGE_CHECKSUM_ALGORITHM_COLUMN)
87 87 private ChecksumAlgorithm checksumAlgorithm;
88 88
89   - @Column(name = FIRMWARE_CHECKSUM_COLUMN)
  89 + @Column(name = OTA_PACKAGE_CHECKSUM_COLUMN)
90 90 private String checksum;
91 91
92   - @Column(name = FIRMWARE_DATA_SIZE_COLUMN)
  92 + @Column(name = OTA_PACKAGE_DATA_SIZE_COLUMN)
93 93 private Long dataSize;
94 94
95 95 @Type(type = "json")
96   - @Column(name = ModelConstants.FIRMWARE_ADDITIONAL_INFO_COLUMN)
  96 + @Column(name = ModelConstants.OTA_PACKAGE_ADDITIONAL_INFO_COLUMN)
97 97 private JsonNode additionalInfo;
98 98
99 99 @Column(name = SEARCH_TEXT_PROPERTY)
... ... @@ -102,11 +102,11 @@ public class FirmwareInfoEntity extends BaseSqlEntity<FirmwareInfo> implements S
102 102 @Transient
103 103 private boolean hasData;
104 104
105   - public FirmwareInfoEntity() {
  105 + public OtaPackageInfoEntity() {
106 106 super();
107 107 }
108 108
109   - public FirmwareInfoEntity(FirmwareInfo firmware) {
  109 + public OtaPackageInfoEntity(OtaPackageInfo firmware) {
110 110 this.createdTime = firmware.getCreatedTime();
111 111 this.setUuid(firmware.getUuidId());
112 112 this.tenantId = firmware.getTenantId().getId();
... ... @@ -124,9 +124,9 @@ public class FirmwareInfoEntity extends BaseSqlEntity<FirmwareInfo> implements S
124 124 this.additionalInfo = firmware.getAdditionalInfo();
125 125 }
126 126
127   - public FirmwareInfoEntity(UUID id, long createdTime, UUID tenantId, UUID deviceProfileId, FirmwareType type, String title, String version,
128   - String fileName, String contentType, ChecksumAlgorithm checksumAlgorithm, String checksum, Long dataSize,
129   - Object additionalInfo, boolean hasData) {
  127 + public OtaPackageInfoEntity(UUID id, long createdTime, UUID tenantId, UUID deviceProfileId, OtaPackageType type, String title, String version,
  128 + String fileName, String contentType, ChecksumAlgorithm checksumAlgorithm, String checksum, Long dataSize,
  129 + Object additionalInfo, boolean hasData) {
130 130 this.id = id;
131 131 this.createdTime = createdTime;
132 132 this.tenantId = tenantId;
... ... @@ -154,8 +154,8 @@ public class FirmwareInfoEntity extends BaseSqlEntity<FirmwareInfo> implements S
154 154 }
155 155
156 156 @Override
157   - public FirmwareInfo toData() {
158   - FirmwareInfo firmware = new FirmwareInfo(new FirmwareId(id));
  157 + public OtaPackageInfo toData() {
  158 + OtaPackageInfo firmware = new OtaPackageInfo(new OtaPackageId(id));
159 159 firmware.setCreatedTime(createdTime);
160 160 firmware.setTenantId(new TenantId(tenantId));
161 161 if (deviceProfileId != null) {
... ...