/**
* Copyright 2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with
* the License. A copy of the License is located at
*
* http://aws.amazon.com/apache2.0/
*
* or in the "LICENSE" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
* and limitations under the License.
*/
package awslabs.lab22;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.model.AttributeDefinition;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.dynamodbv2.model.AttributeValueUpdate;
import com.amazonaws.services.dynamodbv2.model.Condition;
import com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
import com.amazonaws.services.dynamodbv2.model.DeleteTableRequest;
import com.amazonaws.services.dynamodbv2.model.DescribeTableRequest;
import com.amazonaws.services.dynamodbv2.model.DescribeTableResult;
import com.amazonaws.services.dynamodbv2.model.ExpectedAttributeValue;
import com.amazonaws.services.dynamodbv2.model.KeySchemaElement;
import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
import com.amazonaws.services.dynamodbv2.model.PutItemRequest;
import com.amazonaws.services.dynamodbv2.model.QueryRequest;
import com.amazonaws.services.dynamodbv2.model.QueryResult;
import com.amazonaws.services.dynamodbv2.model.TableDescription;
import com.amazonaws.services.dynamodbv2.model.UpdateItemRequest;
/**
* Project: Lab2.2
*/
public abstract class SolutionCode implements ILabCode, IOptionalLabCode {
@Override
public void createAccountItem(AmazonDynamoDBClient ddbClient, String tableName, Account account) {
// Create a HashMap<String, AttributeValue> object to hold the attributes of the item to add.
Map<String, AttributeValue> itemAttributes = new HashMap<String, AttributeValue>();
// Add the required items (Company and Email) from the account parameter to the attribute HashMap.
itemAttributes.put("Company", new AttributeValue().withS(account.getCompany()));
itemAttributes.put("Email", new AttributeValue().withS(account.getEmail()));
// Check the account parameter and add all values that aren't empty strings ("") to the attribute HashMap.
if (!account.getFirst().equals("")) {
itemAttributes.put("First", new AttributeValue().withS(account.getFirst()));
}
if (!account.getLast().equals("")) {
itemAttributes.put("Last", new AttributeValue().withS(account.getLast()));
}
if (!account.getAge().equals("")) {
itemAttributes.put("Age", new AttributeValue().withN(account.getAge()));
}
// Construct a PutItemRequest object to put the attributes into the specified table.
PutItemRequest putItemRequest = new PutItemRequest().withTableName(tableName).withItem(itemAttributes);
// Submit the request using the putItem method of the ddbClient object.
ddbClient.putItem(putItemRequest);
}
@Override
public QueryResult lookupByHashKey(AmazonDynamoDBClient ddbClient, String tableName, String company) {
// Construct an AttributeValue object containing the provided company name.
AttributeValue attributeValue = new AttributeValue().withS(company);
// Construct a Condition object containing the desired comparison ("EQ") and the attribute value
// containing the company name.
Condition condition = new Condition().withComparisonOperator("EQ").withAttributeValueList(attributeValue);
// Construct a QueryRequest object that performs a consistent read on the specified table for the
// previously constructed condition.
QueryRequest queryRequest = new QueryRequest().withTableName(tableName).withConsistentRead(true);
queryRequest.addKeyConditionsEntry("Company", condition);
// Submit the query by calling the query method of the ddbClient object and return the result.
return ddbClient.query(queryRequest);
}
@Override
public void updateIfMatch(AmazonDynamoDBClient ddbClient, String tableName, String email, String company,
String firstNameTarget, String firstNameMatch) {
// Construct an UpdateItemRequest object for the specified table.
UpdateItemRequest updateItemRequest = new UpdateItemRequest().withTableName(tableName);
// Add KeyEntry elements to the request containing AttributeValue objects for the company name and email
// address provided.
updateItemRequest.addKeyEntry("Company", new AttributeValue().withS(company));
updateItemRequest.addKeyEntry("Email", new AttributeValue().withS(email));
// Add an ExpectedEntry element to the request containing an ExpectedAttributeValue object that contains
// the value in the firstNameMatch parameter.
updateItemRequest.addExpectedEntry("First",
new ExpectedAttributeValue().withValue(new AttributeValue().withS(firstNameMatch)));
// Add an AttributeUpdatesEntry element to the request containing an AttributeValueUpdate object that
// contains the value in the firstNameTarget parameter
updateItemRequest.addAttributeUpdatesEntry("First",
new AttributeValueUpdate().withAction("PUT").withValue(new AttributeValue().withS(firstNameTarget)));
// Submit the request using the updateItem method of the ddbClient object.
ddbClient.updateItem(updateItemRequest);
}
@Override
public void deleteTable(AmazonDynamoDBClient ddbClient, String tableName) {
String tableStatus = getTableStatus(ddbClient, tableName);
if (tableStatus.equals("ACTIVE")) {
System.out.println("Deleting pre-existing table.");
DeleteTableRequest deleteTableRequest = new DeleteTableRequest().withTableName(tableName);
ddbClient.deleteTable(deleteTableRequest);
waitForStatus(ddbClient, tableName, "NOTFOUND");
System.out.println("Table deletion confirmed.");
} else if (tableStatus.equals("NOTFOUND")) {
System.out.println("Skipped deletion operation. Table not found.");
} else {
System.out.println("Skipped deletion operation. Table not in correct state.");
}
}
@Override
public void buildTable(AmazonDynamoDBClient ddbClient, String tableName) {
System.out.println("Creating table.");
CreateTableRequest createTableRequest = new CreateTableRequest().withTableName(tableName);
createTableRequest.setAttributeDefinitions(new ArrayList<AttributeDefinition>());
// Define attributes
createTableRequest.getAttributeDefinitions().add(
new AttributeDefinition().withAttributeName("Company").withAttributeType("S"));
createTableRequest.getAttributeDefinitions().add(
new AttributeDefinition().withAttributeName("Email").withAttributeType("S"));
// Define key schema
createTableRequest.setKeySchema(new ArrayList<KeySchemaElement>());
createTableRequest.getKeySchema().add(new KeySchemaElement().withAttributeName("Company").withKeyType("HASH"));
createTableRequest.getKeySchema().add(new KeySchemaElement().withAttributeName("Email").withKeyType("RANGE"));
// Define provisioned throughput
createTableRequest.setProvisionedThroughput(new ProvisionedThroughput().withReadCapacityUnits(10L)
.withWriteCapacityUnits(5L));
// Submit create request
ddbClient.createTable(createTableRequest);
// Pause until the table is active
waitForStatus(ddbClient, tableName, "ACTIVE");
System.out.println("Table created and active.");
}
@Override
public String getTableStatus(AmazonDynamoDBClient ddbClient, String tableName) {
TableDescription tableDescription = getTableDescription(ddbClient, tableName);
if (tableDescription == null) {
return "NOTFOUND";
}
return tableDescription.getTableStatus();
}
@Override
public TableDescription getTableDescription(AmazonDynamoDBClient ddbClient, String tableName) {
try {
DescribeTableRequest describeTableRequest = new DescribeTableRequest().withTableName(tableName);
DescribeTableResult describeTableResult = ddbClient.describeTable(describeTableRequest);
return describeTableResult.getTable();
} catch (AmazonServiceException ase) {
// If the table isn't found, there's no problem.
// If the error is something else, re-throw the exception to bubble it up to the caller.
if (!ase.getErrorCode().equals("ResourceNotFoundException")) {
throw ase;
}
return null;
}
}
@Override
public void waitForStatus(AmazonDynamoDBClient ddbClient, String tableName, String status) {
while (!getTableStatus(ddbClient, tableName).equals(status)) {
// Sleep for one second.
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// Just gobble up the exception.
}
}
}
}