WIP: welcome + error
[maven-thymeleaf-skin] / src / main / java / de / juplo / thymeproxy / Application.java
index dcc35f8..0840e95 100644 (file)
@@ -1,13 +1,26 @@
 package de.juplo.thymeproxy;
 
+import de.juplo.thymeleaf.JuploDialect;
 import java.util.HashMap;
 import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 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.config.annotation.ViewControllerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
 import org.springframework.web.servlet.mvc.UrlFilenameViewController;
 import org.thymeleaf.resourceresolver.IResourceResolver;
 import org.thymeleaf.resourceresolver.UrlResourceResolver;
@@ -15,8 +28,12 @@ import org.thymeleaf.templateresolver.TemplateResolver;
 
 
 @SpringBootApplication
-public class Application
+public class Application extends WebMvcConfigurerAdapter
 {
+  @Autowired
+  private ServerProperties properties;
+
+
   @Bean
   public RegexUrlHandlerMapping proxiedHandlerMapping(
       ProxyHttpRequestHandler proxy,
@@ -27,10 +44,11 @@ public class Application
     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;
   }
@@ -62,7 +80,7 @@ public class Application
   {
     TemplateResolver resolver = new TemplateResolver();
     resolver.setResourceResolver(resources);
-    resolver.setPrefix("//thymeleaf/");
+    resolver.setPrefix("http://localhost:8080/thymeleaf/");
     resolver.setSuffix(".html");
     resolver.setTemplateMode("HTML5");
     resolver.setCharacterEncoding("UTF-8");
@@ -70,15 +88,75 @@ public class Application
     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 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
+  {
+    CustomErrorController(
+        ErrorAttributes errorAttributes,
+        ErrorProperties errorProperties
+        )
+    {
+      super(errorAttributes, errorProperties);
+    }
+
+
+    @Override
+    public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response)
+    {
+      response.setStatus(getStatus(request).value());
+      Map<String, Object> model =
+          getErrorAttributes(
+              request,
+              isIncludeStackTrace(request, MediaType.TEXT_HTML)
+              );
+      return new ModelAndView("templates/error", model);
+    }
+  }
 }
\ No newline at end of file