package at.asitplus.eidas.specific.connector.gui; import java.util.Locale; import java.util.Map; import javax.annotation.Nullable; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; 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 at.gv.egiz.eaaf.core.api.gui.ISpringMvcGuiFormBuilder; import at.gv.egiz.eaaf.core.exceptions.GuiBuildException; public class SpringMvcGuiFormBuilderImpl implements ISpringMvcGuiFormBuilder { private static final Logger log = LoggerFactory.getLogger(SpringMvcGuiFormBuilderImpl.class); private @Autowired(required=false) ViewResolver[] viewResolvers; private @Autowired(required=false) LocaleResolver localeResolver; @Override public void build(HttpServletRequest httpReq, HttpServletResponse httpResp, IGuiBuilderConfiguration config, String loggerName) throws GuiBuildException { build(httpReq, httpResp, config, null, loggerName); } @Override public void build(HttpServletRequest httpReq, HttpServletResponse httpResp, IGuiBuilderConfiguration config, String contentType, String loggerName) throws GuiBuildException { try { final ModelAndView mav = new ModelAndView(config.getViewName()); if (config.getViewParameters() != null) mav.addAllObjects(config.getViewParameters()); render(mav, httpReq, httpResp); } catch (final Exception e) { log.info("Can NOT generate GUI for illustration", e); throw new GuiBuildException(e.getMessage(), e); } } protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception { // Determine locale for request and apply it to the response. final Locale locale = (this.localeResolver != null ? this.localeResolver.resolveLocale(request) : request.getLocale()); response.setLocale(locale); View view; final String viewName = mv.getViewName(); if (viewName != null) { // We need to resolve the view name. view = resolveViewName(viewName, mv.getModelMap(), locale, request); 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 "); } // Delegate to the View object for rendering. if (log.isTraceEnabled()) log.trace("Rendering view [" + view + "] "); try { if (mv.getStatus() != null) response.setStatus(mv.getStatus().value()); view.render(mv.getModelMap(), request, response); } catch (final Exception ex) { if (log.isDebugEnabled()) log.debug("Error rendering view [" + view + "]", ex); throw ex; } } protected View resolveViewName(String viewName, @Nullable Map model, Locale locale, HttpServletRequest request) throws Exception { if (viewResolvers != null) { for (final ViewResolver viewResolver : this.viewResolvers) { final View view = viewResolver.resolveViewName(viewName, locale); if (view != null) return view; } } return null; } }