@Override
  public void beforeView(
      final HttpServletRequest request,
      final HttpServletResponse response,
      final ModelAndView modelAndView) {
    final CMSSiteModel currentSite = cmsSiteService.getCurrentSite();

    final String siteName = currentSite.getUid();
    final String themeName = getThemeNameForSite(currentSite);
    final String uiExperienceCode = uiExperienceService.getUiExperienceLevel().getCode();
    final String uiExperienceCodeLower =
        uiExperienceViewResolver.getUiExperienceViewPrefix().isEmpty()
            ? uiExperienceCode.toLowerCase()
            : StringUtils.remove(
                uiExperienceViewResolver
                    .getUiExperienceViewPrefix()
                    .get(uiExperienceService.getUiExperienceLevel()),
                "/");
    final Object urlEncodingAttributes = request.getAttribute(WebConstants.URL_ENCODING_ATTRIBUTES);
    final String contextPath =
        StringUtils.remove(
            request.getContextPath(),
            (urlEncodingAttributes != null) ? urlEncodingAttributes.toString() : "");

    final String siteRootUrl = contextPath + "/_ui/" + uiExperienceCodeLower;
    final String sharedResourcePath = contextPath + "/_ui/" + SHARED;
    final String siteResourcePath = siteRootUrl + "/site-" + siteName;
    final String themeResourcePath = siteRootUrl + "/theme-" + themeName;
    final String commonResourcePath = siteRootUrl + "/" + COMMON;
    final String encodedContextPath = request.getContextPath();
    final LanguageModel currentLanguage = commerceCommonI18NService.getCurrentLanguage();

    modelAndView.addObject("contextPath", contextPath);
    modelAndView.addObject("sharedResourcePath", sharedResourcePath);
    modelAndView.addObject("siteResourcePath", siteResourcePath);
    modelAndView.addObject("themeResourcePath", themeResourcePath);
    modelAndView.addObject("commonResourcePath", commonResourcePath);
    modelAndView.addObject("encodedContextPath", encodedContextPath);
    modelAndView.addObject("siteRootUrl", siteRootUrl);
    modelAndView.addObject(
        "language", (currentLanguage != null ? currentLanguage.getIsocode() : "en"));
    modelAndView.addObject("CSRFToken", CSRFTokenManager.getTokenForSession(request.getSession()));

    modelAndView.addObject("uiExperienceLevel", uiExperienceCode);

    final String detectedUiExperienceCode =
        uiExperienceService.getDetectedUiExperienceLevel().getCode();
    modelAndView.addObject("detectedUiExperienceCode", detectedUiExperienceCode);

    final UiExperienceLevel overrideUiExperienceLevel =
        uiExperienceService.getOverrideUiExperienceLevel();
    if (overrideUiExperienceLevel == null) {
      modelAndView.addObject("uiExperienceOverride", Boolean.FALSE);
    } else {
      modelAndView.addObject("uiExperienceOverride", Boolean.TRUE);
      modelAndView.addObject("overrideUiExperienceCode", overrideUiExperienceLevel.getCode());
    }

    final DeviceData currentDetectedDevice = deviceDetectionFacade.getCurrentDetectedDevice();
    modelAndView.addObject("detectedDevice", currentDetectedDevice);

    final List<String> dependantAddOns =
        requiredAddOnsNameProvider.getAddOns(
            request.getSession().getServletContext().getServletContextName());

    modelAndView.addObject(
        "addOnCommonCssPaths",
        getAddOnCommonCSSPaths(contextPath, uiExperienceCodeLower, dependantAddOns));
    modelAndView.addObject(
        "addOnThemeCssPaths",
        getAddOnThemeCSSPaths(contextPath, themeName, uiExperienceCodeLower, dependantAddOns));
    modelAndView.addObject(
        "addOnJavaScriptPaths",
        getAddOnJSPaths(contextPath, siteName, uiExperienceCodeLower, dependantAddOns));
  }