View Javadoc
1   /*
2    * Copyright 2002-2014 the original author or authors.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package org.springframework.web.servlet.config.annotation;
18  
19  import java.util.Arrays;
20  
21  import org.junit.Before;
22  import org.junit.Test;
23  
24  import org.springframework.beans.DirectFieldAccessor;
25  import org.springframework.core.Ordered;
26  import org.springframework.web.accept.ContentNegotiationManager;
27  import org.springframework.web.context.support.StaticWebApplicationContext;
28  import org.springframework.web.servlet.ViewResolver;
29  import org.springframework.web.servlet.view.BeanNameViewResolver;
30  import org.springframework.web.servlet.view.ContentNegotiatingViewResolver;
31  import org.springframework.web.servlet.view.InternalResourceViewResolver;
32  import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
33  import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver;
34  import org.springframework.web.servlet.view.groovy.GroovyMarkupConfigurer;
35  import org.springframework.web.servlet.view.groovy.GroovyMarkupViewResolver;
36  import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
37  import org.springframework.web.servlet.view.tiles3.TilesConfigurer;
38  import org.springframework.web.servlet.view.tiles3.TilesViewResolver;
39  import org.springframework.web.servlet.view.velocity.VelocityConfigurer;
40  import org.springframework.web.servlet.view.velocity.VelocityViewResolver;
41  import org.springframework.web.servlet.view.xml.MarshallingView;
42  
43  import static org.junit.Assert.*;
44  
45  /**
46   * Test fixture with a {@link ViewResolverRegistry}.
47   *
48   * @author Sebastien Deleuze
49   * @author Rossen Stoyanchev
50   */
51  public class ViewResolverRegistryTests {
52  
53  	private ViewResolverRegistry registry;
54  
55  
56  	@Before
57  	public void setUp() {
58  		StaticWebApplicationContext context = new StaticWebApplicationContext();
59  		context.registerSingleton("freeMarkerConfigurer", FreeMarkerConfigurer.class);
60  		context.registerSingleton("velocityConfigurer", VelocityConfigurer.class);
61  		context.registerSingleton("tilesConfigurer", TilesConfigurer.class);
62  		context.registerSingleton("groovyMarkupConfigurer", GroovyMarkupConfigurer.class);
63  		this.registry = new ViewResolverRegistry();
64  		this.registry.setApplicationContext(context);
65  		this.registry.setContentNegotiationManager(new ContentNegotiationManager());
66  	}
67  
68  
69  	@Test
70  	public void order() {
71  		assertEquals(Ordered.LOWEST_PRECEDENCE, this.registry.getOrder());
72  		this.registry.enableContentNegotiation();
73  		assertEquals(Ordered.HIGHEST_PRECEDENCE, this.registry.getOrder());
74  	}
75  
76  	@Test
77  	public void hasRegistrations() {
78  		assertFalse(this.registry.hasRegistrations());
79  		this.registry.velocity();
80  		assertTrue(this.registry.hasRegistrations());
81  	}
82  
83  	@Test
84  	public void hasRegistrationsWhenContentNegotiationEnabled() {
85  		assertFalse(this.registry.hasRegistrations());
86  		this.registry.enableContentNegotiation();
87  		assertTrue(this.registry.hasRegistrations());
88  	}
89  
90  	@Test
91  	public void noResolvers() {
92  		assertNotNull(this.registry.getViewResolvers());
93  		assertEquals(0, this.registry.getViewResolvers().size());
94  		assertFalse(this.registry.hasRegistrations());
95  	}
96  
97  	@Test
98  	public void customViewResolver() {
99  		InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
100 		viewResolver.setPrefix("/");
101 		viewResolver.setSuffix(".jsp");
102 		this.registry.viewResolver(viewResolver);
103 		assertSame(viewResolver, this.registry.getViewResolvers().get(0));
104 	}
105 
106 	@Test
107 	public void beanName() {
108 		this.registry.beanName();
109 		assertEquals(1, this.registry.getViewResolvers().size());
110 		assertEquals(BeanNameViewResolver.class, registry.getViewResolvers().get(0).getClass());
111 	}
112 
113 	@Test
114 	public void jspDefaultValues() {
115 		this.registry.jsp();
116 		InternalResourceViewResolver resolver = checkAndGetResolver(InternalResourceViewResolver.class);
117 		checkPropertyValues(resolver, "prefix", "/WEB-INF/", "suffix", ".jsp");
118 	}
119 
120 	@Test
121 	public void jsp() {
122 		this.registry.jsp("/", ".jsp");
123 		InternalResourceViewResolver resolver = checkAndGetResolver(InternalResourceViewResolver.class);
124 		checkPropertyValues(resolver, "prefix", "/", "suffix", ".jsp");
125 	}
126 
127 	@Test
128 	public void jspMultipleResolvers() {
129 		this.registry.jsp().viewNames("view1", "view2");
130 		this.registry.jsp().viewNames("view3", "view4");
131 		assertNotNull(this.registry.getViewResolvers());
132 		assertEquals(2, this.registry.getViewResolvers().size());
133 		assertEquals(InternalResourceViewResolver.class, this.registry.getViewResolvers().get(0).getClass());
134 		assertEquals(InternalResourceViewResolver.class, this.registry.getViewResolvers().get(1).getClass());
135 	}
136 
137 	@Test
138 	public void tiles() {
139 		this.registry.tiles();
140 		checkAndGetResolver(TilesViewResolver.class);
141 	}
142 
143 	@Test
144 	public void velocity() {
145 		this.registry.velocity().prefix("/").suffix(".vm").cache(true);
146 		VelocityViewResolver resolver = checkAndGetResolver(VelocityViewResolver.class);
147 		checkPropertyValues(resolver, "prefix", "/", "suffix", ".vm", "cacheLimit", 1024);
148 	}
149 
150 	@Test
151 	public void velocityDefaultValues() {
152 		this.registry.velocity();
153 		VelocityViewResolver resolver = checkAndGetResolver(VelocityViewResolver.class);
154 		checkPropertyValues(resolver, "prefix", "", "suffix", ".vm");
155 	}
156 
157 	@Test
158 	public void freeMarker() {
159 		this.registry.freeMarker().prefix("/").suffix(".fmt").cache(false);
160 		FreeMarkerViewResolver resolver = checkAndGetResolver(FreeMarkerViewResolver.class);
161 		checkPropertyValues(resolver, "prefix", "/", "suffix", ".fmt", "cacheLimit", 0);
162 	}
163 
164 	@Test
165 	public void freeMarkerDefaultValues() {
166 		this.registry.freeMarker();
167 		FreeMarkerViewResolver resolver = checkAndGetResolver(FreeMarkerViewResolver.class);
168 		checkPropertyValues(resolver, "prefix", "", "suffix", ".ftl");
169 	}
170 
171 	@Test
172 	public void groovyMarkup() {
173 		this.registry.groovy().prefix("/").suffix(".groovy").cache(true);
174 		GroovyMarkupViewResolver resolver = checkAndGetResolver(GroovyMarkupViewResolver.class);
175 		checkPropertyValues(resolver, "prefix", "/", "suffix", ".groovy", "cacheLimit", 1024);
176 	}
177 
178 	@Test
179 	public void groovyMarkupDefaultValues() {
180 		this.registry.groovy();
181 		GroovyMarkupViewResolver resolver = checkAndGetResolver(GroovyMarkupViewResolver.class);
182 		checkPropertyValues(resolver, "prefix", "", "suffix", ".tpl");
183 	}
184 
185 	@Test
186 	public void contentNegotiation() {
187 		MappingJackson2JsonView view = new MappingJackson2JsonView();
188 		this.registry.enableContentNegotiation(view);
189 		ContentNegotiatingViewResolver resolver = checkAndGetResolver(ContentNegotiatingViewResolver.class);
190 		assertEquals(Arrays.asList(view), resolver.getDefaultViews());
191 		assertEquals(Ordered.HIGHEST_PRECEDENCE, this.registry.getOrder());
192 	}
193 
194 	@Test
195 	public void contentNegotiationAddsDefaultViewRegistrations() {
196 		MappingJackson2JsonView view1 = new MappingJackson2JsonView();
197 		this.registry.enableContentNegotiation(view1);
198 
199 		ContentNegotiatingViewResolver resolver1 = checkAndGetResolver(ContentNegotiatingViewResolver.class);
200 		assertEquals(Arrays.asList(view1), resolver1.getDefaultViews());
201 
202 		MarshallingView view2 = new MarshallingView();
203 		this.registry.enableContentNegotiation(view2);
204 
205 		ContentNegotiatingViewResolver resolver2 = checkAndGetResolver(ContentNegotiatingViewResolver.class);
206 		assertEquals(Arrays.asList(view1, view2), resolver2.getDefaultViews());
207 		assertSame(resolver1, resolver2);
208 	}
209 
210 
211 	@SuppressWarnings("unchecked")
212 	private <T extends ViewResolver> T checkAndGetResolver(Class<T> resolverType) {
213 		assertNotNull(this.registry.getViewResolvers());
214 		assertEquals(1, this.registry.getViewResolvers().size());
215 		assertEquals(resolverType, this.registry.getViewResolvers().get(0).getClass());
216 		return (T) registry.getViewResolvers().get(0);
217 	}
218 
219 	private void checkPropertyValues(ViewResolver resolver, Object... nameValuePairs) {
220 		DirectFieldAccessor accessor =  new DirectFieldAccessor(resolver);
221 		for (int i = 0; i < nameValuePairs.length ; i++, i++) {
222 			Object expected = nameValuePairs[i + 1];
223 			Object actual = accessor.getPropertyValue((String) nameValuePairs[i]);
224 			assertEquals(expected, actual);
225 		}
226 	}
227 
228 }