diff --git a/config/spotbugs/exclude.xml b/config/spotbugs/exclude.xml index 41e91ac25..1e08f3b3c 100644 --- a/config/spotbugs/exclude.xml +++ b/config/spotbugs/exclude.xml @@ -44,4 +44,14 @@ + + + + + + + + + + diff --git a/gp2gp-translator/src/integrationTest/java/uk/nhs/adaptors/pss/translator/storage/AzureStorageServiceTest.java b/gp2gp-translator/src/integrationTest/java/uk/nhs/adaptors/pss/translator/storage/AzureStorageServiceTest.java index 31305c91d..d8e6e6c4d 100644 --- a/gp2gp-translator/src/integrationTest/java/uk/nhs/adaptors/pss/translator/storage/AzureStorageServiceTest.java +++ b/gp2gp-translator/src/integrationTest/java/uk/nhs/adaptors/pss/translator/storage/AzureStorageServiceTest.java @@ -32,10 +32,9 @@ void setUp() { .buildClient(); blobServiceClient.createBlobContainer(CONTAINER_NAME); - StorageServiceConfiguration config = new StorageServiceConfiguration(); - config.setContainerName(CONTAINER_NAME); + var blobContainerClient = blobServiceClient.getBlobContainerClient(CONTAINER_NAME); - azureStorageService = new AzureStorageService(blobServiceClient, config); + azureStorageService = new AzureStorageService(blobContainerClient); } @AfterEach diff --git a/gp2gp-translator/src/main/java/uk/nhs/adaptors/pss/translator/storage/AWSStorageService.java b/gp2gp-translator/src/main/java/uk/nhs/adaptors/pss/translator/storage/AWSStorageService.java index 6dbe1f746..93ef0e14f 100644 --- a/gp2gp-translator/src/main/java/uk/nhs/adaptors/pss/translator/storage/AWSStorageService.java +++ b/gp2gp-translator/src/main/java/uk/nhs/adaptors/pss/translator/storage/AWSStorageService.java @@ -6,7 +6,6 @@ import java.net.URL; import java.time.Duration; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; @@ -23,7 +22,6 @@ import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest; @Slf4j -@SuppressFBWarnings(value = "EI_EXPOSE_REP2", justification = "S3Client is immutable and thread-safe.") public class AWSStorageService implements StorageService { private static final long SIXTY_MINUTES = 60; diff --git a/gp2gp-translator/src/main/java/uk/nhs/adaptors/pss/translator/storage/AzureStorageService.java b/gp2gp-translator/src/main/java/uk/nhs/adaptors/pss/translator/storage/AzureStorageService.java index 17d4e4615..5d40496f4 100644 --- a/gp2gp-translator/src/main/java/uk/nhs/adaptors/pss/translator/storage/AzureStorageService.java +++ b/gp2gp-translator/src/main/java/uk/nhs/adaptors/pss/translator/storage/AzureStorageService.java @@ -6,19 +6,14 @@ import java.io.InputStream; import com.azure.storage.blob.BlobContainerClient; -import com.azure.storage.blob.BlobServiceClient; import com.azure.storage.blob.specialized.BlockBlobClient; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -@SuppressFBWarnings(value = "EI_EXPOSE_REP2", justification = "BlobServiceClient is immutable and thread-safe.") public class AzureStorageService implements StorageService { - private final BlobServiceClient blobServiceClient; - private final String containerName; + private final BlobContainerClient blobContainerClient; - public AzureStorageService(BlobServiceClient client, StorageServiceConfiguration config) { - blobServiceClient = client; - containerName = config.getContainerName(); + public AzureStorageService(BlobContainerClient client) { + blobContainerClient = client; } public void uploadFile(String filename, byte[] fileAsString) throws StorageException { @@ -35,23 +30,15 @@ public byte[] downloadFile(String filename) throws StorageException { } public void deleteFile(String filename) { - BlobContainerClient containerClient = createBlobContainerClient(); - BlockBlobClient blobClient = containerClient.getBlobClient(filename).getBlockBlobClient(); - blobClient.delete(); + createBlobBlockClient(filename).delete(); } public String getFileLocation(String filename) { - var blobClient = createBlobBlockClient(filename); - return blobClient.getBlobUrl(); - } - - private BlobContainerClient createBlobContainerClient() { - return blobServiceClient.getBlobContainerClient(containerName); + return createBlobBlockClient(filename).getBlobUrl(); } private BlockBlobClient createBlobBlockClient(String filename) { - BlobContainerClient containerClient = createBlobContainerClient(); - return containerClient.getBlobClient(filename).getBlockBlobClient(); + return blobContainerClient.getBlobClient(filename).getBlockBlobClient(); } private void addFileStringToMainContainer(String filename, byte[] fileAsString) throws StorageException, IOException { @@ -75,5 +62,4 @@ private ByteArrayOutputStream downloadFileToStream(String filename) throws Stora throw new StorageException("Failed to download blob from Azure Blob storage", e); } } - } diff --git a/gp2gp-translator/src/main/java/uk/nhs/adaptors/pss/translator/storage/StorageServiceConfig.java b/gp2gp-translator/src/main/java/uk/nhs/adaptors/pss/translator/storage/StorageServiceConfig.java index 63a14dc0d..fd53d8702 100644 --- a/gp2gp-translator/src/main/java/uk/nhs/adaptors/pss/translator/storage/StorageServiceConfig.java +++ b/gp2gp-translator/src/main/java/uk/nhs/adaptors/pss/translator/storage/StorageServiceConfig.java @@ -34,7 +34,9 @@ public class StorageServiceConfig { .credential(credentials) .buildClient(); - return new AzureStorageService(blobServiceClient, configuration); + var blobContainerClient = blobServiceClient.getBlobContainerClient(configuration.getContainerName()); + + return new AzureStorageService(blobContainerClient); } @Bean diff --git a/gp2gp-translator/src/test/java/uk/nhs/adaptors/pss/translator/storage/AzureStorageServiceTest.java b/gp2gp-translator/src/test/java/uk/nhs/adaptors/pss/translator/storage/AzureStorageServiceTest.java index 2d46d31f1..33cb93b6d 100644 --- a/gp2gp-translator/src/test/java/uk/nhs/adaptors/pss/translator/storage/AzureStorageServiceTest.java +++ b/gp2gp-translator/src/test/java/uk/nhs/adaptors/pss/translator/storage/AzureStorageServiceTest.java @@ -1,7 +1,6 @@ package uk.nhs.adaptors.pss.translator.storage; import com.azure.storage.blob.BlobContainerClient; -import com.azure.storage.blob.BlobServiceClient; import com.azure.storage.blob.models.BlobProperties; import com.azure.storage.blob.specialized.BlockBlobClient; import com.azure.storage.blob.BlobClient; @@ -25,15 +24,9 @@ @ExtendWith(MockitoExtension.class) public class AzureStorageServiceTest { - - private static final String CONTAINER_NAME = "container"; private static final String FILE_NAME = "testfile.txt"; private static final byte[] FILE_CONTENT = "mock-content".getBytes(StandardCharsets.UTF_8); - @Mock - private BlobServiceClient blobServiceClient; - @Mock - private StorageServiceConfiguration configuration; @Mock private BlobContainerClient blobContainerClient; @Mock @@ -47,19 +40,17 @@ public class AzureStorageServiceTest { @BeforeEach void setUp() { - when(configuration.getContainerName()).thenReturn(CONTAINER_NAME); - azureStorageService = new AzureStorageService(blobServiceClient, configuration); + azureStorageService = new AzureStorageService(blobContainerClient); } - private void mockBlobClientChain() { - when(blobServiceClient.getBlobContainerClient(CONTAINER_NAME)).thenReturn(blobContainerClient); + private void mockBlobContainerClientChain() { when(blobContainerClient.getBlobClient(FILE_NAME)).thenReturn(blobClient); when(blobClient.getBlockBlobClient()).thenReturn(blockBlobClient); } @Test void When_UploadFile_Expect_SuccessfullyUploadsToAzure() throws StorageException { - mockBlobClientChain(); + mockBlobContainerClientChain(); azureStorageService.uploadFile(FILE_NAME, FILE_CONTENT); @@ -68,7 +59,7 @@ void When_UploadFile_Expect_SuccessfullyUploadsToAzure() throws StorageException @Test void When_DownloadFile_Expect_SuccessfullyDownloadsFromAzure() throws StorageException { - mockBlobClientChain(); + mockBlobContainerClientChain(); when(blockBlobClient.getProperties()).thenReturn(blobProperties); when(blobProperties.getBlobSize()).thenReturn((long) FILE_CONTENT.length); @@ -85,7 +76,7 @@ void When_DownloadFile_Expect_SuccessfullyDownloadsFromAzure() throws StorageExc @Test void When_DeleteFile_Expect_SuccessfullyDeletesFromAzure() { - mockBlobClientChain(); + mockBlobContainerClientChain(); azureStorageService.deleteFile(FILE_NAME); @@ -94,7 +85,7 @@ void When_DeleteFile_Expect_SuccessfullyDeletesFromAzure() { @Test void When_GetFileLocation_Expect_ReturnsCorrectUrl() { - mockBlobClientChain(); + mockBlobContainerClientChain(); String expectedUrl = "https://azuremock.blob.core.windows.net/test-container/testfile.txt"; when(blockBlobClient.getBlobUrl()).thenReturn(expectedUrl);