SPR-7812 RequestCondition refactoring with the possibility for custom request conditions in mind.

This commit is contained in:
Rossen Stoyanchev
2011-06-17 09:39:49 +00:00
parent 3a332e556c
commit 96b0752ddb
25 changed files with 1262 additions and 1361 deletions

View File

@@ -16,6 +16,11 @@
package org.springframework.web.servlet.mvc.method;
import static java.util.Arrays.asList;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.Comparator;
@@ -23,17 +28,14 @@ import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import org.springframework.web.servlet.mvc.method.condition.RequestConditionFactory;
import org.springframework.web.servlet.mvc.method.condition.ParamsRequestCondition;
import org.springframework.web.servlet.mvc.method.condition.ProducesRequestCondition;
import org.springframework.web.servlet.mvc.method.condition.RequestMethodsRequestCondition;
import org.springframework.web.util.UrlPathHelper;
import static java.util.Arrays.*;
import static org.junit.Assert.*;
/**
* Test fixture with {@link RequestMappingHandlerMapping} testing its {@link RequestMappingInfo} comparator.
*
@@ -57,8 +59,8 @@ public class RequestMappingInfoComparatorTests {
request.setRequestURI("/foo");
String lookupPath = new UrlPathHelper().getLookupPathForRequest(request);
Comparator<RequestMappingInfo> comparator = handlerMapping.getMappingComparator(lookupPath, request);
RequestMappingInfo key1 = new RequestMappingInfo(asList("/fo*"), null);
RequestMappingInfo key2 = new RequestMappingInfo(asList("/foo"), null);
RequestMappingInfo key1 = new RequestMappingInfo(new String[]{"/fo*"});
RequestMappingInfo key2 = new RequestMappingInfo(new String[]{"/foo"});
assertEquals(1, comparator.compare(key1, key2));
}
@@ -68,8 +70,8 @@ public class RequestMappingInfoComparatorTests {
request.setRequestURI("/foo");
String lookupPath = new UrlPathHelper().getLookupPathForRequest(request);
Comparator<RequestMappingInfo> comparator = handlerMapping.getMappingComparator(lookupPath, request);
RequestMappingInfo key1 = new RequestMappingInfo(asList("/foo*"), null);
RequestMappingInfo key2 = new RequestMappingInfo(asList("/foo*"), null);
RequestMappingInfo key1 = new RequestMappingInfo(new String[]{"/foo*"});
RequestMappingInfo key2 = new RequestMappingInfo(new String[]{"/foo*"});
assertEquals(0, comparator.compare(key1, key2));
}
@@ -78,20 +80,20 @@ public class RequestMappingInfoComparatorTests {
public void greaterNumberOfMatchingPatternsWins() throws Exception {
request.setRequestURI("/foo.html");
String lookupPath = new UrlPathHelper().getLookupPathForRequest(request);
RequestMappingInfo key1 = new RequestMappingInfo(asList("/foo", "*.jpeg"), null);
RequestMappingInfo key2 = new RequestMappingInfo(asList("/foo", "*.html"), null);
RequestMappingInfo key1 = new RequestMappingInfo(new String[]{"/foo", "*.jpeg"});
RequestMappingInfo key2 = new RequestMappingInfo(new String[]{"/foo", "*.html"});
RequestMappingInfo match1 = handlerMapping.getMatchingMapping(key1, lookupPath, request);
RequestMappingInfo match2 = handlerMapping.getMatchingMapping(key2, lookupPath, request);
List<RequestMappingInfo> matches = asList(match1, match2);
Collections.sort(matches, handlerMapping.getMappingComparator(lookupPath, request));
assertSame(match2.getPatterns(), matches.get(0).getPatterns());
assertSame(match2.getPatternsCondition(), matches.get(0).getPatternsCondition());
}
@Test
public void oneMethodWinsOverNone() {
Comparator<RequestMappingInfo> comparator = handlerMapping.getMappingComparator("", request);
RequestMappingInfo key1 = new RequestMappingInfo(null, null);
RequestMappingInfo key1 = new RequestMappingInfo(null);
RequestMappingInfo key2 = new RequestMappingInfo(null, new RequestMethod[] {RequestMethod.GET});
assertEquals(1, comparator.compare(key1, key2));
@@ -99,10 +101,11 @@ public class RequestMappingInfoComparatorTests {
@Test
public void methodsAndParams() {
RequestMappingInfo empty = new RequestMappingInfo(null, null);
RequestMappingInfo empty = new RequestMappingInfo(null);
RequestMappingInfo oneMethod = new RequestMappingInfo(null, new RequestMethod[] {RequestMethod.GET});
RequestMappingInfo oneMethodOneParam =
new RequestMappingInfo(null, RequestConditionFactory.parseMethods(RequestMethod.GET), RequestConditionFactory.parseParams("foo"), null, null, null);
new RequestMappingInfo(null, new RequestMethodsRequestCondition(RequestMethod.GET),
new ParamsRequestCondition("foo"), null, null, null);
List<RequestMappingInfo> list = asList(empty, oneMethod, oneMethodOneParam);
Collections.shuffle(list);
Collections.sort(list, handlerMapping.getMappingComparator("", request));
@@ -114,9 +117,9 @@ public class RequestMappingInfoComparatorTests {
@Test
public void produces() {
RequestMappingInfo html = new RequestMappingInfo(null, null, null, null, null, RequestConditionFactory.parseProduces("text/html"));
RequestMappingInfo xml = new RequestMappingInfo(null, null, null, null, null, RequestConditionFactory.parseProduces("application/xml"));
RequestMappingInfo none = new RequestMappingInfo(null, null);
RequestMappingInfo html = new RequestMappingInfo(null, null, null, null, null, new ProducesRequestCondition("text/html"));
RequestMappingInfo xml = new RequestMappingInfo(null, null, null, null, null, new ProducesRequestCondition("application/xml"));
RequestMappingInfo none = new RequestMappingInfo(null);
request.addHeader("Accept", "application/xml, text/html");
Comparator<RequestMappingInfo> comparator = handlerMapping.getMappingComparator("", request);

View File

@@ -24,7 +24,6 @@ import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Map;
import org.junit.Before;
@@ -42,9 +41,13 @@ import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import org.springframework.web.servlet.handler.MappedInterceptor;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import org.springframework.web.servlet.mvc.method.condition.RequestConditionFactory;
import org.springframework.web.servlet.mvc.method.condition.ConsumesRequestCondition;
import org.springframework.web.servlet.mvc.method.condition.HeadersRequestCondition;
import org.springframework.web.servlet.mvc.method.condition.ParamsRequestCondition;
import org.springframework.web.servlet.mvc.method.condition.PatternsRequestCondition;
import org.springframework.web.servlet.mvc.method.condition.ProducesRequestCondition;
import org.springframework.web.servlet.mvc.method.condition.RequestMethodsRequestCondition;
import org.springframework.web.util.UrlPathHelper;
/**
@@ -129,7 +132,7 @@ public class RequestMappingInfoHandlerMappingTests {
@Test
public void uriTemplateVariables() {
RequestMappingInfo key = new RequestMappingInfo(Arrays.asList("/{path1}/{path2}"), null);
RequestMappingInfo key = new RequestMappingInfo(new String[] {"/{path1}/{path2}"});
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/1/2");
String lookupPath = new UrlPathHelper().getLookupPathForRequest(request);
@@ -197,12 +200,13 @@ public class RequestMappingInfoHandlerMappingTests {
@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
RequestMapping annotation = AnnotationUtils.findAnnotation(method, RequestMapping.class);
return new RequestMappingInfo(Arrays.asList(annotation.value()),
RequestConditionFactory.parseMethods(annotation.method()),
RequestConditionFactory.parseParams(annotation.params()),
RequestConditionFactory.parseHeaders(annotation.headers()),
RequestConditionFactory.parseConsumes(annotation.consumes(), annotation.headers()),
RequestConditionFactory.parseProduces(annotation.produces(), annotation.headers()));
return new RequestMappingInfo(
new PatternsRequestCondition(annotation.value(), getUrlPathHelper(), getPathMatcher()),
new RequestMethodsRequestCondition(annotation.method()),
new ParamsRequestCondition(annotation.params()),
new HeadersRequestCondition(annotation.headers()),
new ConsumesRequestCondition(annotation.consumes(), annotation.headers()),
new ProducesRequestCondition(annotation.produces(), annotation.headers()));
}
}

View File

@@ -16,20 +16,19 @@
package org.springframework.web.servlet.mvc.method;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.springframework.web.bind.annotation.RequestMethod.GET;
import static org.springframework.web.bind.annotation.RequestMethod.POST;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.PathMatcher;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.condition.RequestConditionFactory;
import org.springframework.web.util.UrlPathHelper;
import static java.util.Arrays.*;
import static java.util.Collections.*;
import static org.junit.Assert.*;
import static org.springframework.web.bind.annotation.RequestMethod.*;
import org.springframework.web.servlet.mvc.method.condition.ConsumesRequestCondition;
import org.springframework.web.servlet.mvc.method.condition.HeadersRequestCondition;
import org.springframework.web.servlet.mvc.method.condition.ParamsRequestCondition;
import org.springframework.web.servlet.mvc.method.condition.PatternsRequestCondition;
import org.springframework.web.servlet.mvc.method.condition.ProducesRequestCondition;
/**
* Test fixture for {@link RequestMappingInfo} tests.
@@ -41,8 +40,8 @@ public class RequestMappingInfoTests {
@Test
public void equals() {
RequestMappingInfo key1 = new RequestMappingInfo(singleton("/foo"), methods(GET));
RequestMappingInfo key2 = new RequestMappingInfo(singleton("/foo"), methods(GET));
RequestMappingInfo key1 = new RequestMappingInfo(new String[] {"/foo"}, GET);
RequestMappingInfo key2 = new RequestMappingInfo(new String[] {"/foo"}, GET);
assertEquals(key1, key2);
assertEquals(key1.hashCode(), key2.hashCode());
@@ -50,8 +49,8 @@ public class RequestMappingInfoTests {
@Test
public void equalsPrependSlash() {
RequestMappingInfo key1 = new RequestMappingInfo(singleton("/foo"), methods(GET));
RequestMappingInfo key2 = new RequestMappingInfo(singleton("foo"), methods(GET));
RequestMappingInfo key1 = new RequestMappingInfo(new String[] {"/foo"}, GET);
RequestMappingInfo key2 = new RequestMappingInfo(new String[] {"foo"}, GET);
assertEquals(key1, key2);
assertEquals(key1.hashCode(), key2.hashCode());
@@ -59,213 +58,190 @@ public class RequestMappingInfoTests {
@Test
public void combinePatterns() {
AntPathMatcher pathMatcher = new AntPathMatcher();
RequestMappingInfo key1 = createFromPatterns("/t1", "/t2");
RequestMappingInfo key2 = createFromPatterns("/m1", "/m2");
RequestMappingInfo key3 = createFromPatterns("/t1/m1", "/t1/m2", "/t2/m1", "/t2/m2");
assertEquals(key3.getPatternsCondition(), key1.combine(key2).getPatternsCondition());
RequestMappingInfo key1 = createKeyFromPatterns("/t1", "/t2");
RequestMappingInfo key2 = createKeyFromPatterns("/m1", "/m2");
RequestMappingInfo key3 = createKeyFromPatterns("/t1/m1", "/t1/m2", "/t2/m1", "/t2/m2");
assertEquals(key3.getPatterns(), key1.combine(key2, pathMatcher).getPatterns());
key1 = createFromPatterns("/t1");
key2 = createFromPatterns();
key3 = createFromPatterns("/t1");
assertEquals(key3.getPatternsCondition(), key1.combine(key2).getPatternsCondition());
key1 = createKeyFromPatterns("/t1");
key2 = createKeyFromPatterns();
key3 = createKeyFromPatterns("/t1");
assertEquals(key3.getPatterns(), key1.combine(key2, pathMatcher).getPatterns());
key1 = createFromPatterns();
key2 = createFromPatterns("/m1");
key3 = createFromPatterns("/m1");
assertEquals(key3.getPatternsCondition(), key1.combine(key2).getPatternsCondition());
key1 = createKeyFromPatterns();
key2 = createKeyFromPatterns("/m1");
key3 = createKeyFromPatterns("/m1");
assertEquals(key3.getPatterns(), key1.combine(key2, pathMatcher).getPatterns());
key1 = createFromPatterns();
key2 = createFromPatterns();
key3 = createFromPatterns("");
assertEquals(key3.getPatternsCondition(), key1.combine(key2).getPatternsCondition());
key1 = createKeyFromPatterns();
key2 = createKeyFromPatterns();
key3 = createKeyFromPatterns("");
assertEquals(key3.getPatterns(), key1.combine(key2, pathMatcher).getPatterns());
key1 = createKeyFromPatterns("/t1");
key2 = createKeyFromPatterns("");
key3 = createKeyFromPatterns("/t1");
assertEquals(key3.getPatterns(), key1.combine(key2, pathMatcher).getPatterns());
key1 = createFromPatterns("/t1");
key2 = createFromPatterns("");
key3 = createFromPatterns("/t1");
assertEquals(key3.getPatternsCondition(), key1.combine(key2).getPatternsCondition());
}
@Test
public void matchPatternsToRequest() {
UrlPathHelper pathHelper = new UrlPathHelper();
PathMatcher pathMatcher = new AntPathMatcher();
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo");
RequestMappingInfo key = new RequestMappingInfo(singleton("/foo"), null);
RequestMappingInfo match =
key.getMatchingRequestMapping(pathHelper.getLookupPathForRequest(request), request, pathMatcher);
RequestMappingInfo match = createFromPatterns("/foo").getMatchingRequestMapping(request);
assertNotNull(match);
request = new MockHttpServletRequest("GET", "/foo/bar");
key = new RequestMappingInfo(singleton("/foo/*"), null);
match = key.getMatchingRequestMapping(pathHelper.getLookupPathForRequest(request), request, pathMatcher);
match = createFromPatterns("/foo/*").getMatchingRequestMapping(request);
assertNotNull("Pattern match", match);
request = new MockHttpServletRequest("GET", "/foo.html");
key = new RequestMappingInfo(singleton("/foo"), null);
match = key.getMatchingRequestMapping(pathHelper.getLookupPathForRequest(request), request, pathMatcher);
match = createFromPatterns("/foo").getMatchingRequestMapping(request);
assertNotNull("Implicit match by extension", match);
assertEquals("Contains matched pattern", "/foo.*", match.getPatterns().iterator().next());
assertEquals("Contains matched pattern", "/foo.*", match.getPatternsCondition().getPatterns().iterator().next());
request = new MockHttpServletRequest("GET", "/foo/");
key = new RequestMappingInfo(singleton("/foo"), null);
match = key.getMatchingRequestMapping(pathHelper.getLookupPathForRequest(request), request, pathMatcher);
match = createFromPatterns("/foo").getMatchingRequestMapping(request);
assertNotNull("Implicit match by trailing slash", match);
assertEquals("Contains matched pattern", "/foo/", match.getPatterns().iterator().next());
assertEquals("Contains matched pattern", "/foo/", match.getPatternsCondition().getPatterns().iterator().next());
request = new MockHttpServletRequest("GET", "/foo.html");
key = new RequestMappingInfo(singleton("/foo.jpg"), null);
match = key.getMatchingRequestMapping(pathHelper.getLookupPathForRequest(request), request, pathMatcher);
match = createFromPatterns("/foo.jpg").getMatchingRequestMapping(request);
assertNull("Implicit match ignored if pattern has extension", match);
request = new MockHttpServletRequest("GET", "/foo.html");
key = new RequestMappingInfo(singleton("/foo.jpg"), null);
match = key.getMatchingRequestMapping(pathHelper.getLookupPathForRequest(request), request, pathMatcher);
match = createFromPatterns("/foo.jpg").getMatchingRequestMapping(request);
assertNull("Implicit match ignored on pattern with trailing slash", match);
}
@Test
public void matchRequestMethods() {
PathMatcher pathMatcher = new AntPathMatcher();
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo");
String lookupPath = new UrlPathHelper().getLookupPathForRequest(request);
RequestMappingInfo key = new RequestMappingInfo(singleton("/foo"), null);
RequestMappingInfo match = key.getMatchingRequestMapping(lookupPath, request, pathMatcher);
RequestMappingInfo key = createFromPatterns("/foo");
RequestMappingInfo match = createFromPatterns("/foo").getMatchingRequestMapping(request);
assertNotNull("No method matches any method", match);
key = new RequestMappingInfo(singleton("/foo"), methods(GET));
match = key.getMatchingRequestMapping(lookupPath, request, pathMatcher);
key = new RequestMappingInfo(new String[]{"/foo"}, GET);
match = key.getMatchingRequestMapping(request);
assertNotNull("Exact match", match);
key = new RequestMappingInfo(singleton("/foo"), methods(POST));
match = key.getMatchingRequestMapping(lookupPath, request, pathMatcher);
key = new RequestMappingInfo(new String[]{"/foo"}, POST);
match = key.getMatchingRequestMapping(request);
assertNull("No match", match);
}
@Test
public void matchingKeyContent() {
PathMatcher pathMatcher = new AntPathMatcher();
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo");
String lookupPath = new UrlPathHelper().getLookupPathForRequest(request);
RequestMappingInfo key = new RequestMappingInfo(asList("/foo*", "/bar"), methods(GET, POST));
RequestMappingInfo match = key.getMatchingRequestMapping(lookupPath, request, pathMatcher);
RequestMappingInfo expected = new RequestMappingInfo(singleton("/foo*"), methods(GET));
RequestMappingInfo key = new RequestMappingInfo(new String[] {"/foo*", "/bar"}, GET, POST);
RequestMappingInfo match = key.getMatchingRequestMapping(request);
RequestMappingInfo expected = new RequestMappingInfo(new String[] {"/foo*"}, GET);
assertEquals("Matching RequestKey contains matched patterns and methods only", expected, match);
key = new RequestMappingInfo(asList("/**", "/foo*", "/foo"), null);
match = key.getMatchingRequestMapping(lookupPath, request, pathMatcher);
expected = new RequestMappingInfo(asList("/foo", "/foo*", "/**"), null);
key = createFromPatterns("/**", "/foo*", "/foo");
match = key.getMatchingRequestMapping(request);
expected = createFromPatterns("/foo", "/foo*", "/**");
assertEquals("Matched patterns are sorted with best match at the top", expected, match);
}
@Test
public void paramsCondition() {
PathMatcher pathMatcher = new AntPathMatcher();
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo");
request.setParameter("foo", "bar");
String lookupPath = new UrlPathHelper().getLookupPathForRequest(request);
RequestMappingInfo key =
new RequestMappingInfo(asList("/foo"), null, RequestConditionFactory.parseParams("foo=bar"), null,
null, null);
RequestMappingInfo match = key.getMatchingRequestMapping(lookupPath, request, pathMatcher);
new RequestMappingInfo(
new PatternsRequestCondition("/foo"), null,
new ParamsRequestCondition("foo=bar"), null, null, null);
RequestMappingInfo match = key.getMatchingRequestMapping(request);
assertNotNull(match);
key = new RequestMappingInfo(singleton("/foo"), null, RequestConditionFactory.parseParams("foo!=bar"), null,
null, null);
match = key.getMatchingRequestMapping(lookupPath, request, pathMatcher);
key = new RequestMappingInfo(
new PatternsRequestCondition("/foo"), null,
new ParamsRequestCondition("foo!=bar"), null, null, null);
match = key.getMatchingRequestMapping(request);
assertNull(match);
}
@Test
public void headersCondition() {
PathMatcher pathMatcher = new AntPathMatcher();
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo");
request.addHeader("foo", "bar");
String lookupPath = new UrlPathHelper().getLookupPathForRequest(request);
RequestMappingInfo key =
new RequestMappingInfo(singleton("/foo"), null, null, RequestConditionFactory.parseHeaders("foo=bar"),
null, null);
RequestMappingInfo match = key.getMatchingRequestMapping(lookupPath, request, pathMatcher);
new RequestMappingInfo(
new PatternsRequestCondition("/foo"), null, null,
new HeadersRequestCondition("foo=bar"), null, null);
RequestMappingInfo match = key.getMatchingRequestMapping(request);
assertNotNull(match);
key = new RequestMappingInfo(singleton("/foo"), null, null, RequestConditionFactory.parseHeaders("foo!=bar"),
null, null);
match = key.getMatchingRequestMapping(lookupPath, request, pathMatcher);
key = new RequestMappingInfo(
new PatternsRequestCondition("/foo"), null, null,
new HeadersRequestCondition("foo!=bar"), null, null);
match = key.getMatchingRequestMapping(request);
assertNull(match);
}
@Test
public void consumesCondition() {
PathMatcher pathMatcher = new AntPathMatcher();
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo");
request.setContentType("text/plain");
String lookupPath = new UrlPathHelper().getLookupPathForRequest(request);
RequestMappingInfo key = new RequestMappingInfo(singleton("/foo"), null, null, null,
RequestConditionFactory.parseConsumes("text/plain"), null);
RequestMappingInfo match = key.getMatchingRequestMapping(lookupPath, request, pathMatcher);
RequestMappingInfo key =
new RequestMappingInfo(
new PatternsRequestCondition("/foo"), null, null, null,
new ConsumesRequestCondition("text/plain"), null);
RequestMappingInfo match = key.getMatchingRequestMapping(request);
assertNotNull(match);
key = new RequestMappingInfo(singleton("/foo"), null, null, null,
RequestConditionFactory.parseConsumes("application/xml"), null);
match = key.getMatchingRequestMapping(lookupPath, request, pathMatcher);
key = new RequestMappingInfo(
new PatternsRequestCondition("/foo"), null, null, null,
new ConsumesRequestCondition("application/xml"), null);
match = key.getMatchingRequestMapping(request);
assertNull(match);
}
@Test
public void producesCondition() {
PathMatcher pathMatcher = new AntPathMatcher();
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo");
request.addHeader("Accept", "text/plain");
String lookupPath = new UrlPathHelper().getLookupPathForRequest(request);
RequestMappingInfo key = new RequestMappingInfo(singleton("/foo"), null, null, null,
null, RequestConditionFactory.parseProduces("text/plain"));
RequestMappingInfo match = key.getMatchingRequestMapping(lookupPath, request, pathMatcher);
RequestMappingInfo key =
new RequestMappingInfo(
new PatternsRequestCondition("/foo"), null, null, null, null,
new ProducesRequestCondition("text/plain"));
RequestMappingInfo match = key.getMatchingRequestMapping(request);
assertNotNull(match);
key = new RequestMappingInfo(singleton("/foo"), null, null, null, null,
RequestConditionFactory.parseProduces("application/xml"));
match = key.getMatchingRequestMapping(lookupPath, request, pathMatcher);
key = new RequestMappingInfo(
new PatternsRequestCondition("/foo"), null, null, null, null,
new ProducesRequestCondition("application/xml"));
match = key.getMatchingRequestMapping(request);
assertNull(match);
}
private RequestMappingInfo createKeyFromPatterns(String... patterns) {
return new RequestMappingInfo(asList(patterns), null);
}
private RequestMethod[] methods(RequestMethod... methods) {
if (methods != null) {
return methods;
}
else {
return new RequestMethod[0];
}
private RequestMappingInfo createFromPatterns(String... patterns) {
return new RequestMappingInfo(patterns);
}
}

View File

@@ -16,13 +16,17 @@
package org.springframework.web.servlet.mvc.method.condition;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Collection;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletRequest;
import static org.junit.Assert.*;
import org.springframework.web.servlet.mvc.method.condition.ConsumesRequestCondition.ConsumeMediaTypeExpression;
/**
* @author Arjen Poutsma
@@ -31,75 +35,79 @@ public class ConsumesRequestConditionTests {
@Test
public void consumesMatch() {
RequestCondition condition = new ConsumesRequestCondition("text/plain");
ConsumesRequestCondition condition = new ConsumesRequestCondition("text/plain");
MockHttpServletRequest request = new MockHttpServletRequest();
request.setContentType("text/plain");
assertTrue(condition.match(request));
assertNotNull(condition.getMatchingCondition(request));
}
@Test
public void negatedConsumesMatch() {
RequestCondition condition = new ConsumesRequestCondition("!text/plain");
ConsumesRequestCondition condition = new ConsumesRequestCondition("!text/plain");
MockHttpServletRequest request = new MockHttpServletRequest();
request.setContentType("text/plain");
assertFalse(condition.match(request));
assertNull(condition.getMatchingCondition(request));
}
@Test
public void consumesWildcardMatch() {
RequestCondition condition = new ConsumesRequestCondition("text/*");
ConsumesRequestCondition condition = new ConsumesRequestCondition("text/*");
MockHttpServletRequest request = new MockHttpServletRequest();
request.setContentType("text/plain");
assertTrue(condition.match(request));
assertNotNull(condition.getMatchingCondition(request));
}
@Test
public void consumesMultipleMatch() {
RequestCondition condition = new ConsumesRequestCondition("text/plain", "application/xml");
ConsumesRequestCondition condition = new ConsumesRequestCondition("text/plain", "application/xml");
MockHttpServletRequest request = new MockHttpServletRequest();
request.setContentType("text/plain");
assertTrue(condition.match(request));
assertNotNull(condition.getMatchingCondition(request));
}
@Test
public void consumesSingleNoMatch() {
RequestCondition condition = new ConsumesRequestCondition("text/plain");
ConsumesRequestCondition condition = new ConsumesRequestCondition("text/plain");
MockHttpServletRequest request = new MockHttpServletRequest();
request.setContentType("application/xml");
assertFalse(condition.match(request));
assertNull(condition.getMatchingCondition(request));
}
@Test
public void compareToSingle() {
MockHttpServletRequest request = new MockHttpServletRequest();
ConsumesRequestCondition condition1 = new ConsumesRequestCondition("text/plain");
ConsumesRequestCondition condition2 = new ConsumesRequestCondition("text/*");
int result = condition1.compareTo(condition2);
int result = condition1.compareTo(condition2, request);
assertTrue("Invalid comparison result: " + result, result < 0);
result = condition2.compareTo(condition1);
result = condition2.compareTo(condition1, request);
assertTrue("Invalid comparison result: " + result, result > 0);
}
@Test
public void compareToMultiple() {
MockHttpServletRequest request = new MockHttpServletRequest();
ConsumesRequestCondition condition1 = new ConsumesRequestCondition("*/*", "text/plain");
ConsumesRequestCondition condition2 = new ConsumesRequestCondition("text/*", "text/plain;q=0.7");
int result = condition1.compareTo(condition2);
int result = condition1.compareTo(condition2, request);
assertTrue("Invalid comparison result: " + result, result < 0);
result = condition2.compareTo(condition1);
result = condition2.compareTo(condition1, request);
assertTrue("Invalid comparison result: " + result, result > 0);
}
@@ -126,28 +134,11 @@ public class ConsumesRequestConditionTests {
public void parseConsumesAndHeaders() {
String[] consumes = new String[] {"text/plain"};
String[] headers = new String[]{"foo=bar", "content-type=application/xml,application/pdf"};
ConsumesRequestCondition condition = RequestConditionFactory.parseConsumes(consumes, headers);
ConsumesRequestCondition condition = new ConsumesRequestCondition(consumes, headers);
assertConditions(condition, "text/plain", "application/xml", "application/pdf");
}
@Test
public void parseConsumesDefault() {
String[] consumes = new String[] {"*/*"};
String[] headers = new String[0];
ConsumesRequestCondition condition = RequestConditionFactory.parseConsumes(consumes, headers);
assertConditions(condition, "*/*");
}
@Test
public void parseConsumesDefaultAndHeaders() {
String[] consumes = new String[] {"*/*"};
String[] headers = new String[]{"foo=bar", "content-type=text/plain"};
ConsumesRequestCondition condition = RequestConditionFactory.parseConsumes(consumes, headers);
assertConditions(condition, "text/plain");
}
@Test
public void getMatchingCondition() {
MockHttpServletRequest request = new MockHttpServletRequest();
@@ -165,12 +156,12 @@ public class ConsumesRequestConditionTests {
}
private void assertConditions(ConsumesRequestCondition condition, String... expected) {
Set<ConsumesRequestCondition.ConsumeRequestCondition> conditions = condition.getConditions();
assertEquals("Invalid amount of conditions", conditions.size(), expected.length);
Collection<ConsumeMediaTypeExpression> expressions = condition.getContent();
assertEquals("Invalid amount of conditions", expressions.size(), expected.length);
for (String s : expected) {
boolean found = false;
for (ConsumesRequestCondition.ConsumeRequestCondition requestCondition : conditions) {
String conditionMediaType = requestCondition.getMediaType().toString();
for (ConsumeMediaTypeExpression expr : expressions) {
String conditionMediaType = expr.getMediaType().toString();
if (conditionMediaType.equals(s)) {
found = true;
break;
@@ -181,12 +172,6 @@ public class ConsumesRequestConditionTests {
fail("Condition [" + s + "] not found");
}
}
}
}

View File

@@ -16,13 +16,17 @@
package org.springframework.web.servlet.mvc.method.condition;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.Collection;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletRequest;
import static org.junit.Assert.*;
import org.springframework.web.servlet.mvc.method.condition.HeadersRequestCondition.HeaderExpression;
/**
* @author Arjen Poutsma
@@ -40,81 +44,83 @@ public class HeadersRequestConditionTests {
@Test
public void headerPresent() {
RequestCondition condition = new HeadersRequestCondition("accept");
HeadersRequestCondition condition = new HeadersRequestCondition("accept");
MockHttpServletRequest request = new MockHttpServletRequest();
request.addHeader("Accept", "");
assertTrue(condition.match(request));
assertNotNull(condition.getMatchingCondition(request));
}
@Test
public void headerPresentNoMatch() {
RequestCondition condition = new HeadersRequestCondition("foo");
HeadersRequestCondition condition = new HeadersRequestCondition("foo");
MockHttpServletRequest request = new MockHttpServletRequest();
request.addHeader("bar", "");
assertFalse(condition.match(request));
assertNull(condition.getMatchingCondition(request));
}
@Test
public void headerNotPresent() {
RequestCondition condition = new HeadersRequestCondition("!accept");
HeadersRequestCondition condition = new HeadersRequestCondition("!accept");
MockHttpServletRequest request = new MockHttpServletRequest();
assertTrue(condition.match(request));
assertNotNull(condition.getMatchingCondition(request));
}
@Test
public void headerValueMatch() {
RequestCondition condition = new HeadersRequestCondition("foo=bar");
HeadersRequestCondition condition = new HeadersRequestCondition("foo=bar");
MockHttpServletRequest request = new MockHttpServletRequest();
request.addHeader("foo", "bar");
assertTrue(condition.match(request));
assertNotNull(condition.getMatchingCondition(request));
}
@Test
public void headerValueNoMatch() {
RequestCondition condition = new HeadersRequestCondition("foo=bar");
HeadersRequestCondition condition = new HeadersRequestCondition("foo=bar");
MockHttpServletRequest request = new MockHttpServletRequest();
request.addHeader("foo", "bazz");
assertFalse(condition.match(request));
assertNull(condition.getMatchingCondition(request));
}
@Test
public void headerCaseSensitiveValueMatch() {
RequestCondition condition = new HeadersRequestCondition("foo=Bar");
HeadersRequestCondition condition = new HeadersRequestCondition("foo=Bar");
MockHttpServletRequest request = new MockHttpServletRequest();
request.addHeader("foo", "bar");
assertFalse(condition.match(request));
assertNull(condition.getMatchingCondition(request));
}
@Test
public void headerValueMatchNegated() {
RequestCondition condition = new HeadersRequestCondition("foo!=bar");
HeadersRequestCondition condition = new HeadersRequestCondition("foo!=bar");
MockHttpServletRequest request = new MockHttpServletRequest();
request.addHeader("foo", "baz");
assertTrue(condition.match(request));
assertNotNull(condition.getMatchingCondition(request));
}
@Test
public void compareTo() {
MockHttpServletRequest request = new MockHttpServletRequest();
HeadersRequestCondition condition1 = new HeadersRequestCondition("foo", "bar", "baz");
HeadersRequestCondition condition2 = new HeadersRequestCondition("foo", "bar");
int result = condition1.compareTo(condition2);
int result = condition1.compareTo(condition2, request);
assertTrue("Invalid comparison result: " + result, result < 0);
result = condition2.compareTo(condition1);
result = condition2.compareTo(condition1, request);
assertTrue("Invalid comparison result: " + result, result > 0);
}
@@ -125,7 +131,7 @@ public class HeadersRequestConditionTests {
HeadersRequestCondition condition2 = new HeadersRequestCondition("foo=baz");
HeadersRequestCondition result = condition1.combine(condition2);
Set<HeadersRequestCondition.HeaderRequestCondition> conditions = result.getConditions();
Collection<HeaderExpression> conditions = result.getContent();
assertEquals(2, conditions.size());
}

View File

@@ -16,13 +16,17 @@
package org.springframework.web.servlet.mvc.method.condition;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.Collection;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletRequest;
import static org.junit.Assert.*;
import org.springframework.web.servlet.mvc.method.condition.ParamsRequestCondition.ParamExpression;
/**
* @author Arjen Poutsma
@@ -41,62 +45,64 @@ public class ParamsRequestConditionTests {
@Test
public void paramPresent() {
RequestCondition condition = new ParamsRequestCondition("foo");
ParamsRequestCondition condition = new ParamsRequestCondition("foo");
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("foo", "");
assertTrue(condition.match(request));
assertNotNull(condition.getMatchingCondition(request));
}
@Test
public void paramPresentNoMatch() {
RequestCondition condition = new ParamsRequestCondition("foo");
ParamsRequestCondition condition = new ParamsRequestCondition("foo");
MockHttpServletRequest request = new MockHttpServletRequest();
request.addHeader("bar", "");
assertFalse(condition.match(request));
assertNull(condition.getMatchingCondition(request));
}
@Test
public void paramNotPresent() {
RequestCondition condition = new ParamsRequestCondition("!foo");
ParamsRequestCondition condition = new ParamsRequestCondition("!foo");
MockHttpServletRequest request = new MockHttpServletRequest();
assertTrue(condition.match(request));
assertNotNull(condition.getMatchingCondition(request));
}
@Test
public void paramValueMatch() {
RequestCondition condition = new ParamsRequestCondition("foo=bar");
ParamsRequestCondition condition = new ParamsRequestCondition("foo=bar");
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("foo", "bar");
assertTrue(condition.match(request));
assertNotNull(condition.getMatchingCondition(request));
}
@Test
public void paramValueNoMatch() {
RequestCondition condition = new ParamsRequestCondition("foo=bar");
ParamsRequestCondition condition = new ParamsRequestCondition("foo=bar");
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("foo", "bazz");
assertFalse(condition.match(request));
assertNull(condition.getMatchingCondition(request));
}
@Test
public void compareTo() {
MockHttpServletRequest request = new MockHttpServletRequest();
ParamsRequestCondition condition1 = new ParamsRequestCondition("foo", "bar", "baz");
ParamsRequestCondition condition2 = new ParamsRequestCondition("foo", "bar");
int result = condition1.compareTo(condition2);
int result = condition1.compareTo(condition2, request);
assertTrue("Invalid comparison result: " + result, result < 0);
result = condition2.compareTo(condition1);
result = condition2.compareTo(condition1, request);
assertTrue("Invalid comparison result: " + result, result > 0);
}
@@ -106,7 +112,7 @@ public class ParamsRequestConditionTests {
ParamsRequestCondition condition2 = new ParamsRequestCondition("foo=baz");
ParamsRequestCondition result = condition1.combine(condition2);
Set<ParamsRequestCondition.ParamRequestCondition> conditions = result.getConditions();
Collection<ParamExpression> conditions = result.getContent();
assertEquals(2, conditions.size());
}

View File

@@ -16,17 +16,17 @@
package org.springframework.web.servlet.mvc.method.condition;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Collection;
import org.junit.Test;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockHttpServletRequest;
import static org.junit.Assert.*;
import org.springframework.web.servlet.mvc.method.condition.ProducesRequestCondition.ProduceMediaTypeExpression;
/**
* @author Arjen Poutsma
@@ -35,65 +35,66 @@ public class ProducesRequestConditionTests {
@Test
public void consumesMatch() {
RequestCondition condition = new ProducesRequestCondition("text/plain");
ProducesRequestCondition condition = new ProducesRequestCondition("text/plain");
MockHttpServletRequest request = new MockHttpServletRequest();
request.addHeader("Accept", "text/plain");
assertTrue(condition.match(request));
assertNotNull(condition.getMatchingCondition(request));
}
@Test
public void negatedConsumesMatch() {
RequestCondition condition = new ProducesRequestCondition("!text/plain");
ProducesRequestCondition condition = new ProducesRequestCondition("!text/plain");
MockHttpServletRequest request = new MockHttpServletRequest();
request.addHeader("Accept", "text/plain");
assertFalse(condition.match(request));
assertNull(condition.getMatchingCondition(request));
}
@Test
public void consumesWildcardMatch() {
RequestCondition condition = new ProducesRequestCondition("text/*");
ProducesRequestCondition condition = new ProducesRequestCondition("text/*");
MockHttpServletRequest request = new MockHttpServletRequest();
request.addHeader("Accept", "text/plain");
assertTrue(condition.match(request));
assertNotNull(condition.getMatchingCondition(request));
}
@Test
public void consumesMultipleMatch() {
RequestCondition condition = new ProducesRequestCondition("text/plain", "application/xml");
ProducesRequestCondition condition = new ProducesRequestCondition("text/plain", "application/xml");
MockHttpServletRequest request = new MockHttpServletRequest();
request.addHeader("Accept", "text/plain");
assertTrue(condition.match(request));
assertNotNull(condition.getMatchingCondition(request));
}
@Test
public void consumesSingleNoMatch() {
RequestCondition condition = new ProducesRequestCondition("text/plain");
ProducesRequestCondition condition = new ProducesRequestCondition("text/plain");
MockHttpServletRequest request = new MockHttpServletRequest();
request.addHeader("Accept", "application/xml");
assertFalse(condition.match(request));
assertNull(condition.getMatchingCondition(request));
}
@Test
public void compareToSingle() {
MockHttpServletRequest request = new MockHttpServletRequest();
request.addHeader("Accept", "text/plain");
ProducesRequestCondition condition1 = new ProducesRequestCondition("text/plain");
ProducesRequestCondition condition2 = new ProducesRequestCondition("text/*");
List<MediaType> accept = Collections.singletonList(MediaType.TEXT_PLAIN);
int result = condition1.compareTo(condition2, accept);
int result = condition1.compareTo(condition2, request);
assertTrue("Invalid comparison result: " + result, result < 0);
result = condition2.compareTo(condition1, accept);
result = condition2.compareTo(condition1, request);
assertTrue("Invalid comparison result: " + result, result > 0);
}
@@ -102,23 +103,25 @@ public class ProducesRequestConditionTests {
ProducesRequestCondition condition1 = new ProducesRequestCondition("*/*", "text/plain");
ProducesRequestCondition condition2 = new ProducesRequestCondition("text/*", "text/plain;q=0.7");
List<MediaType> accept = Collections.singletonList(MediaType.TEXT_PLAIN);
MockHttpServletRequest request = new MockHttpServletRequest();
request.addHeader("Accept", "text/plain");
int result = condition1.compareTo(condition2, accept);
int result = condition1.compareTo(condition2, request);
assertTrue("Invalid comparison result: " + result, result < 0);
result = condition2.compareTo(condition1, accept);
result = condition2.compareTo(condition1, request);
assertTrue("Invalid comparison result: " + result, result > 0);
condition1 = new ProducesRequestCondition("*/*");
condition2 = new ProducesRequestCondition("text/*");
accept = Collections.singletonList(new MediaType("text", "*"));
request = new MockHttpServletRequest();
request.addHeader("Accept", "text/*");
result = condition1.compareTo(condition2, accept);
result = condition1.compareTo(condition2, request);
assertTrue("Invalid comparison result: " + result, result > 0);
result = condition2.compareTo(condition1, accept);
result = condition2.compareTo(condition1, request);
assertTrue("Invalid comparison result: " + result, result < 0);
}
@@ -127,20 +130,24 @@ public class ProducesRequestConditionTests {
ProducesRequestCondition condition1 = new ProducesRequestCondition("text/*", "text/plain");
ProducesRequestCondition condition2 = new ProducesRequestCondition("application/*", "application/xml");
List<MediaType> accept = Arrays.asList(MediaType.TEXT_PLAIN, MediaType.APPLICATION_XML);
MockHttpServletRequest request = new MockHttpServletRequest();
request.addHeader("Accept", "text/plain");
request.addHeader("Accept", "application/xml");
int result = condition1.compareTo(condition2, accept);
int result = condition1.compareTo(condition2, request);
assertTrue("Invalid comparison result: " + result, result < 0);
result = condition2.compareTo(condition1, accept);
result = condition2.compareTo(condition1, request);
assertTrue("Invalid comparison result: " + result, result > 0);
accept = Arrays.asList(MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN);
request = new MockHttpServletRequest();
request.addHeader("Accept", "application/xml");
request.addHeader("Accept", "text/plain");
result = condition1.compareTo(condition2, accept);
result = condition1.compareTo(condition2, request);
assertTrue("Invalid comparison result: " + result, result > 0);
result = condition2.compareTo(condition1, accept);
result = condition2.compareTo(condition1, request);
assertTrue("Invalid comparison result: " + result, result < 0);
}
@@ -166,28 +173,11 @@ public class ProducesRequestConditionTests {
public void parseConsumesAndHeaders() {
String[] consumes = new String[] {"text/plain"};
String[] headers = new String[]{"foo=bar", "accept=application/xml,application/pdf"};
ProducesRequestCondition condition = RequestConditionFactory.parseProduces(consumes, headers);
ProducesRequestCondition condition = new ProducesRequestCondition(consumes, headers);
assertConditions(condition, "text/plain", "application/xml", "application/pdf");
}
@Test
public void parseConsumesDefault() {
String[] consumes = new String[] {"*/*"};
String[] headers = new String[0];
ProducesRequestCondition condition = RequestConditionFactory.parseProduces(consumes, headers);
assertConditions(condition, "*/*");
}
@Test
public void parseConsumesDefaultAndHeaders() {
String[] consumes = new String[] {"*/*"};
String[] headers = new String[]{"foo=bar", "accept=text/plain"};
ProducesRequestCondition condition = RequestConditionFactory.parseProduces(consumes, headers);
assertConditions(condition, "text/plain");
}
@Test
public void getMatchingCondition() {
MockHttpServletRequest request = new MockHttpServletRequest();
@@ -205,12 +195,12 @@ public class ProducesRequestConditionTests {
}
private void assertConditions(ProducesRequestCondition condition, String... expected) {
Set<ProducesRequestCondition.ProduceRequestCondition> conditions = condition.getConditions();
assertEquals("Invalid amount of conditions", conditions.size(), expected.length);
Collection<ProduceMediaTypeExpression> expressions = condition.getContent();
assertEquals("Invalid amount of conditions", expressions.size(), expected.length);
for (String s : expected) {
boolean found = false;
for (ProducesRequestCondition.ProduceRequestCondition requestCondition : conditions) {
String conditionMediaType = requestCondition.getMediaType().toString();
for (ProduceMediaTypeExpression expr : expressions) {
String conditionMediaType = expr.getMediaType().toString();
if (conditionMediaType.equals(s)) {
found = true;
break;

View File

@@ -30,29 +30,29 @@ public class RequestMethodsRequestConditionTests {
@Test
public void methodMatch() {
RequestCondition condition = new RequestMethodsRequestCondition(RequestMethod.GET);
RequestMethodsRequestCondition condition = new RequestMethodsRequestCondition(RequestMethod.GET);
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo");
assertTrue(condition.match(request));
assertNotNull(condition.getMatchingCondition(request));
}
@Test
public void methodNoMatch() {
RequestCondition condition = new RequestMethodsRequestCondition(RequestMethod.GET);
RequestMethodsRequestCondition condition = new RequestMethodsRequestCondition(RequestMethod.GET);
MockHttpServletRequest request = new MockHttpServletRequest("POST", "/foo");
assertFalse(condition.match(request));
assertNull(condition.getMatchingCondition(request));
}
@Test
public void multipleMethodsMatch() {
RequestCondition condition = new RequestMethodsRequestCondition(RequestMethod.GET, RequestMethod.POST);
RequestMethodsRequestCondition condition = new RequestMethodsRequestCondition(RequestMethod.GET, RequestMethod.POST);
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo");
assertTrue(condition.match(request));
assertNotNull(condition.getMatchingCondition(request));
}
@@ -62,16 +62,18 @@ public class RequestMethodsRequestConditionTests {
RequestMethodsRequestCondition condition2 = new RequestMethodsRequestCondition(RequestMethod.POST);
RequestMethodsRequestCondition condition3 = new RequestMethodsRequestCondition();
int result = condition1.compareTo(condition2);
MockHttpServletRequest request = new MockHttpServletRequest();
int result = condition1.compareTo(condition2, request);
assertTrue("Invalid comparison result: " + result, result < 0);
result = condition2.compareTo(condition1);
result = condition2.compareTo(condition1, request);
assertTrue("Invalid comparison result: " + result, result > 0);
result = condition2.compareTo(condition3);
result = condition2.compareTo(condition3, request);
assertTrue("Invalid comparison result: " + result, result < 0);
result = condition1.compareTo(condition1);
result = condition1.compareTo(condition1, request);
assertEquals("Invalid comparison result ", 0, result);
}
@@ -81,7 +83,7 @@ public class RequestMethodsRequestConditionTests {
RequestMethodsRequestCondition condition2 = new RequestMethodsRequestCondition(RequestMethod.POST);
RequestMethodsRequestCondition result = condition1.combine(condition2);
assertEquals(2, result.getConditions().size());
assertEquals(2, result.getContent().size());
}