/** * Create a {@link LiteDeviceDelegatingViewResolver} delegating to the specified * {@link ViewResolver}. * @param delegate the view resolver to delegate to * @param delegatingOrder the order of the {@link LiteDeviceDelegatingViewResolver} * @return a {@link LiteDeviceDelegatingViewResolver} handling the specified resolver */ public LiteDeviceDelegatingViewResolver createViewResolver(ViewResolver delegate, int delegatingOrder) { LiteDeviceDelegatingViewResolver resolver = new LiteDeviceDelegatingViewResolver( delegate); resolver.setEnableFallback(this.properties.isEnableFallback()); resolver.setNormalPrefix(this.properties.getNormalPrefix()); resolver.setNormalSuffix(this.properties.getNormalSuffix()); resolver.setMobilePrefix(this.properties.getMobilePrefix()); resolver.setMobileSuffix(this.properties.getMobileSuffix()); resolver.setTabletPrefix(this.properties.getTabletPrefix()); resolver.setTabletSuffix(this.properties.getTabletSuffix()); resolver.setOrder(delegatingOrder); return resolver; }
@Override protected String getDeviceViewNameInternal(String viewName) { RequestAttributes attrs = RequestContextHolder.getRequestAttributes(); Assert.isInstanceOf(ServletRequestAttributes.class, attrs); HttpServletRequest request = ((ServletRequestAttributes) attrs).getRequest(); Device device = DeviceUtils.getCurrentDevice(request); SitePreference sitePreference = SitePreferenceUtils.getCurrentSitePreference(request); String resolvedViewName = viewName; if (ResolverUtils.isNormal(device, sitePreference)) { resolvedViewName = getNormalPrefix() + viewName + getNormalSuffix(); } else if (ResolverUtils.isMobile(device, sitePreference)) { resolvedViewName = getMobilePrefix() + viewName + getMobileSuffix(); } else if (ResolverUtils.isTablet(device, sitePreference)) { resolvedViewName = getTabletPrefix() + viewName + getTabletSuffix(); } // MOBILE-63 "redirect:/" and "forward:/" can result in the view name containing multiple trailing slashes return stripTrailingSlash(resolvedViewName); }
@Bean @Exposed public LiteDeviceDelegatingViewResolver thymeleafDeviceAwareViewResolver( ThymeleafViewResolver mobileSupportingThymeleafViewResolver ) { LiteDeviceDelegatingViewResolver resolver = new LiteDeviceDelegatingViewResolver( mobileSupportingThymeleafViewResolver ); resolver.setOrder( 0 ); resolver.setEnableFallback( true ); return resolver; } }
@Autowired public void registerDeviceTypes() { Set<DeviceType> deviceTypes = settings.getDeviceTypes(); for ( LiteDeviceDelegatingViewResolver resolver : viewResolvers ) { if ( deviceTypes.contains( DeviceType.MOBILE ) ) { resolver.setMobilePrefix( MOBILE_PREFIX ); } if ( deviceTypes.contains( DeviceType.TABLET ) ) { resolver.setTabletPrefix( TABLET_PREFIX ); } if ( deviceTypes.contains( DeviceType.NORMAL ) ) { resolver.setNormalPrefix( NORMAL_PREFIX ); } } }
@Test public void resolveViewNameMobileDeviceMobilePrefixForward() throws Exception { this.viewName = "forward:about"; device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setMobilePrefix("mobile/"); replayMocks("forward:about"); }
@Test public void resolveViewNameTabletDeviceTabletPrefixRedirectToRoot() throws Exception { this.viewName = "redirect:/"; device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setTabletPrefix("tablet/"); replayMocks("redirect:/"); }
@Test public void resolveViewNameTabletDeviceNoSitePreferenceTabletPrefixAndSuffix() throws Exception { device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setTabletPrefix("tablet/"); viewResolver.setTabletSuffix(".tab"); replayMocks("tablet/" + viewName + ".tab"); }
@Test public void resolveViewNameMobileDeviceNoSitePreferenceMobilePrefixAndSuffix() throws Exception { device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setMobilePrefix("mobile/"); viewResolver.setMobileSuffix(".mob"); replayMocks("mobile/" + viewName + ".mob"); }
@Test public void resolveViewNameNoDeviceNoSitePreferenceNormalPrefixAndSuffix() throws Exception { viewResolver.setNormalPrefix("normal/"); viewResolver.setNormalSuffix(".nor"); replayMocks("normal/" + viewName + ".nor"); }
@Test public void resolveViewNameNoDeviceNoSitePreferenceNormalPrefix() throws Exception { viewResolver.setNormalPrefix("normal/"); replayMocks("normal/" + viewName); }
@Bean public LiteDeviceDelegatingViewResolver liteDeviceAwareViewResolver() { InternalResourceViewResolver delegate = new InternalResourceViewResolver(); delegate.setPrefix("/WEB-INF/views/"); delegate.setSuffix(".jsp"); LiteDeviceDelegatingViewResolver resolver = new LiteDeviceDelegatingViewResolver(delegate); resolver.setMobilePrefix("mobile/"); resolver.setTabletPrefix("tablet/"); return resolver; }
@Test public void resolveViewNameMobileDevicePrefixFallback() throws Exception { device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setMobilePrefix("mobile/"); viewResolver.setEnableFallback(true); expect(delegateViewResolver.resolveViewName("mobile/" + viewName, locale)).andReturn(null); expect(delegateViewResolver.resolveViewName(viewName, locale)).andReturn(view); replay(delegateViewResolver, view); View result = viewResolver.resolveViewName(viewName, locale); assertSame("Invalid view", view, result); verify(delegateViewResolver, view); }
@Test public void resolveViewNameTabletDevicePrefixFallback() throws Exception { device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setTabletPrefix("tablet/"); viewResolver.setEnableFallback(true); expect(delegateViewResolver.resolveViewName("tablet/" + viewName, locale)).andReturn(null); expect(delegateViewResolver.resolveViewName(viewName, locale)).andReturn(view); replay(delegateViewResolver, view); View result = viewResolver.resolveViewName(viewName, locale); assertSame("Invalid view", view, result); verify(delegateViewResolver, view); }
@Test public void resolveViewNameNormalDevicePrefixFallback() throws Exception { device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setNormalPrefix("normal/"); viewResolver.setEnableFallback(true); expect(delegateViewResolver.resolveViewName("normal/" + viewName, locale)).andReturn(null); expect(delegateViewResolver.resolveViewName(viewName, locale)).andReturn(view); replay(delegateViewResolver, view); View result = viewResolver.resolveViewName(viewName, locale); assertSame("Invalid view", view, result); verify(delegateViewResolver, view); }
@Test public void resolveViewNameMobileDeviceSuffixFallback() throws Exception { device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setMobileSuffix(".mob"); viewResolver.setEnableFallback(true); expect(delegateViewResolver.resolveViewName(viewName + ".mob", locale)).andReturn(null); expect(delegateViewResolver.resolveViewName(viewName, locale)).andReturn(view); replay(delegateViewResolver, view); View result = viewResolver.resolveViewName(viewName, locale); assertSame("Invalid view", view, result); verify(delegateViewResolver, view); }
@Test public void resolveViewNameNormalDeviceSuffixFallback() throws Exception { device.setDeviceType(DeviceType.NORMAL); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setNormalSuffix(".nor"); viewResolver.setEnableFallback(true); expect(delegateViewResolver.resolveViewName(viewName + ".nor", locale)).andReturn(null); expect(delegateViewResolver.resolveViewName(viewName, locale)).andReturn(view); replay(delegateViewResolver, view); View result = viewResolver.resolveViewName(viewName, locale); assertSame("Invalid view", view, result); verify(delegateViewResolver, view); }
@Test public void resolveViewNameTabletDeviceSuffixFallback() throws Exception { device.setDeviceType(DeviceType.TABLET); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setTabletSuffix(".tab"); viewResolver.setEnableFallback(true); expect(delegateViewResolver.resolveViewName(viewName + ".tab", locale)).andReturn(null); expect(delegateViewResolver.resolveViewName(viewName, locale)).andReturn(view); replay(delegateViewResolver, view); View result = viewResolver.resolveViewName(viewName, locale); assertSame("Invalid view", view, result); verify(delegateViewResolver, view); }
@Test public void resolveViewNameNoDeviceNoSitePreferenceNormalSuffix() throws Exception { viewResolver.setNormalSuffix(".norm"); replayMocks(viewName + ".norm"); }
@Test public void resolveViewNameMobileDeviceMobileSuffixRedirect() throws Exception { this.viewName = "redirect:about"; device.setDeviceType(DeviceType.MOBILE); request.setAttribute(DeviceUtils.CURRENT_DEVICE_ATTRIBUTE, device); viewResolver.setMobileSuffix(".mob"); replayMocks("redirect:about"); }