From b2927eb5a00e70b8bf3934dd800bc14f71fb2c43 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Thu, 1 May 2014 14:29:18 +0200 Subject: [PATCH] DATAREST-276 - Improved BaseUri to accomodate trailing slashes. We now strip trailing and leading slashes from configured base URI to make sure the matching algorithm accommodates both lookup paths with and without trailing slashes. Added a few more tests in shape of unit tests for BaseUri. --- .../data/rest/webmvc/BaseUri.java | 7 +- .../data/rest/webmvc/BaseUriUnitTests.java | 90 +++++++++++++++++++ 2 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/BaseUriUnitTests.java diff --git a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/BaseUri.java b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/BaseUri.java index 301132ede..2aaaedf5e 100644 --- a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/BaseUri.java +++ b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/BaseUri.java @@ -15,6 +15,8 @@ */ package org.springframework.data.rest.webmvc; +import static org.springframework.util.StringUtils.*; + import java.net.URI; import java.util.Collections; import java.util.List; @@ -49,7 +51,8 @@ public class BaseUri { Assert.notNull(uri, "Base URI must not be null!"); - this.baseUri = uri; + String uriString = uri.toString(); + this.baseUri = URI.create(trimTrailingCharacter(trimTrailingCharacter(uriString, '/'), '/')); } /** @@ -100,8 +103,6 @@ public class BaseUri { Assert.notNull(lookupPath, "Lookup path must not be null!"); - lookupPath = StringUtils.trimTrailingCharacter(lookupPath, '/'); - if (!baseUri.isAbsolute()) { String uri = baseUri.toString(); diff --git a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/BaseUriUnitTests.java b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/BaseUriUnitTests.java new file mode 100644 index 000000000..d36c6953d --- /dev/null +++ b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/BaseUriUnitTests.java @@ -0,0 +1,90 @@ +/* + * Copyright 2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.rest.webmvc; + +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; + +import java.net.URI; + +import org.junit.Test; + +/** + * Unit tests for {@link BaseUri}. + * + * @author Oliver Gierke + */ +public class BaseUriUnitTests { + + /** + * @see DATAREST-276 + */ + @Test + public void doesNotMatchNonOverlap() { + + assertThat(new BaseUri(URI.create("foo")).getRepositoryLookupPath("/bar"), is(nullValue())); + assertThat(new BaseUri(URI.create("http://localhost:8080/foo/")).getRepositoryLookupPath("/bar"), is(nullValue())); + } + + /** + * @see DATAREST-276 + */ + @Test + public void matchesSimpleBaseUri() { + + BaseUri uri = new BaseUri(URI.create("foo")); + + assertThat(uri.getRepositoryLookupPath("/foo"), isEmptyString()); + } + + /** + * @see DATAREST-276 + */ + @Test + public void ignoresTrailingSlash() { + + BaseUri uri = new BaseUri(URI.create("foo/")); + + assertThat(uri.getRepositoryLookupPath("/foo"), isEmptyString()); + assertThat(uri.getRepositoryLookupPath("/foo/"), is("/")); + } + + /** + * @see DATAREST-276 + */ + @Test + public void ignoresLeadingSlash() { + + BaseUri uri = new BaseUri(URI.create("/foo")); + + assertThat(uri.getRepositoryLookupPath("/foo"), isEmptyString()); + assertThat(uri.getRepositoryLookupPath("/foo/"), is("/")); + } + + /** + * @see DATAREST-276 + */ + @Test + public void matchesAbsoluteBaseUriOnOverlap() { + + BaseUri uri = new BaseUri(URI.create("http://localhost:8080/foo/")); + + assertThat(uri.getRepositoryLookupPath("/foo"), isEmptyString()); + assertThat(uri.getRepositoryLookupPath("/foo/"), is("/")); + assertThat(uri.getRepositoryLookupPath("/foo/people"), is("/people")); + assertThat(uri.getRepositoryLookupPath("/foo/people/"), is("/people/")); + } +}