diff --git a/application/src/main/java/org/thingsboard/server/controller/ResourceController.java b/application/src/main/java/org/thingsboard/server/controller/ResourceController.java index 7ce3c196e8..1d4a31c1c2 100644 --- a/application/src/main/java/org/thingsboard/server/controller/ResourceController.java +++ b/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')") - @RequestMapping(value = "/resource/page", method = RequestMethod.GET) + @RequestMapping(value = "/resource", method = RequestMethod.GET) @ResponseBody public PageData getResources(@RequestParam(required = false) boolean system, @RequestParam int pageSize, @@ -71,8 +71,6 @@ public class ResourceController extends BaseController { @RequestParam(required = false) String sortProperty, @RequestParam(required = false) String sortOrder) throws ThingsboardException { try { -// int[] objectIds; -// ResourceType resourceType PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder); return checkNotNull(resourceService.findResourcesByTenantId(system ? TenantId.SYS_TENANT_ID : getTenantId(), pageLink)); } catch (Exception e) { @@ -101,11 +99,9 @@ public class ResourceController extends BaseController { @ResponseBody public List getLwm2mListObjects(@RequestParam String sortOrder, @RequestParam String sortProperty, - @RequestParam(required = false) String[] objectIds, - @RequestParam(required = false) String searchText) - throws ThingsboardException { + @RequestParam(required = false) String[] objectIds) throws ThingsboardException { try { - return checkNotNull(resourceService.findLwM2mObject(getTenantId(), sortOrder, sortProperty, objectIds, searchText)); + return checkNotNull(resourceService.findLwM2mObject(getTenantId(), sortOrder, sortProperty, objectIds)); } catch (Exception e) { throw handleException(e); } diff --git a/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java b/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java index 142350dd42..3a59397f12 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java +++ b/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 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.Value; 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.rule.RuleChain; 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.WidgetsBundle; 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.WidgetsBundleService; -import java.io.ByteArrayInputStream; -import java.io.File; import java.io.IOException; import java.nio.file.DirectoryStream; import java.nio.file.Files; @@ -215,8 +208,8 @@ public class InstallScripts { Resource resource = new Resource(); resource.setTenantId(TenantId.SYS_TENANT_ID); resource.setResourceType(ResourceType.LWM2M_MODEL); - resource.setResourceId(getValueByTeg(source, "ObjectID") + "_" + getValueByTeg(source, "ObjectVersion")); - resource.setTextSearch(resource.getResourceId() + ":" + getValueByTeg(source, "Name")); + resource.setResourceId(getValueByTag(source, "ObjectID") + "_" + getValueByTag(source, "ObjectVersion")); + resource.setTextSearch(resource.getResourceId() + ":" + getValueByTag(source, "Name")); resource.setValue(Base64.getEncoder().encodeToString(fileBytes)); resourceService.saveResource(resource); } catch (Exception e) { @@ -238,43 +231,18 @@ public class InstallScripts { resourceService.saveResource(resource); } catch (Exception e) { 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) { - int lenTag = ("<" + tagHtml + ">").length(); - int indStart = source.indexOf("<" + tagHtml + ">"); - int indEnd = source.indexOf(""); + private String getValueByTag(String source, String tag) { + int lenTag = ("<" + tag + ">").length(); + int indStart = source.indexOf("<" + tag + ">"); + int indEnd = source.indexOf(""); 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 { Path dashboardsDir = Paths.get(getDataDir(), JSON_DIR, DEMO_DIR, DASHBOARDS_DIR); try (DirectoryStream dirStream = Files.newDirectoryStream(dashboardsDir, path -> path.toString().endsWith(JSON_EXT))) { diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/resource/ResourceService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/resource/ResourceService.java index 97db9d6418..9f522d57b3 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/resource/ResourceService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/resource/ResourceService.java @@ -32,19 +32,18 @@ public interface ResourceService { PageData findResourcesByTenantId(TenantId tenantId, PageLink pageLink); + List findAllByTenantIdAndResourceType(TenantId tenantId, ResourceType resourceType); + List findLwM2mObject(TenantId tenantId, String sortOrder, String sortProperty, - String[] objectIds, - String searchText); + String[] objectIds); List findLwM2mObjectPage(TenantId tenantId, String sortProperty, String sortOrder, PageLink pageLink); - List findAllByTenantIdAndResourceType(TenantId tenantId, ResourceType resourceType); - void deleteResource(TenantId tenantId, ResourceType resourceType, String resourceId); void deleteResourcesByTenantId(TenantId tenantId); diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/Resource.java b/common/data/src/main/java/org/thingsboard/server/common/data/Resource.java index 1d92d852e6..351a450fa2 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/Resource.java +++ b/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.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.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.util.ArrayList; -import java.util.Base64; -import java.util.List; @Slf4j @Data @@ -55,38 +43,4 @@ public class Resource implements HasTenantId, Serializable { res.append('}'); return res.toString(); } - - public LwM2mObject toLwM2mObject () { - try { - DDFFileParser ddfFileParser = new DDFFileParser(new DefaultDDFFileValidator()); - List 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 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; - } - } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/resource/BaseResourceService.java b/dao/src/main/java/org/thingsboard/server/dao/resource/BaseResourceService.java index 839aec32f4..a84d20fda9 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/resource/BaseResourceService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/resource/BaseResourceService.java @@ -95,22 +95,25 @@ public class BaseResourceService implements ResourceService { PageData resourcePageData = resourceDao.findResourcesByTenantIdAndResourceType( tenantId, ResourceType.LWM2M_MODEL, pageLink); - List lwM2mObjects = resourcePageData.getData().stream().map(this::toLwM2mObject).collect(Collectors.toList()); - return lwM2mObjects.size() > 1 ? this.sortList (lwM2mObjects, sortProperty, sortOrder) : lwM2mObjects; + return resourcePageData.getData().stream() + .map(this::toLwM2mObject) + .sorted(getComparator(sortProperty, sortOrder)) + .collect(Collectors.toList()); } @Override public List findLwM2mObject(TenantId tenantId, String sortOrder, String sortProperty, - String[] objectIds, - String searchText) { + String[] objectIds) { log.trace("Executing findByTenantId [{}]", tenantId); validateId(tenantId, INCORRECT_TENANT_ID + tenantId); List resources = resourceDao.findResourcesByTenantIdAndResourceType(tenantId, ResourceType.LWM2M_MODEL, objectIds, - searchText); - List lwM2mObjects = resources.stream().map(this::toLwM2mObject).collect(Collectors.toList()); - return lwM2mObjects.size() > 1 ? this.sortList (lwM2mObjects, sortProperty, sortOrder) : lwM2mObjects; + null); + return resources.stream() + .map(this::toLwM2mObject) + .sorted(getComparator(sortProperty, sortOrder)) + .collect(Collectors.toList()); } @Override @@ -128,7 +131,7 @@ public class BaseResourceService implements ResourceService { throw new DataValidationException("Resource value should be specified!"); } 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())); } } @@ -177,27 +180,14 @@ public class BaseResourceService implements ResourceService { } } - private List sortList (List lwM2mObjects, String sortProperty, String sortOrder) { - switch (sortProperty) { - case "name": - switch (sortOrder) { - case "ASC": - lwM2mObjects.sort((o1, o2) -> o1.getName().compareTo(o2.getName())); - 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())); - } + private Comparator getComparator(String sortProperty, String sortOrder) { + Comparator comparator; + if ("name".equals(sortProperty)) { + comparator = Comparator.comparing(LwM2mObject::getName); + } else { + comparator = Comparator.comparingLong(LwM2mObject::getId); } - return lwM2mObjects; + return "DESC".equals(sortOrder) ? comparator.reversed() : comparator; } } diff --git a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-object-list.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-object-list.component.ts index 73332b8e1d..ddb870e21c 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-object-list.component.ts +++ b/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; } - private getLwM2mModels(): Observable> { - 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 => { if (!this.dirty) { this.lwm2mListFormGroup.get('objectLwm2m').updateValueAndValidity({onlySelf: true, emitEvent: true});