1 package com.atlassian.refapp.activeobjects;
2
3 import com.atlassian.activeobjects.spi.AbstractTenantAwareDataSourceProvider;
4 import com.atlassian.activeobjects.spi.DatabaseType;
5 import com.atlassian.refapp.api.ConnectionProvider;
6 import com.atlassian.tenancy.api.Tenant;
7 import com.google.common.collect.ImmutableMap;
8
9 import javax.annotation.Nonnull;
10 import javax.sql.DataSource;
11
12 import java.util.Map;
13
14 import static com.google.common.base.Preconditions.checkNotNull;
15
16 public class RefappTenantAwareDataSourceProvider extends AbstractTenantAwareDataSourceProvider {
17 private final ConnectionProvider connectionProvider;
18
19 private static final Map<String, DatabaseType> TYPE_MAPPING = ImmutableMap.<String, DatabaseType>builder()
20 .put("org.h2.Driver", DatabaseType.H2)
21 .put("org.postgresql.Driver", DatabaseType.POSTGRESQL)
22 .put("com.mysql.jdbc.Driver", DatabaseType.MYSQL)
23 .put("net.sourceforge.jtds.jdbc.Driver", DatabaseType.MS_SQL)
24 .put("com.microsoft.sqlserver.jdbc.SQLServerDriver", DatabaseType.MS_SQL)
25 .put("oracle.jdbc.OracleDriver", DatabaseType.ORACLE)
26 .build();
27
28 public RefappTenantAwareDataSourceProvider(@Nonnull final ConnectionProvider connectionProvider) {
29 this.connectionProvider = checkNotNull(connectionProvider);
30 }
31
32 @Nonnull
33 @Override
34 public DataSource getDataSource(@Nonnull final Tenant tenant) {
35 return connectionProvider.dataSource();
36 }
37
38 @Nonnull
39 @Override
40 public DatabaseType getDatabaseType(@Nonnull final Tenant tenant) {
41 final DatabaseType databaseType = TYPE_MAPPING.get(connectionProvider.driverClassName());
42 if (databaseType == null) {
43 throw new RuntimeException("unknown driver class name '" + connectionProvider.driverClassName() + "'");
44 }
45 return databaseType;
46 }
47
48 @Override
49 public String getSchema(@Nonnull Tenant tenant) {
50 return connectionProvider.schema().orElse(null);
51 }
52 }