diff --git a/src/main/java/org/springframework/hateoas/TemplateVariable.java b/src/main/java/org/springframework/hateoas/TemplateVariable.java index 058efc486..7aa765169 100644 --- a/src/main/java/org/springframework/hateoas/TemplateVariable.java +++ b/src/main/java/org/springframework/hateoas/TemplateVariable.java @@ -19,11 +19,7 @@ import java.io.Serializable; import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.StreamSupport; @@ -499,7 +495,7 @@ public enum VariableType { */ COMPOSITE_PARAM("*", "", true); - private static final List COMBINABLE_TYPES = Arrays.asList(REQUEST_PARAM, REQUEST_PARAM_CONTINUED); + private static final EnumSet COMBINABLE_TYPES = EnumSet.of(REQUEST_PARAM, REQUEST_PARAM_CONTINUED); static final String DEFAULT_SEPARATOR = ","; private final String key, combiner; diff --git a/src/main/java/org/springframework/hateoas/TemplateVariables.java b/src/main/java/org/springframework/hateoas/TemplateVariables.java index 1a7382666..beef80ae4 100644 --- a/src/main/java/org/springframework/hateoas/TemplateVariables.java +++ b/src/main/java/org/springframework/hateoas/TemplateVariables.java @@ -68,11 +68,12 @@ public TemplateVariables(List variables) { for (TemplateVariable variable : variables) { - processed.add(variable.isRequestParameterVariable() && requestParameterFound + boolean isRequestParameter = variable.isRequestParameterVariable(); + processed.add(isRequestParameter && requestParameterFound ? variable.withType(REQUEST_PARAM_CONTINUED) : variable); - if (variable.isRequestParameterVariable()) { + if (isRequestParameter) { requestParameterFound = true; } } @@ -100,12 +101,11 @@ public TemplateVariables concat(Collection variables) { List result = new ArrayList<>(this.variables.size() + variables.size()); result.addAll(this.variables); - - List filtered = variables.stream() // - .filter(variable -> !containsEquivalentFor(variable)).collect(Collectors.toList()); - - result.addAll(filtered); - + for (TemplateVariable otherVariable : variables) { + if (!containsEquivalentFor(otherVariable)) { + result.add(otherVariable); + } + } return new TemplateVariables(result); } @@ -133,9 +133,12 @@ public Stream stream() { } private boolean containsEquivalentFor(TemplateVariable candidate) { - - return this.variables.stream() // - .anyMatch(variable -> variable.isEquivalent(candidate)); + for (TemplateVariable variable : variables) { + if (variable.isEquivalent(candidate)) { + return true; + } + } + return false; } /* diff --git a/src/main/java/org/springframework/hateoas/UriTemplate.java b/src/main/java/org/springframework/hateoas/UriTemplate.java index e74e6dc41..dfac120de 100644 --- a/src/main/java/org/springframework/hateoas/UriTemplate.java +++ b/src/main/java/org/springframework/hateoas/UriTemplate.java @@ -18,13 +18,7 @@ import java.io.Serializable; import java.net.URI; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -172,13 +166,10 @@ public UriTemplate with(TemplateVariables variables) { } UriComponents components = UriComponentsBuilder.fromUriString(baseUri).build(); + MultiValueMap parameters = components.getQueryParams(); List result = new ArrayList<>(); - String newOriginal = template; - ExpandGroups groups = this.groups; for (TemplateVariable variable : variables) { - - MultiValueMap parameters = components.getQueryParams(); boolean isRequestParam = variable.isRequestParameterVariable(); boolean alreadyPresent = parameters.containsKey(variable.getName()); @@ -195,9 +186,20 @@ public UriTemplate with(TemplateVariables variables) { variable = variable.withType(VariableType.REQUEST_PARAM_CONTINUED); } - ExpandGroup existing = groups.findLastExpandGroupOfType(variable.getType()); - ExpandGroup group = new ExpandGroup(Collections.singletonList(variable)); + result.add(variable); + } + + String newOriginal = template; + ExpandGroups groups = this.groups; + LinkedHashMap> groupedByVariableType = result.stream() + .collect( + Collectors.groupingBy(TemplateVariable::getType, LinkedHashMap::new, Collectors.toList())); + + + for (Map.Entry> entry : groupedByVariableType.entrySet()) { + ExpandGroup existing = groups.findLastExpandGroupOfType(entry.getKey()); + ExpandGroup group = new ExpandGroup(entry.getValue()); if (existing != null) { group = existing.merge(group); newOriginal = newOriginal.replace(existing.asString(), group.asString()); @@ -206,7 +208,6 @@ public UriTemplate with(TemplateVariables variables) { } groups = groups.addOrAugment(group); - result.add(variable); } return new UriTemplate(baseUri, newOriginal, this.variables.concat(result), groups);