Commit 65f4ca58001a3a71fdf7a654b53cd47122f1d44c

Authored by nickAS21
1 parent c78bd55d

Lwm2m: back: add tenantId and repositoryTenant - test

... ... @@ -447,6 +447,7 @@ public class SqlDatabaseUpgradeService implements DatabaseEntitiesUpgradeService
447 447 " );");
448 448
449 449 conn.createStatement().execute("UPDATE tb_schema_settings SET schema_version = 3003000;");
  450 + installScripts.loadSystemLwm2mResources();
450 451 } catch (Exception e) {
451 452 log.error("Failed updating schema!!!", e);
452 453 }
... ...
... ... @@ -33,7 +33,6 @@ import org.thingsboard.server.common.data.page.PageLink;
33 33 import org.thingsboard.server.common.transport.lwm2m.LwM2MTransportConfigBootstrap;
34 34 import org.thingsboard.server.common.transport.lwm2m.LwM2MTransportConfigServer;
35 35 import org.thingsboard.server.dao.service.Validator;
36   -import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
37 36 import org.thingsboard.server.transport.lwm2m.secure.LwM2MSecurityMode;
38 37
39 38 import java.math.BigInteger;
... ... @@ -102,8 +101,8 @@ public class LwM2MModelsRepository {
102 101 */
103 102 private List<LwM2mObject> getLwm2mObjects(Predicate<? super ObjectModel> predicate, String sortProperty, String sortOrder) {
104 103 List<LwM2mObject> lwM2mObjects = new ArrayList<>();
105   - List<ObjectModel> listObjects = (predicate == null) ? this.contextServer.getModelsValue() :
106   - contextServer.getModelsValue().stream()
  104 + List<ObjectModel> listObjects = (predicate == null) ? this.contextServer.getModelsValueCommon() :
  105 + contextServer.getModelsValueCommon().stream()
107 106 .filter(predicate)
108 107 .collect(Collectors.toList());
109 108
... ...
... ... @@ -94,7 +94,7 @@ public class LwM2MTransportBootstrapServerConfiguration {
94 94 builder.setCoapConfig(getCoapConfig(bootstrapPortNoSec, bootstrapSecurePort));
95 95
96 96 /** Define model provider (Create Models )*/
97   - builder.setModel(new StaticModel(contextS.getLwM2MTransportConfigServer().getModelsValue()));
  97 + builder.setModel(new StaticModel(contextS.getLwM2MTransportConfigServer().getModelsValueCommon()));
98 98
99 99 /** Create credentials */
100 100 this.setServerWithCredentials(builder);
... ...
... ... @@ -188,8 +188,9 @@ public class LwM2mTransportHandler {
188 188 return null;
189 189 }
190 190
191   - public static LwM2mClientProfile getNewProfileParameters(JsonObject profilesConfigData) {
  191 + public static LwM2mClientProfile getNewProfileParameters(JsonObject profilesConfigData, String tenantId) {
192 192 LwM2mClientProfile lwM2MClientProfile = new LwM2mClientProfile();
  193 + lwM2MClientProfile.setTenantId(tenantId);
193 194 lwM2MClientProfile.setPostClientLwM2mSettings(profilesConfigData.get(CLIENT_LWM2M_SETTINGS).getAsJsonObject());
194 195 lwM2MClientProfile.setPostKeyNameProfile(profilesConfigData.get(OBSERVE_ATTRIBUTE_TELEMETRY).getAsJsonObject().get(KEY_NAME).getAsJsonObject());
195 196 lwM2MClientProfile.setPostAttributeProfile(profilesConfigData.get(OBSERVE_ATTRIBUTE_TELEMETRY).getAsJsonObject().get(ATTRIBUTE).getAsJsonArray());
... ... @@ -221,7 +222,7 @@ public class LwM2mTransportHandler {
221 222 ObjectMapper mapper = new ObjectMapper();
222 223 String profileStr = mapper.writeValueAsString(profile);
223 224 JsonObject profileJson = (profileStr != null) ? validateJson(profileStr) : null;
224   - return (getValidateCredentialsBodyFromThingsboard(profileJson)) ? LwM2mTransportHandler.getNewProfileParameters(profileJson) : null;
  225 + return (getValidateCredentialsBodyFromThingsboard(profileJson)) ? LwM2mTransportHandler.getNewProfileParameters(profileJson, deviceProfile.getTenantId().getId().toString()) : null;
225 226 } catch (IOException e) {
226 227 log.error("", e);
227 228 }
... ...
... ... @@ -24,7 +24,6 @@ import org.eclipse.leshan.server.californium.LeshanServer;
24 24 import org.eclipse.leshan.server.californium.LeshanServerBuilder;
25 25 import org.eclipse.leshan.server.californium.registration.CaliforniumRegistrationStore;
26 26 import org.eclipse.leshan.server.model.LwM2mModelProvider;
27   -import org.eclipse.leshan.server.model.VersionedModelProvider;
28 27 import org.eclipse.leshan.server.security.DefaultAuthorizer;
29 28 import org.eclipse.leshan.server.security.EditableSecurityStore;
30 29 import org.eclipse.leshan.server.security.SecurityChecker;
... ... @@ -32,6 +31,7 @@ import org.springframework.beans.factory.annotation.Autowired;
32 31 import org.springframework.context.annotation.Bean;
33 32 import org.springframework.stereotype.Component;
34 33 import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
  34 +import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext;
35 35 import org.thingsboard.server.transport.lwm2m.utils.LwM2mValueConverterImpl;
36 36
37 37 import java.math.BigInteger;
... ... @@ -77,6 +77,9 @@ public class LwM2mTransportServerConfiguration {
77 77 @Autowired
78 78 private EditableSecurityStore securityStore;
79 79
  80 + @Autowired
  81 + private LwM2mClientContext lwM2mClientContext;;
  82 +
80 83 @Bean
81 84 public LeshanServer getLeshanServer() {
82 85 log.info("Starting LwM2M transport Server... PostConstruct");
... ... @@ -95,7 +98,8 @@ public class LwM2mTransportServerConfiguration {
95 98 builder.setCoapConfig(getCoapConfig(serverPortNoSec, serverSecurePort));
96 99
97 100 /** Define model provider (Create Models )*/
98   - LwM2mModelProvider modelProvider = new VersionedModelProvider(this.context.getLwM2MTransportConfigServer().getModelsValue());
  101 +// LwM2mModelProvider modelProvider = new VersionedModelProvider(this.context.getLwM2MTransportConfigServer().getModelsValueCommon());
  102 + LwM2mModelProvider modelProvider = new LwM2mVersionedModelProvider(this.context.getLwM2MTransportConfigServer().getModelsValueServer(), this.lwM2mClientContext);
99 103 builder.setObjectModelProvider(modelProvider);
100 104
101 105 /** Create credentials */
... ...
... ... @@ -153,6 +153,8 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
153 153 executorRegistered.submit(() -> {
154 154 try {
155 155 log.warn("[{}] [{{}] Client: create after Registration", registration.getEndpoint(), registration.getId());
  156 + ((LwM2mVersionedModelProvider)leshanServer.getModelProvider()).setRepository(this.lwM2mTransportContextServer.getLwM2MTransportConfigServer().getModelsValueCommon());
  157 +// (((VersionedModelProvider) (leshanServer)).modelProvider).repository;
156 158 LwM2mClient lwM2MClient = this.lwM2mClientContext.updateInSessionsLwM2MClient(registration);
157 159 if (lwM2MClient != null) {
158 160 SessionInfoProto sessionInfo = this.getValidateSessionInfo(registration);
... ...
  1 +package org.thingsboard.server.transport.lwm2m.server;
  2 +
  3 +import org.eclipse.leshan.core.model.LwM2mModel;
  4 +import org.eclipse.leshan.core.model.LwM2mModelRepository;
  5 +import org.eclipse.leshan.core.model.ObjectModel;
  6 +import org.eclipse.leshan.core.model.ResourceModel;
  7 +import org.eclipse.leshan.server.model.LwM2mModelProvider;
  8 +import org.eclipse.leshan.server.registration.Registration;
  9 +import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext;
  10 +
  11 +import java.util.ArrayList;
  12 +import java.util.Collection;
  13 +import java.util.Map;
  14 +import java.util.concurrent.ConcurrentHashMap;
  15 +
  16 +public class LwM2mVersionedModelProvider implements LwM2mModelProvider {
  17 +
  18 + private LwM2mModelRepository repository;
  19 + private Map<String, LwM2mModelRepository> repositoriesTenant;
  20 + private LwM2mClientContext lwM2mClientContext;
  21 +
  22 + public LwM2mVersionedModelProvider(Collection<ObjectModel> objectModels, LwM2mClientContext lwM2mClientContext) {
  23 + this.repository = new LwM2mModelRepository(objectModels);
  24 + this.lwM2mClientContext = lwM2mClientContext;
  25 + this.repositoriesTenant = new ConcurrentHashMap<>();
  26 + }
  27 +
  28 + public LwM2mVersionedModelProvider(LwM2mModelRepository repository, LwM2mClientContext lwM2mClientContext) {
  29 + this.repository = repository;
  30 + this.lwM2mClientContext = lwM2mClientContext;
  31 + this.repositoriesTenant = new ConcurrentHashMap<>();
  32 + }
  33 +
  34 + public void setRepositoriesTenant (String tenantID, LwM2mModelRepository repositoryTenant) {
  35 + this.repositoriesTenant.put(tenantID, repositoryTenant);
  36 + }
  37 +
  38 + public LwM2mModelRepository getRepositoriesTenant (String tenantID) {
  39 + return this.repositoriesTenant.get(tenantID);
  40 + }
  41 +
  42 + public void setRepository (Collection<ObjectModel> objectModels) {
  43 + this.repository = new LwM2mModelRepository(objectModels);
  44 + }
  45 +
  46 + public LwM2mModelRepository getRepositoriesCommonTenant (String tenantID) {
  47 + LwM2mModelRepository repository = new LwM2mModelRepository();
  48 +
  49 + return repository;
  50 + }
  51 +
  52 + @Override
  53 + public LwM2mModel getObjectModel(Registration registration) {
  54 + return new DynamicModel(registration, this.lwM2mClientContext.getProfile(registration).getTenantId());
  55 + }
  56 +
  57 + private class DynamicModel implements LwM2mModel {
  58 +
  59 + private final Registration registration;
  60 + private final String tenantId;
  61 +
  62 + public DynamicModel(Registration registration, String tenantId) {
  63 + this.registration = registration;
  64 + this.tenantId = tenantId;
  65 + }
  66 +
  67 + @Override
  68 + public ResourceModel getResourceModel(int objectId, int resourceId) {
  69 + ObjectModel objectModel = getObjectModel(objectId);
  70 + if (objectModel != null)
  71 + return objectModel.resources.get(resourceId);
  72 + else
  73 + return null;
  74 + }
  75 +
  76 + @Override
  77 + public ObjectModel getObjectModel(int objectId) {
  78 + String version = registration.getSupportedVersion(objectId);
  79 + if (version != null) {
  80 + return repository.getObjectModel(objectId, version);
  81 + }
  82 + return null;
  83 + }
  84 +
  85 + @Override
  86 + public Collection<ObjectModel> getObjectModels() {
  87 + Map<Integer, String> supportedObjects = registration.getSupportedObject();
  88 + Collection<ObjectModel> result = new ArrayList<>(supportedObjects.size());
  89 + for (Map.Entry<Integer, String> supportedObject : supportedObjects.entrySet()) {
  90 + ObjectModel objectModel = repository.getObjectModel(supportedObject.getKey(),
  91 + supportedObject.getValue());
  92 + if (objectModel != null)
  93 + result.add(objectModel);
  94 + }
  95 + return result;
  96 + }
  97 + }
  98 +}
... ...
... ... @@ -22,12 +22,14 @@ import lombok.Data;
22 22
23 23 @Data
24 24 public class LwM2mClientProfile {
  25 +
  26 + private String tenantId;
25 27 /**
26 28 * {"clientLwM2mSettings": {
27 29 * clientUpdateValueAfterConnect: false;
28 30 * }
29 31 **/
30   - JsonObject postClientLwM2mSettings;
  32 + private JsonObject postClientLwM2mSettings;
31 33
32 34 /**
33 35 * {"keyName": {
... ... @@ -36,22 +38,22 @@ public class LwM2mClientProfile {
36 38 * "/3/0/2": "serialNumber"
37 39 * }
38 40 **/
39   - JsonObject postKeyNameProfile;
  41 + private JsonObject postKeyNameProfile;
40 42
41 43 /**
42 44 * [ "/2/0/0", "/2/0/1"]
43 45 */
44   - JsonArray postAttributeProfile;
  46 + private JsonArray postAttributeProfile;
45 47
46 48 /**
47 49 * [ "/2/0/0", "/2/0/1"]
48 50 */
49   - JsonArray postTelemetryProfile;
  51 + private JsonArray postTelemetryProfile;
50 52
51 53 /**
52 54 * [ "/2/0/0", "/2/0/1"]
53 55 */
54   - JsonArray postObserveProfile;
  56 + private JsonArray postObserveProfile;
55 57
56 58 public LwM2mClientProfile clone() {
57 59 LwM2mClientProfile lwM2mClientProfile = new LwM2mClientProfile();
... ...
... ... @@ -26,6 +26,7 @@ import org.eclipse.leshan.core.util.StringUtils;
26 26 import javax.xml.datatype.DatatypeConfigurationException;
27 27 import javax.xml.datatype.DatatypeFactory;
28 28 import javax.xml.datatype.XMLGregorianCalendar;
  29 +import java.math.BigInteger;
29 30 import java.text.DateFormat;
30 31 import java.text.SimpleDateFormat;
31 32 import java.util.Date;
... ... @@ -130,7 +131,13 @@ public class LwM2mValueConverterImpl implements LwM2mValueConverter {
130 131 return String.valueOf(value);
131 132 case TIME:
132 133 String DATE_FORMAT = "MMM d, yyyy HH:mm a";
133   - Long timeValue = ((Date) value).getTime();
  134 + Long timeValue;
  135 + try {
  136 + timeValue = ((Date) value).getTime();
  137 + }
  138 + catch (Exception e){
  139 + timeValue = new BigInteger((byte [])value).longValue();
  140 + }
134 141 DateFormat formatter = new SimpleDateFormat(DATE_FORMAT);
135 142 return formatter.format(new Date(timeValue));
136 143 default:
... ...
... ... @@ -84,7 +84,11 @@ public class LwM2MTransportConfigServer {
84 84
85 85 @Getter
86 86 @Setter
87   - private List<ObjectModel> modelsValue;
  87 + private List<ObjectModel> modelsValueCommon;
  88 +
  89 + @Getter
  90 + @Setter
  91 + private List<ObjectModel> modelsValueServer;
88 92
89 93 @Getter
90 94 @Value("${transport.lwm2m.timeout:}")
... ... @@ -188,11 +192,13 @@ public class LwM2MTransportConfigServer {
188 192
189 193 @PostConstruct
190 194 public void init() {
191   - modelsValue = ObjectLoader.loadDefault();
  195 + modelsValueServer = ObjectLoader.loadDefault();
  196 + modelsValueServer.remove(3);
  197 + modelsValueCommon = ObjectLoader.loadDefault();
192 198 File path = getPathModels();
193 199 if (path.isDirectory()) {
194 200 try {
195   - modelsValue.addAll(ObjectLoader.loadObjectsFromDir(path));
  201 + modelsValueCommon.addAll(ObjectLoader.loadObjectsFromDir(path));
196 202 log.info(" [{}] Models directory is a directory", path.getAbsoluteFile());
197 203 } catch (Exception e) {
198 204 log.error(" [{}] Could not parse the resource definition file", e.toString());
... ... @@ -255,9 +261,9 @@ public class LwM2MTransportConfigServer {
255 261 public ResourceModel getResourceModel(Registration registration, LwM2mPath pathIds) {
256 262 String pathLink = "/" + pathIds.getObjectId() + "/" + pathIds.getObjectInstanceId();
257 263 return (Arrays.stream(registration.getObjectLinks()).filter(p-> p.getUrl().equals(pathLink)).findFirst().isPresent() &&
258   - this.modelsValue.stream().filter(v -> v.id == pathIds.getObjectId()).collect(Collectors.toList()).size() > 0) &&
259   - this.modelsValue.stream().filter(v -> v.id == pathIds.getObjectId()).collect(Collectors.toList()).get(0).resources.containsKey(pathIds.getResourceId()) ?
260   - this.modelsValue.stream().filter(v -> v.id == pathIds.getObjectId()).collect(Collectors.toList()).get(0).resources.get(pathIds.getResourceId()) :
  264 + this.modelsValueCommon.stream().filter(v -> v.id == pathIds.getObjectId()).collect(Collectors.toList()).size() > 0) &&
  265 + this.modelsValueCommon.stream().filter(v -> v.id == pathIds.getObjectId()).collect(Collectors.toList()).get(0).resources.containsKey(pathIds.getResourceId()) ?
  266 + this.modelsValueCommon.stream().filter(v -> v.id == pathIds.getObjectId()).collect(Collectors.toList()).get(0).resources.get(pathIds.getResourceId()) :
261 267 null;
262 268 }
263 269
... ...