Commit b0a27954ea43b6e745ca6e49220fea6a443cf69d

Authored by Andrii Shvaika
1 parent a9e83b48

Improvements to FirmwareInfo

@@ -70,6 +70,7 @@ CREATE TABLE IF NOT EXISTS firmware ( @@ -70,6 +70,7 @@ CREATE TABLE IF NOT EXISTS firmware (
70 checksum_algorithm varchar(32), 70 checksum_algorithm varchar(32),
71 checksum varchar(1020), 71 checksum varchar(1020),
72 data bytea, 72 data bytea,
  73 + data_size bigint,
73 additional_info varchar, 74 additional_info varchar,
74 search_text varchar(255), 75 search_text varchar(255),
75 CONSTRAINT firmware_tenant_title_version_unq_key UNIQUE (tenant_id, title, version) 76 CONSTRAINT firmware_tenant_title_version_unq_key UNIQUE (tenant_id, title, version)
@@ -129,16 +129,18 @@ public class FirmwareController extends BaseController { @@ -129,16 +129,18 @@ public class FirmwareController extends BaseController {
129 firmware.setVersion(info.getVersion()); 129 firmware.setVersion(info.getVersion());
130 firmware.setAdditionalInfo(info.getAdditionalInfo()); 130 firmware.setAdditionalInfo(info.getAdditionalInfo());
131 131
  132 + byte[] data = file.getBytes();
132 if (StringUtils.isEmpty(checksumAlgorithm)) { 133 if (StringUtils.isEmpty(checksumAlgorithm)) {
133 checksumAlgorithm = "sha256"; 134 checksumAlgorithm = "sha256";
134 - checksum = Hashing.sha256().hashBytes(file.getBytes()).toString(); 135 + checksum = Hashing.sha256().hashBytes(data).toString();
135 } 136 }
136 137
137 firmware.setChecksumAlgorithm(checksumAlgorithm); 138 firmware.setChecksumAlgorithm(checksumAlgorithm);
138 firmware.setChecksum(checksum); 139 firmware.setChecksum(checksum);
139 firmware.setFileName(file.getOriginalFilename()); 140 firmware.setFileName(file.getOriginalFilename());
140 firmware.setContentType(file.getContentType()); 141 firmware.setContentType(file.getContentType());
141 - firmware.setData(ByteBuffer.wrap(file.getBytes())); 142 + firmware.setData(ByteBuffer.wrap(data));
  143 + firmware.setDataSize((long) data.length);
142 return firmwareService.saveFirmware(firmware); 144 return firmwareService.saveFirmware(firmware);
143 } catch (Exception e) { 145 } catch (Exception e) {
144 throw handleException(e); 146 throw handleException(e);
@@ -23,6 +23,7 @@ import org.thingsboard.server.common.data.DataConstants; @@ -23,6 +23,7 @@ import org.thingsboard.server.common.data.DataConstants;
23 import org.thingsboard.server.common.data.Device; 23 import org.thingsboard.server.common.data.Device;
24 import org.thingsboard.server.common.data.DeviceProfile; 24 import org.thingsboard.server.common.data.DeviceProfile;
25 import org.thingsboard.server.common.data.Firmware; 25 import org.thingsboard.server.common.data.Firmware;
  26 +import org.thingsboard.server.common.data.FirmwareInfo;
26 import org.thingsboard.server.common.data.id.DeviceId; 27 import org.thingsboard.server.common.data.id.DeviceId;
27 import org.thingsboard.server.common.data.id.FirmwareId; 28 import org.thingsboard.server.common.data.id.FirmwareId;
28 import org.thingsboard.server.common.data.id.TenantId; 29 import org.thingsboard.server.common.data.id.TenantId;
@@ -174,12 +175,21 @@ public class DefaultFirmwareStateService implements FirmwareStateService { @@ -174,12 +175,21 @@ public class DefaultFirmwareStateService implements FirmwareStateService {
174 .setTs(ts) 175 .setTs(ts)
175 .build(); 176 .build();
176 177
  178 + FirmwareInfo firmware = firmwareService.findFirmwareInfoById(tenantId, firmwareId);
  179 + if (firmware == null) {
  180 + log.warn("[{}] Failed to send firmware update because firmware was already deleted", firmwareId);
  181 + return;
  182 + }
  183 +
177 TopicPartitionInfo tpi = new TopicPartitionInfo(fwStateMsgProducer.getDefaultTopic(), null, null, false); 184 TopicPartitionInfo tpi = new TopicPartitionInfo(fwStateMsgProducer.getDefaultTopic(), null, null, false);
178 fwStateMsgProducer.send(tpi, new TbProtoQueueMsg<>(UUID.randomUUID(), msg), null); 185 fwStateMsgProducer.send(tpi, new TbProtoQueueMsg<>(UUID.randomUUID(), msg), null);
179 186
180 - BasicTsKvEntry status = new BasicTsKvEntry(ts, new StringDataEntry(DataConstants.FIRMWARE_STATE, FirmwareUpdateStatus.QUEUED.name())); 187 + List<TsKvEntry> telemetry = new ArrayList<>();
  188 + telemetry.add(new BasicTsKvEntry(ts, new StringDataEntry(DataConstants.TARGET_FIRMWARE_TITLE, firmware.getTitle())));
  189 + telemetry.add(new BasicTsKvEntry(ts, new StringDataEntry(DataConstants.TARGET_FIRMWARE_VERSION, firmware.getVersion())));
  190 + telemetry.add(new BasicTsKvEntry(ts, new StringDataEntry(DataConstants.FIRMWARE_STATE, FirmwareUpdateStatus.QUEUED.name())));
181 191
182 - telemetryService.saveAndNotify(tenantId, deviceId, Collections.singletonList(status), new FutureCallback<>() { 192 + telemetryService.saveAndNotify(tenantId, deviceId, telemetry, new FutureCallback<>() {
183 @Override 193 @Override
184 public void onSuccess(@Nullable Void tmp) { 194 public void onSuccess(@Nullable Void tmp) {
185 log.trace("[{}] Success save firmware status!", deviceId); 195 log.trace("[{}] Success save firmware status!", deviceId);
@@ -193,16 +203,13 @@ public class DefaultFirmwareStateService implements FirmwareStateService { @@ -193,16 +203,13 @@ public class DefaultFirmwareStateService implements FirmwareStateService {
193 } 203 }
194 204
195 205
196 - private void update(Device device, Firmware firmware, long ts) { 206 + private void update(Device device, FirmwareInfo firmware, long ts) {
197 TenantId tenantId = device.getTenantId(); 207 TenantId tenantId = device.getTenantId();
198 DeviceId deviceId = device.getId(); 208 DeviceId deviceId = device.getId();
199 209
200 - List<TsKvEntry> telemetry = new ArrayList<>();  
201 - telemetry.add(new BasicTsKvEntry(ts, new StringDataEntry(DataConstants.TARGET_FIRMWARE_TITLE, firmware.getTitle())));  
202 - telemetry.add(new BasicTsKvEntry(ts, new StringDataEntry(DataConstants.TARGET_FIRMWARE_VERSION, firmware.getVersion())));  
203 - telemetry.add(new BasicTsKvEntry(ts, new StringDataEntry(DataConstants.FIRMWARE_STATE, FirmwareUpdateStatus.INITIATED.name()))); 210 + BasicTsKvEntry status = new BasicTsKvEntry(System.currentTimeMillis(), new StringDataEntry(DataConstants.FIRMWARE_STATE, FirmwareUpdateStatus.INITIATED.name()));
204 211
205 - telemetryService.saveAndNotify(tenantId, deviceId, telemetry, new FutureCallback<>() { 212 + telemetryService.saveAndNotify(tenantId, deviceId, Collections.singletonList(status), new FutureCallback<>() {
206 @Override 213 @Override
207 public void onSuccess(@Nullable Void tmp) { 214 public void onSuccess(@Nullable Void tmp) {
208 log.trace("[{}] Success save telemetry with target firmware for device!", deviceId); 215 log.trace("[{}] Success save telemetry with target firmware for device!", deviceId);
@@ -219,7 +226,7 @@ public class DefaultFirmwareStateService implements FirmwareStateService { @@ -219,7 +226,7 @@ public class DefaultFirmwareStateService implements FirmwareStateService {
219 attributes.add(new BaseAttributeKvEntry(ts, new StringDataEntry(DataConstants.FIRMWARE_TITLE, firmware.getTitle()))); 226 attributes.add(new BaseAttributeKvEntry(ts, new StringDataEntry(DataConstants.FIRMWARE_TITLE, firmware.getTitle())));
220 attributes.add(new BaseAttributeKvEntry(ts, new StringDataEntry(DataConstants.FIRMWARE_VERSION, firmware.getVersion()))); 227 attributes.add(new BaseAttributeKvEntry(ts, new StringDataEntry(DataConstants.FIRMWARE_VERSION, firmware.getVersion())));
221 228
222 - attributes.add(new BaseAttributeKvEntry(ts, new LongDataEntry(FIRMWARE_SIZE, (long) firmware.getData().array().length))); 229 + attributes.add(new BaseAttributeKvEntry(ts, new LongDataEntry(FIRMWARE_SIZE, firmware.getDataSize())));
223 attributes.add(new BaseAttributeKvEntry(ts, new StringDataEntry(DataConstants.FIRMWARE_CHECKSUM_ALGORITHM, firmware.getChecksumAlgorithm()))); 230 attributes.add(new BaseAttributeKvEntry(ts, new StringDataEntry(DataConstants.FIRMWARE_CHECKSUM_ALGORITHM, firmware.getChecksumAlgorithm())));
224 attributes.add(new BaseAttributeKvEntry(ts, new StringDataEntry(DataConstants.FIRMWARE_CHECKSUM, firmware.getChecksum()))); 231 attributes.add(new BaseAttributeKvEntry(ts, new StringDataEntry(DataConstants.FIRMWARE_CHECKSUM, firmware.getChecksum())));
225 telemetryService.saveAndNotify(tenantId, deviceId, DataConstants.SHARED_SCOPE, attributes, new FutureCallback<>() { 232 telemetryService.saveAndNotify(tenantId, deviceId, DataConstants.SHARED_SCOPE, attributes, new FutureCallback<>() {
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
1 package org.thingsboard.server.service.firmware; 16 package org.thingsboard.server.service.firmware;
2 17
3 public enum FirmwareUpdateStatus { 18 public enum FirmwareUpdateStatus {
@@ -151,8 +151,8 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCore @@ -151,8 +151,8 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCore
151 @PostConstruct 151 @PostConstruct
152 public void init() { 152 public void init() {
153 super.init("tb-core-consumer", "tb-core-notifications-consumer"); 153 super.init("tb-core-consumer", "tb-core-notifications-consumer");
154 - this.usageStatsExecutor = Executors.newCachedThreadPool(ThingsBoardThreadFactory.forName("tb-core-usage-stats-consumer"));  
155 - this.firmwareStatesExecutor = Executors.newCachedThreadPool(ThingsBoardThreadFactory.forName("tb-core-firmware-notifications-consumer")); 154 + this.usageStatsExecutor = Executors.newSingleThreadExecutor(ThingsBoardThreadFactory.forName("tb-core-usage-stats-consumer"));
  155 + this.firmwareStatesExecutor = Executors.newSingleThreadExecutor(ThingsBoardThreadFactory.forName("tb-core-firmware-notifications-consumer"));
156 } 156 }
157 157
158 @PreDestroy 158 @PreDestroy
@@ -363,7 +363,6 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCore @@ -363,7 +363,6 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCore
363 try { 363 try {
364 List<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> msgs = firmwareStatesConsumer.poll(getNotificationPollDuration()); 364 List<TbProtoQueueMsg<ToFirmwareStateServiceMsg>> msgs = firmwareStatesConsumer.poll(getNotificationPollDuration());
365 if (msgs.isEmpty()) { 365 if (msgs.isEmpty()) {
366 - Thread.sleep(maxProcessingTimeoutPerRecord);  
367 continue; 366 continue;
368 } 367 }
369 long timeToSleep = maxProcessingTimeoutPerRecord; 368 long timeToSleep = maxProcessingTimeoutPerRecord;
@@ -374,10 +373,13 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCore @@ -374,10 +373,13 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCore
374 long endTime = System.currentTimeMillis(); 373 long endTime = System.currentTimeMillis();
375 long spentTime = endTime - startTime; 374 long spentTime = endTime - startTime;
376 timeToSleep = timeToSleep - spentTime; 375 timeToSleep = timeToSleep - spentTime;
377 - if (isSuccessUpdate && timeToSleep > 0) {  
378 - log.debug("Spent time per record is: [{}]!", spentTime);  
379 - Thread.sleep(timeToSleep);  
380 - timeToSleep = maxProcessingTimeoutPerRecord; 376 + if (isSuccessUpdate) {
  377 + if (timeToSleep > 0) {
  378 + log.debug("Spent time per record is: [{}]!", spentTime);
  379 + Thread.sleep(timeToSleep);
  380 + timeToSleep = 0;
  381 + }
  382 + timeToSleep += maxProcessingTimeoutPerRecord;
381 } 383 }
382 } catch (Throwable e) { 384 } catch (Throwable e) {
383 log.warn("Failed to process firmware update msg: {}", msg, e); 385 log.warn("Failed to process firmware update msg: {}", msg, e);
@@ -27,14 +27,6 @@ public class Firmware extends FirmwareInfo { @@ -27,14 +27,6 @@ public class Firmware extends FirmwareInfo {
27 27
28 private static final long serialVersionUID = 3091601761339422546L; 28 private static final long serialVersionUID = 3091601761339422546L;
29 29
30 - private String fileName;  
31 -  
32 - private String contentType;  
33 -  
34 - private String checksumAlgorithm;  
35 -  
36 - private String checksum;  
37 -  
38 private transient ByteBuffer data; 30 private transient ByteBuffer data;
39 31
40 public Firmware() { 32 public Firmware() {
@@ -47,10 +39,6 @@ public class Firmware extends FirmwareInfo { @@ -47,10 +39,6 @@ public class Firmware extends FirmwareInfo {
47 39
48 public Firmware(Firmware firmware) { 40 public Firmware(Firmware firmware) {
49 super(firmware); 41 super(firmware);
50 - this.fileName = firmware.getFileName();  
51 - this.contentType = firmware.getContentType();  
52 this.data = firmware.getData(); 42 this.data = firmware.getData();
53 - this.checksumAlgorithm = firmware.getChecksumAlgorithm();  
54 - this.checksum = firmware.getChecksum();  
55 } 43 }
56 } 44 }
@@ -32,6 +32,12 @@ public class FirmwareInfo extends SearchTextBasedWithAdditionalInfo<FirmwareId> @@ -32,6 +32,12 @@ public class FirmwareInfo extends SearchTextBasedWithAdditionalInfo<FirmwareId>
32 private String title; 32 private String title;
33 private String version; 33 private String version;
34 private boolean hasData; 34 private boolean hasData;
  35 + private String fileName;
  36 + private String contentType;
  37 + private String checksumAlgorithm;
  38 + private String checksum;
  39 + private Long dataSize;
  40 +
35 41
36 public FirmwareInfo() { 42 public FirmwareInfo() {
37 super(); 43 super();
@@ -47,6 +53,11 @@ public class FirmwareInfo extends SearchTextBasedWithAdditionalInfo<FirmwareId> @@ -47,6 +53,11 @@ public class FirmwareInfo extends SearchTextBasedWithAdditionalInfo<FirmwareId>
47 this.title = firmwareInfo.getTitle(); 53 this.title = firmwareInfo.getTitle();
48 this.version = firmwareInfo.getVersion(); 54 this.version = firmwareInfo.getVersion();
49 this.hasData = firmwareInfo.isHasData(); 55 this.hasData = firmwareInfo.isHasData();
  56 + this.fileName = firmwareInfo.getFileName();
  57 + this.contentType = firmwareInfo.getContentType();
  58 + this.checksumAlgorithm = firmwareInfo.getChecksumAlgorithm();
  59 + this.checksum = firmwareInfo.getChecksum();
  60 + this.dataSize = firmwareInfo.getDataSize();
50 } 61 }
51 62
52 @Override 63 @Override
@@ -184,13 +184,7 @@ public class BaseFirmwareService implements FirmwareService { @@ -184,13 +184,7 @@ public class BaseFirmwareService implements FirmwareService {
184 protected void validateUpdate(TenantId tenantId, FirmwareInfo firmware) { 184 protected void validateUpdate(TenantId tenantId, FirmwareInfo firmware) {
185 FirmwareInfo firmwareOld = firmwareInfoDao.findById(tenantId, firmware.getUuidId()); 185 FirmwareInfo firmwareOld = firmwareInfoDao.findById(tenantId, firmware.getUuidId());
186 186
187 - if (!firmwareOld.getTitle().equals(firmware.getTitle())) {  
188 - throw new DataValidationException("Updating firmware title is prohibited!");  
189 - }  
190 -  
191 - if (!firmwareOld.getVersion().equals(firmware.getVersion())) {  
192 - throw new DataValidationException("Updating firmware version is prohibited!");  
193 - } 187 + BaseFirmwareService.validateUpdate(firmware, firmwareOld);
194 } 188 }
195 }; 189 };
196 190
@@ -261,35 +255,43 @@ public class BaseFirmwareService implements FirmwareService { @@ -261,35 +255,43 @@ public class BaseFirmwareService implements FirmwareService {
261 protected void validateUpdate(TenantId tenantId, Firmware firmware) { 255 protected void validateUpdate(TenantId tenantId, Firmware firmware) {
262 Firmware firmwareOld = firmwareDao.findById(tenantId, firmware.getUuidId()); 256 Firmware firmwareOld = firmwareDao.findById(tenantId, firmware.getUuidId());
263 257
264 - if (!firmwareOld.getTitle().equals(firmware.getTitle())) {  
265 - throw new DataValidationException("Updating firmware title is prohibited!");  
266 - } 258 + BaseFirmwareService.validateUpdate(firmware, firmwareOld);
267 259
268 - if (!firmwareOld.getVersion().equals(firmware.getVersion())) {  
269 - throw new DataValidationException("Updating firmware version is prohibited!"); 260 + if (firmwareOld.getData() != null && !firmwareOld.getData().equals(firmware.getData())) {
  261 + throw new DataValidationException("Updating firmware data is prohibited!");
270 } 262 }
  263 + }
  264 + };
271 265
272 - if (firmwareOld.getFileName() != null && !firmwareOld.getFileName().equals(firmware.getFileName())) {  
273 - throw new DataValidationException("Updating firmware file name is prohibited!");  
274 - } 266 + private static void validateUpdate(FirmwareInfo firmware, FirmwareInfo firmwareOld) {
  267 + if (!firmwareOld.getTitle().equals(firmware.getTitle())) {
  268 + throw new DataValidationException("Updating firmware title is prohibited!");
  269 + }
275 270
276 - if (firmwareOld.getContentType() != null && !firmwareOld.getContentType().equals(firmware.getContentType())) {  
277 - throw new DataValidationException("Updating firmware content type is prohibited!");  
278 - } 271 + if (!firmwareOld.getVersion().equals(firmware.getVersion())) {
  272 + throw new DataValidationException("Updating firmware version is prohibited!");
  273 + }
279 274
280 - if (firmwareOld.getChecksumAlgorithm() != null && !firmwareOld.getChecksumAlgorithm().equals(firmware.getChecksumAlgorithm())) {  
281 - throw new DataValidationException("Updating firmware content type is prohibited!");  
282 - } 275 + if (firmwareOld.getFileName() != null && !firmwareOld.getFileName().equals(firmware.getFileName())) {
  276 + throw new DataValidationException("Updating firmware file name is prohibited!");
  277 + }
283 278
284 - if (firmwareOld.getChecksum() != null && !firmwareOld.getChecksum().equals(firmware.getChecksum())) {  
285 - throw new DataValidationException("Updating firmware content type is prohibited!");  
286 - } 279 + if (firmwareOld.getContentType() != null && !firmwareOld.getContentType().equals(firmware.getContentType())) {
  280 + throw new DataValidationException("Updating firmware content type is prohibited!");
  281 + }
287 282
288 - if (firmwareOld.getData() != null && !firmwareOld.getData().equals(firmware.getData())) {  
289 - throw new DataValidationException("Updating firmware data is prohibited!");  
290 - } 283 + if (firmwareOld.getChecksumAlgorithm() != null && !firmwareOld.getChecksumAlgorithm().equals(firmware.getChecksumAlgorithm())) {
  284 + throw new DataValidationException("Updating firmware content type is prohibited!");
291 } 285 }
292 - }; 286 +
  287 + if (firmwareOld.getChecksum() != null && !firmwareOld.getChecksum().equals(firmware.getChecksum())) {
  288 + throw new DataValidationException("Updating firmware content type is prohibited!");
  289 + }
  290 +
  291 + if (firmwareOld.getDataSize() != null && !firmwareOld.getDataSize().equals(firmware.getDataSize())) {
  292 + throw new DataValidationException("Updating firmware data size is prohibited!");
  293 + }
  294 + }
293 295
294 private PaginatedRemover<TenantId, FirmwareInfo> tenantFirmwareRemover = 296 private PaginatedRemover<TenantId, FirmwareInfo> tenantFirmwareRemover =
295 new PaginatedRemover<>() { 297 new PaginatedRemover<>() {
@@ -483,6 +483,7 @@ public class ModelConstants { @@ -483,6 +483,7 @@ public class ModelConstants {
483 public static final String FIRMWARE_CHECKSUM_ALGORITHM_COLUMN = "checksum_algorithm"; 483 public static final String FIRMWARE_CHECKSUM_ALGORITHM_COLUMN = "checksum_algorithm";
484 public static final String FIRMWARE_CHECKSUM_COLUMN = "checksum"; 484 public static final String FIRMWARE_CHECKSUM_COLUMN = "checksum";
485 public static final String FIRMWARE_DATA_COLUMN = "data"; 485 public static final String FIRMWARE_DATA_COLUMN = "data";
  486 + public static final String FIRMWARE_DATA_SIZE_COLUMN = "data_size";
486 public static final String FIRMWARE_ADDITIONAL_INFO_COLUMN = ADDITIONAL_INFO_PROPERTY; 487 public static final String FIRMWARE_ADDITIONAL_INFO_COLUMN = ADDITIONAL_INFO_PROPERTY;
487 public static final String FIRMWARE_HAS_DATA_PROPERTY = "has_data"; 488 public static final String FIRMWARE_HAS_DATA_PROPERTY = "has_data";
488 489
@@ -38,6 +38,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_CHECKSUM_ @@ -38,6 +38,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_CHECKSUM_
38 import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_CHECKSUM_COLUMN; 38 import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_CHECKSUM_COLUMN;
39 import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_CONTENT_TYPE_COLUMN; 39 import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_CONTENT_TYPE_COLUMN;
40 import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_DATA_COLUMN; 40 import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_DATA_COLUMN;
  41 +import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_DATA_SIZE_COLUMN;
41 import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_FILE_NAME_COLUMN; 42 import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_FILE_NAME_COLUMN;
42 import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_TABLE_NAME; 43 import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_TABLE_NAME;
43 import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_TENANT_ID_COLUMN; 44 import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_TENANT_ID_COLUMN;
@@ -76,6 +77,9 @@ public class FirmwareEntity extends BaseSqlEntity<Firmware> implements SearchTex @@ -76,6 +77,9 @@ public class FirmwareEntity extends BaseSqlEntity<Firmware> implements SearchTex
76 @Column(name = FIRMWARE_DATA_COLUMN, columnDefinition = "BINARY") 77 @Column(name = FIRMWARE_DATA_COLUMN, columnDefinition = "BINARY")
77 private byte[] data; 78 private byte[] data;
78 79
  80 + @Column(name = FIRMWARE_DATA_SIZE_COLUMN)
  81 + private Long dataSize;
  82 +
79 @Type(type = "json") 83 @Type(type = "json")
80 @Column(name = ModelConstants.FIRMWARE_ADDITIONAL_INFO_COLUMN) 84 @Column(name = ModelConstants.FIRMWARE_ADDITIONAL_INFO_COLUMN)
81 private JsonNode additionalInfo; 85 private JsonNode additionalInfo;
@@ -98,6 +102,7 @@ public class FirmwareEntity extends BaseSqlEntity<Firmware> implements SearchTex @@ -98,6 +102,7 @@ public class FirmwareEntity extends BaseSqlEntity<Firmware> implements SearchTex
98 this.checksumAlgorithm = firmware.getChecksumAlgorithm(); 102 this.checksumAlgorithm = firmware.getChecksumAlgorithm();
99 this.checksum = firmware.getChecksum(); 103 this.checksum = firmware.getChecksum();
100 this.data = firmware.getData().array(); 104 this.data = firmware.getData().array();
  105 + this.dataSize = firmware.getDataSize();
101 this.additionalInfo = firmware.getAdditionalInfo(); 106 this.additionalInfo = firmware.getAdditionalInfo();
102 } 107 }
103 108
@@ -122,6 +127,7 @@ public class FirmwareEntity extends BaseSqlEntity<Firmware> implements SearchTex @@ -122,6 +127,7 @@ public class FirmwareEntity extends BaseSqlEntity<Firmware> implements SearchTex
122 firmware.setContentType(contentType); 127 firmware.setContentType(contentType);
123 firmware.setChecksumAlgorithm(checksumAlgorithm); 128 firmware.setChecksumAlgorithm(checksumAlgorithm);
124 firmware.setChecksum(checksum); 129 firmware.setChecksum(checksum);
  130 + firmware.setDataSize(dataSize);
125 if (data != null) { 131 if (data != null) {
126 firmware.setData(ByteBuffer.wrap(data)); 132 firmware.setData(ByteBuffer.wrap(data));
127 firmware.setHasData(true); 133 firmware.setHasData(true);
@@ -35,6 +35,12 @@ import javax.persistence.Table; @@ -35,6 +35,12 @@ import javax.persistence.Table;
35 import javax.persistence.Transient; 35 import javax.persistence.Transient;
36 import java.util.UUID; 36 import java.util.UUID;
37 37
  38 +import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_CHECKSUM_ALGORITHM_COLUMN;
  39 +import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_CHECKSUM_COLUMN;
  40 +import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_CONTENT_TYPE_COLUMN;
  41 +import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_DATA_COLUMN;
  42 +import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_DATA_SIZE_COLUMN;
  43 +import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_FILE_NAME_COLUMN;
38 import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_HAS_DATA_PROPERTY; 44 import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_HAS_DATA_PROPERTY;
39 import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_TABLE_NAME; 45 import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_TABLE_NAME;
40 import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_TENANT_ID_COLUMN; 46 import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_TENANT_ID_COLUMN;
@@ -58,6 +64,21 @@ public class FirmwareInfoEntity extends BaseSqlEntity<FirmwareInfo> implements S @@ -58,6 +64,21 @@ public class FirmwareInfoEntity extends BaseSqlEntity<FirmwareInfo> implements S
58 @Column(name = FIRMWARE_VERSION_COLUMN) 64 @Column(name = FIRMWARE_VERSION_COLUMN)
59 private String version; 65 private String version;
60 66
  67 + @Column(name = FIRMWARE_FILE_NAME_COLUMN)
  68 + private String fileName;
  69 +
  70 + @Column(name = FIRMWARE_CONTENT_TYPE_COLUMN)
  71 + private String contentType;
  72 +
  73 + @Column(name = FIRMWARE_CHECKSUM_ALGORITHM_COLUMN)
  74 + private String checksumAlgorithm;
  75 +
  76 + @Column(name = FIRMWARE_CHECKSUM_COLUMN)
  77 + private String checksum;
  78 +
  79 + @Column(name = FIRMWARE_DATA_SIZE_COLUMN)
  80 + private Long dataSize;
  81 +
61 @Type(type = "json") 82 @Type(type = "json")
62 @Column(name = ModelConstants.FIRMWARE_ADDITIONAL_INFO_COLUMN) 83 @Column(name = ModelConstants.FIRMWARE_ADDITIONAL_INFO_COLUMN)
63 private JsonNode additionalInfo; 84 private JsonNode additionalInfo;
@@ -65,7 +86,6 @@ public class FirmwareInfoEntity extends BaseSqlEntity<FirmwareInfo> implements S @@ -65,7 +86,6 @@ public class FirmwareInfoEntity extends BaseSqlEntity<FirmwareInfo> implements S
65 @Column(name = SEARCH_TEXT_PROPERTY) 86 @Column(name = SEARCH_TEXT_PROPERTY)
66 private String searchText; 87 private String searchText;
67 88
68 -// @Column(name = FIRMWARE_HAS_DATA_PROPERTY, insertable = false, updatable = false)  
69 @Transient 89 @Transient
70 private boolean hasData; 90 private boolean hasData;
71 91
@@ -79,15 +99,27 @@ public class FirmwareInfoEntity extends BaseSqlEntity<FirmwareInfo> implements S @@ -79,15 +99,27 @@ public class FirmwareInfoEntity extends BaseSqlEntity<FirmwareInfo> implements S
79 this.tenantId = firmware.getTenantId().getId(); 99 this.tenantId = firmware.getTenantId().getId();
80 this.title = firmware.getTitle(); 100 this.title = firmware.getTitle();
81 this.version = firmware.getVersion(); 101 this.version = firmware.getVersion();
  102 + this.fileName = firmware.getFileName();
  103 + this.contentType = firmware.getContentType();
  104 + this.checksumAlgorithm = firmware.getChecksumAlgorithm();
  105 + this.checksum = firmware.getChecksum();
  106 + this.dataSize = firmware.getDataSize();
82 this.additionalInfo = firmware.getAdditionalInfo(); 107 this.additionalInfo = firmware.getAdditionalInfo();
83 } 108 }
84 109
85 - public FirmwareInfoEntity(UUID id, long createdTime, UUID tenantId, String title, String version, Object additionalInfo, boolean hasData) { 110 + public FirmwareInfoEntity(UUID id, long createdTime, UUID tenantId, String title, String version,
  111 + String fileName, String contentType, String checksumAlgorithm, String checksum, Long dataSize,
  112 + Object additionalInfo, boolean hasData) {
86 this.id = id; 113 this.id = id;
87 this.createdTime = createdTime; 114 this.createdTime = createdTime;
88 this.tenantId = tenantId; 115 this.tenantId = tenantId;
89 this.title = title; 116 this.title = title;
90 this.version = version; 117 this.version = version;
  118 + this.fileName = fileName;
  119 + this.contentType = contentType;
  120 + this.checksumAlgorithm = checksumAlgorithm;
  121 + this.checksum = checksum;
  122 + this.dataSize = dataSize;
91 this.hasData = hasData; 123 this.hasData = hasData;
92 this.additionalInfo = JacksonUtil.convertValue(additionalInfo, JsonNode.class); 124 this.additionalInfo = JacksonUtil.convertValue(additionalInfo, JsonNode.class);
93 } 125 }
@@ -109,6 +141,11 @@ public class FirmwareInfoEntity extends BaseSqlEntity<FirmwareInfo> implements S @@ -109,6 +141,11 @@ public class FirmwareInfoEntity extends BaseSqlEntity<FirmwareInfo> implements S
109 firmware.setTenantId(new TenantId(tenantId)); 141 firmware.setTenantId(new TenantId(tenantId));
110 firmware.setTitle(title); 142 firmware.setTitle(title);
111 firmware.setVersion(version); 143 firmware.setVersion(version);
  144 + firmware.setFileName(fileName);
  145 + firmware.setContentType(contentType);
  146 + firmware.setChecksumAlgorithm(checksumAlgorithm);
  147 + firmware.setChecksum(checksum);
  148 + firmware.setDataSize(dataSize);
112 firmware.setAdditionalInfo(additionalInfo); 149 firmware.setAdditionalInfo(additionalInfo);
113 firmware.setHasData(hasData); 150 firmware.setHasData(hasData);
114 return firmware; 151 return firmware;
@@ -25,14 +25,14 @@ import org.thingsboard.server.dao.model.sql.FirmwareInfoEntity; @@ -25,14 +25,14 @@ import org.thingsboard.server.dao.model.sql.FirmwareInfoEntity;
25 import java.util.UUID; 25 import java.util.UUID;
26 26
27 public interface FirmwareInfoRepository extends CrudRepository<FirmwareInfoEntity, UUID> { 27 public interface FirmwareInfoRepository extends CrudRepository<FirmwareInfoEntity, UUID> {
28 - @Query("SELECT new FirmwareInfoEntity(f.id, f.createdTime, f.tenantId, f.title, f.version, f.additionalInfo, f.data IS NOT NULL) FROM FirmwareEntity f WHERE " + 28 + @Query("SELECT new FirmwareInfoEntity(f.id, f.createdTime, f.tenantId, f.title, f.version, f.fileName, f.contentType, f.checksumAlgorithm, f.checksum, f.dataSize, f.additionalInfo, f.data IS NOT NULL) FROM FirmwareEntity f WHERE " +
29 "f.tenantId = :tenantId " + 29 "f.tenantId = :tenantId " +
30 "AND LOWER(f.searchText) LIKE LOWER(CONCAT(:searchText, '%'))") 30 "AND LOWER(f.searchText) LIKE LOWER(CONCAT(:searchText, '%'))")
31 Page<FirmwareInfoEntity> findAllByTenantId(@Param("tenantId") UUID tenantId, 31 Page<FirmwareInfoEntity> findAllByTenantId(@Param("tenantId") UUID tenantId,
32 @Param("searchText") String searchText, 32 @Param("searchText") String searchText,
33 Pageable pageable); 33 Pageable pageable);
34 34
35 - @Query("SELECT new FirmwareInfoEntity(f.id, f.createdTime, f.tenantId, f.title, f.version, f.additionalInfo, f.data IS NOT NULL) FROM FirmwareEntity f WHERE " + 35 + @Query("SELECT new FirmwareInfoEntity(f.id, f.createdTime, f.tenantId, f.title, f.version, f.fileName, f.contentType, f.checksumAlgorithm, f.checksum, f.dataSize, f.additionalInfo, f.data IS NOT NULL) FROM FirmwareEntity f WHERE " +
36 "f.tenantId = :tenantId " + 36 "f.tenantId = :tenantId " +
37 "AND ((f.data IS NOT NULL AND :hasData = true) OR (f.data IS NULL AND :hasData = false ))" + 37 "AND ((f.data IS NOT NULL AND :hasData = true) OR (f.data IS NULL AND :hasData = false ))" +
38 "AND LOWER(f.searchText) LIKE LOWER(CONCAT(:searchText, '%'))") 38 "AND LOWER(f.searchText) LIKE LOWER(CONCAT(:searchText, '%'))")
@@ -41,6 +41,6 @@ public interface FirmwareInfoRepository extends CrudRepository<FirmwareInfoEntit @@ -41,6 +41,6 @@ public interface FirmwareInfoRepository extends CrudRepository<FirmwareInfoEntit
41 @Param("searchText") String searchText, 41 @Param("searchText") String searchText,
42 Pageable pageable); 42 Pageable pageable);
43 43
44 - @Query("SELECT new FirmwareInfoEntity(f.id, f.createdTime, f.tenantId, f.title, f.version, f.additionalInfo, f.data IS NOT NULL) FROM FirmwareEntity f WHERE f.id = :id") 44 + @Query("SELECT new FirmwareInfoEntity(f.id, f.createdTime, f.tenantId, f.title, f.version, f.fileName, f.contentType, f.checksumAlgorithm, f.checksum, f.dataSize, f.additionalInfo, f.data IS NOT NULL) FROM FirmwareEntity f WHERE f.id = :id")
45 FirmwareInfoEntity findFirmwareInfoById(@Param("id") UUID id); 45 FirmwareInfoEntity findFirmwareInfoById(@Param("id") UUID id);
46 } 46 }
@@ -169,6 +169,7 @@ CREATE TABLE IF NOT EXISTS firmware ( @@ -169,6 +169,7 @@ CREATE TABLE IF NOT EXISTS firmware (
169 checksum_algorithm varchar(32), 169 checksum_algorithm varchar(32),
170 checksum varchar(1020), 170 checksum varchar(1020),
171 data binary, 171 data binary,
  172 + data_size bigint,
172 additional_info varchar, 173 additional_info varchar,
173 search_text varchar(255), 174 search_text varchar(255),
174 CONSTRAINT firmware_tenant_title_version_unq_key UNIQUE (tenant_id, title, version) 175 CONSTRAINT firmware_tenant_title_version_unq_key UNIQUE (tenant_id, title, version)
@@ -187,6 +187,7 @@ CREATE TABLE IF NOT EXISTS firmware ( @@ -187,6 +187,7 @@ CREATE TABLE IF NOT EXISTS firmware (
187 checksum_algorithm varchar(32), 187 checksum_algorithm varchar(32),
188 checksum varchar(1020), 188 checksum varchar(1020),
189 data bytea, 189 data bytea,
  190 + data_size bigint,
190 additional_info varchar, 191 additional_info varchar,
191 search_text varchar(255), 192 search_text varchar(255),
192 CONSTRAINT firmware_tenant_title_version_unq_key UNIQUE (tenant_id, title, version) 193 CONSTRAINT firmware_tenant_title_version_unq_key UNIQUE (tenant_id, title, version)
@@ -28,6 +28,7 @@ import java.util.Arrays; @@ -28,6 +28,7 @@ import java.util.Arrays;
28 "org.thingsboard.server.dao.service.attributes.sql.*SqlTest", 28 "org.thingsboard.server.dao.service.attributes.sql.*SqlTest",
29 "org.thingsboard.server.dao.service.event.sql.*SqlTest", 29 "org.thingsboard.server.dao.service.event.sql.*SqlTest",
30 "org.thingsboard.server.dao.service.timeseries.sql.*SqlTest" 30 "org.thingsboard.server.dao.service.timeseries.sql.*SqlTest"
  31 +
31 }) 32 })
32 public class SqlDaoServiceTestSuite { 33 public class SqlDaoServiceTestSuite {
33 34
@@ -122,6 +122,7 @@ public abstract class BaseFirmwareServiceTest extends AbstractServiceTest { @@ -122,6 +122,7 @@ public abstract class BaseFirmwareServiceTest extends AbstractServiceTest {
122 122
123 firmwareService.saveFirmware(firmware); 123 firmwareService.saveFirmware(firmware);
124 124
  125 + savedFirmwareInfo = firmwareService.findFirmwareInfoById(tenantId, savedFirmwareInfo.getId());
125 savedFirmwareInfo.setAdditionalInfo(JacksonUtil.newObjectNode()); 126 savedFirmwareInfo.setAdditionalInfo(JacksonUtil.newObjectNode());
126 firmwareService.saveFirmwareInfo(savedFirmwareInfo); 127 firmwareService.saveFirmwareInfo(savedFirmwareInfo);
127 128
@@ -421,6 +422,11 @@ public abstract class BaseFirmwareServiceTest extends AbstractServiceTest { @@ -421,6 +422,11 @@ public abstract class BaseFirmwareServiceTest extends AbstractServiceTest {
421 firmwareInfo.setTenantId(tenantId); 422 firmwareInfo.setTenantId(tenantId);
422 firmwareInfo.setTitle(TITLE); 423 firmwareInfo.setTitle(TITLE);
423 firmwareInfo.setVersion(VERSION + i); 424 firmwareInfo.setVersion(VERSION + i);
  425 + firmwareInfo.setFileName(FILE_NAME);
  426 + firmwareInfo.setContentType(CONTENT_TYPE);
  427 + firmwareInfo.setChecksumAlgorithm(CHECKSUM_ALGORITHM);
  428 + firmwareInfo.setChecksum(CHECKSUM);
  429 + firmwareInfo.setDataSize((long) DATA.array().length);
424 firmwares.add(firmwareService.saveFirmwareInfo(firmwareInfo)); 430 firmwares.add(firmwareService.saveFirmwareInfo(firmwareInfo));
425 } 431 }
426 432
@@ -451,6 +457,7 @@ public abstract class BaseFirmwareServiceTest extends AbstractServiceTest { @@ -451,6 +457,7 @@ public abstract class BaseFirmwareServiceTest extends AbstractServiceTest {
451 firmware.setChecksumAlgorithm(CHECKSUM_ALGORITHM); 457 firmware.setChecksumAlgorithm(CHECKSUM_ALGORITHM);
452 firmware.setChecksum(CHECKSUM); 458 firmware.setChecksum(CHECKSUM);
453 firmware.setData(DATA); 459 firmware.setData(DATA);
  460 + firmware.setDataSize((long) DATA.array().length);
454 firmwareService.saveFirmware(firmware); 461 firmwareService.saveFirmware(firmware);
455 f.setHasData(true); 462 f.setHasData(true);
456 }); 463 });