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
46
47
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
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
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
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,
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
161
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 }