Skip to content

Commit fa05a20

Browse files
pzavadskaminbi
authored andcommitted
Resolving issue #375 StorageClass header is not added to upload request (#398)
1 parent 769472b commit fa05a20

File tree

9 files changed

+187
-120
lines changed

9 files changed

+187
-120
lines changed

aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/TransferDBUtil.java

Lines changed: 38 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ public Uri insertSingleTransferRecord(TransferType type, String bucket, String k
119119
*/
120120
public Uri insertSingleTransferRecord(TransferType type, String bucket, String key, File file,
121121
ObjectMetadata metadata, CannedAccessControlList cannedAcl) {
122-
final ContentValues values = generateContentValuesForSinglePartTransfer(type, bucket, key, file,
122+
final ContentValues values = generateContentValuesForSinglePartTransfer(type, bucket, key,
123+
file,
123124
metadata, cannedAcl);
124125
return transferDBBase.insert(transferDBBase.getContentUri(), values);
125126
}
@@ -195,9 +196,9 @@ public int updateBytesTotalForDownload(int id, long bytes) {
195196
* Updates the state but do not notify TransferService to refresh its
196197
* transfer record list. Therefore, only TransferObserver knows the state
197198
* change of the transfer record. If the new state is STATE_FAILED, we need
198-
* to check the original state, because "pause", "cancel" and
199-
* "disconnect network" actions may also cause failure message of the
200-
* threads, but these are not actual failure of transfers.
199+
* to check the original state, because "pause", "cancel" and "disconnect
200+
* network" actions may also cause failure message of the threads, but these
201+
* are not actual failure of transfers.
201202
*
202203
* @param id The id of the transfer.
203204
* @param state The new state of the transfer.
@@ -209,12 +210,12 @@ public int updateState(int id, TransferState state) {
209210
if (TransferState.FAILED.equals(state)) {
210211
return transferDBBase.update(getRecordUri(id), values, TransferTable.COLUMN_STATE
211212
+ " not in (?,?,?,?,?) ", new String[] {
212-
TransferState.COMPLETED.toString(),
213-
TransferState.PENDING_NETWORK_DISCONNECT.toString(),
214-
TransferState.PAUSED.toString(),
215-
TransferState.CANCELED.toString(),
216-
TransferState.WAITING_FOR_NETWORK.toString()
217-
});
213+
TransferState.COMPLETED.toString(),
214+
TransferState.PENDING_NETWORK_DISCONNECT.toString(),
215+
TransferState.PAUSED.toString(),
216+
TransferState.CANCELED.toString(),
217+
TransferState.WAITING_FOR_NETWORK.toString()
218+
});
218219
} else {
219220
return transferDBBase.update(getRecordUri(id), values, null, null);
220221
}
@@ -275,11 +276,12 @@ public int updateNetworkDisconnected() {
275276
TransferState.PENDING_NETWORK_DISCONNECT.toString());
276277
return transferDBBase.update(transferDBBase.getContentUri(), values,
277278
TransferTable.COLUMN_STATE
278-
+ " in (?,?,?)", new String[] {
279+
+ " in (?,?,?)",
280+
new String[] {
279281
TransferState.IN_PROGRESS.toString(),
280282
TransferState.RESUMED_WAITING.toString(),
281283
TransferState.WAITING.toString()
282-
});
284+
});
283285
}
284286

285287
/**
@@ -293,10 +295,11 @@ public int updateNetworkConnected() {
293295
values.put(TransferTable.COLUMN_STATE, TransferState.RESUMED_WAITING.toString());
294296
return transferDBBase.update(transferDBBase.getContentUri(), values,
295297
TransferTable.COLUMN_STATE
296-
+ " in (?,?)", new String[] {
298+
+ " in (?,?)",
299+
new String[] {
297300
TransferState.PENDING_NETWORK_DISCONNECT.toString(),
298301
TransferState.WAITING_FOR_NETWORK.toString()
299-
});
302+
});
300303
}
301304

302305
/**
@@ -318,7 +321,7 @@ public int setAllRunningRecordsToPausedBeforeShutdownService() {
318321
TransferState.PENDING_PAUSE.toString(),
319322
TransferState.RESUMED_WAITING.toString(),
320323
TransferState.WAITING.toString()
321-
});
324+
});
322325
}
323326

324327
/**
@@ -403,7 +406,7 @@ public Cursor queryAllTransfersWithType(TransferType type) {
403406
} else {
404407
return transferDBBase.query(transferDBBase.getContentUri(), null,
405408
TransferTable.COLUMN_TYPE + "=?", new String[] {
406-
type.toString()
409+
type.toString()
407410
}, null);
408411
}
409412
}
@@ -423,7 +426,7 @@ public Cursor queryTransfersWithTypeAndState(TransferType type, TransferState st
423426
} else {
424427
return transferDBBase.query(getStateUri(state), null, TransferTable.COLUMN_TYPE + "=?",
425428
new String[] {
426-
type.toString()
429+
type.toString()
427430
}, null);
428431
}
429432
}
@@ -436,7 +439,7 @@ public Cursor queryTransfersWithTypeAndState(TransferType type, TransferState st
436439
* @return A Cursor pointing to records in the database in any of the given states.
437440
*/
438441
public Cursor queryTransfersWithTypeAndStates(TransferType type,
439-
TransferState[] states) {
442+
TransferState[] states) {
440443
final String selection;
441444
final String[] selectionArgs;
442445
int index = 0;
@@ -487,7 +490,8 @@ public long queryBytesTransferredByMainUploadId(int mainUploadId) {
487490
try {
488491
c = transferDBBase.query(getPartUri(mainUploadId), null, null, null, null);
489492
while (c.moveToNext()) {
490-
final String state = c.getString(c.getColumnIndexOrThrow(TransferTable.COLUMN_STATE));
493+
final String state = c
494+
.getString(c.getColumnIndexOrThrow(TransferTable.COLUMN_STATE));
491495
if (TransferState.PART_COMPLETED.equals(TransferState.getState(state))) {
492496
bytesTotal += c.getLong(c
493497
.getColumnIndexOrThrow(TransferTable.COLUMN_BYTES_TOTAL));
@@ -564,7 +568,8 @@ public List<UploadPartRequest> getNonCompletedPartRequestsFromDB(int mainUploadI
564568
.withId(c.getInt(c.getColumnIndexOrThrow(TransferTable.COLUMN_ID)))
565569
.withMainUploadId(
566570
c.getInt(c
567-
.getColumnIndexOrThrow(TransferTable.COLUMN_MAIN_UPLOAD_ID)))
571+
.getColumnIndexOrThrow(
572+
TransferTable.COLUMN_MAIN_UPLOAD_ID)))
568573
.withBucketName(
569574
c.getString(c
570575
.getColumnIndexOrThrow(TransferTable.COLUMN_BUCKET_NAME)))
@@ -573,11 +578,13 @@ public List<UploadPartRequest> getNonCompletedPartRequestsFromDB(int mainUploadI
573578
.withFile(new File(
574579
c.getString(c.getColumnIndexOrThrow(TransferTable.COLUMN_FILE))))
575580
.withFileOffset(
576-
c.getLong(c.getColumnIndexOrThrow(TransferTable.COLUMN_FILE_OFFSET)))
581+
c.getLong(
582+
c.getColumnIndexOrThrow(TransferTable.COLUMN_FILE_OFFSET)))
577583
.withPartNumber(
578584
c.getInt(c.getColumnIndexOrThrow(TransferTable.COLUMN_PART_NUM)))
579585
.withPartSize(
580-
c.getLong(c.getColumnIndexOrThrow(TransferTable.COLUMN_BYTES_TOTAL)))
586+
c.getLong(
587+
c.getColumnIndexOrThrow(TransferTable.COLUMN_BYTES_TOTAL)))
581588
.withLastPart(1 == c.getInt(c
582589
.getColumnIndexOrThrow(TransferTable.COLUMN_IS_LAST_PART)));
583590
list.add(putPartRequest);
@@ -591,8 +598,8 @@ public List<UploadPartRequest> getNonCompletedPartRequestsFromDB(int mainUploadI
591598
}
592599

593600
/**
594-
* Queries waiting for network partUpload tasks of a multipart upload and returns
595-
* true if one such partUpload tasks
601+
* Queries waiting for network partUpload tasks of a multipart upload and
602+
* returns true if one such partUpload tasks
596603
*
597604
* @param mainUploadId The mainUploadId of a multipart upload task
598605
* @return If a partUpload task waiting for network exist
@@ -602,7 +609,8 @@ public boolean checkWaitingForNetworkPartRequestsFromDB(int mainUploadId) {
602609
Cursor c = null;
603610

604611
try {
605-
c = transferDBBase.query(getPartUri(mainUploadId), null, TransferTable.COLUMN_STATE + "=?",
612+
c = transferDBBase.query(getPartUri(mainUploadId), null,
613+
TransferTable.COLUMN_STATE + "=?",
606614
new String[] {
607615
TransferState.WAITING_FOR_NETWORK.toString()
608616
}, null);
@@ -703,11 +711,15 @@ private ContentValues generateContentValuesForObjectMetadata(ObjectMetadata meta
703711
metadata.getContentDisposition());
704712
values.put(TransferTable.COLUMN_SSE_ALGORITHM, metadata.getSSEAlgorithm());
705713
values.put(TransferTable.COLUMN_SSE_KMS_KEY, metadata.getSSEAwsKmsKeyId());
706-
values.put(TransferTable.COLUMN_EXPIRATION_TIME_RULE_ID, metadata.getExpirationTimeRuleId());
714+
values.put(TransferTable.COLUMN_EXPIRATION_TIME_RULE_ID,
715+
metadata.getExpirationTimeRuleId());
707716
if (metadata.getHttpExpiresDate() != null) {
708717
values.put(TransferTable.COLUMN_HTTP_EXPIRES_DATE,
709718
String.valueOf(metadata.getHttpExpiresDate().getTime()));
710719
}
720+
if (metadata.getStorageClass() != null) {
721+
values.put(TransferTable.COLUMN_HEADER_STORAGE_CLASS, metadata.getStorageClass());
722+
}
711723

712724
return values;
713725
}
@@ -816,4 +828,3 @@ static TransferDBBase getTransferDBBase() {
816828
return transferDBBase;
817829
}
818830
}
819-

aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/TransferDatabaseHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
class TransferDatabaseHelper extends SQLiteOpenHelper {
2323

2424
private static final String DATABASE_NAME = "awss3transfertable.db";
25-
private static final int DATABASE_VERSION = 4;
25+
private static final int DATABASE_VERSION = 5;
2626

2727
private int version;
2828

aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/TransferRecord.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class TransferRecord {
6868
public String headerContentEncoding;
6969
public String headerCacheControl;
7070
public String headerExpire;
71+
public String headerStorageClass;
7172

7273
/**
7374
* The following were added in 2.2.6 to support object metdata
@@ -147,6 +148,8 @@ public void updateFromDB(Cursor c) {
147148
this.sseKMSKey = c.getString(c.getColumnIndexOrThrow(TransferTable.COLUMN_SSE_KMS_KEY));
148149
this.md5 = c.getString(c.getColumnIndexOrThrow(TransferTable.COLUMN_CONTENT_MD5));
149150
this.cannedAcl = c.getString(c.getColumnIndexOrThrow(TransferTable.COLUMN_CANNED_ACL));
151+
this.headerStorageClass = c
152+
.getString(c.getColumnIndexOrThrow(TransferTable.COLUMN_HEADER_STORAGE_CLASS));
150153
}
151154

152155
/**
@@ -287,7 +290,8 @@ public String toString() {
287290
.append("isLastPart:").append(isLastPart).append(",")
288291
.append("partNumber:").append(partNumber).append(",")
289292
.append("multipartId:").append(multipartId).append(",")
290-
.append("eTag:").append(eTag)
293+
.append("eTag:").append(eTag).append(",")
294+
.append("storageClass:").append(headerStorageClass)
291295
.append("]");
292296
return sb.toString();
293297
}

aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/TransferTable.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,11 @@ class TransferTable {
153153
*/
154154
public static final String COLUMN_HEADER_CACHE_CONTROL = "header_cache_control";
155155

156+
/**
157+
* User specified storage class
158+
*/
159+
public static final String COLUMN_HEADER_STORAGE_CLASS = "header_storage_class";
160+
156161
/**
157162
* ============ Below added in 2.2.6 for support for metadata ============
158163
*/
@@ -244,6 +249,7 @@ public static void onCreate(SQLiteDatabase database, int version) {
244249
private static final int TABLE_VERSION_2 = 2;
245250
private static final int TABLE_VERSION_3 = 3;
246251
private static final int TABLE_VERSION_4 = 4;
252+
private static final int TABLE_VERSION_5 = 5;
247253

248254
/**
249255
* Upgrades the database.
@@ -264,6 +270,9 @@ public static void onUpgrade(SQLiteDatabase database, int oldVersion,
264270
if (oldVersion < TABLE_VERSION_4 && newVersion >= TABLE_VERSION_4) {
265271
addVersion4Columns(database);
266272
}
273+
if (oldVersion < TABLE_VERSION_5 && newVersion >= TABLE_VERSION_5) {
274+
addVersion5Columns(database);
275+
}
267276
}
268277

269278
/**
@@ -297,11 +306,20 @@ private static void addVersion3Columns(SQLiteDatabase database) {
297306
}
298307

299308
/**
300-
* Adds columns that were introduced in version 3 to the database
309+
* Adds columns that were introduced in version 4 to the database
301310
*/
302311
private static void addVersion4Columns(SQLiteDatabase database) {
303312
final String addCannedAcl = "ALTER TABLE " + TABLE_TRANSFER +
304313
" ADD COLUMN " + COLUMN_CANNED_ACL + " text;";
305314
database.execSQL(addCannedAcl);
306315
}
316+
317+
/**
318+
* Adds columns that were introduced in version 5 to the database
319+
*/
320+
private static void addVersion5Columns(SQLiteDatabase database) {
321+
final String addCannedAcl = "ALTER TABLE " + TABLE_TRANSFER +
322+
" ADD COLUMN " + COLUMN_HEADER_STORAGE_CLASS + " text;";
323+
database.execSQL(addCannedAcl);
324+
}
307325
}

aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/UploadTask.java

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515

1616
package com.amazonaws.mobileconnectors.s3.transferutility;
1717

18-
1918
import com.amazonaws.AmazonClientException;
2019
import com.amazonaws.mobileconnectors.s3.transferutility.TransferService.NetworkInfoReceiver;
2120
import com.amazonaws.retry.RetryUtils;
@@ -122,14 +121,16 @@ private Boolean uploadMultipartAndWaitForCompletion() throws ExecutionException
122121
}
123122
updater.updateProgress(upload.id, bytesAlreadyTransferrd, upload.bytesTotal);
124123

125-
final List<UploadPartRequest> requestList = dbUtil.getNonCompletedPartRequestsFromDB(upload.id,
124+
final List<UploadPartRequest> requestList = dbUtil.getNonCompletedPartRequestsFromDB(
125+
upload.id,
126126
upload.multipartId);
127127
LOGGER.debug("multipart upload " + upload.id + " in " + requestList.size() + " parts.");
128128
final ArrayList<Future<Boolean>> futures = new ArrayList<Future<Boolean>>();
129129
for (final UploadPartRequest request : requestList) {
130130
TransferUtility.appendMultipartTransferServiceUserAgentString(request);
131131
request.setGeneralProgressListener(updater.newProgressListener(upload.id));
132-
futures.add(TransferThreadPool.submitTask(new UploadPartTask(request, s3, dbUtil, networkInfo)));
132+
futures.add(TransferThreadPool
133+
.submitTask(new UploadPartTask(request, s3, dbUtil, networkInfo)));
133134
}
134135
try {
135136
boolean isSuccess = true;
@@ -161,10 +162,12 @@ private Boolean uploadMultipartAndWaitForCompletion() throws ExecutionException
161162
// handle pause, cancel, etc
162163
boolean isNetworkInterrupted = false;
163164
if (ee.getCause() != null && ee.getCause() instanceof Exception) {
164-
// check for network interruption and pause the transfer instead of failing them
165+
// check for network interruption and pause the transfer instead
166+
// of failing them
165167
isNetworkInterrupted = dbUtil.checkWaitingForNetworkPartRequestsFromDB(upload.id);
166168
if (isNetworkInterrupted) {
167-
LOGGER.debug("Network Connection Interrupted: Transfer " + upload.id + " waits for network");
169+
LOGGER.debug("Network Connection Interrupted: Transfer " + upload.id
170+
+ " waits for network");
168171
updater.updateState(upload.id, TransferState.WAITING_FOR_NETWORK);
169172
return false;
170173
}
@@ -225,8 +228,10 @@ private Boolean uploadSinglePartAndWaitForCompletion() {
225228
return false;
226229
} else if (e.getCause() != null && e.getCause() instanceof AmazonClientException
227230
&& !networkInfo.isNetworkConnected()) {
228-
// check for network interruption and pause the transfer instead of failing them
229-
LOGGER.debug("Network Connection Interrupted: Transfer " + upload.id + " waits for network");
231+
// check for network interruption and pause the transfer instead
232+
// of failing them
233+
LOGGER.debug("Network Connection Interrupted: Transfer " + upload.id
234+
+ " waits for network");
230235
updater.updateState(upload.id, TransferState.WAITING_FOR_NETWORK);
231236
return false;
232237
} else if (e.getCause() != null && e.getCause() instanceof IOException
@@ -245,7 +250,8 @@ private Boolean uploadSinglePartAndWaitForCompletion() {
245250
private void completeMultiPartUpload(int mainUploadId, String bucket,
246251
String key, String multipartId) {
247252
final List<PartETag> partETags = dbUtil.queryPartETagsOfUpload(mainUploadId);
248-
final CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest(bucket,
253+
final CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest(
254+
bucket,
249255
key, multipartId, partETags);
250256
TransferUtility.appendMultipartTransferServiceUserAgentString(completeRequest);
251257
s3.completeMultipartUpload(completeRequest);
@@ -261,13 +267,14 @@ private String initiateMultipartUpload(PutObjectRequest putObjectRequest) {
261267
InitiateMultipartUploadRequest initiateMultipartUploadRequest = null;
262268
initiateMultipartUploadRequest = new InitiateMultipartUploadRequest(
263269
putObjectRequest.getBucketName(), putObjectRequest.getKey())
264-
.withCannedACL(putObjectRequest.getCannedAcl())
265-
.withObjectMetadata(putObjectRequest.getMetadata())
266-
.withSSEAwsKeyManagementParams(
270+
.withCannedACL(putObjectRequest.getCannedAcl())
271+
.withObjectMetadata(putObjectRequest.getMetadata())
272+
.withSSEAwsKeyManagementParams(
267273
putObjectRequest.getSSEAwsKeyManagementParams());
268274
TransferUtility
269275
.appendMultipartTransferServiceUserAgentString(initiateMultipartUploadRequest);
270-
final String uploadId = s3.initiateMultipartUpload(initiateMultipartUploadRequest).getUploadId();
276+
final String uploadId = s3.initiateMultipartUpload(initiateMultipartUploadRequest)
277+
.getUploadId();
271278
return uploadId;
272279
}
273280

@@ -301,6 +308,9 @@ private PutObjectRequest createPutObjectRequest(TransferRecord upload) {
301308
} else {
302309
om.setContentType(Mimetypes.getInstance().getMimetype(file));
303310
}
311+
if (upload.headerStorageClass != null) {
312+
putObjectRequest.setStorageClass(upload.headerStorageClass);
313+
}
304314
if (upload.expirationTimeRuleId != null) {
305315
om.setExpirationTimeRuleId(upload.expirationTimeRuleId);
306316
}
@@ -320,7 +330,6 @@ private PutObjectRequest createPutObjectRequest(TransferRecord upload) {
320330
putObjectRequest
321331
.setSSEAwsKeyManagementParams(new SSEAwsKeyManagementParams(upload.sseKMSKey));
322332
}
323-
324333
putObjectRequest.setMetadata(om);
325334
putObjectRequest.setCannedAcl(getCannedAclFromString(upload.cannedAcl));
326335

0 commit comments

Comments
 (0)