org.openhab.persistence.dynamodb.internal.DynamoDBConfig.java Source code

Java tutorial

Introduction

Here is the source code for org.openhab.persistence.dynamodb.internal.DynamoDBConfig.java

Source

/**
 * Copyright (c) 2010-2016, openHAB.org and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 */
package org.openhab.persistence.dynamodb.internal;

import static org.apache.commons.lang.StringUtils.isBlank;

import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.auth.profile.ProfilesConfigFile;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;

/**
 * Configuration for DynamoDB connections
 *
 * @author Sami Salonen
 */
public class DynamoDBConfig {
    public static final String DEFAULT_TABLE_PREFIX = "openhab-";
    public static final boolean DEFAULT_CREATE_TABLE_ON_DEMAND = true;
    public static final long DEFAULT_READ_CAPACITY_UNITS = 1;
    public static final long DEFAULT_WRITE_CAPACITY_UNITS = 1;

    private static final Logger logger = LoggerFactory.getLogger(DynamoDBConfig.class);

    private String tablePrefix = DEFAULT_TABLE_PREFIX;
    private Region region;
    private AWSCredentials credentials;
    private boolean createTable = DEFAULT_CREATE_TABLE_ON_DEMAND;
    private long readCapacityUnits = DEFAULT_READ_CAPACITY_UNITS;
    private long writeCapacityUnits = DEFAULT_WRITE_CAPACITY_UNITS;

    /**
     *
     * @param config persistence service configuration
     * @return DynamoDB configuration. Returns null in case of configuration errors
     */
    public static DynamoDBConfig fromConfig(Map<String, Object> config) {
        if (config == null || config.isEmpty()) {
            logger.error("Configuration not provided! At least AWS region and credentials must be provided.");
            return null;
        }

        try {
            String regionName = (String) config.get("region");
            if (isBlank(regionName)) {
                invalidRegionLogHelp(regionName);
                return null;
            }
            final Region region;
            try {
                region = Region.getRegion(Regions.fromName(regionName));
            } catch (IllegalArgumentException e) {
                invalidRegionLogHelp(regionName);
                return null;
            }

            AWSCredentials credentials;
            String accessKey = (String) config.get("accessKey");
            String secretKey = (String) config.get("secretKey");
            if (!isBlank(accessKey) && !isBlank(secretKey)) {
                logger.debug("accessKey and secretKey specified. Using those.");
                credentials = new BasicAWSCredentials(accessKey, secretKey);
            } else {
                logger.debug("accessKey and/or secretKey blank. Checking profilesConfigFile and profile.");
                String profilesConfigFile = (String) config.get("profilesConfigFile");
                String profile = (String) config.get("profile");
                if (isBlank(profilesConfigFile) || isBlank(profile)) {
                    logger.error("Specify either 1) accessKey and secretKey; or 2) profilesConfigFile and "
                            + "profile for providing AWS credentials");
                    return null;
                }
                credentials = new ProfilesConfigFile(profilesConfigFile).getCredentials(profile);
            }

            String table = (String) config.get("tablePrefix");
            if (isBlank(table)) {
                logger.debug("Using default table name {}", DEFAULT_TABLE_PREFIX);
                table = DEFAULT_TABLE_PREFIX;
            }

            final boolean createTable;
            String createTableParam = (String) config.get("createTable");
            if (isBlank(createTableParam)) {
                logger.debug("Creating table on demand: {}", DEFAULT_CREATE_TABLE_ON_DEMAND);
                createTable = DEFAULT_CREATE_TABLE_ON_DEMAND;
            } else {
                createTable = Boolean.parseBoolean(createTableParam);
            }

            final long readCapacityUnits;
            String readCapacityUnitsParam = (String) config.get("readCapacityUnits");
            if (isBlank(readCapacityUnitsParam)) {
                logger.debug("Read capacity units: {}", DEFAULT_READ_CAPACITY_UNITS);
                readCapacityUnits = DEFAULT_READ_CAPACITY_UNITS;
            } else {
                readCapacityUnits = Long.parseLong(readCapacityUnitsParam);
            }

            final long writeCapacityUnits;
            String writeCapacityUnitsParam = (String) config.get("writeCapacityUnits");
            if (isBlank(writeCapacityUnitsParam)) {
                logger.debug("Write capacity units: {}", DEFAULT_WRITE_CAPACITY_UNITS);
                writeCapacityUnits = DEFAULT_WRITE_CAPACITY_UNITS;
            } else {
                writeCapacityUnits = Long.parseLong(writeCapacityUnitsParam);
            }

            return new DynamoDBConfig(region, credentials, table, createTable, readCapacityUnits,
                    writeCapacityUnits);
        } catch (Exception e) {
            logger.error("Error with configuration", e);
            return null;
        }
    }

    public DynamoDBConfig(Region region, AWSCredentials credentials, String table, boolean createTable,
            long readCapacityUnits, long writeCapacityUnits) {
        this.region = region;
        this.credentials = credentials;
        this.tablePrefix = table;
        this.createTable = createTable;
        this.readCapacityUnits = readCapacityUnits;
        this.writeCapacityUnits = writeCapacityUnits;
    }

    public AWSCredentials getCredentials() {
        return credentials;
    }

    public String getTablePrefix() {
        return tablePrefix;
    }

    public Region getRegion() {
        return region;
    }

    public boolean isCreateTable() {
        return createTable;
    }

    public long getReadCapacityUnits() {
        return readCapacityUnits;
    }

    public long getWriteCapacityUnits() {
        return writeCapacityUnits;
    }

    private static void invalidRegionLogHelp(String region) {
        logger.error("Specify valid AWS region to use, got {}. Valid values include: {}", region,
                StringUtils.join(Regions.values(), ','));
    }
}