com.amediamanager.config.S3ConfigurationProvider.java Source code

Java tutorial

Introduction

Here is the source code for com.amediamanager.config.S3ConfigurationProvider.java

Source

/*
 * Copyright 2014 Amazon Technologies, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *    http://aws.amazon.com/apache2.0
 *
 * 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 com.amediamanager.config;

import java.io.IOException;
import java.util.Properties;

import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.AWSCredentialsProviderChain;
import com.amazonaws.auth.EnvironmentVariableCredentialsProvider;
import com.amazonaws.auth.InstanceProfileCredentialsProvider;
import com.amazonaws.auth.SystemPropertiesCredentialsProvider;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.AmazonS3Exception;
import com.amazonaws.services.s3.model.S3Object;
import com.amediamanager.config.ConfigurationSettings.ConfigProps;

public abstract class S3ConfigurationProvider extends ConfigurationProvider {
    private static final Logger LOG = LoggerFactory.getLogger(S3ConfigurationProvider.class);
    private String bucket;
    private String key;
    private Properties properties;

    @Override
    public void loadProperties() {
        this.properties = null;

        // Load properties if there is a bucket and key
        if (bucket != null && key != null) {
            AWSCredentialsProvider creds = new AWSCredentialsProviderChain(new InstanceProfileCredentialsProvider(),
                    new EnvironmentVariableCredentialsProvider(), new SystemPropertiesCredentialsProvider());
            AmazonS3 s3Client = new AmazonS3Client(creds);
            try {
                S3Object object = s3Client.getObject(this.bucket, this.key);
                if (object != null) {
                    this.properties = new Properties();
                    try {
                        this.properties.load(object.getObjectContent());
                    } catch (IOException e) {
                        this.properties = null;
                        LOG.warn("Found configuration file in S3 but failed to load properties (s3://{}/{})",
                                new Object[] { this.bucket, this.key, e });
                    } finally {
                        try {
                            object.close();
                        } catch (IOException e) {
                            // Don't care
                        }
                    }
                }
            } catch (AmazonS3Exception ase) {
                LOG.error("Error loading config from s3://{}/{}", new Object[] { this.bucket, this.key, ase });
            }
        }
    }

    @Override
    public void persistNewProperty(String key, String value) {
        if (this.properties != null) {
            this.properties.put(key, value);
            AmazonS3 s3Client = new AmazonS3Client();
            try {
                s3Client.putObject(this.bucket, this.key,
                        IOUtils.toInputStream(this.propsToString(this.properties)), null);
            } catch (AmazonS3Exception ase) {
                LOG.error("Error persisting config from s3://{}/{}", new Object[] { this.bucket, this.key, ase });
            }
        } else {
            LOG.error("Could not persist new property because this.properties is null.");
        }
    }

    @Override
    public void persistNewProperty(ConfigProps property, String value) {
        persistNewProperty(property.name(), value);
    }

    @Override
    public String getPrettyName() {
        return this.getClass().getSimpleName();
    }

    @Override
    public Properties getProperties() {
        return properties;
    }

    /**
     * This setter is only exposed to make the coding challenge feasible. The challenge
     * subclass implements loadProperties and needs access to set this.properties.
     * @param properties
     */
    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    public String getBucket() {
        return this.bucket;
    }

    public void setBucket(String bucket) {
        this.bucket = bucket;
    }

    public String getKey() {
        return this.key;
    }

    public void setKey(String key) {
        this.key = key;
    }
}