Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -499,7 +495,7 @@ public enum VariableType {
*/
COMPOSITE_PARAM("*", "", true);

private static final List<VariableType> COMBINABLE_TYPES = Arrays.asList(REQUEST_PARAM, REQUEST_PARAM_CONTINUED);
private static final EnumSet<VariableType> COMBINABLE_TYPES = EnumSet.of(REQUEST_PARAM, REQUEST_PARAM_CONTINUED);
static final String DEFAULT_SEPARATOR = ",";

private final String key, combiner;
Expand Down
25 changes: 14 additions & 11 deletions src/main/java/org/springframework/hateoas/TemplateVariables.java
Original file line number Diff line number Diff line change
Expand Up @@ -68,11 +68,12 @@ public TemplateVariables(List<TemplateVariable> 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;
}
}
Expand Down Expand Up @@ -100,12 +101,11 @@ public TemplateVariables concat(Collection<TemplateVariable> variables) {

List<TemplateVariable> result = new ArrayList<>(this.variables.size() + variables.size());
result.addAll(this.variables);

List<TemplateVariable> 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);
}

Expand Down Expand Up @@ -133,9 +133,12 @@ public Stream<TemplateVariable> 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;
}

/*
Expand Down
29 changes: 15 additions & 14 deletions src/main/java/org/springframework/hateoas/UriTemplate.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -172,13 +166,10 @@ public UriTemplate with(TemplateVariables variables) {
}

UriComponents components = UriComponentsBuilder.fromUriString(baseUri).build();
MultiValueMap<String, String> parameters = components.getQueryParams();
List<TemplateVariable> result = new ArrayList<>();
String newOriginal = template;
ExpandGroups groups = this.groups;

for (TemplateVariable variable : variables) {

MultiValueMap<String, String> parameters = components.getQueryParams();
boolean isRequestParam = variable.isRequestParameterVariable();
boolean alreadyPresent = parameters.containsKey(variable.getName());

Expand All @@ -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<VariableType, List<TemplateVariable>> groupedByVariableType = result.stream()
.collect(
Collectors.groupingBy(TemplateVariable::getType, LinkedHashMap::new, Collectors.toList()));


for (Map.Entry<VariableType, List<TemplateVariable>> 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());
Expand All @@ -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);
Expand Down