9311cf85e2004c8252f2a252ca470a8d72ff714e
[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.springframework.web.servlet.mvc.UrlFilenameViewController;
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       UrlFilenameViewController 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 UrlFilenameViewController urlFilenameViewController()
67   {
68     return new UrlFilenameViewController();
69   }
70
71   @Bean
72   public TemplateResolver defaultTemplateResolver(
73       IResourceResolver resources,
74       Environment env
75       )
76   {
77     TemplateResolver resolver = new TemplateResolver();
78     resolver.setResourceResolver(resources);
79     resolver.setPrefix("http://localhost:8080/thymeleaf/");
80     resolver.setSuffix(".html");
81     resolver.setTemplateMode("HTML5");
82     resolver.setCharacterEncoding("UTF-8");
83     resolver.setCacheable(Boolean.valueOf(env.getProperty("thymeproxy.cacheable")));
84     return resolver;
85   }
86
87   @Bean
88   public TemplateResolver jsonTemplateResolver(
89       IResourceResolver resources,
90       Environment env
91       )
92   {
93     TemplateResolver resolver = new TemplateResolver();
94     resolver.setResourceResolver(resources);
95     resolver.setPrefix("http://localhost:8080/thymeleaf/");
96     resolver.setSuffix(".json");
97     resolver.setTemplateMode("JSON");
98     resolver.setCharacterEncoding("UTF-8");
99     resolver.setCacheable(Boolean.valueOf(env.getProperty("thymeproxy.cacheable")));
100     return resolver;
101   }
102
103   @Bean
104   public UrlResourceResolver thymeleafResourceResolver()
105   {
106     return new UrlResourceResolver();
107   }
108
109   @Bean
110   public JuploDialect juploDialect()
111   {
112     return new JuploDialect();
113   }
114
115   @Bean
116   public SimpleMappingExceptionResolver simpleMappingExceptionResolver()
117   {
118     SimpleMappingExceptionResolver resolver =
119         new SimpleMappingExceptionResolver();
120
121     Properties mappings = new Properties();
122     mappings.setProperty("TemplateInputException", "templates/404");
123
124     resolver.setExceptionMappings(mappings);
125     resolver.setDefaultErrorView("templates/500");
126     resolver.setWarnLogCategory("exception");
127     return resolver;
128   }
129
130   @Bean
131   public ErrorController errorController(
132       ApplicationContext context,
133       ErrorAttributes errorAttributes
134       )
135   {
136     return new ExceptionResolverErrorController(
137         context,
138         errorAttributes,
139         properties.getError()
140         );
141   }
142
143
144   @Override
145   public void addViewControllers(ViewControllerRegistry registry)
146   {
147     registry.addViewController("/").setViewName("forward:index.html");
148   }
149
150
151   public static void main(String[] args)
152   {
153     SpringApplication.run(Application.class, args);
154   }
155 }