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