1 package com.atlassian.dbexporter;
2
3 import java.util.Locale;
4
5
6
7
8
9
10 public final class DatabaseInformations {
11 private DatabaseInformations() {
12 }
13
14 public static Database database(DatabaseInformation info) {
15 return new DatabaseImpl(info.get("database.name", new DatabaseTypeConverter()));
16 }
17
18 public static interface Database {
19 Type getType();
20
21 static enum Type {
22 H2,
23 HSQL,
24 MYSQL,
25 POSTGRES,
26 ORACLE,
27 MSSQL,
28 UNKNOWN
29 }
30 }
31
32 private static class DatabaseTypeConverter extends DatabaseInformation.AbstractStringConverter<Database.Type> {
33 @Override
34 public Database.Type convert(String dbName) {
35 if (isEmpty(dbName)) {
36 return Database.Type.UNKNOWN;
37 }
38
39 if (isH2(dbName)) {
40 return Database.Type.H2;
41 }
42
43 if (isHsql(dbName)) {
44 return Database.Type.HSQL;
45 }
46
47 if (isMySql(dbName)) {
48 return Database.Type.MYSQL;
49 }
50
51 if (isPostgres(dbName)) {
52 return Database.Type.POSTGRES;
53 }
54
55 if (isOracle(dbName)) {
56 return Database.Type.ORACLE;
57 }
58
59 if (isMsSql(dbName)) {
60 return Database.Type.MSSQL;
61 }
62
63 return Database.Type.UNKNOWN;
64 }
65
66 private boolean isEmpty(String dbName) {
67 return dbName == null || dbName.trim().length() == 0;
68 }
69
70 private boolean isH2(String dbName) {
71 return startsWithIgnoreCase(dbName, "H2");
72 }
73
74 private boolean isHsql(String dbName) {
75 return startsWithIgnoreCase(dbName, "HSQL");
76 }
77
78 private boolean isMySql(String dbName) {
79 return startsWithIgnoreCase(dbName, "MySQL");
80 }
81
82 private boolean isPostgres(String dbName) {
83 return startsWithIgnoreCase(dbName, "PostgreSQL");
84 }
85
86 private boolean isOracle(String dbName) {
87 return startsWithIgnoreCase(dbName, "Oracle");
88 }
89
90 private boolean isMsSql(String dbName) {
91 return startsWithIgnoreCase(dbName, "Microsoft");
92 }
93
94 private boolean startsWithIgnoreCase(String s, String start) {
95 return toLowerCase(s).startsWith(toLowerCase(start));
96 }
97
98 private String toLowerCase(String s) {
99 return s == null ? s : s.toLowerCase(Locale.ENGLISH);
100 }
101 }
102
103 private static class DatabaseImpl implements Database {
104 private final Type type;
105
106 public DatabaseImpl(Type type) {
107 this.type = type;
108 }
109
110 @Override
111 public Type getType() {
112 return type;
113 }
114
115 @Override
116 public String toString() {
117 return new StringBuilder().append(getType()).toString();
118 }
119 }
120 }