diff --git a/application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java b/application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java index e8da713c7d..b3b617d380 100644 --- a/application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java +++ b/application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java @@ -1,12 +1,12 @@ /** * Copyright © 2016-2022 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 - * + *

+ * 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. @@ -101,7 +101,6 @@ import org.thingsboard.server.service.executors.DbCallbackExecutorService; import org.thingsboard.server.service.profile.TbDeviceProfileCache; import org.thingsboard.server.service.resource.TbResourceService; -import java.io.File; import java.io.IOException; import java.util.List; import java.util.Optional; @@ -600,17 +599,16 @@ public class DefaultTransportApiService implements TransportApiService { builder.setType(otaPackageInfo.getType().name()); builder.setTitle(otaPackageInfo.getTitle()); builder.setVersion(otaPackageInfo.getVersion()); - File file = otaPackageService.getOtaDataFile(otaPackageInfo.getTenantId(), otaPackageId); - builder.setFileName(file.getAbsolutePath()); + builder.setFileName(otaPackageInfo.getFileName()); builder.setContentType(otaPackageInfo.getContentType()); -// if (!otaPackageDataCache.has(otaPackageId.toString())) { -// OtaPackage otaPackage = otaPackageService.findOtaPackageById(tenantId, otaPackageId); -// try { -// otaPackageDataCache.put(otaPackageId.toString(), otaPackage.getData().readAllBytes()); -// } catch (IOException e) { -// log.error("Failed to cache ota package with id {}",otaPackage.getId(), e); -// } -// } + if (!otaPackageDataCache.has(otaPackageId.toString())) { + OtaPackage otaPackage = otaPackageService.findOtaPackageById(tenantId, otaPackageId); + try { + otaPackageDataCache.put(otaPackageId.toString(), otaPackage.getData().readAllBytes()); + } catch (IOException e) { + log.error("Failed to cache ota package with id {}",otaPackage.getId(), e); + } + } } } diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/ota/OtaPackageService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/ota/OtaPackageService.java index 304adba019..a2e1681600 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/ota/OtaPackageService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/ota/OtaPackageService.java @@ -16,7 +16,6 @@ package org.thingsboard.server.dao.ota; import com.google.common.util.concurrent.ListenableFuture; -import org.springframework.boot.web.servlet.MultipartConfigFactory; import org.thingsboard.server.common.data.OtaPackage; import org.thingsboard.server.common.data.OtaPackageInfo; import org.thingsboard.server.common.data.id.DeviceProfileId; @@ -27,7 +26,6 @@ import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; import java.io.File; -import java.io.InputStream; public interface OtaPackageService { diff --git a/common/transport/http/src/main/java/org/thingsboard/server/transport/http/DeviceApiController.java b/common/transport/http/src/main/java/org/thingsboard/server/transport/http/DeviceApiController.java index ca991ff7de..df44a5c61f 100644 --- a/common/transport/http/src/main/java/org/thingsboard/server/transport/http/DeviceApiController.java +++ b/common/transport/http/src/main/java/org/thingsboard/server/transport/http/DeviceApiController.java @@ -20,13 +20,10 @@ import com.google.gson.JsonParser; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.core.io.ByteArrayResource; -import org.springframework.core.io.FileSystemResource; -import org.springframework.core.io.Resource; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -68,8 +65,6 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToServerRpcResponseM import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceTokenRequestMsg; import javax.servlet.http.HttpServletRequest; -import java.io.File; -import java.io.FileInputStream; import java.util.Arrays; import java.util.List; import java.util.UUID; @@ -510,25 +505,15 @@ public class DeviceApiController implements TbTransportService { } @Override - @SneakyThrows public void onSuccess(TransportProtos.GetOtaPackageResponseMsg otaPackageResponseMsg) { if (!TransportProtos.ResponseStatus.SUCCESS.equals(otaPackageResponseMsg.getResponseStatus())) { responseWriter.setResult(new ResponseEntity<>(HttpStatus.NOT_FOUND)); } else if (title.equals(otaPackageResponseMsg.getTitle()) && version.equals(otaPackageResponseMsg.getVersion())) { -// String otaPackageId = new UUID(otaPackageResponseMsg.getOtaPackageIdMSB(), otaPackageResponseMsg.getOtaPackageIdLSB()).toString(); - File file = new File(otaPackageResponseMsg.getFileName()); - Resource resource = null; - if(chuckSize!=0){ - FileInputStream fileInputStream = new FileInputStream(file); - byte[] bytes = new byte[chuckSize]; - fileInputStream.read(bytes, chuck, chuckSize); - resource = new ByteArrayResource(bytes); - } else { - resource= new FileSystemResource(file); - } - ResponseEntity response = ResponseEntity.ok() - .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + getFileName(otaPackageResponseMsg.getFileName())) - .header("x-filename", getFileName(otaPackageResponseMsg.getFileName())) + String otaPackageId = new UUID(otaPackageResponseMsg.getOtaPackageIdMSB(), otaPackageResponseMsg.getOtaPackageIdLSB()).toString(); + ByteArrayResource resource = new ByteArrayResource(transportContext.getOtaPackageDataCache().get(otaPackageId, chuckSize, chuck)); + ResponseEntity response = ResponseEntity.ok() + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + otaPackageResponseMsg.getFileName()) + .header("x-filename", otaPackageResponseMsg.getFileName()) .contentLength(resource.contentLength()) .contentType(parseMediaType(otaPackageResponseMsg.getContentType())) .body(resource); @@ -538,10 +523,6 @@ public class DeviceApiController implements TbTransportService { } } - private String getFileName(String fileName) { - return new File(fileName).getName(); - } - @Override public void onError(Throwable e) { log.warn("Failed to process request", e); @@ -625,7 +606,7 @@ public class DeviceApiController implements TbTransportService { @Override public void onDeviceDeleted(DeviceId deviceId) { UUID sessionId = new UUID(sessionInfo.getSessionIdMSB(), sessionInfo.getSessionIdLSB()); - log.trace("[{}] Received device deleted notification for device with id: {}",sessionId, deviceId); + log.trace("[{}] Received device deleted notification for device with id: {}", sessionId, deviceId); responseWriter.setResult(new ResponseEntity<>("Device was deleted!", HttpStatus.FORBIDDEN)); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/ota/BaseOtaPackageService.java b/dao/src/main/java/org/thingsboard/server/dao/ota/BaseOtaPackageService.java index d7db3d30cd..a538fc0359 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/ota/BaseOtaPackageService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/ota/BaseOtaPackageService.java @@ -1,12 +1,12 @@ /** * Copyright © 2016-2022 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 - * + *

+ * 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. @@ -38,9 +38,9 @@ import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.service.PaginatedRemover; import javax.transaction.Transactional; -import java.io.*; -import java.util.Collections; -import java.util.List; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.InputStream; import java.util.Optional; import static org.thingsboard.server.dao.service.Validator.validateId; @@ -70,7 +70,7 @@ public class BaseOtaPackageService extends AbstractCachedEntityService optionalStream = file.getInputStream(); - if(optionalStream.isEmpty()){ + if (optionalStream.isEmpty()) { log.error("Failed to get input stream from file {}", file.getFileName()); throw new RuntimeException("Failed to save ota package file"); }