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