com.amediamanager.dao.RdsDriverManagerDataSource.java Source code

Java tutorial

Introduction

Here is the source code for com.amediamanager.dao.RdsDriverManagerDataSource.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.dao;

import java.util.List;

import javax.annotation.PostConstruct;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.amazonaws.services.rds.model.Endpoint;
import com.amediamanager.config.ConfigurationSettings;

/**
 * This custom DriverManagerDataSource retrieves DB connection information from
 * the ConfigurationSettings class. Most im
 * @author evbrown
 *
 */
public class RdsDriverManagerDataSource extends DriverManagerDataSource {
    private static final Logger LOG = LoggerFactory.getLogger(RdsDriverManagerDataSource.class);

    @Autowired
    ConfigurationSettings config;

    @Autowired
    com.amediamanager.dao.challenge.RdsDbEndpointRetriever dbEndpointRetriever;

    @PostConstruct
    public void init() {
        initializeDataSource();
    }

    @Override
    public String getUsername() {
        return config.getProperty(ConfigurationSettings.ConfigProps.RDS_USERNAME);
    }

    @Override
    public String getPassword() {
        return config.getProperty(ConfigurationSettings.ConfigProps.RDS_PASSWORD);
    }

    private void initializeDataSource() {
        // Use the RDS DB and the dbEndpointRetriever to discover the URL of the
        // database. If there
        // are read replicas, set the correct driver and use them.
        final String masterId = config.getProperty(ConfigurationSettings.ConfigProps.RDS_INSTANCEID);

        try {
            Endpoint master = dbEndpointRetriever.getMasterDbEndpoint(masterId);
            List<Endpoint> replicas = dbEndpointRetriever.getReadReplicaEndpoints(masterId);

            if (master != null) {
                LOG.info("Detected RDS Master database");
                StringBuilder builder = new StringBuilder();
                builder.append("jdbc:mysql:");
                if (replicas != null) {
                    builder.append("replication:");
                    super.setDriverClassName("com.mysql.jdbc.ReplicationDriver");
                } else {
                    super.setDriverClassName("com.mysql.jdbc.Driver");
                }

                builder.append("//" + master.getAddress() + ":" + master.getPort());
                if (replicas != null) {
                    LOG.info("Detected RDS Read Replicas");
                    for (Endpoint endpoint : replicas) {
                        builder.append("," + endpoint.getAddress() + ":" + endpoint.getPort());
                    }
                } else {
                    LOG.info("No Read Replicas detected");
                }
                builder.append("/" + config.getProperty(ConfigurationSettings.ConfigProps.RDS_DATABASE));
                String connectionString = builder.toString();
                LOG.info("MySQL Connection String: " + connectionString);
                super.setUrl(connectionString);
            } else {
                LOG.warn("No RDS master database detected!");
            }
        } catch (Exception e) {
            LOG.warn("Failed to initialize datasource.", e);
        }
    }
}