Showing
8 changed files
with
23 additions
and
61 deletions
@@ -782,15 +782,15 @@ public class DeviceController extends BaseController { | @@ -782,15 +782,15 @@ public class DeviceController extends BaseController { | ||
782 | } | 782 | } |
783 | 783 | ||
784 | @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") | 784 | @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") |
785 | - @RequestMapping(value = "/devices/count", method = RequestMethod.GET) | 785 | + @RequestMapping(value = "/devices/count/{otaPackageType}", method = RequestMethod.GET) |
786 | @ResponseBody | 786 | @ResponseBody |
787 | - public Long countDevicesByTenantIdAndDeviceProfileIdAndEmptyOtaPackage(@RequestParam(required = false) String otaPackageType, | ||
788 | - @RequestParam(required = false) String deviceProfileId) throws ThingsboardException { | 787 | + public Long countDevicesByTenantIdAndDeviceProfileIdAndEmptyOtaPackage(@PathVariable("otaPackageType") String otaPackageType, |
788 | + @RequestParam String deviceProfileId) throws ThingsboardException { | ||
789 | checkParameter("OtaPackageType", otaPackageType); | 789 | checkParameter("OtaPackageType", otaPackageType); |
790 | checkParameter("DeviceProfileId", deviceProfileId); | 790 | checkParameter("DeviceProfileId", deviceProfileId); |
791 | try { | 791 | try { |
792 | return deviceService.countDevicesByTenantIdAndDeviceProfileIdAndEmptyOtaPackage( | 792 | return deviceService.countDevicesByTenantIdAndDeviceProfileIdAndEmptyOtaPackage( |
793 | - getCurrentUser().getTenantId(), new DeviceProfileId(UUID.fromString(deviceProfileId)), OtaPackageType.valueOf(deviceProfileId)); | 793 | + getCurrentUser().getTenantId(), new DeviceProfileId(UUID.fromString(deviceProfileId)), OtaPackageType.valueOf(otaPackageType)); |
794 | } catch (Exception e) { | 794 | } catch (Exception e) { |
795 | throw handleException(e); | 795 | throw handleException(e); |
796 | } | 796 | } |
@@ -374,6 +374,9 @@ caffeine: | @@ -374,6 +374,9 @@ caffeine: | ||
374 | otaPackages: | 374 | otaPackages: |
375 | timeToLiveInMinutes: 60 | 375 | timeToLiveInMinutes: 60 |
376 | maxSize: 10 | 376 | maxSize: 10 |
377 | + otaPackagesData: | ||
378 | + timeToLiveInMinutes: 60 | ||
379 | + maxSize: 10 | ||
377 | edges: | 380 | edges: |
378 | timeToLiveInMinutes: 1440 | 381 | timeToLiveInMinutes: 1440 |
379 | maxSize: 0 | 382 | maxSize: 0 |
@@ -21,6 +21,7 @@ import org.springframework.cache.CacheManager; | @@ -21,6 +21,7 @@ import org.springframework.cache.CacheManager; | ||
21 | import org.springframework.stereotype.Service; | 21 | import org.springframework.stereotype.Service; |
22 | 22 | ||
23 | import static org.thingsboard.server.common.data.CacheConstants.OTA_PACKAGE_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 | @Service | 26 | @Service |
26 | @ConditionalOnProperty(prefix = "cache", value = "type", havingValue = "caffeine", matchIfMissing = true) | 27 | @ConditionalOnProperty(prefix = "cache", value = "type", havingValue = "caffeine", matchIfMissing = true) |
@@ -36,7 +37,7 @@ public class CaffeineOtaPackageCache implements OtaPackageDataCache { | @@ -36,7 +37,7 @@ public class CaffeineOtaPackageCache implements OtaPackageDataCache { | ||
36 | 37 | ||
37 | @Override | 38 | @Override |
38 | public byte[] get(String key, int chunkSize, int chunk) { | 39 | public byte[] get(String key, int chunkSize, int chunk) { |
39 | - byte[] data = cacheManager.getCache(OTA_PACKAGE_CACHE).get(key, byte[].class); | 40 | + byte[] data = cacheManager.getCache(OTA_PACKAGE_DATA_CACHE).get(key, byte[].class); |
40 | 41 | ||
41 | if (chunkSize < 1) { | 42 | if (chunkSize < 1) { |
42 | return data; | 43 | return data; |
@@ -58,11 +59,11 @@ public class CaffeineOtaPackageCache implements OtaPackageDataCache { | @@ -58,11 +59,11 @@ public class CaffeineOtaPackageCache implements OtaPackageDataCache { | ||
58 | 59 | ||
59 | @Override | 60 | @Override |
60 | public void put(String key, byte[] value) { | 61 | public void put(String key, byte[] value) { |
61 | - cacheManager.getCache(OTA_PACKAGE_CACHE).putIfAbsent(key, value); | 62 | + cacheManager.getCache(OTA_PACKAGE_DATA_CACHE).putIfAbsent(key, value); |
62 | } | 63 | } |
63 | 64 | ||
64 | @Override | 65 | @Override |
65 | public void evict(String key) { | 66 | public void evict(String key) { |
66 | - cacheManager.getCache(OTA_PACKAGE_CACHE).evict(key); | 67 | + cacheManager.getCache(OTA_PACKAGE_DATA_CACHE).evict(key); |
67 | } | 68 | } |
68 | } | 69 | } |
@@ -22,6 +22,7 @@ import org.springframework.data.redis.connection.RedisConnectionFactory; | @@ -22,6 +22,7 @@ import org.springframework.data.redis.connection.RedisConnectionFactory; | ||
22 | import org.springframework.stereotype.Service; | 22 | import org.springframework.stereotype.Service; |
23 | 23 | ||
24 | import static org.thingsboard.server.common.data.CacheConstants.OTA_PACKAGE_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 | @Service | 27 | @Service |
27 | @ConditionalOnProperty(prefix = "cache", value = "type", havingValue = "redis") | 28 | @ConditionalOnProperty(prefix = "cache", value = "type", havingValue = "redis") |
@@ -63,6 +64,6 @@ public class RedisOtaPackageDataCache implements OtaPackageDataCache { | @@ -63,6 +64,6 @@ public class RedisOtaPackageDataCache implements OtaPackageDataCache { | ||
63 | } | 64 | } |
64 | 65 | ||
65 | private byte[] toOtaPackageCacheKey(String key) { | 66 | private byte[] toOtaPackageCacheKey(String key) { |
66 | - return String.format("%s::%s", OTA_PACKAGE_CACHE, key).getBytes(); | 67 | + return String.format("%s::%s", OTA_PACKAGE_DATA_CACHE, key).getBytes(); |
67 | } | 68 | } |
68 | } | 69 | } |
@@ -30,4 +30,5 @@ public class CacheConstants { | @@ -30,4 +30,5 @@ public class CacheConstants { | ||
30 | public static final String ATTRIBUTES_CACHE = "attributes"; | 30 | public static final String ATTRIBUTES_CACHE = "attributes"; |
31 | public static final String TOKEN_OUTDATAGE_TIME_CACHE = "tokensOutdatageTime"; | 31 | public static final String TOKEN_OUTDATAGE_TIME_CACHE = "tokensOutdatageTime"; |
32 | public static final String OTA_PACKAGE_CACHE = "otaPackages"; | 32 | public static final String OTA_PACKAGE_CACHE = "otaPackages"; |
33 | + public static final String OTA_PACKAGE_DATA_CACHE = "otaPackagesData"; | ||
33 | } | 34 | } |
@@ -221,8 +221,6 @@ public class BaseOtaPackageService implements OtaPackageService { | @@ -221,8 +221,6 @@ public class BaseOtaPackageService implements OtaPackageService { | ||
221 | @Override | 221 | @Override |
222 | protected void validateUpdate(TenantId tenantId, OtaPackageInfo otaPackage) { | 222 | protected void validateUpdate(TenantId tenantId, OtaPackageInfo otaPackage) { |
223 | OtaPackageInfo otaPackageOld = otaPackageInfoDao.findById(tenantId, otaPackage.getUuidId()); | 223 | OtaPackageInfo otaPackageOld = otaPackageInfoDao.findById(tenantId, otaPackage.getUuidId()); |
224 | - | ||
225 | - validateUpdateDeviceProfile(otaPackage, otaPackageOld); | ||
226 | BaseOtaPackageService.validateUpdate(otaPackage, otaPackageOld); | 224 | BaseOtaPackageService.validateUpdate(otaPackage, otaPackageOld); |
227 | } | 225 | } |
228 | }; | 226 | }; |
@@ -261,7 +259,6 @@ public class BaseOtaPackageService implements OtaPackageService { | @@ -261,7 +259,6 @@ public class BaseOtaPackageService implements OtaPackageService { | ||
261 | protected void validateUpdate(TenantId tenantId, OtaPackage otaPackage) { | 259 | protected void validateUpdate(TenantId tenantId, OtaPackage otaPackage) { |
262 | OtaPackage otaPackageOld = otaPackageDao.findById(tenantId, otaPackage.getUuidId()); | 260 | OtaPackage otaPackageOld = otaPackageDao.findById(tenantId, otaPackage.getUuidId()); |
263 | 261 | ||
264 | - validateUpdateDeviceProfile(otaPackage, otaPackageOld); | ||
265 | BaseOtaPackageService.validateUpdate(otaPackage, otaPackageOld); | 262 | BaseOtaPackageService.validateUpdate(otaPackage, otaPackageOld); |
266 | 263 | ||
267 | if (otaPackageOld.getData() != null && !otaPackageOld.getData().equals(otaPackage.getData())) { | 264 | if (otaPackageOld.getData() != null && !otaPackageOld.getData().equals(otaPackage.getData())) { |
@@ -270,14 +267,6 @@ public class BaseOtaPackageService implements OtaPackageService { | @@ -270,14 +267,6 @@ public class BaseOtaPackageService implements OtaPackageService { | ||
270 | } | 267 | } |
271 | }; | 268 | }; |
272 | 269 | ||
273 | - private void validateUpdateDeviceProfile(OtaPackageInfo otaPackage, OtaPackageInfo otaPackageOld) { | ||
274 | - if (otaPackageOld.getDeviceProfileId() != null && !otaPackageOld.getDeviceProfileId().equals(otaPackage.getDeviceProfileId())) { | ||
275 | - if (otaPackageInfoDao.isOtaPackageUsed(otaPackageOld.getId(), otaPackage.getType(), otaPackageOld.getDeviceProfileId())) { | ||
276 | - throw new DataValidationException("Can`t update deviceProfileId because otaPackage is already in use!"); | ||
277 | - } | ||
278 | - } | ||
279 | - } | ||
280 | - | ||
281 | private static void validateUpdate(OtaPackageInfo otaPackage, OtaPackageInfo otaPackageOld) { | 270 | private static void validateUpdate(OtaPackageInfo otaPackage, OtaPackageInfo otaPackageOld) { |
282 | if (!otaPackageOld.getType().equals(otaPackage.getType())) { | 271 | if (!otaPackageOld.getType().equals(otaPackage.getType())) { |
283 | throw new DataValidationException("Updating type is prohibited!"); | 272 | throw new DataValidationException("Updating type is prohibited!"); |
@@ -291,6 +280,10 @@ public class BaseOtaPackageService implements OtaPackageService { | @@ -291,6 +280,10 @@ public class BaseOtaPackageService implements OtaPackageService { | ||
291 | throw new DataValidationException("Updating otaPackage version is prohibited!"); | 280 | throw new DataValidationException("Updating otaPackage version is prohibited!"); |
292 | } | 281 | } |
293 | 282 | ||
283 | + if (!otaPackageOld.getDeviceProfileId().equals(otaPackage.getDeviceProfileId())) { | ||
284 | + throw new DataValidationException("Updating otaPackage deviceProfile is prohibited!"); | ||
285 | + } | ||
286 | + | ||
294 | if (otaPackageOld.getFileName() != null && !otaPackageOld.getFileName().equals(otaPackage.getFileName())) { | 287 | if (otaPackageOld.getFileName() != null && !otaPackageOld.getFileName().equals(otaPackage.getFileName())) { |
295 | throw new DataValidationException("Updating otaPackage file name is prohibited!"); | 288 | throw new DataValidationException("Updating otaPackage file name is prohibited!"); |
296 | } | 289 | } |
@@ -408,7 +408,7 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest { | @@ -408,7 +408,7 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest { | ||
408 | } | 408 | } |
409 | 409 | ||
410 | @Test | 410 | @Test |
411 | - public void testUpdateDeviceProfileIdWithReferenceByDevice() { | 411 | + public void testUpdateDeviceProfileId() { |
412 | OtaPackage firmware = new OtaPackage(); | 412 | OtaPackage firmware = new OtaPackage(); |
413 | firmware.setTenantId(tenantId); | 413 | firmware.setTenantId(tenantId); |
414 | firmware.setDeviceProfileId(deviceProfileId); | 414 | firmware.setDeviceProfileId(deviceProfileId); |
@@ -422,20 +422,12 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest { | @@ -422,20 +422,12 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest { | ||
422 | firmware.setData(DATA); | 422 | firmware.setData(DATA); |
423 | OtaPackage savedFirmware = otaPackageService.saveOtaPackage(firmware); | 423 | OtaPackage savedFirmware = otaPackageService.saveOtaPackage(firmware); |
424 | 424 | ||
425 | - Device device = new Device(); | ||
426 | - device.setTenantId(tenantId); | ||
427 | - device.setName("My device"); | ||
428 | - device.setDeviceProfileId(deviceProfileId); | ||
429 | - device.setFirmwareId(savedFirmware.getId()); | ||
430 | - Device savedDevice = deviceService.saveDevice(device); | ||
431 | - | ||
432 | try { | 425 | try { |
433 | thrown.expect(DataValidationException.class); | 426 | thrown.expect(DataValidationException.class); |
434 | - thrown.expectMessage("Can`t update deviceProfileId because otaPackage is already in use!"); | 427 | + thrown.expectMessage("Updating otaPackage deviceProfile is prohibited!"); |
435 | savedFirmware.setDeviceProfileId(null); | 428 | savedFirmware.setDeviceProfileId(null); |
436 | otaPackageService.saveOtaPackage(savedFirmware); | 429 | otaPackageService.saveOtaPackage(savedFirmware); |
437 | } finally { | 430 | } finally { |
438 | - deviceService.deleteDevice(tenantId, savedDevice.getId()); | ||
439 | otaPackageService.deleteOtaPackage(tenantId, savedFirmware.getId()); | 431 | otaPackageService.deleteOtaPackage(tenantId, savedFirmware.getId()); |
440 | } | 432 | } |
441 | } | 433 | } |
@@ -472,38 +464,6 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest { | @@ -472,38 +464,6 @@ public abstract class BaseOtaPackageServiceTest extends AbstractServiceTest { | ||
472 | } | 464 | } |
473 | 465 | ||
474 | @Test | 466 | @Test |
475 | - public void testUpdateDeviceProfileIdWithReferenceByDeviceProfile() { | ||
476 | - DeviceProfile deviceProfile = this.createDeviceProfile(tenantId, "Test Device Profile"); | ||
477 | - DeviceProfile savedDeviceProfile = deviceProfileService.saveDeviceProfile(deviceProfile); | ||
478 | - | ||
479 | - OtaPackage firmware = new OtaPackage(); | ||
480 | - firmware.setTenantId(tenantId); | ||
481 | - firmware.setDeviceProfileId(savedDeviceProfile.getId()); | ||
482 | - firmware.setType(FIRMWARE); | ||
483 | - firmware.setTitle(TITLE); | ||
484 | - firmware.setVersion(VERSION); | ||
485 | - firmware.setFileName(FILE_NAME); | ||
486 | - firmware.setContentType(CONTENT_TYPE); | ||
487 | - firmware.setChecksumAlgorithm(CHECKSUM_ALGORITHM); | ||
488 | - firmware.setChecksum(CHECKSUM); | ||
489 | - firmware.setData(DATA); | ||
490 | - OtaPackage savedFirmware = otaPackageService.saveOtaPackage(firmware); | ||
491 | - | ||
492 | - savedDeviceProfile.setFirmwareId(savedFirmware.getId()); | ||
493 | - deviceProfileService.saveDeviceProfile(savedDeviceProfile); | ||
494 | - | ||
495 | - try { | ||
496 | - thrown.expect(DataValidationException.class); | ||
497 | - thrown.expectMessage("Can`t update deviceProfileId because otaPackage is already in use!"); | ||
498 | - savedFirmware.setDeviceProfileId(null); | ||
499 | - otaPackageService.saveOtaPackage(savedFirmware); | ||
500 | - } finally { | ||
501 | - deviceProfileService.deleteDeviceProfile(tenantId, savedDeviceProfile.getId()); | ||
502 | - otaPackageService.deleteOtaPackage(tenantId, savedFirmware.getId()); | ||
503 | - } | ||
504 | - } | ||
505 | - | ||
506 | - @Test | ||
507 | public void testFindFirmwareById() { | 467 | public void testFindFirmwareById() { |
508 | OtaPackage firmware = new OtaPackage(); | 468 | OtaPackage firmware = new OtaPackage(); |
509 | firmware.setTenantId(tenantId); | 469 | firmware.setTenantId(tenantId); |
@@ -39,6 +39,9 @@ caffeine.specs.deviceProfiles.maxSize=100000 | @@ -39,6 +39,9 @@ caffeine.specs.deviceProfiles.maxSize=100000 | ||
39 | caffeine.specs.otaPackages.timeToLiveInMinutes=1440 | 39 | caffeine.specs.otaPackages.timeToLiveInMinutes=1440 |
40 | caffeine.specs.otaPackages.maxSize=100000 | 40 | caffeine.specs.otaPackages.maxSize=100000 |
41 | 41 | ||
42 | +caffeine.specs.otaPackagesData.timeToLiveInMinutes=1440 | ||
43 | +caffeine.specs.otaPackagesData.maxSize=100000 | ||
44 | + | ||
42 | caffeine.specs.edges.timeToLiveInMinutes=1440 | 45 | caffeine.specs.edges.timeToLiveInMinutes=1440 |
43 | caffeine.specs.edges.maxSize=100000 | 46 | caffeine.specs.edges.maxSize=100000 |
44 | 47 |