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