summaryrefslogtreecommitdiff
path: root/eaaf_core/src/main/java/at/gv/egiz/eaaf/core/impl/gui/utils/MvcGuiRenderUtils.java
diff options
context:
space:
mode:
Diffstat (limited to 'eaaf_core/src/main/java/at/gv/egiz/eaaf/core/impl/gui/utils/MvcGuiRenderUtils.java')
-rw-r--r--eaaf_core/src/main/java/at/gv/egiz/eaaf/core/impl/gui/utils/MvcGuiRenderUtils.java199
1 files changed, 199 insertions, 0 deletions
diff --git a/eaaf_core/src/main/java/at/gv/egiz/eaaf/core/impl/gui/utils/MvcGuiRenderUtils.java b/eaaf_core/src/main/java/at/gv/egiz/eaaf/core/impl/gui/utils/MvcGuiRenderUtils.java
new file mode 100644
index 00000000..5a3f14cb
--- /dev/null
+++ b/eaaf_core/src/main/java/at/gv/egiz/eaaf/core/impl/gui/utils/MvcGuiRenderUtils.java
@@ -0,0 +1,199 @@
+package at.gv.egiz.eaaf.core.impl.gui.utils;
+
+import java.util.Locale;
+
+import javax.annotation.Nullable;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.util.Assert;
+import org.springframework.web.servlet.LocaleResolver;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.View;
+import org.springframework.web.servlet.ViewResolver;
+
+import at.gv.egiz.eaaf.core.api.gui.IGuiBuilderConfiguration;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * Utils GUI generation by using Spring MVC.
+
+ * @author tlenz
+ *
+ */
+@Slf4j
+public class MvcGuiRenderUtils {
+
+ private static final String REQ_ATTR_MODEL_HOLDER = "GUI_MODEL_ASYNCH_RENDERING";
+
+ /**
+ * Build Spring MVC model from GUI configuration.
+ *
+ * @param config GUI configuration
+ * @return MVC model
+ */
+ @NonNull
+ public static ModelAndView prepareSpringGuiModel(@NonNull final IGuiBuilderConfiguration config) {
+ final ModelAndView mav = new ModelAndView(config.getViewName());
+ if (config.getViewParameters() != null) {
+ mav.addAllObjects(config.getViewParameters());
+
+ }
+ return mav;
+
+ }
+
+
+ /**
+ * Inject GUI-builder configuration into http request to render it asynchronous in Spring intercepter.
+ *
+ * @param request Current HttpServletRequest
+ * @param config Configuration for GUI rendering
+ */
+ public static void setMvcForAsynchRendering(@NonNull final HttpServletRequest request,
+ @NonNull final IGuiBuilderConfiguration config) {
+ request.setAttribute(REQ_ATTR_MODEL_HOLDER, prepareSpringGuiModel(config));
+
+ }
+
+ /**
+ * Get GUI model for asynchronous rendering.
+ *
+ * @param request Current HttpServletRequest
+ * @return GUI model, or <code>null</code> of model was set
+ */
+ @Nullable
+ public static ModelAndView getMvcForAsynchRendering(@NonNull final HttpServletRequest request) {
+ return (ModelAndView) request.getAttribute(REQ_ATTR_MODEL_HOLDER);
+
+ }
+
+ /**
+ * Analyze GUI template and HTTP request to evaluate ContentType of HTTP response generated by this builder.
+ *
+ * @param httpReq Current HttpServletRequest
+ * @param config GUI configuration
+ * @param viewResolvers Spring based view-resolvers
+ * @param localeResolver Spring based locale-resolvers
+ * @return Response content-type, or <code>null</code> if evaluation has no result
+ * @throws Exception In case of a GUI rendering error
+ */
+ @Nullable
+ public static String evaluateResponseContentType(HttpServletRequest httpReq,
+ IGuiBuilderConfiguration config, @Nullable final ViewResolver[] viewResolvers,
+ @Nullable final LocaleResolver localeResolver) throws Exception {
+ return buildViewFromModel(viewResolvers,
+ getLocaleByRequest(localeResolver, httpReq),
+ prepareSpringGuiModel(config)).getContentType();
+
+ }
+
+ /**
+ * Render a GUI by using Spring based ModelAndView (MVC) components.
+ *
+ * @param mv GUI model
+ * @param request Current HttpServletRequest
+ * @param response Current HttpServletResponse
+ * @param viewResolvers Spring based view-resolvers
+ * @param localeResolver Spring based locale-resolvers
+ * @throws Exception In case of a GUI rendering error
+ */
+ public static void render(@NonNull final ModelAndView mv, @NonNull final HttpServletRequest request,
+ @NonNull final HttpServletResponse response, @Nullable final ViewResolver[] viewResolvers,
+ @Nullable final LocaleResolver localeResolver) throws Exception {
+ Assert.notNull(request, "http request object");
+ Assert.notNull(response, "http response object");
+ Assert.notNull(mv, "Model and view");
+
+ // Determine locale for request and apply it to the response.
+ final Locale locale = getLocaleByRequest(localeResolver, request);
+ response.setLocale(locale);
+
+ // Determine view for response
+ View view = buildViewFromModel(viewResolvers, locale, mv);
+
+ final HttpStatus modelStatus = mv.getStatus();
+ if (modelStatus != null) {
+ response.setStatus(modelStatus.value());
+
+ } else {
+ log.trace("HttpStatus is 'null' Set {} as default", HttpServletResponse.SC_OK);
+ response.setStatus(HttpServletResponse.SC_OK);
+
+ }
+
+ // Delegate to the View object for rendering.
+ if (log.isTraceEnabled()) {
+ log.trace("Rendering view [{}] ", view);
+ }
+
+ try {
+ view.render(mv.getModelMap(), request, response);
+
+ } catch (final Exception ex) {
+ if (log.isDebugEnabled()) {
+ log.debug("Error rendering view [{}]", view, null, ex);
+ }
+
+ throw ex;
+
+ }
+
+ }
+
+ private static Locale getLocaleByRequest(LocaleResolver localeResolver, @NonNull HttpServletRequest request) {
+ return localeResolver != null ? localeResolver.resolveLocale(request) : request.getLocale();
+
+ }
+
+ private static View buildViewFromModel(ViewResolver[] viewResolvers, Locale locale,
+ @NonNull ModelAndView mv) throws Exception {
+
+ final String viewName = mv.getViewName();
+ View view;
+ if (viewName != null) {
+ // We need to resolve the view name.
+ view = resolveViewName(viewResolvers, viewName, locale);
+
+ if (view == null) {
+ throw new ServletException("Could not resolve view with name '" + mv.getViewName() + "' ");
+ }
+
+ } else {
+ // No need to lookup: the ModelAndView object contains the actual View object.
+ view = mv.getView();
+ if (view == null) {
+ throw new ServletException(
+ "ModelAndView [" + mv + "] neither contains a view name nor a " + "View object ");
+
+ }
+ }
+
+ return view;
+
+ }
+
+
+ private static View resolveViewName(@Nullable final ViewResolver[] viewResolvers,
+ final String viewName, final Locale locale) throws Exception {
+ if (viewResolvers != null) {
+ for (final ViewResolver viewResolver : viewResolvers) {
+ final View view = viewResolver.resolveViewName(viewName, locale);
+ if (view != null) {
+ return view;
+ }
+
+ }
+ }
+
+ return null;
+ }
+
+ private MvcGuiRenderUtils() {
+ // private constructor for class with only static methods
+ }
+
+}