1 package de.juplo.thymeproxy;
3 import de.juplo.thymeleaf.JuploDialect;
4 import java.util.HashMap;
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;
28 @SpringBootApplication
29 public class Application extends WebMvcConfigurerAdapter
32 private ServerProperties properties;
36 public RegexUrlHandlerMapping proxiedHandlerMapping(
37 ProxyHttpRequestHandler proxy,
38 UrlThymeleafViewController views
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);
54 public ProxyHttpRequestHandler proxyHttpRequestHandler(
55 CloseableHttpClient client,
59 ProxyHttpRequestHandler handler = new ProxyHttpRequestHandler();
60 handler.setClient(client);
61 handler.setOrigin(env.getProperty("thymeproxy.origin"));
62 handler.setTtl(30000l);
67 public UrlThymeleafViewController urlThymeleafViewController(
71 return new UrlThymeleafViewController(engine);
75 public TemplateResolver defaultTemplateResolver(
76 IResourceResolver resources,
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")));
91 public TemplateResolver jsonTemplateResolver(
92 IResourceResolver resources,
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")));
107 public UrlResourceResolver thymeleafResourceResolver()
109 return new UrlResourceResolver();
113 public JuploDialect juploDialect()
115 return new JuploDialect();
119 public SimpleMappingExceptionResolver simpleMappingExceptionResolver()
121 SimpleMappingExceptionResolver resolver =
122 new SimpleMappingExceptionResolver();
124 Properties mappings = new Properties();
125 mappings.setProperty("TemplateInputException", "templates/404");
127 resolver.setExceptionMappings(mappings);
128 resolver.setDefaultErrorView("templates/error");
129 resolver.setWarnLogCategory("exception");
134 public ErrorController errorController(
135 ApplicationContext context,
136 ErrorAttributes errorAttributes
139 ExceptionResolverErrorController controller =
140 new ExceptionResolverErrorController(
143 properties.getError()
145 controller.addErrorMapping(HttpStatus.NOT_FOUND, "templates/404");
146 controller.setDefaultErrorView("templates/error");
152 public void addViewControllers(ViewControllerRegistry registry)
154 registry.addViewController("/").setViewName("forward:index.html");
158 public static void main(String[] args)
160 SpringApplication.run(Application.class, args);