View Javadoc
1   package net.avcompris.examples.users3.web;
2   
3   import static org.apache.commons.lang3.StringUtils.substringBeforeLast;
4   
5   import org.springframework.boot.SpringApplication;
6   import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
7   import org.springframework.boot.autoconfigure.SpringBootApplication;
8   import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
9   import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
10  import org.springframework.context.ApplicationContext;
11  import org.springframework.context.annotation.Bean;
12  import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
13  import org.springframework.web.servlet.config.annotation.CorsRegistry;
14  import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
15  import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
16  
17  import com.beust.jcommander.JCommander;
18  
19  import net.avcompris.commons3.api.EntitiesQueryRaw;
20  import net.avcompris.commons3.client.DataBeanDeserializer;
21  import net.avcompris.commons3.client.SessionPropagator;
22  import net.avcompris.commons3.core.impl.PermissionsImpl;
23  import net.avcompris.commons3.dao.CorrelationDao;
24  import net.avcompris.commons3.dao.impl.CorrelationDaoInMemory;
25  import net.avcompris.commons3.notifier.impl.ErrorNotifierInMemory;
26  import net.avcompris.commons3.utils.ClockImpl;
27  import net.avcompris.commons3.web.AbstractApplication;
28  import net.avcompris.commons3.web.AbstractConfig;
29  import net.avcompris.commons3.web.ApplicationUtils;
30  import net.avcompris.examples.shared3.core.impl.CorrelationServiceImpl;
31  import net.avcompris.examples.shared3.dao.impl.CorrelationDaoInRDS;
32  import net.avcompris.examples.users3.api.Credentials;
33  import net.avcompris.examples.users3.api.UserCreate;
34  import net.avcompris.examples.users3.api.UserUpdate;
35  import net.avcompris.examples.users3.core.impl.AuthServiceImpl;
36  import net.avcompris.examples.users3.core.impl.UsersServiceImpl;
37  import net.avcompris.examples.users3.dao.AuthDao;
38  import net.avcompris.examples.users3.dao.UsersDao;
39  import net.avcompris.examples.users3.dao.impl.AuthDaoInMemory;
40  import net.avcompris.examples.users3.dao.impl.AuthDaoInRDS;
41  import net.avcompris.examples.users3.dao.impl.UsersDaoInMemory;
42  import net.avcompris.examples.users3.dao.impl.UsersDaoInRDS;
43  
44  /**
45   * Our Spring Boot applications.
46   *
47   * @author dandriana
48   */
49  @EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class })
50  @SpringBootApplication
51  public class Application extends AbstractApplication {
52  
53  	public static final String NAME = "examples-users3";
54  
55  	public static final String API = "/api/v1";
56  
57  	/**
58  	 * Of the form "net.avcompris.commons3.examples.users".
59  	 */
60  	public static final String PACKAGE_PREFIX = substringBeforeLast(Application.class.getPackage().getName(), ".web");
61  
62  	private static boolean secure = true;
63  
64  	private static final class Config extends AbstractConfig {
65  
66  		private Config(final ApplicationArgs myargs) {
67  
68  			super(myargs);
69  		}
70  
71  		static Config load(final ApplicationArgs myargs) {
72  
73  			return new Config(myargs);
74  		}
75  	}
76  
77  	public static void main(final String... args) throws Exception {
78  
79  		// 1. APPLICATION ARGS
80  
81  		final ApplicationArgsApplicationArgs.html#ApplicationArgs">ApplicationArgs myargs = new ApplicationArgs();
82  
83  		JCommander.newBuilder().addObject(myargs).build().parse(args);
84  
85  		secure = !myargs.unsecure;
86  
87  		final Config config = Config.load(myargs);
88  
89  		// 2. SPRING BEANS
90  
91  		final ApplicationContext context = SpringApplication.run(new Class<?>[] {
92  
93  				Application.class,
94  
95  				ClockImpl.class,
96  
97  				CorrelationServiceImpl.class,
98  
99  				ErrorNotifierInMemory.class, // ErrorNotifierInRabbitMQ.class,
100 
101 				AuthServiceImpl.class,
102 
103 				PermissionsImpl.class,
104 
105 				SessionPropagator.class,
106 
107 				UsersServiceImpl.class,
108 
109 				dao(AuthDao.class, //
110 						config.inMemory, AuthDaoInMemory.class, //
111 						config.rds, AuthDaoInRDS.class),
112 
113 				dao(CorrelationDao.class, //
114 						config.inMemory, CorrelationDaoInMemory.class, //
115 						config.rds, CorrelationDaoInRDS.class),
116 
117 				dao(UsersDao.class, //
118 						config.inMemory, UsersDaoInMemory.class, //
119 						config.rds, UsersDaoInRDS.class),
120 
121 		}, args);
122 
123 		ApplicationUtils.dumpBeans(context, System.out, "net.avcompris");
124 	}
125 
126 	@Bean
127 	public WebMvcConfigurer corsConfigurer() {
128 
129 		return new WebMvcConfigurerAdapter() {
130 
131 			@Override
132 			public void addCorsMappings(final CorsRegistry registry) {
133 
134 				registry.addMapping("/**").allowedMethods(
135 
136 						"HEAD", "GET", "POST", "PUT", "DELETE" //
137 				);
138 			}
139 		};
140 	}
141 
142 	public static boolean isSecure() {
143 
144 		final boolean secure = Application.secure;
145 
146 		if (!secure) {
147 			System.err.println("*** WARNING *** Application.secure = " + secure
148 					+ ", which means HTTP Cookies may be sent on non-SSL HTTP connections");
149 		}
150 
151 		return secure;
152 	}
153 
154 	public static boolean isHttpOnly() {
155 
156 		return true;
157 	}
158 
159 	/**
160 	 * Because we use interfaces for our DataBean classes (via our DataBeans utility), we
161 	 * must specify custom JSON deserializers here.
162 	 */
163 	@Bean
164 	public Jackson2ObjectMapperBuilderCustomizer addCustomDeserialization() {
165 
166 		return new Jackson2ObjectMapperBuilderCustomizer() {
167 
168 			@Override
169 			public void customize(final Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder) {
170 
171 				for (final Class<?> clazz : new Class<?>[] {
172 
173 						Credentials.class,
174 
175 						EntitiesQueryRaw.class,
176 
177 						UserCreate.class, UserUpdate.class,
178 
179 				}) {
180 
181 					jackson2ObjectMapperBuilder.deserializerByType(clazz,
182 							DataBeanDeserializer.createDeserializer(clazz));
183 				}
184 			}
185 		};
186 	}
187 }