Browse Source

Lwm2m add resource fix (#4272)

* lwm2m: add objectKeyId to back and front profile

* lwm2m: front^ strategy - select

* lwm2m: back fix bag

* lwm2m: back fix bag2

* lwm2m: back fix bag3
pull/4277/head
nickAS21 6 years ago
committed by GitHub
parent
commit
bc21db007b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 10
      application/src/main/java/org/thingsboard/server/controller/ResourceController.java
  2. 46
      application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java
  3. 7
      common/dao-api/src/main/java/org/thingsboard/server/dao/resource/ResourceService.java
  4. 46
      common/data/src/main/java/org/thingsboard/server/common/data/Resource.java
  5. 46
      dao/src/main/java/org/thingsboard/server/dao/resource/BaseResourceService.java
  6. 14
      ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-object-list.component.ts

10
application/src/main/java/org/thingsboard/server/controller/ResourceController.java

@ -62,7 +62,7 @@ public class ResourceController extends BaseController {
} }
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
@RequestMapping(value = "/resource/page", method = RequestMethod.GET) @RequestMapping(value = "/resource", method = RequestMethod.GET)
@ResponseBody @ResponseBody
public PageData<Resource> getResources(@RequestParam(required = false) boolean system, public PageData<Resource> getResources(@RequestParam(required = false) boolean system,
@RequestParam int pageSize, @RequestParam int pageSize,
@ -71,8 +71,6 @@ public class ResourceController extends BaseController {
@RequestParam(required = false) String sortProperty, @RequestParam(required = false) String sortProperty,
@RequestParam(required = false) String sortOrder) throws ThingsboardException { @RequestParam(required = false) String sortOrder) throws ThingsboardException {
try { try {
// int[] objectIds;
// ResourceType resourceType
PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder); PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder);
return checkNotNull(resourceService.findResourcesByTenantId(system ? TenantId.SYS_TENANT_ID : getTenantId(), pageLink)); return checkNotNull(resourceService.findResourcesByTenantId(system ? TenantId.SYS_TENANT_ID : getTenantId(), pageLink));
} catch (Exception e) { } catch (Exception e) {
@ -101,11 +99,9 @@ public class ResourceController extends BaseController {
@ResponseBody @ResponseBody
public List<LwM2mObject> getLwm2mListObjects(@RequestParam String sortOrder, public List<LwM2mObject> getLwm2mListObjects(@RequestParam String sortOrder,
@RequestParam String sortProperty, @RequestParam String sortProperty,
@RequestParam(required = false) String[] objectIds, @RequestParam(required = false) String[] objectIds) throws ThingsboardException {
@RequestParam(required = false) String searchText)
throws ThingsboardException {
try { try {
return checkNotNull(resourceService.findLwM2mObject(getTenantId(), sortOrder, sortProperty, objectIds, searchText)); return checkNotNull(resourceService.findLwM2mObject(getTenantId(), sortOrder, sortProperty, objectIds));
} catch (Exception e) { } catch (Exception e) {
throw handleException(e); throw handleException(e);
} }

46
application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java

@ -17,10 +17,6 @@ package org.thingsboard.server.service.install;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.eclipse.leshan.core.model.DDFFileParser;
import org.eclipse.leshan.core.model.DefaultDDFFileValidator;
import org.eclipse.leshan.core.model.InvalidDDFFileException;
import org.eclipse.leshan.core.model.ObjectModel;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -34,7 +30,6 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.oauth2.OAuth2ClientRegistrationTemplate; import org.thingsboard.server.common.data.oauth2.OAuth2ClientRegistrationTemplate;
import org.thingsboard.server.common.data.rule.RuleChain; import org.thingsboard.server.common.data.rule.RuleChain;
import org.thingsboard.server.common.data.rule.RuleChainMetaData; import org.thingsboard.server.common.data.rule.RuleChainMetaData;
import org.thingsboard.server.common.data.widget.WidgetType;
import org.thingsboard.server.common.data.widget.WidgetTypeDetails; import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
import org.thingsboard.server.common.data.widget.WidgetsBundle; import org.thingsboard.server.common.data.widget.WidgetsBundle;
import org.thingsboard.server.dao.dashboard.DashboardService; import org.thingsboard.server.dao.dashboard.DashboardService;
@ -45,8 +40,6 @@ import org.thingsboard.server.dao.rule.RuleChainService;
import org.thingsboard.server.dao.widget.WidgetTypeService; import org.thingsboard.server.dao.widget.WidgetTypeService;
import org.thingsboard.server.dao.widget.WidgetsBundleService; import org.thingsboard.server.dao.widget.WidgetsBundleService;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.DirectoryStream; import java.nio.file.DirectoryStream;
import java.nio.file.Files; import java.nio.file.Files;
@ -215,8 +208,8 @@ public class InstallScripts {
Resource resource = new Resource(); Resource resource = new Resource();
resource.setTenantId(TenantId.SYS_TENANT_ID); resource.setTenantId(TenantId.SYS_TENANT_ID);
resource.setResourceType(ResourceType.LWM2M_MODEL); resource.setResourceType(ResourceType.LWM2M_MODEL);
resource.setResourceId(getValueByTeg(source, "ObjectID") + "_" + getValueByTeg(source, "ObjectVersion")); resource.setResourceId(getValueByTag(source, "ObjectID") + "_" + getValueByTag(source, "ObjectVersion"));
resource.setTextSearch(resource.getResourceId() + ":" + getValueByTeg(source, "Name")); resource.setTextSearch(resource.getResourceId() + ":" + getValueByTag(source, "Name"));
resource.setValue(Base64.getEncoder().encodeToString(fileBytes)); resource.setValue(Base64.getEncoder().encodeToString(fileBytes));
resourceService.saveResource(resource); resourceService.saveResource(resource);
} catch (Exception e) { } catch (Exception e) {
@ -238,43 +231,18 @@ public class InstallScripts {
resourceService.saveResource(resource); resourceService.saveResource(resource);
} catch (Exception e) { } catch (Exception e) {
log.error("Unable to load lwm2m serverKeyStore [{}]", jksPath.toString()); log.error("Unable to load lwm2m serverKeyStore [{}]", jksPath.toString());
throw new RuntimeException("Unable to load l2m2m serverKeyStore", e); throw new RuntimeException("Unable to load lwm2m serverKeyStore", e);
} }
} }
private String getValueByTeg(String source, String tagHtml) { private String getValueByTag(String source, String tag) {
int lenTag = ("<" + tagHtml + ">").length(); int lenTag = ("<" + tag + ">").length();
int indStart = source.indexOf("<" + tagHtml + ">"); int indStart = source.indexOf("<" + tag + ">");
int indEnd = source.indexOf("</" + tagHtml + ">"); int indEnd = source.indexOf("</" + tag + ">");
return (indStart > 0 && indEnd > 0) ? source.substring(indStart + lenTag, indEnd) : null; return (indStart > 0 && indEnd > 0) ? source.substring(indStart + lenTag, indEnd) : null;
} }
private ObjectModel getObjectModelLwm2mValid(byte[] xmlByte, String streamName, DefaultDDFFileValidator ddfValidator) {
try {
DDFFileParser ddfFileParser = new DDFFileParser(ddfValidator);
return ddfFileParser.parseEx(new ByteArrayInputStream(xmlByte), streamName).get(0);
} catch (IOException | InvalidDDFFileException e) {
log.error("Could not parse the XML file [{}]", streamName, e);
return null;
}
}
private void removeFile(Path modelsDir, String nameFile, byte[] fileBytes) {
String path = "/home/nick/Igor_project/thingsboard_ce_3_2_docker/thingsboard/common/transport/lwm2m/src/main/resources/models/";
File file = new File(path + nameFile);
if (!file.isDirectory()) {
try {
Files.write(Paths.get(path + "server/" + nameFile), fileBytes);
file.delete();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void loadDashboards(TenantId tenantId, CustomerId customerId) throws Exception { public void loadDashboards(TenantId tenantId, CustomerId customerId) throws Exception {
Path dashboardsDir = Paths.get(getDataDir(), JSON_DIR, DEMO_DIR, DASHBOARDS_DIR); Path dashboardsDir = Paths.get(getDataDir(), JSON_DIR, DEMO_DIR, DASHBOARDS_DIR);
try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(dashboardsDir, path -> path.toString().endsWith(JSON_EXT))) { try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(dashboardsDir, path -> path.toString().endsWith(JSON_EXT))) {

7
common/dao-api/src/main/java/org/thingsboard/server/dao/resource/ResourceService.java

@ -32,19 +32,18 @@ public interface ResourceService {
PageData<Resource> findResourcesByTenantId(TenantId tenantId, PageLink pageLink); PageData<Resource> findResourcesByTenantId(TenantId tenantId, PageLink pageLink);
List<Resource> findAllByTenantIdAndResourceType(TenantId tenantId, ResourceType resourceType);
List<LwM2mObject> findLwM2mObject(TenantId tenantId, List<LwM2mObject> findLwM2mObject(TenantId tenantId,
String sortOrder, String sortOrder,
String sortProperty, String sortProperty,
String[] objectIds, String[] objectIds);
String searchText);
List<LwM2mObject> findLwM2mObjectPage(TenantId tenantId, List<LwM2mObject> findLwM2mObjectPage(TenantId tenantId,
String sortProperty, String sortProperty,
String sortOrder, String sortOrder,
PageLink pageLink); PageLink pageLink);
List<Resource> findAllByTenantIdAndResourceType(TenantId tenantId, ResourceType resourceType);
void deleteResource(TenantId tenantId, ResourceType resourceType, String resourceId); void deleteResource(TenantId tenantId, ResourceType resourceType, String resourceId);
void deleteResourcesByTenantId(TenantId tenantId); void deleteResourcesByTenantId(TenantId tenantId);

46
common/data/src/main/java/org/thingsboard/server/common/data/Resource.java

@ -17,21 +17,9 @@ package org.thingsboard.server.common.data;
import lombok.Data; import lombok.Data;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.eclipse.leshan.core.model.DDFFileParser;
import org.eclipse.leshan.core.model.DefaultDDFFileValidator;
import org.eclipse.leshan.core.model.InvalidDDFFileException;
import org.eclipse.leshan.core.model.ObjectModel;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.lwm2m.LwM2mInstance;
import org.thingsboard.server.common.data.lwm2m.LwM2mObject;
import org.thingsboard.server.common.data.lwm2m.LwM2mResource;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
@Slf4j @Slf4j
@Data @Data
@ -55,38 +43,4 @@ public class Resource implements HasTenantId, Serializable {
res.append('}'); res.append('}');
return res.toString(); return res.toString();
} }
public LwM2mObject toLwM2mObject () {
try {
DDFFileParser ddfFileParser = new DDFFileParser(new DefaultDDFFileValidator());
List<ObjectModel> objectModels = ddfFileParser.parseEx(new ByteArrayInputStream(Base64.getDecoder().decode(this.value)), this.textSearch);
if (objectModels.size() == 0) {
return null;
}
else {
ObjectModel obj = objectModels.get(0);
LwM2mObject lwM2mObject = new LwM2mObject();
lwM2mObject.setId(obj.id);
lwM2mObject.setKeyId(this.resourceId);
lwM2mObject.setName(obj.name);
lwM2mObject.setMultiple(obj.multiple);
lwM2mObject.setMandatory(obj.mandatory);
LwM2mInstance instance = new LwM2mInstance();
instance.setId(0);
List<LwM2mResource> resources = new ArrayList<>();
obj.resources.forEach((k, v) -> {
if (!v.operations.isExecutable()) {
LwM2mResource resource = new LwM2mResource(k, v.name, false, false, false);
resources.add(resource);
}
});
instance.setResources(resources.stream().toArray(LwM2mResource[]::new));
lwM2mObject.setInstances(new LwM2mInstance[]{instance});
return lwM2mObject;
}
} catch (IOException | InvalidDDFFileException e) {
log.error("Could not parse the XML of objectModel with name [{}]", this.textSearch, e);
return null;
}
}
} }

46
dao/src/main/java/org/thingsboard/server/dao/resource/BaseResourceService.java

@ -95,22 +95,25 @@ public class BaseResourceService implements ResourceService {
PageData<Resource> resourcePageData = resourceDao.findResourcesByTenantIdAndResourceType( PageData<Resource> resourcePageData = resourceDao.findResourcesByTenantIdAndResourceType(
tenantId, tenantId,
ResourceType.LWM2M_MODEL, pageLink); ResourceType.LWM2M_MODEL, pageLink);
List<LwM2mObject> lwM2mObjects = resourcePageData.getData().stream().map(this::toLwM2mObject).collect(Collectors.toList()); return resourcePageData.getData().stream()
return lwM2mObjects.size() > 1 ? this.sortList (lwM2mObjects, sortProperty, sortOrder) : lwM2mObjects; .map(this::toLwM2mObject)
.sorted(getComparator(sortProperty, sortOrder))
.collect(Collectors.toList());
} }
@Override @Override
public List<LwM2mObject> findLwM2mObject(TenantId tenantId, String sortOrder, public List<LwM2mObject> findLwM2mObject(TenantId tenantId, String sortOrder,
String sortProperty, String sortProperty,
String[] objectIds, String[] objectIds) {
String searchText) {
log.trace("Executing findByTenantId [{}]", tenantId); log.trace("Executing findByTenantId [{}]", tenantId);
validateId(tenantId, INCORRECT_TENANT_ID + tenantId); validateId(tenantId, INCORRECT_TENANT_ID + tenantId);
List<Resource> resources = resourceDao.findResourcesByTenantIdAndResourceType(tenantId, ResourceType.LWM2M_MODEL, List<Resource> resources = resourceDao.findResourcesByTenantIdAndResourceType(tenantId, ResourceType.LWM2M_MODEL,
objectIds, objectIds,
searchText); null);
List<LwM2mObject> lwM2mObjects = resources.stream().map(this::toLwM2mObject).collect(Collectors.toList()); return resources.stream()
return lwM2mObjects.size() > 1 ? this.sortList (lwM2mObjects, sortProperty, sortOrder) : lwM2mObjects; .map(this::toLwM2mObject)
.sorted(getComparator(sortProperty, sortOrder))
.collect(Collectors.toList());
} }
@Override @Override
@ -128,7 +131,7 @@ public class BaseResourceService implements ResourceService {
throw new DataValidationException("Resource value should be specified!"); throw new DataValidationException("Resource value should be specified!");
} }
validate(resource.getTenantId(), resource.getResourceType(), resource.getResourceId()); validate(resource.getTenantId(), resource.getResourceType(), resource.getResourceId());
if (resource.getResourceType().equals(ResourceType.LWM2M_MODEL) && resource.toLwM2mObject() == null) { if (resource.getResourceType().equals(ResourceType.LWM2M_MODEL) && this.toLwM2mObject(resource) == null) {
throw new DataValidationException(String.format("Could not parse the XML of objectModel with name %s", resource.getTextSearch())); throw new DataValidationException(String.format("Could not parse the XML of objectModel with name %s", resource.getTextSearch()));
} }
} }
@ -177,27 +180,14 @@ public class BaseResourceService implements ResourceService {
} }
} }
private List<LwM2mObject> sortList (List<LwM2mObject> lwM2mObjects, String sortProperty, String sortOrder) { private Comparator<? super LwM2mObject> getComparator(String sortProperty, String sortOrder) {
switch (sortProperty) { Comparator<LwM2mObject> comparator;
case "name": if ("name".equals(sortProperty)) {
switch (sortOrder) { comparator = Comparator.comparing(LwM2mObject::getName);
case "ASC": } else {
lwM2mObjects.sort((o1, o2) -> o1.getName().compareTo(o2.getName())); comparator = Comparator.comparingLong(LwM2mObject::getId);
break;
case "DESC":
lwM2mObjects.stream().sorted(Comparator.comparing(LwM2mObject::getName).reversed());
break;
}
case "id":
switch (sortOrder) {
case "ASC":
lwM2mObjects.sort((o1, o2) -> Long.compare(o1.getId(), o2.getId()));
break;
case "DESC":
lwM2mObjects.sort((o1, o2) -> Long.compare(o2.getId(), o1.getId()));
}
} }
return lwM2mObjects; return "DESC".equals(sortOrder) ? comparator.reversed() : comparator;
} }
} }

14
ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-object-list.component.ts

@ -179,20 +179,6 @@ export class Lwm2mObjectListComponent implements ControlValueAccessor, OnInit, V
return this.lw2mModels; return this.lw2mModels;
} }
private getLwM2mModels(): Observable<Array<ObjectLwM2M>> {
if (!this.lw2mModels) {
const sortOrder = {
property: 'id',
direction: Direction.ASC
};
this.lw2mModels = this.deviceProfileService.getLwm2mObjects(sortOrder).pipe(
publishReplay(1),
refCount()
);
}
return this.lw2mModels;
}
onFocus = (): void => { onFocus = (): void => {
if (!this.dirty) { if (!this.dirty) {
this.lwm2mListFormGroup.get('objectLwm2m').updateValueAndValidity({onlySelf: true, emitEvent: true}); this.lwm2mListFormGroup.get('objectLwm2m').updateValueAndValidity({onlySelf: true, emitEvent: true});

Loading…
Cancel
Save