All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.zodiac.ds.api.DataSourceHolder Maven / Gradle / Ivy

package org.zodiac.ds.api;

import org.zodiac.ds.api.exception.DataSourceNotFoundException;
import org.zodiac.ds.api.switcher.*;

import reactor.core.publisher.Mono;

/**
 * Used to manipulate dynamic data sources. 
* For example, obtain the currently used data source and use the switcher to switch data sources. * */ public final class DataSourceHolder { private DataSourceHolder() { super(); } /** * Dynamic data source service. */ static volatile DynamicDataSourceService dynamicDataSourceService; static volatile JdbcSwitcher jdbcSwitcher = new DefaultJdbcSwitcher(); static volatile R2dbcSwitcher r2dbcSwitcher = new DefaultR2dbcSwicher(); public static void setDynamicDataSourceService(DynamicDataSourceService dynamicDataSourceService) { DataSourceHolder.dynamicDataSourceService = dynamicDataSourceService; } public static boolean isDynamicDataSourceReady() { return dynamicDataSourceService != null; } public static void checkDynamicDataSourceReady() { if (dynamicDataSourceService == null) { throw new UnsupportedOperationException("dataSourceService not ready"); } } /** * Get a dynamic data source switcher. * * @return Dynamic data source switcher. */ public static JdbcSwitcher switcher() { return jdbcSwitcher; } public static R2dbcSwitcher r2dbcSwitcher() { return r2dbcSwitcher; } /** * Get the default data source. * * @return The default data source. */ public static JdbcDataSource defaultDataSource() { checkDynamicDataSourceReady(); return (JdbcDataSource) dynamicDataSourceService.getDefaultDataSource(); } /** * Obtain {@link JdbcDataSource} based on the specified data source ID. * * @param dataSourceId Data source ID. * @return The {@link JdbcDataSource}. * @throws DataSourceNotFoundException This exception is thrown if the data source does not exist. */ public static JdbcDataSource dataSource(String dataSourceId) { checkDynamicDataSourceReady(); return dynamicDataSourceService.getDataSource(dataSourceId); } /** * Obtain the data source you're currently using. * * @return The data source you're currently using. */ public static JdbcDataSource currentDataSource() { return jdbcSwitcher.datasource() .current() .map(dynamicDataSourceService::getDataSource) .orElseGet(DataSourceHolder::defaultDataSource); } public static Mono currentR2dbc() { return r2dbcSwitcher.datasource() .current() .flatMap(dynamicDataSourceService::getR2dbcDataSource) .switchIfEmpty(Mono.defer(() -> Mono.just(dynamicDataSourceService.getDefaultDataSource()) .map(R2dbcDataSource.class::cast))); } /** * Determines whether the data source you are using is the default data source. * * @return Whether the data source currently in use is the default data source. */ public static boolean currentIsDefault() { return !jdbcSwitcher.datasource().current().isPresent(); } /** * Check whether the specified ID data source exists. * * @param id Data source ID, {@link DynamicDataSource#getId()}. * @return Whether the data source exists. */ public static boolean existing(String id) { try { checkDynamicDataSourceReady(); return dynamicDataSourceService.getDataSource(id) != null; } catch (DataSourceNotFoundException e) { return false; } } /** * Check whether the data source in use exists. * * @return Whether the data source currently in use exists. */ public static boolean currentExisting() { if (currentIsDefault()) { return true; } try { return currentDataSource() != null; } catch (DataSourceNotFoundException e) { return false; } } /** * Obtain the current database type. * * @return The current database type. */ public static DatabaseType currentDatabaseType() { return currentDataSource().getType(); } /** * Obtain the default database type. * * @return The default database type. */ public static DatabaseType defaultDatabaseType() { return defaultDataSource().getType(); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy