package pluginbase.jdbc;
import org.jetbrains.annotations.NotNull;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import javax.sql.DataSource;
import java.io.File;
public class SpringJdbcAgent implements JdbcAgent {
/**
* Initializes a SpringJdbcAgent, starting a connection to a database based on the given settings.
*
* @param settings The settings which indicate how and what database to connect to.
* @param databaseFolder A folder which will contain any embedded database. This may or may not be used depending on the given settings.
* @param classLoader This is the ClassLoader that will be used to load the database Driver class.
* @return a new SpringJdbcAgent.
* @throws ClassNotFoundException if the driver specified in settings is not found.
*/
public static SpringJdbcAgent createAgent(@NotNull DatabaseSettings settings, @NotNull File databaseFolder, @NotNull ClassLoader classLoader) throws ClassNotFoundException {
String dbType = settings.getDatabaseType();
String url = settings.getDatabaseInfo().getUrl();
if (dbType.equalsIgnoreCase("H2")) {
dbType = "org.h2.Driver";
if (!url.startsWith("jdbc")) {
url = "jdbc:h2:" + new File(databaseFolder, url).getPath();
}
} else if (dbType.equalsIgnoreCase("MySQL")) {
dbType = "com.mysql.jdbc.Driver";
} else if (dbType.equalsIgnoreCase("SQLite")) {
dbType = "org.sqlite.JDBC";
if (!url.startsWith("jdbc")) {
url = "jdbc:sqlite:" + new File(databaseFolder, url).getPath();
}
}
ClassLoader previousClassLoader = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(classLoader);
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(dbType);
dataSource.setUrl(url);
dataSource.setUsername(settings.getDatabaseInfo().getUser());
dataSource.setPassword(settings.getDatabaseInfo().getPass());
Thread.currentThread().setContextClassLoader(previousClassLoader);
return new SpringJdbcAgent(settings, dataSource);
}
@NotNull
private final DatabaseSettings settings;
@NotNull
private final DriverManagerDataSource dataSource;
private SpringJdbcAgent(@NotNull DatabaseSettings settings, @NotNull DriverManagerDataSource dataSource) {
this.settings = settings;
this.dataSource = dataSource;
}
@NotNull
@Override
public DataSource getDataSource() {
return dataSource;
}
@NotNull
@Override
public DatabaseSettings getSettings() {
return settings;
}
/**
* A convenience method for creating JdbcTemplate which allows for very intuitive database access.
*/
@NotNull
public JdbcTemplate createJdbcTemplate() {
return new JdbcTemplate(getDataSource());
}
}