package com.amazonaws.bigdatablog.s3index;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.dynamodbv2.model.ScanRequest;
import com.amazonaws.services.dynamodbv2.model.ScanResult;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.ObjectListing;
import com.amazonaws.services.s3.model.S3ObjectSummary;
public class VerifyIndex {
private static final AmazonS3 S3 = new AmazonS3Client();
private static final AmazonDynamoDB DDB = new AmazonDynamoDBClient();
private final SortedSet<String> bucketKeys = new TreeSet<>();
private final SortedSet<String> indexKeys = new TreeSet<>();
public static void main(String[] args) {
final VerifyIndex verify = new VerifyIndex();
verify.verify();
}
private void verify() {
fetchObjectList();
fetchIndexList();
final String[] bucketArr = bucketKeys.toArray(new String[bucketKeys.size()]);
final String[] indexArr = indexKeys.toArray(new String[indexKeys.size()]);
int i = 0;
int j = 0;
while (i < bucketArr.length && j < indexArr.length) {
final String bucketKey = bucketArr[i];
final String indexKey = indexArr[j];
final int cmp = bucketKey.compareTo(indexKey);
if (cmp == 0) {
i++;
j++;
} else if (cmp > 0) {
System.err.println("Index contains key " + indexKey + " which is missing from bucket");
j++;
} else {
System.err.println("Bucket contains key " + bucketKey + " which is missing from index");
i++;
}
}
for (; i < bucketArr.length; i++) {
System.err.println("Bucket contains key " + bucketArr[i] + " which is missing from index");
}
for (; j < indexArr.length; j++) {
System.err.println("Index contains key " + indexArr[j] + " which is missing from bucket");
}
}
private void fetchIndexList() {
final ScanRequest req = new ScanRequest("s3-index-example.mikedeck-index").withAttributesToGet("Key");
ScanResult result = DDB.scan(req);
addIndexItems(result.getItems());
while (result.getLastEvaluatedKey() != null && !result.getLastEvaluatedKey().isEmpty()) {
req.setExclusiveStartKey(result.getLastEvaluatedKey());
result = DDB.scan(req);
addIndexItems(result.getItems());
}
}
private void addIndexItems(List<Map<String, AttributeValue>> items) {
items.stream().forEach(i -> indexKeys.add(i.get("Key").getS()));
}
private void fetchObjectList() {
ObjectListing objects = S3.listObjects("s3-index-example.mikedeck");
addSummaries(objects.getObjectSummaries());
while (objects.isTruncated()) {
objects = S3.listNextBatchOfObjects(objects);
addSummaries(objects.getObjectSummaries());
}
}
private void addSummaries(final List<S3ObjectSummary> summaries) {
for (final S3ObjectSummary summary : summaries) {
bucketKeys.add(summary.getKey());
}
}
}