From 3a8a28beecc7aa0a4df6f47072fe806dd00e5cfc Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Mon, 30 Mar 2015 15:56:03 -0400 Subject: [PATCH] Consolidate partialPaths under FullPathComposite --- .../web/util/HierarchicalUriComponents.java | 135 +++++++++--------- .../web/util/UriComponentsTests.java | 87 +++++------ 2 files changed, 109 insertions(+), 113 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java b/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java index fa5fda06d87..4e657b28ff1 100644 --- a/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java +++ b/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java @@ -642,13 +642,49 @@ final class HierarchicalUriComponents extends UriComponents { public FullPathComponent(String path) { - this.partialPaths = PartialPath.parse(path); + this.partialPaths = Collections.unmodifiableList(initPartialPaths(path)); this.path = path; } private FullPathComponent(List partialPaths) { - this.partialPaths = partialPaths; - this.path = PartialPath.getPath(partialPaths); + this.partialPaths = Collections.unmodifiableList(partialPaths); + this.path = initPath(partialPaths); + } + + private static String initPath(List partialPaths) { + StringBuilder builder = new StringBuilder(); + for (PartialPath partialPath : partialPaths) { + builder.append(partialPath.getValue()); + } + return builder.toString(); + } + + private static List initPartialPaths(String path) { + List result = new ArrayList(); + int startIdx; + int endIdx = 0; + while ((startIdx = path.indexOf("{/", endIdx)) != -1) { + if (startIdx > endIdx) { + String prevPart = path.substring(endIdx, startIdx); + result.add(new PartialPath(prevPart, Type.PATH)); + } + endIdx = path.indexOf('}', startIdx + 2) + 1; + if (endIdx == -1) { + throw new IllegalArgumentException("Path \"" + path + "\" has no " + + "closing \"}\" after \"{/\" at index " + startIdx); + } + String part = path.substring(startIdx, endIdx); + result.add(new PartialPath(part, Type.PATH_SEGMENT)); + } + if (endIdx < path.length()) { + String endPart = path.substring(endIdx); + result.add(new PartialPath(endPart, Type.PATH)); + } + return result; + } + + List getPartialPaths() { + return this.partialPaths; } @Override @@ -670,21 +706,29 @@ final class HierarchicalUriComponents extends UriComponents { @Override public PathComponent encode(String encoding) throws UnsupportedEncodingException { - List encodedPath = - PartialPath.encode(this.partialPaths, encoding); - return new FullPathComponent(encodedPath); + List result = new ArrayList(); + for (PartialPath partialPath : this.partialPaths) { + PartialPath encoded = partialPath.encode(encoding); + result.add(encoded); + } + return new FullPathComponent(result); } @Override public void verify() { - verifyUriComponent(getPath(), Type.PATH); + for (PartialPath partialPath : this.partialPaths) { + partialPath.verify(); + } } @Override public PathComponent expand(UriTemplateVariables uriVariables) { - List expandedPath = - PartialPath.expand(this.partialPaths, uriVariables); - return new FullPathComponent(expandedPath); + List result = new ArrayList(); + for (PartialPath partialPath : this.partialPaths) { + PartialPath expanded = partialPath.expand(uriVariables); + result.add(expanded); + } + return new FullPathComponent(result); } @Override @@ -721,81 +765,31 @@ final class HierarchicalUriComponents extends UriComponents { this.type = type; } + public String getValue() { + return this.value; + } + private PartialPath expand(UriTemplateVariables uriVariables) { String expandedValue = expandUriComponent(this.value, uriVariables); return new PartialPath(expandedValue, this.type); } - private PartialPath encode(String encoding) - throws UnsupportedEncodingException { + private PartialPath encode(String encoding) throws UnsupportedEncodingException { String encodedPath = encodeUriComponent(this.value, encoding, this.type); return new PartialPath(encodedPath, this.type); } - @Override - public String toString() { - return value; + public void verify() { + verifyUriComponent(this.value, this.type); } - public static List parse(String path) { - List result = new ArrayList(); - int startIdx; - int endIdx = 0; - while ((startIdx = path.indexOf("{/", endIdx)) != -1) { - if (startIdx > endIdx) { - String prevPart = path.substring(endIdx, startIdx); - result.add(new PartialPath(prevPart, Type.PATH)); - } - endIdx = path.indexOf('}', startIdx + 2) + 1; - if (endIdx == -1) { - throw new IllegalArgumentException("Path \"" + path + "\" has no " + - "closing \"}\" after \"{/\" at index " + startIdx); - } - String part = path.substring(startIdx, endIdx); - result.add(new PartialPath(part, Type.PATH_SEGMENT)); - } - if (endIdx < path.length()) { - String endPart = path.substring(endIdx); - result.add(new PartialPath(endPart, Type.PATH)); - } - return Collections.unmodifiableList(result); - } - - public static String getPath(List partialPaths) { - StringBuilder builder = new StringBuilder(); - for (PartialPath partialPath : partialPaths) { - builder.append(partialPath.value); - } - return builder.toString(); - } - - public static List expand( - List partialPaths, - UriTemplateVariables uriVariables) { - List result = new ArrayList(); - for (PartialPath partialPath : partialPaths) { - PartialPath expanded = partialPath.expand(uriVariables); - result.add(expanded); - } - return result; - } - - public static List encode( - List partialPaths, String encoding) - throws UnsupportedEncodingException { - List result = new ArrayList(); - for (PartialPath partialPath : partialPaths) { - PartialPath encoded = partialPath.encode(encoding); - result.add(encoded); - } - return result; + @Override + public String toString() { + return this.value; } - } - } - /** * Represents a path backed by a string list (i.e. path segments). */ @@ -964,6 +958,7 @@ final class HierarchicalUriComponents extends UriComponents { @Override public void copyToUriComponentsBuilder(UriComponentsBuilder builder) { } + @SuppressWarnings("EqualsWhichDoesntCheckParameterClass") @Override public boolean equals(Object obj) { return (this == obj); diff --git a/spring-web/src/test/java/org/springframework/web/util/UriComponentsTests.java b/spring-web/src/test/java/org/springframework/web/util/UriComponentsTests.java index ea89d04a6c5..b68f8b72339 100644 --- a/spring-web/src/test/java/org/springframework/web/util/UriComponentsTests.java +++ b/spring-web/src/test/java/org/springframework/web/util/UriComponentsTests.java @@ -16,6 +16,10 @@ package org.springframework.web.util; +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; +import static org.springframework.web.util.UriComponentsBuilder.*; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; @@ -23,13 +27,10 @@ import java.io.ObjectOutputStream; import java.net.URI; import java.net.URISyntaxException; import java.util.Arrays; -import java.util.List; import org.junit.Test; -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; -import static org.springframework.web.util.UriComponentsBuilder.*; +import org.springframework.web.util.HierarchicalUriComponents.FullPathComponent; /** * @author Arjen Poutsma @@ -168,45 +169,45 @@ public class UriComponentsTests { @Test public void partialPath() throws Exception { - List l; - - l = HierarchicalUriComponents.FullPathComponent.PartialPath.parse("x"); - assertEquals(1, l.size()); - assertEquals("x", l.get(0).value); - assertEquals(HierarchicalUriComponents.Type.PATH, l.get(0).type); - - l = HierarchicalUriComponents.FullPathComponent.PartialPath.parse("/foo"); - assertEquals(1, l.size()); - assertEquals("/foo", l.get(0).value); - assertEquals(HierarchicalUriComponents.Type.PATH, l.get(0).type); - - l = HierarchicalUriComponents.FullPathComponent.PartialPath.parse("{/foo}"); - assertEquals(1, l.size()); - assertEquals("{/foo}", l.get(0).value); - assertEquals(HierarchicalUriComponents.Type.PATH_SEGMENT, l.get(0).type); - - l = HierarchicalUriComponents.FullPathComponent.PartialPath.parse("/foo{/bar}"); - assertEquals(2, l.size()); - assertEquals("/foo", l.get(0).value); - assertEquals(HierarchicalUriComponents.Type.PATH, l.get(0).type); - assertEquals("{/bar}", l.get(1).value); - assertEquals(HierarchicalUriComponents.Type.PATH_SEGMENT, l.get(1).type); - - l = HierarchicalUriComponents.FullPathComponent.PartialPath.parse("{/foo}{/bar}"); - assertEquals(2, l.size()); - assertEquals("{/foo}", l.get(0).value); - assertEquals(HierarchicalUriComponents.Type.PATH_SEGMENT, l.get(0).type); - assertEquals("{/bar}", l.get(1).value); - assertEquals(HierarchicalUriComponents.Type.PATH_SEGMENT, l.get(1).type); - - l = HierarchicalUriComponents.FullPathComponent.PartialPath.parse("foo{/bar}baz"); - assertEquals(3, l.size()); - assertEquals("foo", l.get(0).value); - assertEquals(HierarchicalUriComponents.Type.PATH, l.get(0).type); - assertEquals("{/bar}", l.get(1).value); - assertEquals(HierarchicalUriComponents.Type.PATH_SEGMENT, l.get(1).type); - assertEquals("baz", l.get(2).value); - assertEquals(HierarchicalUriComponents.Type.PATH, l.get(2).type); + FullPathComponent l; + + l = new FullPathComponent("x"); + assertEquals(1, l.getPartialPaths().size()); + assertEquals("x", l.getPartialPaths().get(0).value); + assertEquals(HierarchicalUriComponents.Type.PATH, l.getPartialPaths().get(0).type); + + l = new FullPathComponent("/foo"); + assertEquals(1, l.getPartialPaths().size()); + assertEquals("/foo", l.getPartialPaths().get(0).value); + assertEquals(HierarchicalUriComponents.Type.PATH, l.getPartialPaths().get(0).type); + + l = new FullPathComponent("{/foo}"); + assertEquals(1, l.getPartialPaths().size()); + assertEquals("{/foo}", l.getPartialPaths().get(0).value); + assertEquals(HierarchicalUriComponents.Type.PATH_SEGMENT, l.getPartialPaths().get(0).type); + + l = new FullPathComponent("/foo{/bar}"); + assertEquals(2, l.getPartialPaths().size()); + assertEquals("/foo", l.getPartialPaths().get(0).value); + assertEquals(HierarchicalUriComponents.Type.PATH, l.getPartialPaths().get(0).type); + assertEquals("{/bar}", l.getPartialPaths().get(1).value); + assertEquals(HierarchicalUriComponents.Type.PATH_SEGMENT, l.getPartialPaths().get(1).type); + + l = new FullPathComponent("{/foo}{/bar}"); + assertEquals(2, l.getPartialPaths().size()); + assertEquals("{/foo}", l.getPartialPaths().get(0).value); + assertEquals(HierarchicalUriComponents.Type.PATH_SEGMENT, l.getPartialPaths().get(0).type); + assertEquals("{/bar}", l.getPartialPaths().get(1).value); + assertEquals(HierarchicalUriComponents.Type.PATH_SEGMENT, l.getPartialPaths().get(1).type); + + l = new FullPathComponent("foo{/bar}baz"); + assertEquals(3, l.getPartialPaths().size()); + assertEquals("foo", l.getPartialPaths().get(0).value); + assertEquals(HierarchicalUriComponents.Type.PATH, l.getPartialPaths().get(0).type); + assertEquals("{/bar}", l.getPartialPaths().get(1).value); + assertEquals(HierarchicalUriComponents.Type.PATH_SEGMENT, l.getPartialPaths().get(1).type); + assertEquals("baz", l.getPartialPaths().get(2).value); + assertEquals(HierarchicalUriComponents.Type.PATH, l.getPartialPaths().get(2).type); }