package de.juplo.thymeproxy;
+import de.juplo.thymeleaf.JuploDialect;
import java.util.HashMap;
+import java.util.Locale;
import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.apache.http.HttpStatus;
import org.apache.http.impl.client.CloseableHttpClient;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.web.BasicErrorController;
+import org.springframework.boot.autoconfigure.web.ErrorAttributes;
+import org.springframework.boot.autoconfigure.web.ErrorController;
+import org.springframework.boot.autoconfigure.web.ErrorProperties;
+import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.core.Ordered;
import org.springframework.core.env.Environment;
+import org.springframework.http.MediaType;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.View;
+import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.mvc.UrlFilenameViewController;
+import org.thymeleaf.exceptions.TemplateInputException;
import org.thymeleaf.resourceresolver.IResourceResolver;
import org.thymeleaf.resourceresolver.UrlResourceResolver;
+import org.thymeleaf.spring4.view.ThymeleafViewResolver;
import org.thymeleaf.templateresolver.TemplateResolver;
@SpringBootApplication
-public class Application
+public class Application extends WebMvcConfigurerAdapter
{
+ @Autowired
+ private ServerProperties properties;
+
+
@Bean
public RegexUrlHandlerMapping proxiedHandlerMapping(
ProxyHttpRequestHandler proxy,
RegexUrlHandlerMapping mapping = new RegexUrlHandlerMapping();
mapping.setOrder(Ordered.HIGHEST_PRECEDENCE);
Map<String, Object> mappings = new HashMap<>();
- mappings.put("/thymeleaf/.*\\.html", proxy);
+ mappings.put("/img/.+", proxy);
mappings.put("/css/.+", proxy);
mappings.put("/js/.+", proxy);
mappings.put("/fonts/.+", proxy);
- mappings.put(".*\\.html", views);
+ mappings.put("/.*\\.html", views);
mapping.setUrlMap(mappings);
return mapping;
}
return resolver;
}
+ @Bean
+ public TemplateResolver jsonTemplateResolver(
+ IResourceResolver resources,
+ Environment env
+ )
+ {
+ TemplateResolver resolver = new TemplateResolver();
+ resolver.setResourceResolver(resources);
+ resolver.setPrefix("http://localhost:8080/thymeleaf/");
+ resolver.setSuffix(".json");
+ resolver.setTemplateMode("JSON");
+ resolver.setCharacterEncoding("UTF-8");
+ resolver.setCacheable(Boolean.valueOf(env.getProperty("thymeproxy.cacheable")));
+ return resolver;
+ }
+
@Bean
public UrlResourceResolver thymeleafResourceResolver()
{
return new UrlResourceResolver();
}
+ @Bean
+ public JuploDialect juploDialect()
+ {
+ return new JuploDialect();
+ }
+
+ @Bean
+ public View error(ThymeleafViewResolver resolver) throws Exception
+ {
+ return resolver.resolveViewName("templates/500", Locale.getDefault());
+ }
+
+ @Bean
+ public ErrorController errorController(ErrorAttributes errorAttributes)
+ {
+ return new CustomErrorController(errorAttributes, properties.getError());
+ }
+
+
+ @Override
+ public void addViewControllers(ViewControllerRegistry registry)
+ {
+ registry.addViewController("/").setViewName("forward:index.html");
+ }
+
public static void main(String[] args)
{
SpringApplication.run(Application.class, args);
}
+
+
+ static class CustomErrorController extends BasicErrorController
+ {
+ public final static String TEMPLATE_INPUT_EXCEPTION =
+ TemplateInputException.class.getCanonicalName();
+
+
+ CustomErrorController(
+ ErrorAttributes errorAttributes,
+ ErrorProperties errorProperties
+ )
+ {
+ super(errorAttributes, errorProperties);
+ }
+
+
+ @Override
+ public ModelAndView errorHtml(
+ HttpServletRequest request,
+ HttpServletResponse response
+ )
+ {
+ Map<String, Object> model =
+ getErrorAttributes(
+ request,
+ isIncludeStackTrace(request, MediaType.TEXT_HTML)
+ );
+
+ String view;
+
+ switch ((String)model.get("exception"))
+ {
+ case "org.thymeleaf.exceptions.TemplateInputException":
+ response.setStatus(HttpStatus.SC_NOT_FOUND);
+ view = "templates/404";
+ break;
+
+ default:
+ response.setStatus(getStatus(request).value());
+ view = "templates/500";
+ break;
+ }
+
+ return new ModelAndView(view, model);
+ }
+ }
}
\ No newline at end of file