WIP:thymeproxy
[maven-thymeleaf-skin] / src / main / java / de / juplo / thymeproxy / Application.java
index 7eb7333..1c33ce2 100644 (file)
@@ -4,18 +4,28 @@ 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;
@@ -38,7 +48,6 @@ public class Application extends WebMvcConfigurerAdapter
     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);
@@ -118,9 +127,9 @@ public class Application extends WebMvcConfigurerAdapter
   }
 
   @Bean
-  public ExceptionMappings exceptionMappings()
+  public ErrorController errorController(ErrorAttributes errorAttributes)
   {
-    return new ExceptionMappings();
+    return new CustomErrorController(errorAttributes, properties.getError());
   }
 
 
@@ -135,4 +144,51 @@ public class Application extends WebMvcConfigurerAdapter
   {
     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