package com.amazonaws.geo.server.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.geo.GeoDataManager;
import com.amazonaws.geo.GeoDataManagerConfiguration;
import com.amazonaws.geo.model.GeoPoint;
import com.amazonaws.geo.model.PutPointRequest;
import com.amazonaws.geo.util.GeoTableUtil;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
import com.amazonaws.services.dynamodbv2.model.DescribeTableRequest;
import com.amazonaws.services.dynamodbv2.model.DescribeTableResult;
import com.amazonaws.services.dynamodbv2.model.ResourceNotFoundException;
public class Utilities {
private static Utilities utilities;
public enum Status {
NOT_STARTED, CREATING_TABLE, INSERTING_DATA_TO_TABLE, READY
}
private Status status = Status.NOT_STARTED;
private GeoDataManager geoDataManager;
public static synchronized Utilities getInstance() {
if (utilities == null) {
utilities = new Utilities();
}
return utilities;
}
public Status getStatus() {
return status;
}
public boolean isAccessKeySet() {
String accessKey = System.getProperty("AWS_ACCESS_KEY_ID");
return accessKey != null && accessKey.length() > 0;
}
public boolean isSecretKeySet() {
String secretKey = System.getProperty("AWS_SECRET_KEY");
return secretKey != null && secretKey.length() > 0;
}
public void setupTable() {
setupGeoDataManager();
GeoDataManagerConfiguration config = geoDataManager.getGeoDataManagerConfiguration();
DescribeTableRequest describeTableRequest = new DescribeTableRequest().withTableName(config.getTableName());
try {
config.getDynamoDBClient().describeTable(describeTableRequest);
if (status == Status.NOT_STARTED) {
status = Status.READY;
}
} catch (ResourceNotFoundException e) {
PhotoLocationsTable photoLocationsTable = new PhotoLocationsTable();
photoLocationsTable.start();
}
}
public synchronized GeoDataManager setupGeoDataManager() {
if (geoDataManager == null) {
String accessKey = getSystemProperty( "AWS_ACCESS_KEY_ID" );
String secretKey = getSystemProperty( "AWS_SECRET_KEY" );
String regionName = getSystemProperty( "PARAM2", "us-east-1" );
String tableName = getSystemProperty( "PARAM3", "PhotoLocations" );
AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
AmazonDynamoDBClient ddb = new AmazonDynamoDBClient(credentials);
Region region = Region.getRegion(Regions.fromName(regionName));
ddb.setRegion(region);
GeoDataManagerConfiguration config = new GeoDataManagerConfiguration(ddb, tableName);
geoDataManager = new GeoDataManager(config);
}
return geoDataManager;
}
private class PhotoLocationsTable extends Thread {
public void run() {
status = Status.CREATING_TABLE;
GeoDataManagerConfiguration config = geoDataManager.getGeoDataManagerConfiguration();
CreateTableRequest createTableRequest = GeoTableUtil.getCreateTableRequest(config);
config.getDynamoDBClient().createTable(createTableRequest);
waitForTableToBeReady();
}
private void waitForTableToBeReady() {
GeoDataManagerConfiguration config = geoDataManager.getGeoDataManagerConfiguration();
DescribeTableRequest describeTableRequest = new DescribeTableRequest().withTableName(config.getTableName());
DescribeTableResult describeTableResult = config.getDynamoDBClient().describeTable(describeTableRequest);
while (!describeTableResult.getTable().getTableStatus().equalsIgnoreCase("ACTIVE")) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
describeTableResult = config.getDynamoDBClient().describeTable(describeTableRequest);
}
}
}
public static String getSystemProperty( String property ) {
return getSystemProperty( property, null );
}
public static String getSystemProperty( String property, String defaultValue ) {
String value = System.getProperty( property );
if ( isEmpty( value ) ) {
return defaultValue;
}
else {
return value;
}
}
private static boolean isEmpty(String str) {
if (null == str || str.trim().length() == 0)
return true;
return false;
}
private Utilities() {}
}