Package com.amazonaws.geo.server.util

Source Code of com.amazonaws.geo.server.util.Utilities$SchoolDataLoader

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 boolean isTableNameSet() {
    String tableName = System.getProperty("PARAM1");
    return tableName != null && tableName.length() > 0;
  }

  public boolean isRegionNameSet() {
    String regionName = System.getProperty("PARAM2");
    return regionName != null && regionName.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) {
      SchoolDataLoader schoolDataLoader = new SchoolDataLoader();
      schoolDataLoader.start();
    }

  }

  private synchronized void setupGeoDataManager() {
    if (geoDataManager == null) {
      String accessKey = System.getProperty("AWS_ACCESS_KEY_ID");
      String secretKey = System.getProperty("AWS_SECRET_KEY");
      String tableName = System.getProperty("PARAM1");
      String regionName = System.getProperty("PARAM2");

      Region region = Region.getRegion(Regions.fromName(regionName));
      ClientConfiguration clientConfiguration = new ClientConfiguration().withMaxErrorRetry(20);
      AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);

      AmazonDynamoDBClient ddb = new AmazonDynamoDBClient(credentials, clientConfiguration);
      ddb.setRegion(region);

      GeoDataManagerConfiguration config = new GeoDataManagerConfiguration(ddb, tableName);
      geoDataManager = new GeoDataManager(config);
    }
  }

  private class SchoolDataLoader extends Thread {
    public void run() {
      status = Status.CREATING_TABLE;

      GeoDataManagerConfiguration config = geoDataManager.getGeoDataManagerConfiguration();

      CreateTableRequest createTableRequest = GeoTableUtil.getCreateTableRequest(config);
      config.getDynamoDBClient().createTable(createTableRequest);

      waitForTableToBeReady();

      insertData();
    }

    private void insertData() {
      status = Status.INSERTING_DATA_TO_TABLE;

      InputStream fis = Utilities.this.getClass().getResourceAsStream("/school_list_wa.txt");
      BufferedReader br = new BufferedReader(new InputStreamReader(fis, Charset.forName("UTF-8")));
      String line;

      try {
        while ((line = br.readLine()) != null) {
          String[] columns = line.split("\t");
          String schoolId = columns[0];
          String schoolName = columns[1];
          double latitude = Double.parseDouble(columns[2]);
          double longitude = Double.parseDouble(columns[3]);

          GeoPoint geoPoint = new GeoPoint(latitude, longitude);
          AttributeValue rangeKeyValue = new AttributeValue().withS(schoolId);
          AttributeValue schoolNameValue = new AttributeValue().withS(schoolName);

          PutPointRequest putPointRequest = new PutPointRequest(geoPoint, rangeKeyValue);
          putPointRequest.getPutItemRequest().getItem().put("schoolName", schoolNameValue);

          geoDataManager.putPoint(putPointRequest);
        }
      } catch (IOException e) {
        throw new RuntimeException(e);
      } finally {
        try {
          br.close();
          fis.close();
        } catch (IOException e) {
          throw new RuntimeException(e);
        }
      }

      status = Status.READY;
    }

    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);
      }
    }
  }
}
TOP

Related Classes of com.amazonaws.geo.server.util.Utilities$SchoolDataLoader

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.