1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package p3j.misc;
17
18 import james.core.data.DBConnectionData;
19
20 import java.io.File;
21 import java.io.FileNotFoundException;
22 import java.io.FileOutputStream;
23 import java.text.DecimalFormat;
24 import java.util.ArrayList;
25 import java.util.HashMap;
26 import java.util.List;
27 import java.util.Map;
28 import java.util.Map.Entry;
29
30 import javax.xml.transform.OutputKeys;
31 import javax.xml.transform.Transformer;
32 import javax.xml.transform.TransformerException;
33 import javax.xml.transform.TransformerFactory;
34 import javax.xml.transform.dom.DOMSource;
35 import javax.xml.transform.stream.StreamResult;
36
37 import org.hibernate.dialect.HSQLDialect;
38 import org.hibernate.dialect.MySQL5Dialect;
39 import org.hsqldb.jdbcDriver;
40 import org.w3c.dom.Document;
41
42 import p3j.database.DatabaseType;
43 import p3j.simulation.ExecutionMode;
44
45 import com.mysql.jdbc.Driver;
46
47
48
49
50
51
52
53
54
55
56 public final class Misc {
57
58
59
60
61
62
63 private static final String DELIMITER_OF_HIBERNATE_TYPES = "$$";
64
65
66 public static final int BASE_NUM = 10;
67
68
69 public static final DecimalFormat NUMBER_FORMAT = new DecimalFormat(
70 "0.00000000");
71
72
73 public static final double EPSILON = 0.0000000001;
74
75
76 public static final String CONFIG_FILE = "conf/config.xml";
77
78
79 public static final ExecutionMode DEFAULT_EXEC_MODE = ExecutionMode.MONTE_CARLO;
80
81
82 public static final String DEFAULT_HIBERNATE_CONFIG_FILE = "conf/hibernate.cfg.xml";
83
84
85 public static final String TEST_HIBERNATE_CONFIG_FILE = "test.hibernate.cfg.xml";
86
87
88 public static final int DEFAULT_NUM_TRIALS = 1000;
89
90
91 public static final int DEFAULT_NUM_PARALLEL_THREADS = 1;
92
93
94
95
96
97
98 public static final int MAX_SUBNODE_SUMMARY_ELEMENTS = 200;
99
100
101
102
103 public static final String PREF_DB_TYPE = "Database Type";
104
105
106 public static final String PREF_DB_URL = "Database URL";
107
108
109 public static final String PREF_DB_USER = "Database User Name";
110
111
112 public static final String PREF_DB_PWD = "Database Password (currently stored unencrpyted!)";
113
114
115 public static final String PREF_NUM_TRIALS = "Number of Trials (multiples of Parallel Threads only)";
116
117
118 public static final String PREF_NUM_PARALLEL_THREADS = "Parallel Threads (Monte-Carlo only)";
119
120
121 public static final String PREF_EXECUTION_MODE = "Execution Mode";
122
123
124
125
126 public static final String MYSQL_URL_PREFIX = "jdbc:mysql://";
127
128
129 public static final String HSQLDB_URL_PREFIX = "jdbc:hsqldb:file:";
130
131
132 public static final String HSQLDB_FILE_NAME = "pppm_db";
133
134
135 public static final String PREF_HIBERNATE_DIALECT_PROPERTY = "hibernate.dialect";
136
137
138 public static final String PREF_HIBERNATE_DRIVER_PROPERTY = "hibernate.connection.driver_class";
139
140
141 public static final DatabaseType DEFAULT_DB_TYPE = DatabaseType.HSQLDB;
142
143
144 public static final Map<DatabaseType, String> HIBERNATE_DIALECTS = new HashMap<>();
145 static {
146 HIBERNATE_DIALECTS.put(DatabaseType.HSQLDB,
147 HSQLDialect.class.getCanonicalName());
148 HIBERNATE_DIALECTS.put(DatabaseType.MYSQL,
149 MySQL5Dialect.class.getCanonicalName());
150 HIBERNATE_DIALECTS.put(DatabaseType.GENERIC,
151 MySQL5Dialect.class.getCanonicalName());
152 }
153
154 public static final Map<DatabaseType, String> JDBC_DRIVERS = new HashMap<>();
155 static {
156 JDBC_DRIVERS.put(DatabaseType.HSQLDB, jdbcDriver.class.getCanonicalName());
157 JDBC_DRIVERS.put(DatabaseType.MYSQL, Driver.class.getCanonicalName());
158 JDBC_DRIVERS.put(DatabaseType.GENERIC, Driver.class.getCanonicalName());
159 }
160
161
162 public static final Map<DatabaseType, String> DEFAULT_DB_URLS = new HashMap<>();
163 static {
164 DEFAULT_DB_URLS.put(DatabaseType.HSQLDB, HSQLDB_URL_PREFIX + "."
165 + File.separator + HSQLDB_FILE_NAME);
166 DEFAULT_DB_URLS.put(DatabaseType.MYSQL, MYSQL_URL_PREFIX
167 + "localhost/pppm_db");
168 DEFAULT_DB_URLS.put(DatabaseType.GENERIC, MYSQL_URL_PREFIX
169 + "localhost/pppm_db");
170 }
171
172
173 public static final Map<DatabaseType, String> DEFAULT_DB_USERS = new HashMap<>();
174 static {
175 DEFAULT_DB_USERS.put(DatabaseType.HSQLDB, "sa");
176 DEFAULT_DB_USERS.put(DatabaseType.MYSQL, "root");
177 DEFAULT_DB_USERS.put(DatabaseType.GENERIC, "root");
178 }
179
180
181 public static final Map<DatabaseType, String> DEFAULT_DB_PWDS = new HashMap<>();
182 static {
183 DEFAULT_DB_PWDS.put(DatabaseType.HSQLDB, "");
184 DEFAULT_DB_PWDS.put(DatabaseType.MYSQL, "root");
185 DEFAULT_DB_PWDS.put(DatabaseType.GENERIC, "");
186 }
187
188
189 public static final DBConnectionData DEFAULT_DB_CONN = DEFAULT_DB_TYPE
190 .getDefaults().getFirstValue();
191
192
193
194
195 public static final String GUI_LABEL_PROBABILITY = "Probability (in [0,1]):";
196
197
198 public static final String GUI_LABEL_NAME = "Name:";
199
200
201 public static final String GUI_LABEL_DESCRIPTION = "Description:";
202
203
204 public static final String GUI_LABEL_DEVIATION = "Standard deviation";
205
206
207 public static final String GUI_LABEL_JUMP_OFF_YEAR = "Jump-Off Year";
208
209
210 public static final String GUI_LABEL_NUM_AGE_CLASSES = "Number of Age Classes:";
211
212
213 public static final String GUI_LABEL_DESCENDANT_GENERATIONS = "Descendant Generations:";
214
215
216 public static final String GUI_LABEL_PROJECTION_HORIZON = "Projection Horizon:";
217
218
219 public static final String GUI_LABEL_DB_DRIVER_CLASS = "JDBC Driver (needs to be in classpath)";
220
221
222 public static final String GUI_LABEL_HIBERNATE_DIALECT = "Hibernate dialect class";
223
224
225 public static final String GUI_LABEL_DB_FILE_LOCATION = "Location of database";
226
227
228
229
230 private Misc() {
231 }
232
233
234
235
236
237
238
239
240
241 public static String getFileEnding(File file) {
242 return file.getName().substring(file.getName().lastIndexOf('.') + 1);
243 }
244
245
246
247
248
249
250
251
252
253 public static double parseToDouble(Object value) {
254 return Double.parseDouble(value.toString().replace(',', '.'));
255 }
256
257
258
259
260
261
262
263
264
265 public static double parseToDoubleProb(String probString) {
266 double probability = parseToDouble(probString);
267 if (probability < 0 || probability > 1) {
268 return 0;
269 }
270 return probability;
271 }
272
273
274
275
276
277
278
279
280
281
282
283
284 public static boolean numEqual(double x, double y) {
285 return Math.abs(x - y) < EPSILON;
286 }
287
288
289
290
291
292
293
294
295
296 public static int parseToInt(String numString) {
297 return Integer.parseInt(numString);
298 }
299
300
301
302
303
304
305
306
307
308
309
310 public static double round(double value, int digits) {
311 return ((int) (value * Math.pow(BASE_NUM, digits)) / Math.pow(BASE_NUM,
312 digits));
313 }
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328 @Deprecated
329 public static void writeDocumentToFile(String fileName, Document document)
330 throws FileNotFoundException, TransformerException {
331
332 File f = new File(fileName);
333
334 FileOutputStream fop = new FileOutputStream(f);
335
336
337 TransformerFactory tff = TransformerFactory.newInstance();
338 Transformer tf = tff.newTransformer();
339
340 tf.setOutputProperty(OutputKeys.METHOD, "xml");
341 tf.setOutputProperty(OutputKeys.INDENT, "yes");
342
343 DOMSource source = new DOMSource(document);
344 StreamResult result = new StreamResult(fop);
345
346 tf.transform(source, result);
347 }
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362 @SuppressWarnings("unchecked")
363 public static <X> X autoCast(Object o) {
364 return (X) o;
365 }
366
367
368
369
370
371
372
373
374
375
376
377
378
379 public static boolean checkClassEquality(Class<?> class1, Class<?> class2) {
380 return getCleanedClassName(class1).compareTo(getCleanedClassName(class2)) == 0;
381 }
382
383
384
385
386
387
388
389
390
391
392
393 public static String getCleanedClassName(Class<?> theClass) {
394 String name = theClass.getCanonicalName();
395 int cutOffIndex = name.indexOf(DELIMITER_OF_HIBERNATE_TYPES);
396 return cutOffIndex < 0 ? name : name.substring(0, cutOffIndex);
397 }
398
399
400
401
402
403
404
405
406
407
408 public static <D> List<D> mergeList(List<D>... listsToMerge) {
409 List<D> result = new ArrayList<D>();
410 for (List<D> listToMerge : listsToMerge) {
411 result.addAll(listToMerge);
412 }
413 return result;
414 }
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429 public static <X, Y> void invertMap(Map<X, Y> src, Map<Y, X> dest) {
430 dest.clear();
431 for (Entry<X, Y> entry : src.entrySet()) {
432 if (dest.containsKey(entry.getValue())) {
433 throw new IllegalArgumentException("Passed map contains value '"
434 + entry + "' twice, cannot be inverted.");
435 }
436 dest.put(entry.getValue(), entry.getKey());
437 }
438 }
439
440 }