Commit 0aa16d28a4ce4106fc9b612c99bfec2264e2d569

Authored by nickAS21
Committed by GitHub
2 parents 712bab43 9272611a

Merge pull request #4339 from thingsboard/lwm2m_add_resourses

Lwm2m add resourses
@@ -30,6 +30,7 @@ import org.springframework.web.bind.annotation.ResponseBody; @@ -30,6 +30,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
30 import org.springframework.web.bind.annotation.RestController; 30 import org.springframework.web.bind.annotation.RestController;
31 import org.thingsboard.server.common.data.TbResource; 31 import org.thingsboard.server.common.data.TbResource;
32 import org.thingsboard.server.common.data.TbResourceInfo; 32 import org.thingsboard.server.common.data.TbResourceInfo;
  33 +import org.thingsboard.server.common.data.exception.ThingsboardErrorCode;
33 import org.thingsboard.server.common.data.exception.ThingsboardException; 34 import org.thingsboard.server.common.data.exception.ThingsboardException;
34 import org.thingsboard.server.common.data.id.TbResourceId; 35 import org.thingsboard.server.common.data.id.TbResourceId;
35 import org.thingsboard.server.common.data.lwm2m.LwM2mObject; 36 import org.thingsboard.server.common.data.lwm2m.LwM2mObject;
@@ -41,8 +42,10 @@ import org.thingsboard.server.queue.util.TbCoreComponent; @@ -41,8 +42,10 @@ import org.thingsboard.server.queue.util.TbCoreComponent;
41 import org.thingsboard.server.service.security.permission.Operation; 42 import org.thingsboard.server.service.security.permission.Operation;
42 import org.thingsboard.server.service.security.permission.Resource; 43 import org.thingsboard.server.service.security.permission.Resource;
43 44
  45 +import java.util.ArrayList;
44 import java.util.Base64; 46 import java.util.Base64;
45 import java.util.List; 47 import java.util.List;
  48 +import java.util.StringJoiner;
46 49
47 @Slf4j 50 @Slf4j
48 @RestController 51 @RestController
@@ -108,13 +111,24 @@ public class TbResourceController extends BaseController { @@ -108,13 +111,24 @@ public class TbResourceController extends BaseController {
108 @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") 111 @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
109 @RequestMapping(value = "/resource", method = RequestMethod.POST) 112 @RequestMapping(value = "/resource", method = RequestMethod.POST)
110 @ResponseBody 113 @ResponseBody
111 - public TbResource saveResource(@RequestBody TbResource resource) throws ThingsboardException { 114 + public List<TbResource> saveResources(@RequestBody List<TbResource> resources) throws ThingsboardException {
112 try { 115 try {
113 - resource.setTenantId(getTenantId());  
114 - checkEntity(resource.getId(), resource, Resource.TB_RESOURCE);  
115 - TbResource savedResource = checkNotNull(resourceService.saveResource(resource));  
116 - tbClusterService.onResourceChange(savedResource, null);  
117 - return savedResource; 116 + List<TbResource> addResources = new ArrayList<>();
  117 + StringJoiner noSaveResources = new StringJoiner("; ");
  118 + resources.forEach(resource -> {
  119 + try {
  120 + resource.setTenantId(getTenantId());
  121 + checkEntity(resource.getId(), resource, Resource.TB_RESOURCE);
  122 + addResources.add(addResource(resource));
  123 + } catch (Exception e) {
  124 + noSaveResources.add(resource.getFileName());
  125 + log.warn("Fail save resource: [{}]", resource.getFileName(), e);
  126 + }
  127 + });
  128 + if (noSaveResources.length() > 0) {
  129 + throw new ThingsboardException(String.format("Fail save resource: %s", noSaveResources.toString()), ThingsboardErrorCode.INVALID_ARGUMENTS);
  130 + }
  131 + return addResources;
118 } catch (Exception e) { 132 } catch (Exception e) {
119 throw handleException(e); 133 throw handleException(e);
120 } 134 }
@@ -183,4 +197,11 @@ public class TbResourceController extends BaseController { @@ -183,4 +197,11 @@ public class TbResourceController extends BaseController {
183 throw handleException(e); 197 throw handleException(e);
184 } 198 }
185 } 199 }
186 -} 200 +
  201 + private TbResource addResource(TbResource resource) throws Exception {
  202 + checkEntity(resource.getId(), resource, Resource.TB_RESOURCE);
  203 + TbResource savedResource = checkNotNull(resourceService.saveResource(resource));
  204 + tbClusterService.onResourceChange(savedResource, null);
  205 + return savedResource;
  206 + }
  207 +}
@@ -596,8 +596,7 @@ transport: @@ -596,8 +596,7 @@ transport:
596 timeout: "${LWM2M_TIMEOUT:120000}" 596 timeout: "${LWM2M_TIMEOUT:120000}"
597 recommended_ciphers: "${LWM2M_RECOMMENDED_CIPHERS:false}" 597 recommended_ciphers: "${LWM2M_RECOMMENDED_CIPHERS:false}"
598 recommended_supported_groups: "${LWM2M_RECOMMENDED_SUPPORTED_GROUPS:true}" 598 recommended_supported_groups: "${LWM2M_RECOMMENDED_SUPPORTED_GROUPS:true}"
599 - request_pool_size: "${LWM2M_REQUEST_POOL_SIZE:100}"  
600 - request_error_pool_size: "${LWM2M_REQUEST_ERROR_POOL_SIZE:10}" 599 + response_pool_size: "${LWM2M_RESPONSE_POOL_SIZE:100}"
601 registered_pool_size: "${LWM2M_REGISTERED_POOL_SIZE:10}" 600 registered_pool_size: "${LWM2M_REGISTERED_POOL_SIZE:10}"
602 update_registered_pool_size: "${LWM2M_UPDATE_REGISTERED_POOL_SIZE:10}" 601 update_registered_pool_size: "${LWM2M_UPDATE_REGISTERED_POOL_SIZE:10}"
603 un_registered_pool_size: "${LWM2M_UN_REGISTERED_POOL_SIZE:10}" 602 un_registered_pool_size: "${LWM2M_UN_REGISTERED_POOL_SIZE:10}"
@@ -606,8 +605,7 @@ transport: @@ -606,8 +605,7 @@ transport:
606 # To get helps about files format and how to generate it, see: https://github.com/eclipse/leshan/wiki/Credential-files-format 605 # To get helps about files format and how to generate it, see: https://github.com/eclipse/leshan/wiki/Credential-files-format
607 # Create new X509 Certificates: common/transport/lwm2m/src/main/resources/credentials/shell/lwM2M_credentials.sh 606 # Create new X509 Certificates: common/transport/lwm2m/src/main/resources/credentials/shell/lwM2M_credentials.sh
608 key_store_type: "${LWM2M_KEYSTORE_TYPE:JKS}" 607 key_store_type: "${LWM2M_KEYSTORE_TYPE:JKS}"
609 - # key_store_type: "${LWM2M_KEYSTORE_TYPE:PKCS12}"  
610 -# key_store_path_file: "${KEY_STORE_PATH_FILE:/common/transport/lwm2m/src/main/resources/credentials/serverKeyStore.jks" 608 + # key_store_path_file: "${KEY_STORE_PATH_FILE:/common/transport/lwm2m/src/main/resources/credentials/serverKeyStore.jks"
611 key_store_path_file: "${KEY_STORE_PATH_FILE:}" 609 key_store_path_file: "${KEY_STORE_PATH_FILE:}"
612 key_store_password: "${LWM2M_KEYSTORE_PASSWORD_SERVER:server_ks_password}" 610 key_store_password: "${LWM2M_KEYSTORE_PASSWORD_SERVER:server_ks_password}"
613 root_alias: "${LWM2M_SERVER_ROOT_CA:rootca}" 611 root_alias: "${LWM2M_SERVER_ROOT_CA:rootca}"
@@ -626,24 +624,26 @@ transport: @@ -626,24 +624,26 @@ transport:
626 # - Elliptic Curve parameters : [secp256r1 [NIST P-256, X9.62 prime256v1] (1.2.840.10045.3.1.7)] 624 # - Elliptic Curve parameters : [secp256r1 [NIST P-256, X9.62 prime256v1] (1.2.840.10045.3.1.7)]
627 public_x: "${LWM2M_SERVER_PUBLIC_X:05064b9e6762dd8d8b8a52355d7b4d8b9a3d64e6d2ee277d76c248861353f358}" 625 public_x: "${LWM2M_SERVER_PUBLIC_X:05064b9e6762dd8d8b8a52355d7b4d8b9a3d64e6d2ee277d76c248861353f358}"
628 public_y: "${LWM2M_SERVER_PUBLIC_Y:5eeb1838e4f9e37b31fa347aef5ce3431eb54e0a2506910c5e0298817445721b}" 626 public_y: "${LWM2M_SERVER_PUBLIC_Y:5eeb1838e4f9e37b31fa347aef5ce3431eb54e0a2506910c5e0298817445721b}"
629 - private_encoded: "${LWM2M_SERVER_PRIVATE_ENCODED:308193020100301306072a8648ce3d020106082a8648ce3d030107047930770201010420dc774b309e547ceb48fee547e104ce201a9c48c449dc5414cd04e7f5cf05f67ba00a06082a8648ce3d030107a1440342000405064b9e6762dd8d8b8a52355d7b4d8b9a3d64e6d2ee277d76c248861353f3585eeb1838e4f9e37b31fa347aef5ce3431eb54e0a2506910c5e0298817445721b}" # Only Certificate_x509: 627 + private_encoded: "${LWM2M_SERVER_PRIVATE_ENCODED:308193020100301306072a8648ce3d020106082a8648ce3d030107047930770201010420dc774b309e547ceb48fee547e104ce201a9c48c449dc5414cd04e7f5cf05f67ba00a06082a8648ce3d030107a1440342000405064b9e6762dd8d8b8a52355d7b4d8b9a3d64e6d2ee277d76c248861353f3585eeb1838e4f9e37b31fa347aef5ce3431eb54e0a2506910c5e0298817445721b}"
  628 + # Only Certificate_x509:
630 alias: "${LWM2M_KEYSTORE_ALIAS_SERVER:server}" 629 alias: "${LWM2M_KEYSTORE_ALIAS_SERVER:server}"
631 bootstrap: 630 bootstrap:
632 - enable: "${LWM2M_BOOTSTRAP_ENABLED:true}"  
633 - id: "${LWM2M_SERVER_ID:111}" 631 + enable: "${LWM2M_ENABLED_BS:true}"
  632 + id: "${LWM2M_SERVER_ID_BS:111}"
634 bind_address: "${LWM2M_BIND_ADDRESS_BS:0.0.0.0}" 633 bind_address: "${LWM2M_BIND_ADDRESS_BS:0.0.0.0}"
635 bind_port_no_sec: "${LWM2M_BIND_PORT_NO_SEC_BS:5687}" 634 bind_port_no_sec: "${LWM2M_BIND_PORT_NO_SEC_BS:5687}"
636 secure: 635 secure:
637 bind_address_security: "${LWM2M_BIND_ADDRESS_BS:0.0.0.0}" 636 bind_address_security: "${LWM2M_BIND_ADDRESS_BS:0.0.0.0}"
638 - bind_port_security: "${LWM2M_BIND_PORT_SEC_BS:5688}" 637 + bind_port_security: "${LWM2M_BIND_PORT_SECURITY_BS:5688}"
639 # Only for RPK: Public & Private Key. If the keystore file is missing or not working 638 # Only for RPK: Public & Private Key. If the keystore file is missing or not working
640 # - Elliptic Curve parameters : [secp256r1 [NIST P-256, X9.62 prime256v1] (1.2.840.10045.3.1.7)] 639 # - Elliptic Curve parameters : [secp256r1 [NIST P-256, X9.62 prime256v1] (1.2.840.10045.3.1.7)]
641 # - Public Key (Hex): [3059301306072a8648ce3d020106082a8648ce3d030107034200045017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f913fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34] 640 # - Public Key (Hex): [3059301306072a8648ce3d020106082a8648ce3d030107034200045017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f913fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34]
642 # - Private Key (Hex): [308193020100301306072a8648ce3d020106082a8648ce3d0301070479307702010104205ecafd90caa7be45c42e1f3f32571632b8409e6e6249d7124f4ba56fab3c8083a00a06082a8648ce3d030107a144034200045017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f913fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34], 641 # - Private Key (Hex): [308193020100301306072a8648ce3d020106082a8648ce3d0301070479307702010104205ecafd90caa7be45c42e1f3f32571632b8409e6e6249d7124f4ba56fab3c8083a00a06082a8648ce3d030107a144034200045017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f913fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34],
643 public_x: "${LWM2M_SERVER_PUBLIC_X_BS:5017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f91}" 642 public_x: "${LWM2M_SERVER_PUBLIC_X_BS:5017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f91}"
644 public_y: "${LWM2M_SERVER_PUBLIC_Y_BS:3fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34}" 643 public_y: "${LWM2M_SERVER_PUBLIC_Y_BS:3fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34}"
645 - private_encoded: "${LWM2M_SERVER_PRIVATE_ENCODED_BS:308193020100301306072a8648ce3d020106082a8648ce3d0301070479307702010104205ecafd90caa7be45c42e1f3f32571632b8409e6e6249d7124f4ba56fab3c8083a00a06082a8648ce3d030107a144034200045017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f913fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34}" # Only Certificate_x509:  
646 - alias: "${LWM2M_KEYSTORE_ALIAS_BOOTSTRAP:bootstrap}" 644 + private_encoded: "${LWM2M_SERVER_PRIVATE_ENCODED_BS:308193020100301306072a8648ce3d020106082a8648ce3d0301070479307702010104205ecafd90caa7be45c42e1f3f32571632b8409e6e6249d7124f4ba56fab3c8083a00a06082a8648ce3d030107a144034200045017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f913fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34}"
  645 + # Only Certificate_x509:
  646 + alias: "${LWM2M_KEYSTORE_ALIAS_BS:bootstrap}"
647 # Use redis for Security and Registration stores 647 # Use redis for Security and Registration stores
648 redis.enabled: "${LWM2M_REDIS_ENABLED:false}" 648 redis.enabled: "${LWM2M_REDIS_ENABLED:false}"
649 649
@@ -465,6 +465,10 @@ public abstract class AbstractWebTest { @@ -465,6 +465,10 @@ public abstract class AbstractWebTest {
465 return readResponse(doPost(urlTemplate, content, params).andExpect(status().isOk()), responseType); 465 return readResponse(doPost(urlTemplate, content, params).andExpect(status().isOk()), responseType);
466 } 466 }
467 467
  468 + protected <T, R> R doPostWithTypedResponse(String urlTemplate, T content, TypeReference<R> responseType, ResultMatcher resultMatcher, String... params) throws Exception {
  469 + return readResponse(doPost(urlTemplate, content, params).andExpect(resultMatcher), responseType);
  470 + }
  471 +
468 protected <T> T doPostAsync(String urlTemplate, T content, Class<T> responseClass, ResultMatcher resultMatcher, String... params) throws Exception { 472 protected <T> T doPostAsync(String urlTemplate, T content, Class<T> responseClass, ResultMatcher resultMatcher, String... params) throws Exception {
469 return readResponse(doPostAsync(urlTemplate, content, DEFAULT_TIMEOUT, params).andExpect(resultMatcher), responseClass); 473 return readResponse(doPostAsync(urlTemplate, content, DEFAULT_TIMEOUT, params).andExpect(resultMatcher), responseClass);
470 } 474 }
@@ -32,6 +32,7 @@ import org.thingsboard.server.common.data.security.Authority; @@ -32,6 +32,7 @@ import org.thingsboard.server.common.data.security.Authority;
32 import java.util.ArrayList; 32 import java.util.ArrayList;
33 import java.util.Collections; 33 import java.util.Collections;
34 import java.util.List; 34 import java.util.List;
  35 +import java.util.stream.Collectors;
35 36
36 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; 37 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
37 38
@@ -79,7 +80,7 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes @@ -79,7 +80,7 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes
79 resource.setFileName(DEFAULT_FILE_NAME); 80 resource.setFileName(DEFAULT_FILE_NAME);
80 resource.setData("Test Data"); 81 resource.setData("Test Data");
81 82
82 - TbResource savedResource = doPost("/api/resource", resource, TbResource.class); 83 + TbResource savedResource = save(resource);
83 84
84 Assert.assertNotNull(savedResource); 85 Assert.assertNotNull(savedResource);
85 Assert.assertNotNull(savedResource.getId()); 86 Assert.assertNotNull(savedResource.getId());
@@ -92,7 +93,7 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes @@ -92,7 +93,7 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes
92 93
93 savedResource.setTitle("My new resource"); 94 savedResource.setTitle("My new resource");
94 95
95 - doPost("/api/resource", savedResource, TbResource.class); 96 + save(savedResource);
96 97
97 TbResource foundResource = doGet("/api/resource/" + savedResource.getId().getId().toString(), TbResource.class); 98 TbResource foundResource = doGet("/api/resource/" + savedResource.getId().getId().toString(), TbResource.class);
98 Assert.assertEquals(foundResource.getTitle(), savedResource.getTitle()); 99 Assert.assertEquals(foundResource.getTitle(), savedResource.getTitle());
@@ -106,10 +107,10 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes @@ -106,10 +107,10 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes
106 resource.setFileName(DEFAULT_FILE_NAME); 107 resource.setFileName(DEFAULT_FILE_NAME);
107 resource.setData("Test Data"); 108 resource.setData("Test Data");
108 109
109 - TbResource savedResource = doPost("/api/resource", resource, TbResource.class); 110 + TbResource savedResource = save(resource);
110 111
111 loginDifferentTenant(); 112 loginDifferentTenant();
112 - doPost("/api/resource", savedResource, TbResource.class, status().isForbidden()); 113 + doPostWithTypedResponse("/api/resource", Collections.singletonList(savedResource), new TypeReference<>(){}, status().isBadRequest());
113 deleteDifferentTenant(); 114 deleteDifferentTenant();
114 } 115 }
115 116
@@ -121,7 +122,7 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes @@ -121,7 +122,7 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes
121 resource.setFileName(DEFAULT_FILE_NAME); 122 resource.setFileName(DEFAULT_FILE_NAME);
122 resource.setData("Test Data"); 123 resource.setData("Test Data");
123 124
124 - TbResource savedResource = doPost("/api/resource", resource, TbResource.class); 125 + TbResource savedResource = save(resource);
125 126
126 TbResource foundResource = doGet("/api/resource/" + savedResource.getId().getId().toString(), TbResource.class); 127 TbResource foundResource = doGet("/api/resource/" + savedResource.getId().getId().toString(), TbResource.class);
127 Assert.assertNotNull(foundResource); 128 Assert.assertNotNull(foundResource);
@@ -136,7 +137,7 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes @@ -136,7 +137,7 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes
136 resource.setFileName(DEFAULT_FILE_NAME); 137 resource.setFileName(DEFAULT_FILE_NAME);
137 resource.setData("Test Data"); 138 resource.setData("Test Data");
138 139
139 - TbResource savedResource = doPost("/api/resource", resource, TbResource.class); 140 + TbResource savedResource = save(resource);
140 141
141 doDelete("/api/resource/" + savedResource.getId().getId().toString()) 142 doDelete("/api/resource/" + savedResource.getId().getId().toString())
142 .andExpect(status().isOk()); 143 .andExpect(status().isOk());
@@ -147,15 +148,18 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes @@ -147,15 +148,18 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes
147 148
148 @Test 149 @Test
149 public void testFindTenantTbResources() throws Exception { 150 public void testFindTenantTbResources() throws Exception {
150 - List<TbResourceInfo> resources = new ArrayList<>(); 151 + List<TbResource> resourcesToSave = new ArrayList<>();
151 for (int i = 0; i < 173; i++) { 152 for (int i = 0; i < 173; i++) {
152 TbResource resource = new TbResource(); 153 TbResource resource = new TbResource();
153 resource.setTitle("Resource" + i); 154 resource.setTitle("Resource" + i);
154 resource.setResourceType(ResourceType.JKS); 155 resource.setResourceType(ResourceType.JKS);
155 resource.setFileName(i + DEFAULT_FILE_NAME); 156 resource.setFileName(i + DEFAULT_FILE_NAME);
156 resource.setData("Test Data"); 157 resource.setData("Test Data");
157 - resources.add(new TbResourceInfo(doPost("/api/resource", resource, TbResource.class))); 158 + resourcesToSave.add(resource);
158 } 159 }
  160 +
  161 + List<TbResourceInfo> resources =save(resourcesToSave).stream().map(TbResourceInfo::new).collect(Collectors.toList());
  162 +
159 List<TbResourceInfo> loadedResources = new ArrayList<>(); 163 List<TbResourceInfo> loadedResources = new ArrayList<>();
160 PageLink pageLink = new PageLink(24); 164 PageLink pageLink = new PageLink(24);
161 PageData<TbResourceInfo> pageData; 165 PageData<TbResourceInfo> pageData;
@@ -186,7 +190,7 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes @@ -186,7 +190,7 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes
186 resource.setResourceType(ResourceType.JKS); 190 resource.setResourceType(ResourceType.JKS);
187 resource.setFileName(i + DEFAULT_FILE_NAME); 191 resource.setFileName(i + DEFAULT_FILE_NAME);
188 resource.setData("Test Data"); 192 resource.setData("Test Data");
189 - resources.add(new TbResourceInfo(doPost("/api/resource", resource, TbResource.class))); 193 + resources.add(new TbResourceInfo(save(resource)));
190 } 194 }
191 List<TbResourceInfo> loadedResources = new ArrayList<>(); 195 List<TbResourceInfo> loadedResources = new ArrayList<>();
192 PageLink pageLink = new PageLink(24); 196 PageLink pageLink = new PageLink(24);
@@ -236,7 +240,7 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes @@ -236,7 +240,7 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes
236 resource.setResourceType(ResourceType.JKS); 240 resource.setResourceType(ResourceType.JKS);
237 resource.setFileName(i + DEFAULT_FILE_NAME); 241 resource.setFileName(i + DEFAULT_FILE_NAME);
238 resource.setData("Test Data"); 242 resource.setData("Test Data");
239 - expectedResources.add(new TbResourceInfo(doPost("/api/resource", resource, TbResource.class))); 243 + expectedResources.add(new TbResourceInfo(save(resource)));
240 } 244 }
241 245
242 loginSysAdmin(); 246 loginSysAdmin();
@@ -247,7 +251,7 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes @@ -247,7 +251,7 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes
247 resource.setResourceType(ResourceType.JKS); 251 resource.setResourceType(ResourceType.JKS);
248 resource.setFileName(i + DEFAULT_FILE_NAME); 252 resource.setFileName(i + DEFAULT_FILE_NAME);
249 resource.setData("Test Data"); 253 resource.setData("Test Data");
250 - TbResourceInfo savedResource = new TbResourceInfo(doPost("/api/resource", resource, TbResource.class)); 254 + TbResourceInfo savedResource = new TbResourceInfo(save(resource));
251 systemResources.add(savedResource); 255 systemResources.add(savedResource);
252 if (i >= 73) { 256 if (i >= 73) {
253 expectedResources.add(savedResource); 257 expectedResources.add(savedResource);
@@ -281,4 +285,12 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes @@ -281,4 +285,12 @@ public abstract class BaseTbResourceControllerTest extends AbstractControllerTes
281 .andExpect(status().isOk()); 285 .andExpect(status().isOk());
282 } 286 }
283 } 287 }
  288 +
  289 + private TbResource save(TbResource tbResource) throws Exception {
  290 + return save(Collections.singletonList(tbResource)).get(0);
  291 + }
  292 +
  293 + private List<TbResource> save(List<TbResource> tbResources) throws Exception {
  294 + return doPostWithTypedResponse("/api/resource", tbResources, new TypeReference<>(){});
  295 + }
284 } 296 }
@@ -101,7 +101,7 @@ public class LwM2mTransportRequest { @@ -101,7 +101,7 @@ public class LwM2mTransportRequest {
101 @PostConstruct 101 @PostConstruct
102 public void init() { 102 public void init() {
103 this.converter = LwM2mValueConverterImpl.getInstance(); 103 this.converter = LwM2mValueConverterImpl.getInstance();
104 - executorResponse = Executors.newFixedThreadPool(this.lwM2mTransportContextServer.getLwM2MTransportConfigServer().getRequestPoolSize(), 104 + executorResponse = Executors.newFixedThreadPool(this.lwM2mTransportContextServer.getLwM2MTransportConfigServer().getResponsePoolSize(),
105 new NamedThreadFactory(String.format("LwM2M %s channel response", RESPONSE_CHANNEL))); 105 new NamedThreadFactory(String.format("LwM2M %s channel response", RESPONSE_CHANNEL)));
106 } 106 }
107 107
@@ -92,12 +92,8 @@ public class LwM2MTransportConfigServer { @@ -92,12 +92,8 @@ public class LwM2MTransportConfigServer {
92 private boolean recommendedSupportedGroups; 92 private boolean recommendedSupportedGroups;
93 93
94 @Getter 94 @Getter
95 - @Value("${transport.lwm2m.request_pool_size:}")  
96 - private int requestPoolSize;  
97 -  
98 - @Getter  
99 - @Value("${transport.lwm2m.request_error_pool_size:}")  
100 - private int requestErrorPoolSize; 95 + @Value("${transport.lwm2m.response_pool_size:}")
  96 + private int responsePoolSize;
101 97
102 @Getter 98 @Getter
103 @Value("${transport.lwm2m.registered_pool_size:}") 99 @Value("${transport.lwm2m.registered_pool_size:}")
@@ -129,8 +129,7 @@ transport: @@ -129,8 +129,7 @@ transport:
129 timeout: "${LWM2M_TIMEOUT:120000}" 129 timeout: "${LWM2M_TIMEOUT:120000}"
130 recommended_ciphers: "${LWM2M_RECOMMENDED_CIPHERS:false}" 130 recommended_ciphers: "${LWM2M_RECOMMENDED_CIPHERS:false}"
131 recommended_supported_groups: "${LWM2M_RECOMMENDED_SUPPORTED_GROUPS:true}" 131 recommended_supported_groups: "${LWM2M_RECOMMENDED_SUPPORTED_GROUPS:true}"
132 - request_pool_size: "${LWM2M_REQUEST_POOL_SIZE:100}"  
133 - request_error_pool_size: "${LWM2M_REQUEST_ERROR_POOL_SIZE:10}" 132 + response_pool_size: "${LWM2M_RESPONSE_POOL_SIZE:100}"
134 registered_pool_size: "${LWM2M_REGISTERED_POOL_SIZE:10}" 133 registered_pool_size: "${LWM2M_REGISTERED_POOL_SIZE:10}"
135 update_registered_pool_size: "${LWM2M_UPDATE_REGISTERED_POOL_SIZE:10}" 134 update_registered_pool_size: "${LWM2M_UPDATE_REGISTERED_POOL_SIZE:10}"
136 un_registered_pool_size: "${LWM2M_UN_REGISTERED_POOL_SIZE:10}" 135 un_registered_pool_size: "${LWM2M_UN_REGISTERED_POOL_SIZE:10}"
@@ -139,8 +138,7 @@ transport: @@ -139,8 +138,7 @@ transport:
139 # To get helps about files format and how to generate it, see: https://github.com/eclipse/leshan/wiki/Credential-files-format 138 # To get helps about files format and how to generate it, see: https://github.com/eclipse/leshan/wiki/Credential-files-format
140 # Create new X509 Certificates: common/transport/lwm2m/src/main/resources/credentials/shell/lwM2M_credentials.sh 139 # Create new X509 Certificates: common/transport/lwm2m/src/main/resources/credentials/shell/lwM2M_credentials.sh
141 key_store_type: "${LWM2M_KEYSTORE_TYPE:JKS}" 140 key_store_type: "${LWM2M_KEYSTORE_TYPE:JKS}"
142 - # key_store_type: "${LWM2M_KEYSTORE_TYPE:PKCS12}"  
143 - # key_store_path_file: "${KEY_STORE_PATH_FILE:/transport/lwm2m/src/main/data/credentials/serverKeyStore.jks}" 141 + # key_store_path_file: "${KEY_STORE_PATH_FILE:/transport/lwm2m/src/main/data/credentials/serverKeyStore.jks}"
144 key_store_path_file: "${KEY_STORE_PATH_FILE:}" 142 key_store_path_file: "${KEY_STORE_PATH_FILE:}"
145 key_store_password: "${LWM2M_KEYSTORE_PASSWORD_SERVER:server_ks_password}" 143 key_store_password: "${LWM2M_KEYSTORE_PASSWORD_SERVER:server_ks_password}"
146 root_alias: "${LWM2M_SERVER_ROOT_CA:rootca}" 144 root_alias: "${LWM2M_SERVER_ROOT_CA:rootca}"
@@ -159,24 +157,26 @@ transport: @@ -159,24 +157,26 @@ transport:
159 # - Elliptic Curve parameters : [secp256r1 [NIST P-256, X9.62 prime256v1] (1.2.840.10045.3.1.7)] 157 # - Elliptic Curve parameters : [secp256r1 [NIST P-256, X9.62 prime256v1] (1.2.840.10045.3.1.7)]
160 public_x: "${LWM2M_SERVER_PUBLIC_X:05064b9e6762dd8d8b8a52355d7b4d8b9a3d64e6d2ee277d76c248861353f358}" 158 public_x: "${LWM2M_SERVER_PUBLIC_X:05064b9e6762dd8d8b8a52355d7b4d8b9a3d64e6d2ee277d76c248861353f358}"
161 public_y: "${LWM2M_SERVER_PUBLIC_Y:5eeb1838e4f9e37b31fa347aef5ce3431eb54e0a2506910c5e0298817445721b}" 159 public_y: "${LWM2M_SERVER_PUBLIC_Y:5eeb1838e4f9e37b31fa347aef5ce3431eb54e0a2506910c5e0298817445721b}"
162 - private_encoded: "${LWM2M_SERVER_PRIVATE_ENCODED:308193020100301306072a8648ce3d020106082a8648ce3d030107047930770201010420dc774b309e547ceb48fee547e104ce201a9c48c449dc5414cd04e7f5cf05f67ba00a06082a8648ce3d030107a1440342000405064b9e6762dd8d8b8a52355d7b4d8b9a3d64e6d2ee277d76c248861353f3585eeb1838e4f9e37b31fa347aef5ce3431eb54e0a2506910c5e0298817445721b}" # Only Certificate_x509: 160 + private_encoded: "${LWM2M_SERVER_PRIVATE_ENCODED:308193020100301306072a8648ce3d020106082a8648ce3d030107047930770201010420dc774b309e547ceb48fee547e104ce201a9c48c449dc5414cd04e7f5cf05f67ba00a06082a8648ce3d030107a1440342000405064b9e6762dd8d8b8a52355d7b4d8b9a3d64e6d2ee277d76c248861353f3585eeb1838e4f9e37b31fa347aef5ce3431eb54e0a2506910c5e0298817445721b}"
  161 + # Only Certificate_x509:
163 alias: "${LWM2M_KEYSTORE_ALIAS_SERVER:server}" 162 alias: "${LWM2M_KEYSTORE_ALIAS_SERVER:server}"
164 bootstrap: 163 bootstrap:
165 - enable: "${LWM2M_BOOTSTRAP_ENABLED:true}"  
166 - id: "${LWM2M_SERVER_ID:111}" 164 + enable: "${LWM2M_ENABLED_BS:true}"
  165 + id: "${LWM2M_SERVER_ID_BS:111}"
167 bind_address: "${LWM2M_BIND_ADDRESS_BS:0.0.0.0}" 166 bind_address: "${LWM2M_BIND_ADDRESS_BS:0.0.0.0}"
168 bind_port_no_sec: "${LWM2M_BIND_PORT_NO_SEC_BS:5687}" 167 bind_port_no_sec: "${LWM2M_BIND_PORT_NO_SEC_BS:5687}"
169 secure: 168 secure:
170 bind_address_security: "${LWM2M_BIND_ADDRESS_BS:0.0.0.0}" 169 bind_address_security: "${LWM2M_BIND_ADDRESS_BS:0.0.0.0}"
171 - bind_port_security: "${LWM2M_BIND_PORT_SEC_BS:5688}" 170 + bind_port_security: "${LWM2M_BIND_PORT_SECURITY_BS:5688}"
172 # Only for RPK: Public & Private Key. If the keystore file is missing or not working 171 # Only for RPK: Public & Private Key. If the keystore file is missing or not working
173 # - Elliptic Curve parameters : [secp256r1 [NIST P-256, X9.62 prime256v1] (1.2.840.10045.3.1.7)] 172 # - Elliptic Curve parameters : [secp256r1 [NIST P-256, X9.62 prime256v1] (1.2.840.10045.3.1.7)]
174 # - Public Key (Hex): [3059301306072a8648ce3d020106082a8648ce3d030107034200045017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f913fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34] 173 # - Public Key (Hex): [3059301306072a8648ce3d020106082a8648ce3d030107034200045017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f913fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34]
175 # - Private Key (Hex): [308193020100301306072a8648ce3d020106082a8648ce3d0301070479307702010104205ecafd90caa7be45c42e1f3f32571632b8409e6e6249d7124f4ba56fab3c8083a00a06082a8648ce3d030107a144034200045017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f913fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34], 174 # - Private Key (Hex): [308193020100301306072a8648ce3d020106082a8648ce3d0301070479307702010104205ecafd90caa7be45c42e1f3f32571632b8409e6e6249d7124f4ba56fab3c8083a00a06082a8648ce3d030107a144034200045017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f913fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34],
176 public_x: "${LWM2M_SERVER_PUBLIC_X_BS:5017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f91}" 175 public_x: "${LWM2M_SERVER_PUBLIC_X_BS:5017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f91}"
177 public_y: "${LWM2M_SERVER_PUBLIC_Y_BS:3fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34}" 176 public_y: "${LWM2M_SERVER_PUBLIC_Y_BS:3fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34}"
178 - private_encoded: "${LWM2M_SERVER_PRIVATE_ENCODED_BS:308193020100301306072a8648ce3d020106082a8648ce3d0301070479307702010104205ecafd90caa7be45c42e1f3f32571632b8409e6e6249d7124f4ba56fab3c8083a00a06082a8648ce3d030107a144034200045017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f913fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34}" # Only Certificate_x509:  
179 - alias: "${LWM2M_KEYSTORE_ALIAS_BOOTSTRAP:bootstrap}" 177 + private_encoded: "${LWM2M_SERVER_PRIVATE_ENCODED_BS:308193020100301306072a8648ce3d020106082a8648ce3d0301070479307702010104205ecafd90caa7be45c42e1f3f32571632b8409e6e6249d7124f4ba56fab3c8083a00a06082a8648ce3d030107a144034200045017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f913fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34}"
  178 + # Only Certificate_x509:
  179 + alias: "${LWM2M_KEYSTORE_ALIAS_BS:bootstrap}"
180 # Use redis for Security and Registration stores 180 # Use redis for Security and Registration stores
181 redis.enabled: "${LWM2M_REDIS_ENABLED:false}" 181 redis.enabled: "${LWM2M_REDIS_ENABLED:false}"
182 182