
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