1 package net.avcompris.commons3.web;
2
3 import static com.google.common.base.Preconditions.checkNotNull;
4 import static org.apache.commons.lang3.StringUtils.isBlank;
5
6 import javax.sql.DataSource;
7
8 import org.springframework.boot.jdbc.DataSourceBuilder;
9
10 import com.zaxxer.hikari.HikariDataSource;
11
12 public abstract class AbstractApplicationConfig {
13
14 public abstract static class AbstractTableNamesConfig {
15
16 protected abstract String getTableNamePrefix();
17 }
18
19 public abstract static class AbstractRDSConfig extends AbstractTableNamesConfig {
20
21 private final String dbUrlPropertyName;
22 private final String dbUsernamePropertyName;
23 private final String dbPasswordPropertyName;
24 private final String dbTableNamePrefixPropertyName;
25
26 private DataSource dataSource;
27 private String tableNamePrefix;
28 private String dbURL;
29 private String dbUsername;
30
31 public AbstractRDSConfig(final String dbUrlPropertyName, final String dbUsernamePropertyName,
32 final String dbPasswordPropertyName, final String dbTableNamePrefixPropertyName) {
33
34 this.dbUrlPropertyName = checkNotNull(dbUrlPropertyName, "dbUrlPropertyName");
35 this.dbUsernamePropertyName = checkNotNull(dbUsernamePropertyName, "dbUsernamePropertyName");
36 this.dbPasswordPropertyName = checkNotNull(dbPasswordPropertyName, "dbPasswordPropertyName");
37 this.dbTableNamePrefixPropertyName = checkNotNull(dbTableNamePrefixPropertyName,
38 "dbTableNamePrefixPropertyName");
39 }
40
41 private synchronized void loadDataSource() {
42
43
44
45
46
47 if (dbURL == null) {
48 loadDbURL();
49 }
50
51 if (dbUsername == null) {
52 loadDbUsername();
53 }
54
55 final String dbPassword = System.getProperty(dbPasswordPropertyName);
56
57 if (isBlank(dbPassword)) {
58 throw new IllegalStateException(dbPasswordPropertyName + " should be set as an environment variable.");
59 }
60
61 try {
62
63 Class.forName(org.postgresql.Driver.class.getName());
64
65 } catch (final ClassNotFoundException e) {
66
67 throw new RuntimeException(e);
68 }
69
70 dataSource = DataSourceBuilder.create()
71 .type(HikariDataSource.class)
72 .url(dbURL)
73 .username(dbUsername)
74 .password(dbPassword)
75 .build();
76 }
77
78 public final DataSource getDataSource() {
79
80 if (dataSource == null) {
81 loadDataSource();
82 }
83
84 return dataSource;
85 }
86
87 public final String getUrl() {
88
89 if (dbURL == null) {
90 loadDbURL();
91 }
92
93 return dbURL;
94 }
95
96 public final String getUsername() {
97
98 if (dbUsername == null) {
99 loadDbUsername();
100 }
101
102 return dbUsername;
103 }
104
105 @Override
106 public final String getTableNamePrefix() {
107
108 if (tableNamePrefix == null) {
109 loadTableNamePrefix();
110 }
111
112 return tableNamePrefix;
113 }
114
115 private synchronized void loadDbURL() {
116
117 final String dbURL = System.getProperty(dbUrlPropertyName);
118
119 System.out.println(dbUrlPropertyName + ": " + dbURL);
120
121 if (isBlank(dbURL)) {
122 throw new IllegalStateException(dbUrlPropertyName + " should be set as an environment variable."
123 + " It should be of the form: \"jdbc:postgresql://localhost:5432/devdb\"");
124 }
125
126 this.dbURL = dbURL;
127 }
128
129 private synchronized void loadDbUsername() {
130
131 final String dbUsername = System.getProperty(dbUsernamePropertyName);
132
133 System.out.println(dbUsernamePropertyName + ": " + dbUsername);
134
135 if (isBlank(dbUsername)) {
136 throw new IllegalStateException(dbUsernamePropertyName + " should be set as an environment variable."
137 + " It should be of the form: \"postgres\"");
138 }
139
140 this.dbUsername = dbUsername;
141 }
142
143 private synchronized void loadTableNamePrefix() {
144
145
146
147 final String tableNamePrefix = System.getProperty(dbTableNamePrefixPropertyName);
148
149 System.out.println(dbTableNamePrefixPropertyName + ": " + tableNamePrefix);
150
151 if (isBlank(tableNamePrefix)) {
152 throw new IllegalStateException(
153 dbTableNamePrefixPropertyName + " should be set as an environment variable."
154 + " It should be of the form: \"dev_\", \"qa_\", \"prod_\", etc.");
155 }
156
157 if (!tableNamePrefix.endsWith("_")) {
158 throw new IllegalStateException(
159 "tableNamePrefix should end with \"xxx_\", but was: " + tableNamePrefix);
160 }
161
162 this.tableNamePrefix = tableNamePrefix;
163 }
164 }
165 }