WIP: early 404-detection
[maven-thymeleaf-skin] / src / main / java / de / juplo / thymeproxy / Application.java
1 package de.juplo.thymeproxy;
2
3 import de.juplo.thymeleaf.JuploDialect;
4 import java.util.HashMap;
5 import java.util.Map;
6 import java.util.Properties;
7 import org.apache.http.impl.client.CloseableHttpClient;
8 import org.springframework.beans.factory.annotation.Autowired;
9 import org.springframework.boot.SpringApplication;
10 import org.springframework.boot.autoconfigure.SpringBootApplication;
11 import org.springframework.boot.autoconfigure.web.ErrorAttributes;
12 import org.springframework.boot.autoconfigure.web.ErrorController;
13 import org.springframework.boot.autoconfigure.web.ServerProperties;
14 import org.springframework.context.ApplicationContext;
15 import org.springframework.context.annotation.Bean;
16 import org.springframework.core.Ordered;
17 import org.springframework.core.env.Environment;
18 import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
19 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
20 import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
21 import org.thymeleaf.TemplateEngine;
22 import org.thymeleaf.resourceresolver.IResourceResolver;
23 import org.thymeleaf.resourceresolver.UrlResourceResolver;
24 import org.thymeleaf.templateresolver.TemplateResolver;
25
26
27 @SpringBootApplication
28 public class Application extends WebMvcConfigurerAdapter
29 {
30   @Autowired
31   private ServerProperties properties;
32
33
34   @Bean
35   public RegexUrlHandlerMapping proxiedHandlerMapping(
36       ProxyHttpRequestHandler proxy,
37       UrlThymeleafViewController views
38       )
39   {
40     RegexUrlHandlerMapping mapping = new RegexUrlHandlerMapping();
41     mapping.setOrder(Ordered.HIGHEST_PRECEDENCE);
42     Map<String, Object> mappings = new HashMap<>();
43     mappings.put("/img/.+", proxy);
44     mappings.put("/css/.+", proxy);
45     mappings.put("/js/.+", proxy);
46     mappings.put("/fonts/.+", proxy);
47     mappings.put("/.*\\.html", views);
48     mapping.setUrlMap(mappings);
49         return mapping;
50   }
51
52   @Bean
53   public ProxyHttpRequestHandler proxyHttpRequestHandler(
54       CloseableHttpClient client,
55       Environment env
56       )
57   {
58     ProxyHttpRequestHandler handler = new ProxyHttpRequestHandler();
59     handler.setClient(client);
60     handler.setOrigin(env.getProperty("thymeproxy.origin"));
61     handler.setTtl(30000l);
62     return handler;
63   }
64
65   @Bean
66   public UrlThymeleafViewController urlThymeleafViewController(
67       TemplateEngine engine
68       )
69   {
70     return new UrlThymeleafViewController(engine);
71   }
72
73   @Bean
74   public TemplateResolver defaultTemplateResolver(
75       IResourceResolver resources,
76       Environment env
77       )
78   {
79     TemplateResolver resolver = new TemplateResolver();
80     resolver.setResourceResolver(resources);
81     resolver.setPrefix("http://localhost:8080/thymeleaf/");
82     resolver.setSuffix(".html");
83     resolver.setTemplateMode("HTML5");
84     resolver.setCharacterEncoding("UTF-8");
85     resolver.setCacheable(Boolean.valueOf(env.getProperty("thymeproxy.cacheable")));
86     return resolver;
87   }
88
89   @Bean
90   public TemplateResolver jsonTemplateResolver(
91       IResourceResolver resources,
92       Environment env
93       )
94   {
95     TemplateResolver resolver = new TemplateResolver();
96     resolver.setResourceResolver(resources);
97     resolver.setPrefix("http://localhost:8080/thymeleaf/");
98     resolver.setSuffix(".json");
99     resolver.setTemplateMode("JSON");
100     resolver.setCharacterEncoding("UTF-8");
101     resolver.setCacheable(Boolean.valueOf(env.getProperty("thymeproxy.cacheable")));
102     return resolver;
103   }
104
105   @Bean
106   public UrlResourceResolver thymeleafResourceResolver()
107   {
108     return new UrlResourceResolver();
109   }
110
111   @Bean
112   public JuploDialect juploDialect()
113   {
114     return new JuploDialect();
115   }
116
117   @Bean
118   public SimpleMappingExceptionResolver simpleMappingExceptionResolver()
119   {
120     SimpleMappingExceptionResolver resolver =
121         new SimpleMappingExceptionResolver();
122
123     Properties mappings = new Properties();
124     mappings.setProperty("TemplateInputException", "templates/404");
125
126     resolver.setExceptionMappings(mappings);
127     resolver.setDefaultErrorView("templates/500");
128     resolver.setWarnLogCategory("exception");
129     return resolver;
130   }
131
132   @Bean
133   public ErrorController errorController(
134       ApplicationContext context,
135       ErrorAttributes errorAttributes
136       )
137   {
138     return new ExceptionResolverErrorController(
139         context,
140         errorAttributes,
141         properties.getError()
142         );
143   }
144
145
146   @Override
147   public void addViewControllers(ViewControllerRegistry registry)
148   {
149     registry.addViewController("/").setViewName("forward:index.html");
150   }
151
152
153   public static void main(String[] args)
154   {
155     SpringApplication.run(Application.class, args);
156   }
157 }