Merge pull request #9804 from AndriiLandiak/fix/edge-compatibility-after-image-feature
Edge - fix image feature backward compatibility
This commit is contained in:
commit
f4761519b6
@ -33,7 +33,6 @@ import org.thingsboard.server.service.edge.rpc.fetch.EntityViewsEdgeEventFetcher
|
|||||||
import org.thingsboard.server.service.edge.rpc.fetch.OtaPackagesEdgeEventFetcher;
|
import org.thingsboard.server.service.edge.rpc.fetch.OtaPackagesEdgeEventFetcher;
|
||||||
import org.thingsboard.server.service.edge.rpc.fetch.QueuesEdgeEventFetcher;
|
import org.thingsboard.server.service.edge.rpc.fetch.QueuesEdgeEventFetcher;
|
||||||
import org.thingsboard.server.service.edge.rpc.fetch.RuleChainsEdgeEventFetcher;
|
import org.thingsboard.server.service.edge.rpc.fetch.RuleChainsEdgeEventFetcher;
|
||||||
import org.thingsboard.server.service.edge.rpc.fetch.SystemResourcesEdgeEventFetcher;
|
|
||||||
import org.thingsboard.server.service.edge.rpc.fetch.SystemWidgetTypesEdgeEventFetcher;
|
import org.thingsboard.server.service.edge.rpc.fetch.SystemWidgetTypesEdgeEventFetcher;
|
||||||
import org.thingsboard.server.service.edge.rpc.fetch.SystemWidgetsBundlesEdgeEventFetcher;
|
import org.thingsboard.server.service.edge.rpc.fetch.SystemWidgetsBundlesEdgeEventFetcher;
|
||||||
import org.thingsboard.server.service.edge.rpc.fetch.TenantAdminUsersEdgeEventFetcher;
|
import org.thingsboard.server.service.edge.rpc.fetch.TenantAdminUsersEdgeEventFetcher;
|
||||||
@ -79,7 +78,6 @@ public class EdgeSyncCursor {
|
|||||||
fetchers.add(new SystemWidgetsBundlesEdgeEventFetcher(ctx.getWidgetsBundleService()));
|
fetchers.add(new SystemWidgetsBundlesEdgeEventFetcher(ctx.getWidgetsBundleService()));
|
||||||
fetchers.add(new TenantWidgetsBundlesEdgeEventFetcher(ctx.getWidgetsBundleService()));
|
fetchers.add(new TenantWidgetsBundlesEdgeEventFetcher(ctx.getWidgetsBundleService()));
|
||||||
fetchers.add(new OtaPackagesEdgeEventFetcher(ctx.getOtaPackageService()));
|
fetchers.add(new OtaPackagesEdgeEventFetcher(ctx.getOtaPackageService()));
|
||||||
fetchers.add(new SystemResourcesEdgeEventFetcher(ctx.getResourceService()));
|
|
||||||
fetchers.add(new TenantResourcesEdgeEventFetcher(ctx.getResourceService()));
|
fetchers.add(new TenantResourcesEdgeEventFetcher(ctx.getResourceService()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,10 +16,12 @@
|
|||||||
package org.thingsboard.server.service.edge.rpc.constructor.asset;
|
package org.thingsboard.server.service.edge.rpc.constructor.asset;
|
||||||
|
|
||||||
import com.google.protobuf.ByteString;
|
import com.google.protobuf.ByteString;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.thingsboard.common.util.JacksonUtil;
|
import org.thingsboard.common.util.JacksonUtil;
|
||||||
import org.thingsboard.server.common.data.asset.Asset;
|
import org.thingsboard.server.common.data.asset.Asset;
|
||||||
import org.thingsboard.server.common.data.asset.AssetProfile;
|
import org.thingsboard.server.common.data.asset.AssetProfile;
|
||||||
|
import org.thingsboard.server.dao.resource.ImageService;
|
||||||
import org.thingsboard.server.gen.edge.v1.AssetProfileUpdateMsg;
|
import org.thingsboard.server.gen.edge.v1.AssetProfileUpdateMsg;
|
||||||
import org.thingsboard.server.gen.edge.v1.AssetUpdateMsg;
|
import org.thingsboard.server.gen.edge.v1.AssetUpdateMsg;
|
||||||
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
|
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
|
||||||
@ -31,6 +33,9 @@ import java.nio.charset.StandardCharsets;
|
|||||||
@TbCoreComponent
|
@TbCoreComponent
|
||||||
public class AssetMsgConstructorV1 extends BaseAssetMsgConstructor {
|
public class AssetMsgConstructorV1 extends BaseAssetMsgConstructor {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ImageService imageService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AssetUpdateMsg constructAssetUpdatedMsg(UpdateMsgType msgType, Asset asset) {
|
public AssetUpdateMsg constructAssetUpdatedMsg(UpdateMsgType msgType, Asset asset) {
|
||||||
AssetUpdateMsg.Builder builder = AssetUpdateMsg.newBuilder()
|
AssetUpdateMsg.Builder builder = AssetUpdateMsg.newBuilder()
|
||||||
@ -58,6 +63,7 @@ public class AssetMsgConstructorV1 extends BaseAssetMsgConstructor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AssetProfileUpdateMsg constructAssetProfileUpdatedMsg(UpdateMsgType msgType, AssetProfile assetProfile) {
|
public AssetProfileUpdateMsg constructAssetProfileUpdatedMsg(UpdateMsgType msgType, AssetProfile assetProfile) {
|
||||||
|
imageService.inlineImageForEdge(assetProfile);
|
||||||
AssetProfileUpdateMsg.Builder builder = AssetProfileUpdateMsg.newBuilder()
|
AssetProfileUpdateMsg.Builder builder = AssetProfileUpdateMsg.newBuilder()
|
||||||
.setMsgType(msgType)
|
.setMsgType(msgType)
|
||||||
.setIdMSB(assetProfile.getId().getId().getMostSignificantBits())
|
.setIdMSB(assetProfile.getId().getId().getMostSignificantBits())
|
||||||
|
|||||||
@ -15,9 +15,11 @@
|
|||||||
*/
|
*/
|
||||||
package org.thingsboard.server.service.edge.rpc.constructor.dashboard;
|
package org.thingsboard.server.service.edge.rpc.constructor.dashboard;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.thingsboard.common.util.JacksonUtil;
|
import org.thingsboard.common.util.JacksonUtil;
|
||||||
import org.thingsboard.server.common.data.Dashboard;
|
import org.thingsboard.server.common.data.Dashboard;
|
||||||
|
import org.thingsboard.server.dao.resource.ImageService;
|
||||||
import org.thingsboard.server.gen.edge.v1.DashboardUpdateMsg;
|
import org.thingsboard.server.gen.edge.v1.DashboardUpdateMsg;
|
||||||
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
|
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
|
||||||
import org.thingsboard.server.queue.util.TbCoreComponent;
|
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||||
@ -26,8 +28,12 @@ import org.thingsboard.server.queue.util.TbCoreComponent;
|
|||||||
@TbCoreComponent
|
@TbCoreComponent
|
||||||
public class DashboardMsgConstructorV1 extends BaseDashboardMsgConstructor {
|
public class DashboardMsgConstructorV1 extends BaseDashboardMsgConstructor {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ImageService imageService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DashboardUpdateMsg constructDashboardUpdatedMsg(UpdateMsgType msgType, Dashboard dashboard) {
|
public DashboardUpdateMsg constructDashboardUpdatedMsg(UpdateMsgType msgType, Dashboard dashboard) {
|
||||||
|
imageService.inlineImagesForEdge(dashboard);
|
||||||
DashboardUpdateMsg.Builder builder = DashboardUpdateMsg.newBuilder()
|
DashboardUpdateMsg.Builder builder = DashboardUpdateMsg.newBuilder()
|
||||||
.setMsgType(msgType)
|
.setMsgType(msgType)
|
||||||
.setIdMSB(dashboard.getId().getId().getMostSignificantBits())
|
.setIdMSB(dashboard.getId().getId().getMostSignificantBits())
|
||||||
|
|||||||
@ -22,6 +22,7 @@ import org.thingsboard.common.util.JacksonUtil;
|
|||||||
import org.thingsboard.server.common.data.Device;
|
import org.thingsboard.server.common.data.Device;
|
||||||
import org.thingsboard.server.common.data.DeviceProfile;
|
import org.thingsboard.server.common.data.DeviceProfile;
|
||||||
import org.thingsboard.server.common.data.security.DeviceCredentials;
|
import org.thingsboard.server.common.data.security.DeviceCredentials;
|
||||||
|
import org.thingsboard.server.dao.resource.ImageService;
|
||||||
import org.thingsboard.server.gen.edge.v1.DeviceCredentialsUpdateMsg;
|
import org.thingsboard.server.gen.edge.v1.DeviceCredentialsUpdateMsg;
|
||||||
import org.thingsboard.server.gen.edge.v1.DeviceProfileUpdateMsg;
|
import org.thingsboard.server.gen.edge.v1.DeviceProfileUpdateMsg;
|
||||||
import org.thingsboard.server.gen.edge.v1.DeviceUpdateMsg;
|
import org.thingsboard.server.gen.edge.v1.DeviceUpdateMsg;
|
||||||
@ -38,6 +39,9 @@ public class DeviceMsgConstructorV1 extends BaseDeviceMsgConstructor {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private DataDecodingEncodingService dataDecodingEncodingService;
|
private DataDecodingEncodingService dataDecodingEncodingService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ImageService imageService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DeviceUpdateMsg constructDeviceUpdatedMsg(UpdateMsgType msgType, Device device) {
|
public DeviceUpdateMsg constructDeviceUpdatedMsg(UpdateMsgType msgType, Device device) {
|
||||||
DeviceUpdateMsg.Builder builder = DeviceUpdateMsg.newBuilder()
|
DeviceUpdateMsg.Builder builder = DeviceUpdateMsg.newBuilder()
|
||||||
@ -91,6 +95,7 @@ public class DeviceMsgConstructorV1 extends BaseDeviceMsgConstructor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DeviceProfileUpdateMsg constructDeviceProfileUpdatedMsg(UpdateMsgType msgType, DeviceProfile deviceProfile) {
|
public DeviceProfileUpdateMsg constructDeviceProfileUpdatedMsg(UpdateMsgType msgType, DeviceProfile deviceProfile) {
|
||||||
|
imageService.inlineImageForEdge(deviceProfile);
|
||||||
DeviceProfileUpdateMsg.Builder builder = DeviceProfileUpdateMsg.newBuilder()
|
DeviceProfileUpdateMsg.Builder builder = DeviceProfileUpdateMsg.newBuilder()
|
||||||
.setMsgType(msgType)
|
.setMsgType(msgType)
|
||||||
.setIdMSB(deviceProfile.getId().getId().getMostSignificantBits())
|
.setIdMSB(deviceProfile.getId().getId().getMostSignificantBits())
|
||||||
|
|||||||
@ -15,8 +15,8 @@
|
|||||||
*/
|
*/
|
||||||
package org.thingsboard.server.service.edge.rpc.constructor.resource;
|
package org.thingsboard.server.service.edge.rpc.constructor.resource;
|
||||||
|
|
||||||
import com.google.protobuf.ByteString;
|
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.thingsboard.server.common.data.ResourceType;
|
||||||
import org.thingsboard.server.common.data.TbResource;
|
import org.thingsboard.server.common.data.TbResource;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.gen.edge.v1.ResourceUpdateMsg;
|
import org.thingsboard.server.gen.edge.v1.ResourceUpdateMsg;
|
||||||
@ -29,6 +29,11 @@ public class ResourceMsgConstructorV1 extends BaseResourceMsgConstructor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ResourceUpdateMsg constructResourceUpdatedMsg(UpdateMsgType msgType, TbResource tbResource) {
|
public ResourceUpdateMsg constructResourceUpdatedMsg(UpdateMsgType msgType, TbResource tbResource) {
|
||||||
|
if (ResourceType.IMAGE.equals(tbResource.getResourceType())) {
|
||||||
|
// Exclude support for a recently added resource type when dealing with older Edges
|
||||||
|
// to maintain compatibility and avoid potential issues.
|
||||||
|
return null;
|
||||||
|
}
|
||||||
ResourceUpdateMsg.Builder builder = ResourceUpdateMsg.newBuilder()
|
ResourceUpdateMsg.Builder builder = ResourceUpdateMsg.newBuilder()
|
||||||
.setMsgType(msgType)
|
.setMsgType(msgType)
|
||||||
.setIdMSB(tbResource.getId().getId().getMostSignificantBits())
|
.setIdMSB(tbResource.getId().getId().getMostSignificantBits())
|
||||||
|
|||||||
@ -78,7 +78,7 @@ public class TenantMsgConstructorV1 implements TenantMsgConstructor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TenantProfileUpdateMsg constructTenantProfileUpdateMsg(UpdateMsgType msgType, TenantProfile tenantProfile, EdgeVersion edgeVersion) {
|
public TenantProfileUpdateMsg constructTenantProfileUpdateMsg(UpdateMsgType msgType, TenantProfile tenantProfile, EdgeVersion edgeVersion) {
|
||||||
ByteString profileData = EdgeVersionUtils.isEdgeVersionOlderThan(edgeVersion, EdgeVersion.V_3_6_1) ?
|
ByteString profileData = EdgeVersionUtils.isEdgeVersionOlderThan(edgeVersion, EdgeVersion.V_3_6_2) ?
|
||||||
ByteString.empty() : ByteString.copyFrom(dataDecodingEncodingService.encode(tenantProfile.getProfileData()));
|
ByteString.empty() : ByteString.copyFrom(dataDecodingEncodingService.encode(tenantProfile.getProfileData()));
|
||||||
TenantProfileUpdateMsg.Builder builder = TenantProfileUpdateMsg.newBuilder()
|
TenantProfileUpdateMsg.Builder builder = TenantProfileUpdateMsg.newBuilder()
|
||||||
.setMsgType(msgType)
|
.setMsgType(msgType)
|
||||||
|
|||||||
@ -16,11 +16,13 @@
|
|||||||
package org.thingsboard.server.service.edge.rpc.constructor.widget;
|
package org.thingsboard.server.service.edge.rpc.constructor.widget;
|
||||||
|
|
||||||
import com.google.protobuf.ByteString;
|
import com.google.protobuf.ByteString;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.thingsboard.common.util.JacksonUtil;
|
import org.thingsboard.common.util.JacksonUtil;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
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.resource.ImageService;
|
||||||
import org.thingsboard.server.gen.edge.v1.EdgeVersion;
|
import org.thingsboard.server.gen.edge.v1.EdgeVersion;
|
||||||
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
|
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
|
||||||
import org.thingsboard.server.gen.edge.v1.WidgetTypeUpdateMsg;
|
import org.thingsboard.server.gen.edge.v1.WidgetTypeUpdateMsg;
|
||||||
@ -36,8 +38,12 @@ import java.util.List;
|
|||||||
@TbCoreComponent
|
@TbCoreComponent
|
||||||
public class WidgetMsgConstructorV1 extends BaseWidgetMsgConstructor {
|
public class WidgetMsgConstructorV1 extends BaseWidgetMsgConstructor {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ImageService imageService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public WidgetsBundleUpdateMsg constructWidgetsBundleUpdateMsg(UpdateMsgType msgType, WidgetsBundle widgetsBundle, List<String> widgets) {
|
public WidgetsBundleUpdateMsg constructWidgetsBundleUpdateMsg(UpdateMsgType msgType, WidgetsBundle widgetsBundle, List<String> widgets) {
|
||||||
|
imageService.inlineImageForEdge(widgetsBundle);
|
||||||
WidgetsBundleUpdateMsg.Builder builder = WidgetsBundleUpdateMsg.newBuilder()
|
WidgetsBundleUpdateMsg.Builder builder = WidgetsBundleUpdateMsg.newBuilder()
|
||||||
.setMsgType(msgType)
|
.setMsgType(msgType)
|
||||||
.setIdMSB(widgetsBundle.getId().getId().getMostSignificantBits())
|
.setIdMSB(widgetsBundle.getId().getId().getMostSignificantBits())
|
||||||
@ -62,6 +68,7 @@ public class WidgetMsgConstructorV1 extends BaseWidgetMsgConstructor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public WidgetTypeUpdateMsg constructWidgetTypeUpdateMsg(UpdateMsgType msgType, WidgetTypeDetails widgetTypeDetails, EdgeVersion edgeVersion) {
|
public WidgetTypeUpdateMsg constructWidgetTypeUpdateMsg(UpdateMsgType msgType, WidgetTypeDetails widgetTypeDetails, EdgeVersion edgeVersion) {
|
||||||
|
imageService.inlineImagesForEdge(widgetTypeDetails);
|
||||||
WidgetTypeUpdateMsg.Builder builder = WidgetTypeUpdateMsg.newBuilder()
|
WidgetTypeUpdateMsg.Builder builder = WidgetTypeUpdateMsg.newBuilder()
|
||||||
.setMsgType(msgType)
|
.setMsgType(msgType)
|
||||||
.setIdMSB(widgetTypeDetails.getId().getId().getMostSignificantBits())
|
.setIdMSB(widgetTypeDetails.getId().getId().getMostSignificantBits())
|
||||||
|
|||||||
@ -1,49 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright © 2016-2023 The Thingsboard Authors
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.thingsboard.server.service.edge.rpc.fetch;
|
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.thingsboard.server.common.data.EdgeUtils;
|
|
||||||
import org.thingsboard.server.common.data.TbResource;
|
|
||||||
import org.thingsboard.server.common.data.edge.Edge;
|
|
||||||
import org.thingsboard.server.common.data.edge.EdgeEvent;
|
|
||||||
import org.thingsboard.server.common.data.edge.EdgeEventActionType;
|
|
||||||
import org.thingsboard.server.common.data.edge.EdgeEventType;
|
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
|
||||||
import org.thingsboard.server.common.data.page.PageData;
|
|
||||||
import org.thingsboard.server.common.data.page.PageLink;
|
|
||||||
import org.thingsboard.server.dao.resource.ResourceService;
|
|
||||||
|
|
||||||
@Slf4j
|
|
||||||
@AllArgsConstructor
|
|
||||||
public abstract class BaseResourceEdgeEventFetcher extends BasePageableEdgeEventFetcher<TbResource> {
|
|
||||||
|
|
||||||
protected final ResourceService resourceService;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
PageData<TbResource> fetchPageData(TenantId tenantId, Edge edge, PageLink pageLink) {
|
|
||||||
return findTenantResources(tenantId, pageLink);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
EdgeEvent constructEdgeEvent(TenantId tenantId, Edge edge, TbResource tbResource) {
|
|
||||||
return EdgeUtils.constructEdgeEvent(tenantId, edge.getId(), EdgeEventType.TB_RESOURCE,
|
|
||||||
EdgeEventActionType.ADDED, tbResource.getId(), null);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract PageData<TbResource> findTenantResources(TenantId tenantId, PageLink pageLink);
|
|
||||||
}
|
|
||||||
@ -1,34 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright © 2016-2023 The Thingsboard Authors
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.thingsboard.server.service.edge.rpc.fetch;
|
|
||||||
|
|
||||||
import org.thingsboard.server.common.data.TbResource;
|
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
|
||||||
import org.thingsboard.server.common.data.page.PageData;
|
|
||||||
import org.thingsboard.server.common.data.page.PageLink;
|
|
||||||
import org.thingsboard.server.dao.resource.ResourceService;
|
|
||||||
|
|
||||||
public class SystemResourcesEdgeEventFetcher extends BaseResourceEdgeEventFetcher {
|
|
||||||
|
|
||||||
public SystemResourcesEdgeEventFetcher(ResourceService resourceService) {
|
|
||||||
super(resourceService);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected PageData<TbResource> findTenantResources(TenantId tenantId, PageLink pageLink) {
|
|
||||||
return resourceService.findAllTenantResources(TenantId.SYS_TENANT_ID, pageLink);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -15,22 +15,33 @@
|
|||||||
*/
|
*/
|
||||||
package org.thingsboard.server.service.edge.rpc.fetch;
|
package org.thingsboard.server.service.edge.rpc.fetch;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.thingsboard.server.common.data.EdgeUtils;
|
||||||
import org.thingsboard.server.common.data.TbResource;
|
import org.thingsboard.server.common.data.TbResource;
|
||||||
|
import org.thingsboard.server.common.data.edge.Edge;
|
||||||
|
import org.thingsboard.server.common.data.edge.EdgeEvent;
|
||||||
|
import org.thingsboard.server.common.data.edge.EdgeEventActionType;
|
||||||
|
import org.thingsboard.server.common.data.edge.EdgeEventType;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.common.data.page.PageData;
|
import org.thingsboard.server.common.data.page.PageData;
|
||||||
import org.thingsboard.server.common.data.page.PageLink;
|
import org.thingsboard.server.common.data.page.PageLink;
|
||||||
import org.thingsboard.server.dao.resource.ResourceService;
|
import org.thingsboard.server.dao.resource.ResourceService;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class TenantResourcesEdgeEventFetcher extends BaseResourceEdgeEventFetcher {
|
public class TenantResourcesEdgeEventFetcher extends BasePageableEdgeEventFetcher<TbResource> {
|
||||||
|
|
||||||
public TenantResourcesEdgeEventFetcher(ResourceService resourceService) {
|
private final ResourceService resourceService;
|
||||||
super(resourceService);
|
|
||||||
|
@Override
|
||||||
|
PageData<TbResource> fetchPageData(TenantId tenantId, Edge edge, PageLink pageLink) {
|
||||||
|
return resourceService.findAllTenantResources(tenantId, pageLink);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected PageData<TbResource> findTenantResources(TenantId tenantId, PageLink pageLink) {
|
EdgeEvent constructEdgeEvent(TenantId tenantId, Edge edge, TbResource tbResource) {
|
||||||
return resourceService.findAllTenantResources(tenantId, pageLink);
|
return EdgeUtils.constructEdgeEvent(tenantId, edge.getId(), EdgeEventType.TB_RESOURCE,
|
||||||
|
EdgeEventActionType.ADDED, tbResource.getId(), null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -81,10 +81,10 @@ public abstract class ResourceEdgeProcessor extends BaseResourceProcessor implem
|
|||||||
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
|
UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction());
|
||||||
ResourceUpdateMsg resourceUpdateMsg = ((ResourceMsgConstructor)
|
ResourceUpdateMsg resourceUpdateMsg = ((ResourceMsgConstructor)
|
||||||
resourceMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructResourceUpdatedMsg(msgType, tbResource);
|
resourceMsgConstructorFactory.getMsgConstructorByEdgeVersion(edgeVersion)).constructResourceUpdatedMsg(msgType, tbResource);
|
||||||
downlinkMsg = DownlinkMsg.newBuilder()
|
downlinkMsg = resourceUpdateMsg != null ? DownlinkMsg.newBuilder()
|
||||||
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
|
.setDownlinkMsgId(EdgeUtils.nextPositiveInt())
|
||||||
.addResourceUpdateMsg(resourceUpdateMsg)
|
.addResourceUpdateMsg(resourceUpdateMsg)
|
||||||
.build();
|
.build() : null;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DELETED:
|
case DELETED:
|
||||||
|
|||||||
@ -41,7 +41,7 @@ public class ResourceEdgeProcessorV1 extends ResourceEdgeProcessor {
|
|||||||
resource.setResourceKey(resourceUpdateMsg.getResourceKey());
|
resource.setResourceKey(resourceUpdateMsg.getResourceKey());
|
||||||
resource.setResourceType(ResourceType.valueOf(resourceUpdateMsg.getResourceType()));
|
resource.setResourceType(ResourceType.valueOf(resourceUpdateMsg.getResourceType()));
|
||||||
resource.setFileName(resourceUpdateMsg.getFileName());
|
resource.setFileName(resourceUpdateMsg.getFileName());
|
||||||
resource.setData(resourceUpdateMsg.hasData() ? resourceUpdateMsg.getData().getBytes() : null);
|
resource.setEncodedData(resourceUpdateMsg.hasData() ? resourceUpdateMsg.getData() : null);
|
||||||
resource.setEtag(resourceUpdateMsg.hasEtag() ? resourceUpdateMsg.getEtag() : null);
|
resource.setEtag(resourceUpdateMsg.hasEtag() ? resourceUpdateMsg.getEtag() : null);
|
||||||
return resource;
|
return resource;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -48,6 +48,7 @@ import org.thingsboard.server.dao.entityview.EntityViewService;
|
|||||||
import org.thingsboard.server.dao.ota.OtaPackageService;
|
import org.thingsboard.server.dao.ota.OtaPackageService;
|
||||||
import org.thingsboard.server.dao.queue.QueueService;
|
import org.thingsboard.server.dao.queue.QueueService;
|
||||||
import org.thingsboard.server.dao.relation.RelationService;
|
import org.thingsboard.server.dao.relation.RelationService;
|
||||||
|
import org.thingsboard.server.dao.resource.ImageService;
|
||||||
import org.thingsboard.server.dao.resource.ResourceService;
|
import org.thingsboard.server.dao.resource.ResourceService;
|
||||||
import org.thingsboard.server.dao.rule.RuleChainService;
|
import org.thingsboard.server.dao.rule.RuleChainService;
|
||||||
import org.thingsboard.server.dao.service.DataValidator;
|
import org.thingsboard.server.dao.service.DataValidator;
|
||||||
@ -376,6 +377,9 @@ public abstract class BaseEdgeProcessorTest {
|
|||||||
@MockBean
|
@MockBean
|
||||||
protected DashboardEdgeProcessorV2 dashboardProcessorV2;
|
protected DashboardEdgeProcessorV2 dashboardProcessorV2;
|
||||||
|
|
||||||
|
@MockBean
|
||||||
|
protected ImageService imageService;
|
||||||
|
|
||||||
@SpyBean
|
@SpyBean
|
||||||
protected DeviceEdgeProcessorV1 deviceEdgeProcessorV1;
|
protected DeviceEdgeProcessorV1 deviceEdgeProcessorV1;
|
||||||
|
|
||||||
|
|||||||
@ -47,7 +47,9 @@ public interface ImageService {
|
|||||||
TbResourceInfo findSystemOrTenantImageByEtag(TenantId tenantId, String etag);
|
TbResourceInfo findSystemOrTenantImageByEtag(TenantId tenantId, String etag);
|
||||||
|
|
||||||
boolean replaceBase64WithImageUrl(HasImage entity, String type);
|
boolean replaceBase64WithImageUrl(HasImage entity, String type);
|
||||||
|
|
||||||
boolean replaceBase64WithImageUrl(Dashboard dashboard);
|
boolean replaceBase64WithImageUrl(Dashboard dashboard);
|
||||||
|
|
||||||
boolean replaceBase64WithImageUrl(WidgetTypeDetails widgetType);
|
boolean replaceBase64WithImageUrl(WidgetTypeDetails widgetType);
|
||||||
|
|
||||||
void inlineImage(HasImage entity);
|
void inlineImage(HasImage entity);
|
||||||
@ -55,4 +57,10 @@ public interface ImageService {
|
|||||||
void inlineImages(Dashboard dashboard);
|
void inlineImages(Dashboard dashboard);
|
||||||
|
|
||||||
void inlineImages(WidgetTypeDetails widgetTypeDetails);
|
void inlineImages(WidgetTypeDetails widgetTypeDetails);
|
||||||
|
|
||||||
|
void inlineImageForEdge(HasImage entity);
|
||||||
|
|
||||||
|
void inlineImagesForEdge(Dashboard dashboard);
|
||||||
|
|
||||||
|
void inlineImagesForEdge(WidgetTypeDetails widgetTypeDetails);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -512,7 +512,7 @@ public class BaseImageService extends BaseResourceService implements ImageServic
|
|||||||
@Override
|
@Override
|
||||||
public void inlineImage(HasImage entity) {
|
public void inlineImage(HasImage entity) {
|
||||||
log.trace("Executing inlineImage [{}] [{}] [{}]", entity.getTenantId(), entity.getClass().getSimpleName(), entity.getName());
|
log.trace("Executing inlineImage [{}] [{}] [{}]", entity.getTenantId(), entity.getClass().getSimpleName(), entity.getName());
|
||||||
entity.setImage(inlineImage(entity.getTenantId(), "image", entity.getImage()));
|
entity.setImage(inlineImage(entity.getTenantId(), "image", entity.getImage(), true));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -539,7 +539,31 @@ public class BaseImageService extends BaseResourceService implements ImageServic
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void inlineImageForEdge(HasImage entity) {
|
||||||
|
log.trace("Executing inlineImageForEdge [{}] [{}] [{}]", entity.getTenantId(), entity.getClass().getSimpleName(), entity.getName());
|
||||||
|
entity.setImage(inlineImage(entity.getTenantId(), "image", entity.getImage(), false));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void inlineImagesForEdge(Dashboard dashboard) {
|
||||||
|
log.trace("Executing inlineImagesForEdge [{}] [Dashboard] [{}]", dashboard.getTenantId(), dashboard.getId());
|
||||||
|
inlineImageForEdge(dashboard);
|
||||||
|
inlineIntoJson(dashboard.getTenantId(), dashboard.getConfiguration(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void inlineImagesForEdge(WidgetTypeDetails widgetTypeDetails) {
|
||||||
|
log.trace("Executing inlineImage [{}] [WidgetTypeDetails] [{}]", widgetTypeDetails.getTenantId(), widgetTypeDetails.getId());
|
||||||
|
inlineImageForEdge(widgetTypeDetails);
|
||||||
|
inlineIntoJson(widgetTypeDetails.getTenantId(), widgetTypeDetails.getDescriptor(), false);
|
||||||
|
}
|
||||||
|
|
||||||
private void inlineIntoJson(TenantId tenantId, JsonNode root) {
|
private void inlineIntoJson(TenantId tenantId, JsonNode root) {
|
||||||
|
inlineIntoJson(tenantId, root, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void inlineIntoJson(TenantId tenantId, JsonNode root, boolean addTbImagePrefix) {
|
||||||
Queue<JsonNodeProcessingTask> tasks = new LinkedList<>();
|
Queue<JsonNodeProcessingTask> tasks = new LinkedList<>();
|
||||||
tasks.add(new JsonNodeProcessingTask("", root));
|
tasks.add(new JsonNodeProcessingTask("", root));
|
||||||
while (!tasks.isEmpty()) {
|
while (!tasks.isEmpty()) {
|
||||||
@ -555,7 +579,7 @@ public class BaseImageService extends BaseResourceService implements ImageServic
|
|||||||
String childName = it.next();
|
String childName = it.next();
|
||||||
JsonNode childValue = on.get(childName);
|
JsonNode childValue = on.get(childName);
|
||||||
if (childValue.isTextual()) {
|
if (childValue.isTextual()) {
|
||||||
on.put(childName, inlineImage(tenantId, currentPath + childName, childValue.asText()));
|
on.put(childName, inlineImage(tenantId, currentPath + childName, childValue.asText(), addTbImagePrefix));
|
||||||
} else if (childValue.isObject() || childValue.isArray()) {
|
} else if (childValue.isObject() || childValue.isArray()) {
|
||||||
tasks.add(new JsonNodeProcessingTask(currentPath + childName, childValue));
|
tasks.add(new JsonNodeProcessingTask(currentPath + childName, childValue));
|
||||||
}
|
}
|
||||||
@ -567,14 +591,14 @@ public class BaseImageService extends BaseResourceService implements ImageServic
|
|||||||
if (element.isObject()) {
|
if (element.isObject()) {
|
||||||
tasks.add(new JsonNodeProcessingTask(currentPath + "." + i, element));
|
tasks.add(new JsonNodeProcessingTask(currentPath + "." + i, element));
|
||||||
} else if (element.isTextual()) {
|
} else if (element.isTextual()) {
|
||||||
childArray.set(i, inlineImage(tenantId, currentPath + "." + i, element.asText()));
|
childArray.set(i, inlineImage(tenantId, currentPath + "." + i, element.asText(), addTbImagePrefix));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private String inlineImage(TenantId tenantId, String path, String url) {
|
private String inlineImage(TenantId tenantId, String path, String url, boolean addTbImagePrefix) {
|
||||||
try {
|
try {
|
||||||
ImageCacheKey key = getKeyFromUrl(tenantId, url);
|
ImageCacheKey key = getKeyFromUrl(tenantId, url);
|
||||||
if (key != null) {
|
if (key != null) {
|
||||||
@ -582,8 +606,11 @@ public class BaseImageService extends BaseResourceService implements ImageServic
|
|||||||
if (imageInfo != null) {
|
if (imageInfo != null) {
|
||||||
byte[] data = key.isPreview() ? getImagePreview(tenantId, imageInfo.getId()) : getImageData(tenantId, imageInfo.getId());
|
byte[] data = key.isPreview() ? getImagePreview(tenantId, imageInfo.getId()) : getImageData(tenantId, imageInfo.getId());
|
||||||
ImageDescriptor descriptor = getImageDescriptor(imageInfo, key.isPreview());
|
ImageDescriptor descriptor = getImageDescriptor(imageInfo, key.isPreview());
|
||||||
String tbImagePrefix = "tb-image:" + Base64Utils.encodeToString(imageInfo.getResourceKey().getBytes(StandardCharsets.UTF_8)) + ":"
|
String tbImagePrefix = "";
|
||||||
+ Base64Utils.encodeToString(imageInfo.getName().getBytes(StandardCharsets.UTF_8)) + ";";
|
if (addTbImagePrefix) {
|
||||||
|
tbImagePrefix = "tb-image:" + Base64Utils.encodeToString(imageInfo.getResourceKey().getBytes(StandardCharsets.UTF_8)) + ":"
|
||||||
|
+ Base64Utils.encodeToString(imageInfo.getName().getBytes(StandardCharsets.UTF_8)) + ";";
|
||||||
|
}
|
||||||
return tbImagePrefix + "data:" + descriptor.getMediaType() + ";base64," + Base64Utils.encodeToString(data);
|
return tbImagePrefix + "data:" + descriptor.getMediaType() + ";base64," + Base64Utils.encodeToString(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user