1 package com.atlassian.dbexporter.exporter;
2
3 import com.atlassian.dbexporter.ConnectionProvider;
4 import com.atlassian.dbexporter.ImportExportErrorService;
5 import com.google.common.collect.ImmutableMap;
6
7 import java.sql.Connection;
8 import java.sql.DatabaseMetaData;
9 import java.sql.SQLException;
10 import java.util.Map;
11
12 import static com.atlassian.dbexporter.jdbc.JdbcUtils.closeQuietly;
13 import static com.atlassian.dbexporter.jdbc.JdbcUtils.metadata;
14 import static com.google.common.base.Preconditions.checkNotNull;
15
16 public final class ConnectionProviderInformationReader implements DatabaseInformationReader {
17 private final ImportExportErrorService errorService;
18 private final ConnectionProvider connectionProvider;
19
20 public ConnectionProviderInformationReader(ImportExportErrorService errorService, ConnectionProvider connectionProvider) {
21 this.errorService = checkNotNull(errorService);
22 this.connectionProvider = checkNotNull(connectionProvider);
23 }
24
25 @Override
26 public Map<String, String> get() {
27 Connection connection = null;
28 try {
29 final ImmutableMap.Builder<String, String> mapBuilder = ImmutableMap.builder();
30
31 connection = getConnection();
32 final DatabaseMetaData metaData = metadata(errorService, connection);
33
34 mapBuilder.put("database.name", getDatabaseName(metaData));
35 mapBuilder.put("database.version", getDatabaseVersion(metaData));
36 mapBuilder.put("database.minorVersion", getDatabaseMinorVersion(metaData));
37 mapBuilder.put("database.majorVersion", getDatabaseMajorVersion(metaData));
38
39 mapBuilder.put("driver.name", getDriverName(metaData));
40 mapBuilder.put("driver.version", getDriverVersion(metaData));
41
42 return mapBuilder.build();
43 } finally {
44 closeQuietly(connection);
45 }
46 }
47
48 private Connection getConnection() {
49 try {
50 return connectionProvider.getConnection();
51 } catch (SQLException e) {
52 throw errorService.newImportExportSqlException(null, "Could not get connection from provider", e);
53 }
54 }
55
56 private String getDatabaseName(DatabaseMetaData metaData) {
57 try {
58 return metaData.getDatabaseProductName();
59 } catch (SQLException e) {
60 throw errorService.newImportExportSqlException(null, "Could not get database product name from metadata", e);
61 }
62 }
63
64 private String getDatabaseVersion(DatabaseMetaData metaData) {
65 try {
66 return metaData.getDatabaseProductVersion();
67 } catch (SQLException e) {
68 throw errorService.newImportExportSqlException(null, "Could not get database product version from metadata", e);
69 }
70 }
71
72 private String getDatabaseMinorVersion(DatabaseMetaData metaData) {
73 try {
74 return String.valueOf(metaData.getDatabaseMinorVersion());
75 } catch (SQLException e) {
76 throw errorService.newImportExportSqlException(null, "Could not get database minor version from metadata", e);
77 }
78 }
79
80 private String getDatabaseMajorVersion(DatabaseMetaData metaData) {
81 try {
82 return String.valueOf(metaData.getDatabaseMajorVersion());
83 } catch (SQLException e) {
84 throw errorService.newImportExportSqlException(null, "Could not get database major version from metadata", e);
85 }
86 }
87
88 private String getDriverName(DatabaseMetaData metaData) {
89 try {
90 return metaData.getDriverName();
91 } catch (SQLException e) {
92 throw errorService.newImportExportSqlException(null, "Could not get driver name from metadata", e);
93 }
94 }
95
96 private String getDriverVersion(DatabaseMetaData metaData) {
97 try {
98 return metaData.getDriverVersion();
99 } catch (SQLException e) {
100 throw errorService.newImportExportSqlException(null, "Could not get driver version from metadata", e);
101 }
102 }
103 }