From a4e77111892997684466079d0bce5eefe6dca472 Mon Sep 17 00:00:00 2001 From: Saijad Dhuka Date: Wed, 7 Dec 2022 14:22:28 -0600 Subject: [PATCH 1/4] fix: usermeta was persisted as empty in the database --- .../storage/s3/transfer/TransferDBTest.kt | 37 +++++++++++++++++++ .../storage/s3/transfer/TransferDB.kt | 29 +++++++++------ 2 files changed, 55 insertions(+), 11 deletions(-) diff --git a/aws-storage-s3/src/androidTest/java/com/amplifyframework/storage/s3/transfer/TransferDBTest.kt b/aws-storage-s3/src/androidTest/java/com/amplifyframework/storage/s3/transfer/TransferDBTest.kt index af7bdb3c29..ce16a49e20 100644 --- a/aws-storage-s3/src/androidTest/java/com/amplifyframework/storage/s3/transfer/TransferDBTest.kt +++ b/aws-storage-s3/src/androidTest/java/com/amplifyframework/storage/s3/transfer/TransferDBTest.kt @@ -19,7 +19,10 @@ import android.content.ContentValues import android.content.Context import android.net.Uri import androidx.test.core.app.ApplicationProvider +import com.amplifyframework.storage.ObjectMetadata import java.io.File +import java.sql.Date +import java.time.Instant import java.util.UUID import org.junit.After import org.junit.Assert @@ -91,6 +94,40 @@ open class TransferDBTest { } ?: Assert.fail("InsertedRecord is null") } + @Test + fun generateContentValuesForMultiPartUploadWithMetadata() { + val key = UUID.randomUUID().toString() + val expectedHttpExpiresDate = Date.from(Instant.now()) + val expectedExpirationDate = Date.from(Instant.EPOCH) + val restoreExpirationTime = Date.from(Instant.EPOCH) + val contentValues = arrayOfNulls(1) + contentValues[0] = transferDB.generateContentValuesForMultiPartUpload( + key, + bucketName, + key, + tempFile, + 0L, + 0, + null, + 1L, + 0, + ObjectMetadata( + userMetadata = mapOf("key1" to "value1"), + metaData = mutableMapOf("key1" to "value1"), + httpExpiresDate = expectedHttpExpiresDate, + expirationTime = expectedExpirationDate, + expirationTimeRuleId = "ruleId", + ongoingRestore = false, + restoreExpirationTime = restoreExpirationTime + ), + null + ) + val uri = transferDB.bulkInsertTransferRecords(contentValues) + transferDB.getTransferRecordById(uri).run { + assertEquals(mapOf("key1" to "value1"), this?.userMetadata) + } + } + @Test fun testMultiPartDelete() { val key = UUID.randomUUID().toString() diff --git a/aws-storage-s3/src/main/java/com/amplifyframework/storage/s3/transfer/TransferDB.kt b/aws-storage-s3/src/main/java/com/amplifyframework/storage/s3/transfer/TransferDB.kt index f069908202..da870b13cf 100644 --- a/aws-storage-s3/src/main/java/com/amplifyframework/storage/s3/transfer/TransferDB.kt +++ b/aws-storage-s3/src/main/java/com/amplifyframework/storage/s3/transfer/TransferDB.kt @@ -749,19 +749,26 @@ internal class TransferDB private constructor(context: Context) { val values = ContentValues() metadata?.let { values.apply { - TransferTable.COLUMN_USER_METADATA to JsonUtils.mapToString(it.userMetadata) - TransferTable.COLUMN_HEADER_CONTENT_TYPE to it.metaData[ObjectMetadata.CONTENT_TYPE].toString() - TransferTable.COLUMN_HEADER_CONTENT_ENCODING to it.metaData[ObjectMetadata.CONTENT_ENCODING].toString() - TransferTable.COLUMN_HEADER_CACHE_CONTROL to it.metaData[ObjectMetadata.CACHE_CONTROL].toString() - TransferTable.COLUMN_CONTENT_MD5 to it.metaData[ObjectMetadata.CONTENT_MD5].toString() - TransferTable.COLUMN_HEADER_CONTENT_DISPOSITION to + put(TransferTable.COLUMN_USER_METADATA, JsonUtils.mapToString(it.userMetadata)) + put(TransferTable.COLUMN_HEADER_CONTENT_TYPE, it.metaData[ObjectMetadata.CONTENT_TYPE].toString()) + put( + TransferTable.COLUMN_HEADER_CONTENT_ENCODING, + it.metaData[ObjectMetadata.CONTENT_ENCODING].toString() + ) + put(TransferTable.COLUMN_HEADER_CACHE_CONTROL, it.metaData[ObjectMetadata.CACHE_CONTROL].toString()) + put(TransferTable.COLUMN_CONTENT_MD5, it.metaData[ObjectMetadata.CONTENT_MD5].toString()) + put( + TransferTable.COLUMN_HEADER_CONTENT_DISPOSITION, it.metaData[ObjectMetadata.CONTENT_DISPOSITION].toString() - TransferTable.COLUMN_SSE_ALGORITHM to it.metaData[ObjectMetadata.SERVER_SIDE_ENCRYPTION].toString() - TransferTable.COLUMN_SSE_KMS_KEY to + ) + put(TransferTable.COLUMN_SSE_ALGORITHM, it.metaData[ObjectMetadata.SERVER_SIDE_ENCRYPTION].toString()) + put( + TransferTable.COLUMN_SSE_KMS_KEY, it.metaData[ObjectMetadata.SERVER_SIDE_ENCRYPTION_KMS_KEY_ID].toString() - TransferTable.COLUMN_EXPIRATION_TIME_RULE_ID to it.expirationTimeRuleId - TransferTable.COLUMN_HTTP_EXPIRES_DATE to it.httpExpiresDate?.time.toString() - TransferTable.COLUMN_HEADER_STORAGE_CLASS to it.metaData[ObjectMetadata.STORAGE_CLASS].toString() + ) + put(TransferTable.COLUMN_EXPIRATION_TIME_RULE_ID, it.expirationTimeRuleId) + put(TransferTable.COLUMN_HTTP_EXPIRES_DATE, it.httpExpiresDate?.time) + put(TransferTable.COLUMN_HEADER_STORAGE_CLASS, it.metaData[ObjectMetadata.STORAGE_CLASS].toString()) } } return values From 89b30a51c534bf417b354b05ccf49c6763e6feea Mon Sep 17 00:00:00 2001 From: Saijad Dhuka Date: Wed, 7 Dec 2022 16:49:21 -0600 Subject: [PATCH 2/4] fix compilation error --- .../com/amplifyframework/storage/s3/transfer/TransferDBTest.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/aws-storage-s3/src/androidTest/java/com/amplifyframework/storage/s3/transfer/TransferDBTest.kt b/aws-storage-s3/src/androidTest/java/com/amplifyframework/storage/s3/transfer/TransferDBTest.kt index ce16a49e20..1b16add487 100644 --- a/aws-storage-s3/src/androidTest/java/com/amplifyframework/storage/s3/transfer/TransferDBTest.kt +++ b/aws-storage-s3/src/androidTest/java/com/amplifyframework/storage/s3/transfer/TransferDBTest.kt @@ -26,6 +26,7 @@ import java.time.Instant import java.util.UUID import org.junit.After import org.junit.Assert +import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test From a9c7e8319c9b5ba5f116c6148d657ab737b57d8e Mon Sep 17 00:00:00 2001 From: Saijad Dhuka Date: Wed, 7 Dec 2022 17:07:50 -0600 Subject: [PATCH 3/4] fix compilation error --- .../com/amplifyframework/storage/s3/transfer/TransferDBTest.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/aws-storage-s3/src/androidTest/java/com/amplifyframework/storage/s3/transfer/TransferDBTest.kt b/aws-storage-s3/src/androidTest/java/com/amplifyframework/storage/s3/transfer/TransferDBTest.kt index 1b16add487..3b684d7b58 100644 --- a/aws-storage-s3/src/androidTest/java/com/amplifyframework/storage/s3/transfer/TransferDBTest.kt +++ b/aws-storage-s3/src/androidTest/java/com/amplifyframework/storage/s3/transfer/TransferDBTest.kt @@ -26,7 +26,6 @@ import java.time.Instant import java.util.UUID import org.junit.After import org.junit.Assert -import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -125,7 +124,7 @@ open class TransferDBTest { ) val uri = transferDB.bulkInsertTransferRecords(contentValues) transferDB.getTransferRecordById(uri).run { - assertEquals(mapOf("key1" to "value1"), this?.userMetadata) + Assert.assertEquals(mapOf("key1" to "value1"), this?.userMetadata) } } From 69243239ca32d0fa408fc522fd67ef58b3e809f3 Mon Sep 17 00:00:00 2001 From: Saijad Dhuka Date: Thu, 8 Dec 2022 11:50:39 -0600 Subject: [PATCH 4/4] avoid adding metadata if it is null --- .../storage/s3/transfer/TransferDBTest.kt | 1 + .../storage/s3/transfer/TransferDB.kt | 51 +++++++++++-------- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/aws-storage-s3/src/androidTest/java/com/amplifyframework/storage/s3/transfer/TransferDBTest.kt b/aws-storage-s3/src/androidTest/java/com/amplifyframework/storage/s3/transfer/TransferDBTest.kt index 3b684d7b58..4937f389f0 100644 --- a/aws-storage-s3/src/androidTest/java/com/amplifyframework/storage/s3/transfer/TransferDBTest.kt +++ b/aws-storage-s3/src/androidTest/java/com/amplifyframework/storage/s3/transfer/TransferDBTest.kt @@ -125,6 +125,7 @@ open class TransferDBTest { val uri = transferDB.bulkInsertTransferRecords(contentValues) transferDB.getTransferRecordById(uri).run { Assert.assertEquals(mapOf("key1" to "value1"), this?.userMetadata) + Assert.assertNull(this?.headerStorageClass) } } diff --git a/aws-storage-s3/src/main/java/com/amplifyframework/storage/s3/transfer/TransferDB.kt b/aws-storage-s3/src/main/java/com/amplifyframework/storage/s3/transfer/TransferDB.kt index da870b13cf..09fa778a4f 100644 --- a/aws-storage-s3/src/main/java/com/amplifyframework/storage/s3/transfer/TransferDB.kt +++ b/aws-storage-s3/src/main/java/com/amplifyframework/storage/s3/transfer/TransferDB.kt @@ -745,30 +745,41 @@ internal class TransferDB private constructor(context: Context) { * with * @return the ContentValues */ - private fun generateContentValuesForObjectMetadata(metadata: ObjectMetadata?): ContentValues? { + private fun generateContentValuesForObjectMetadata(metadata: ObjectMetadata?): ContentValues { val values = ContentValues() metadata?.let { values.apply { put(TransferTable.COLUMN_USER_METADATA, JsonUtils.mapToString(it.userMetadata)) - put(TransferTable.COLUMN_HEADER_CONTENT_TYPE, it.metaData[ObjectMetadata.CONTENT_TYPE].toString()) - put( - TransferTable.COLUMN_HEADER_CONTENT_ENCODING, - it.metaData[ObjectMetadata.CONTENT_ENCODING].toString() - ) - put(TransferTable.COLUMN_HEADER_CACHE_CONTROL, it.metaData[ObjectMetadata.CACHE_CONTROL].toString()) - put(TransferTable.COLUMN_CONTENT_MD5, it.metaData[ObjectMetadata.CONTENT_MD5].toString()) - put( - TransferTable.COLUMN_HEADER_CONTENT_DISPOSITION, - it.metaData[ObjectMetadata.CONTENT_DISPOSITION].toString() - ) - put(TransferTable.COLUMN_SSE_ALGORITHM, it.metaData[ObjectMetadata.SERVER_SIDE_ENCRYPTION].toString()) - put( - TransferTable.COLUMN_SSE_KMS_KEY, - it.metaData[ObjectMetadata.SERVER_SIDE_ENCRYPTION_KMS_KEY_ID].toString() - ) - put(TransferTable.COLUMN_EXPIRATION_TIME_RULE_ID, it.expirationTimeRuleId) - put(TransferTable.COLUMN_HTTP_EXPIRES_DATE, it.httpExpiresDate?.time) - put(TransferTable.COLUMN_HEADER_STORAGE_CLASS, it.metaData[ObjectMetadata.STORAGE_CLASS].toString()) + it.metaData[ObjectMetadata.CONTENT_TYPE]?.let { + put(TransferTable.COLUMN_HEADER_CONTENT_TYPE, it.toString()) + } + it.metaData[ObjectMetadata.CONTENT_ENCODING]?.let { + put(TransferTable.COLUMN_HEADER_CONTENT_ENCODING, it.toString()) + } + it.metaData[ObjectMetadata.CACHE_CONTROL]?.let { + put(TransferTable.COLUMN_HEADER_CACHE_CONTROL, it.toString()) + } + it.metaData[ObjectMetadata.CONTENT_MD5]?.let { + put(TransferTable.COLUMN_CONTENT_MD5, it.toString()) + } + it.metaData[ObjectMetadata.CONTENT_DISPOSITION]?.let { + put(TransferTable.COLUMN_HEADER_CONTENT_DISPOSITION, it.toString()) + } + it.metaData[ObjectMetadata.SERVER_SIDE_ENCRYPTION]?.let { + put(TransferTable.COLUMN_SSE_ALGORITHM, it.toString()) + } + it.metaData[ObjectMetadata.SERVER_SIDE_ENCRYPTION_KMS_KEY_ID]?.let { + put(TransferTable.COLUMN_SSE_KMS_KEY, it.toString()) + } + it.expirationTimeRuleId?.let { + put(TransferTable.COLUMN_EXPIRATION_TIME_RULE_ID, it) + } + it.httpExpiresDate?.let { + put(TransferTable.COLUMN_HTTP_EXPIRES_DATE, it.time) + } + it.metaData[ObjectMetadata.STORAGE_CLASS]?.let { + put(TransferTable.COLUMN_HEADER_STORAGE_CLASS, it.toString()) + } } } return values