1 package net.avcompris.commons3.web;
2
3 import static com.google.common.base.Preconditions.checkArgument;
4 import static com.google.common.base.Preconditions.checkNotNull;
5 import static org.apache.commons.lang3.StringUtils.join;
6
7 import java.lang.reflect.Modifier;
8 import java.util.ArrayList;
9 import java.util.List;
10
11
12
13
14
15
16 public abstract class AbstractApplication {
17
18
19
20
21 protected AbstractApplication() {
22
23 System.setProperty("spring.jackson.serialization.indent_output", Boolean.TRUE.toString());
24 }
25
26
27
28
29 protected static <T> Class<? extends T> dao(final Class<T> daoClass, final Object... flagClassPairs) {
30
31 checkNotNull(daoClass, "daoClass");
32 checkNotNull(flagClassPairs, "flagClassPairs");
33
34 checkArgument(daoClass.isInterface(),
35 "daoClass should be an interface, but was: %s", daoClass.getName());
36
37 checkArgument(flagClassPairs.length % 2 == 0,
38 "flagClassPairs.length should be % 2 == 0, but was: %s", flagClassPairs.length);
39
40 Class<? extends T> selectedDaoImplClass = null;
41
42 final List<String> daoImplClassNames = new ArrayList<>();
43
44 for (int i = 0; i < flagClassPairs.length / 2; ++i) {
45
46 final boolean flag = (Boolean) flagClassPairs[i * 2];
47 final Class<?> daoImplClass = (Class<?>) flagClassPairs[i * 2 + 1];
48
49 checkArgument(!daoImplClass.isInterface(),
50 "daoImplClass should not be an interface, but was: %s", daoImplClass.getName());
51
52 checkArgument(!Modifier.isAbstract(daoImplClass.getModifiers()),
53 "daoImplClass should not be an abstract class, but was: %s", daoImplClass.getName());
54
55 checkArgument(daoClass.isAssignableFrom(daoImplClass),
56 "daoImplClass should implement the DAO interface: %s, but was: %s", daoClass.getName(),
57 daoImplClass.getName());
58
59 daoImplClassNames.add(daoImplClass.getName());
60
61 if (flag && selectedDaoImplClass == null) {
62
63 selectedDaoImplClass = daoImplClass.asSubclass(daoClass);
64 }
65 }
66
67 checkArgument(selectedDaoImplClass != null,
68 "Could not choose between: %s. Make sure you are passing an DAO-option to the command line, such as: --inMemory, --rds or --redis",
69 join(daoImplClassNames, ", "));
70
71 return selectedDaoImplClass;
72 }
73 }