com.gopivotal.cloudfoundry.test.core.DataSourceUtils.java Source code

Java tutorial

Introduction

Here is the source code for com.gopivotal.cloudfoundry.test.core.DataSourceUtils.java

Source

/*
 * Copyright 2013 the original author or authors.
 *
 * 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://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License 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.gopivotal.cloudfoundry.test.core;

import org.springframework.stereotype.Component;
import org.springframework.util.ReflectionUtils;

import javax.sql.DataSource;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * Utility class for analysing a {@link DataSource}.
 */
@Component
public final class DataSourceUtils extends AbstractServiceUtils<DataSource> {

    private static final String SELECT_ONE = "SELECT 1";

    public String checkAccess(DataSource dataSource) {
        try {
            Connection connection = dataSource.getConnection();
            PreparedStatement selectOne = connection.prepareStatement(SELECT_ONE);
            selectOne.execute();
            return "ok";
        } catch (SQLException e) {
            return "failed with " + e.getMessage();
        }
    }

    public String getUrl(DataSource dataSource) {
        if (isClass(dataSource, "com.jolbox.bonecp.BoneCPDataSource")) {
            return invokeMethod(dataSource, "getJdbcUrl");
        } else if (isClass(dataSource, "org.apache.commons.dbcp.BasicDataSource")) {
            return invokeMethod(dataSource, "getUrl");
        } else if (isClass(dataSource, "org.apache.tomcat.dbcp.dbcp.BasicDataSource")) {
            return invokeMethod(dataSource, "getUrl");
        } else if (isClass(dataSource, "org.apache.tomcat.jdbc.pool.DataSource")) {
            return invokeMethod(dataSource, "getUrl");
        } else if (isClass(dataSource, "org.springframework.jdbc.datasource.embedded"
                + ".EmbeddedDatabaseFactory$EmbeddedDataSourceProxy")) {
            return getUrl(getDataSource(dataSource));
        } else if (isClass(dataSource, "org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy")) {
            return getUrl(getTargetDataSource(dataSource));
        } else if (isClass(dataSource, "org.springframework.jdbc.datasource.SimpleDriverDataSource")) {
            return invokeMethod(dataSource, "getUrl");
        } else if (isClass(dataSource, "org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy")) {
            return getUrl(getTargetDataSource(dataSource));
        }

        return String.format("Unable to determine URL for DataSource of type %s", dataSource.getClass().getName());
    }

    private String invokeMethod(DataSource dataSource, String methodName) {
        Method method = ReflectionUtils.findMethod(dataSource.getClass(), methodName);
        return (String) ReflectionUtils.invokeMethod(method, dataSource);
    }

    private DataSource getTargetDataSource(DataSource dataSource) {
        Method method = ReflectionUtils.findMethod(dataSource.getClass(), "getTargetDataSource");
        return (DataSource) ReflectionUtils.invokeMethod(method, dataSource);
    }

    private DataSource getDataSource(DataSource dataSource) {
        try {
            Field field = dataSource.getClass().getDeclaredField("dataSource");
            ReflectionUtils.makeAccessible(field);

            return (DataSource) field.get(dataSource);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

}