View Javadoc
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   * Base class for all our Spring Boot applications.
13   *
14   * @author dandriana
15   */
16  public abstract class AbstractApplication {
17  
18  	/**
19  	 * In here, we just set JSON indentation for API responses.
20  	 */
21  	protected AbstractApplication() {
22  
23  		System.setProperty("spring.jackson.serialization.indent_output", Boolean.TRUE.toString());
24  	}
25  
26  	/**
27  	 * Choose a DAO class among two or three, depending on arg flags.
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  }