View Javadoc
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  			// e.g "jdbc:postgresql://localhost:5432/devdb"
44  			//
45  			// dbURL = System.getProperty(dbUrlPropertyName);
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 			// e.g "dev_"
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 }