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.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;
27 @SpringBootApplication
28 public class Application extends WebMvcConfigurerAdapter
31 private ServerProperties properties;
35 public RegexUrlHandlerMapping proxiedHandlerMapping(
36 ProxyHttpRequestHandler proxy,
37 UrlThymeleafViewController views
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);
53 public ProxyHttpRequestHandler proxyHttpRequestHandler(
54 CloseableHttpClient client,
58 ProxyHttpRequestHandler handler = new ProxyHttpRequestHandler();
59 handler.setClient(client);
60 handler.setOrigin(env.getProperty("thymeproxy.origin"));
61 handler.setTtl(30000l);
66 public UrlThymeleafViewController urlThymeleafViewController(
70 return new UrlThymeleafViewController(engine);
74 public TemplateResolver defaultTemplateResolver(
75 IResourceResolver resources,
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")));
90 public TemplateResolver jsonTemplateResolver(
91 IResourceResolver resources,
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")));
106 public UrlResourceResolver thymeleafResourceResolver()
108 return new UrlResourceResolver();
112 public JuploDialect juploDialect()
114 return new JuploDialect();
118 public SimpleMappingExceptionResolver simpleMappingExceptionResolver()
120 SimpleMappingExceptionResolver resolver =
121 new SimpleMappingExceptionResolver();
123 Properties mappings = new Properties();
124 mappings.setProperty("TemplateInputException", "templates/404");
126 resolver.setExceptionMappings(mappings);
127 resolver.setDefaultErrorView("templates/500");
128 resolver.setWarnLogCategory("exception");
133 public ErrorController errorController(
134 ApplicationContext context,
135 ErrorAttributes errorAttributes
138 return new ExceptionResolverErrorController(
141 properties.getError()
147 public void addViewControllers(ViewControllerRegistry registry)
149 registry.addViewController("/").setViewName("forward:index.html");
153 public static void main(String[] args)
155 SpringApplication.run(Application.class, args);