remove our immutable list from Parameter, add copy constructor to URLBuilder
This commit is contained in:
parent
e656f2d2bd
commit
c45bbfca53
7 changed files with 59 additions and 28 deletions
|
@ -1,3 +1,3 @@
|
|||
group = org.xbib
|
||||
name = net
|
||||
version = 4.0.3
|
||||
version = 4.0.4
|
||||
|
|
|
@ -10,7 +10,6 @@ import java.util.Map;
|
|||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
import org.xbib.datastructures.common.ImmutableList;
|
||||
import org.xbib.datastructures.common.LinkedHashSetMultiMap;
|
||||
import org.xbib.datastructures.common.MultiMap;
|
||||
import org.xbib.datastructures.common.Pair;
|
||||
|
@ -30,15 +29,11 @@ public class Parameter implements Iterable<Pair<String, Object>>, Comparable<Par
|
|||
|
||||
private final ParameterBuilder builder;
|
||||
|
||||
private final ImmutableList<Pair<String, Object>> list;
|
||||
|
||||
private final String queryString;
|
||||
|
||||
Parameter(ParameterBuilder builder,
|
||||
ImmutableList<Pair<String, Object>> list,
|
||||
String queryString) {
|
||||
this.builder = builder;
|
||||
this.list = list;
|
||||
this.queryString = queryString;
|
||||
}
|
||||
|
||||
|
@ -64,24 +59,24 @@ public class Parameter implements Iterable<Pair<String, Object>>, Comparable<Par
|
|||
|
||||
@Override
|
||||
public Iterator<Pair<String, Object>> iterator() {
|
||||
return list.iterator();
|
||||
return builder.list.iterator();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
return o instanceof Parameter &&
|
||||
builder.domain.equals(((Parameter) o).builder.domain) &&
|
||||
list.equals(((Parameter) o).list);
|
||||
builder.list.equals(((Parameter) o).builder.list);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(builder.domain, list);
|
||||
return Objects.hash(builder.domain, builder.list);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(Parameter o) {
|
||||
return list.toString().compareTo(o.list.toString());
|
||||
return builder.list.toString().compareTo(o.builder.list.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -158,7 +153,7 @@ public class Parameter implements Iterable<Pair<String, Object>>, Comparable<Par
|
|||
}
|
||||
|
||||
public boolean hasElements() {
|
||||
return !list.isEmpty();
|
||||
return !builder.list.isEmpty();
|
||||
}
|
||||
|
||||
public MultiMap<String, Object> asMultiMap() throws ParameterException{
|
||||
|
@ -188,7 +183,7 @@ public class Parameter implements Iterable<Pair<String, Object>>, Comparable<Par
|
|||
return parameter.getAllInDomain(domain);
|
||||
}
|
||||
if (getDomain().equals(domain)) {
|
||||
return list.stream()
|
||||
return builder.list.stream()
|
||||
.map(Pair::getValue)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
@ -204,7 +199,7 @@ public class Parameter implements Iterable<Pair<String, Object>>, Comparable<Par
|
|||
return parameter.isPresent(domain);
|
||||
}
|
||||
if (getDomain().equals(domain)) {
|
||||
return list.stream().findAny().isPresent();
|
||||
return builder.list.stream().findAny().isPresent();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -234,7 +229,7 @@ public class Parameter implements Iterable<Pair<String, Object>>, Comparable<Par
|
|||
throw new ParameterException("undefined domain");
|
||||
}
|
||||
if (getDomain().equals(domain)) {
|
||||
return list.stream()
|
||||
return builder.list.stream()
|
||||
.filter(p -> p.getKey().equals(key))
|
||||
.map(Pair::getValue)
|
||||
.collect(Collectors.toList());
|
||||
|
@ -251,7 +246,7 @@ public class Parameter implements Iterable<Pair<String, Object>>, Comparable<Par
|
|||
return parameter.containsKey(key, domain);
|
||||
}
|
||||
if (getDomain().equals(domain)) {
|
||||
return list.stream()
|
||||
return builder.list.stream()
|
||||
.anyMatch(p -> key.equals(p.getKey()));
|
||||
}
|
||||
return false;
|
||||
|
@ -269,7 +264,7 @@ public class Parameter implements Iterable<Pair<String, Object>>, Comparable<Par
|
|||
throw new ParameterException("undefined domain, please specify domain for parameter " + this);
|
||||
}
|
||||
if (getDomain().equals(domain)) {
|
||||
Optional<Object> optional = list.stream()
|
||||
Optional<Object> optional = builder.list.stream()
|
||||
.filter(p -> key.equals(p.getKey()))
|
||||
.map(Pair::getValue)
|
||||
.findFirst();
|
||||
|
@ -286,7 +281,7 @@ public class Parameter implements Iterable<Pair<String, Object>>, Comparable<Par
|
|||
|
||||
private String allToString() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(list.toString());
|
||||
sb.append(builder.list.toString());
|
||||
builder.parameterMap.forEach((key, value) -> sb.append(" ").append(key).append(" -> ").append(value));
|
||||
return sb.toString();
|
||||
}
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package org.xbib.net;
|
||||
|
||||
import java.io.UncheckedIOException;
|
||||
import java.lang.reflect.Array;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.CodingErrorAction;
|
||||
import java.nio.charset.MalformedInputException;
|
||||
|
@ -16,23 +15,19 @@ import java.util.Locale;
|
|||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
import org.xbib.datastructures.common.ImmutableList;
|
||||
import org.xbib.datastructures.common.MultiMap;
|
||||
import org.xbib.datastructures.common.Pair;
|
||||
import org.xbib.datastructures.common.PairValidator;
|
||||
|
||||
public class ParameterBuilder implements PairValidator {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private static final Pair<String, Object>[] EMPTY_PAIR = (Pair<String, Object>[]) Array.newInstance(Pair.class, 0);
|
||||
|
||||
private static final char AMPERSAND_CHAR = '&';
|
||||
|
||||
private static final char EQUAL_CHAR = '=';
|
||||
|
||||
private static final Integer MAX_PARAMS_IN_QUERY_STRING = 1024;
|
||||
|
||||
private final List<Pair<String, Object>> list;
|
||||
final List<Pair<String, Object>> list;
|
||||
|
||||
protected Parameter.Domain domain;
|
||||
|
||||
|
@ -72,8 +67,8 @@ public class ParameterBuilder implements PairValidator {
|
|||
}
|
||||
|
||||
ParameterBuilder(ParameterBuilder builder) {
|
||||
this.list = builder.list;
|
||||
this.parameterMap = builder.parameterMap;
|
||||
this.list = new ArrayList<>(builder.list);
|
||||
this.parameterMap = new HashMap<>(builder.parameterMap);
|
||||
this.domain = builder.domain;
|
||||
this.limit = builder.limit;
|
||||
this.charset = builder.charset;
|
||||
|
@ -266,7 +261,7 @@ public class ParameterBuilder implements PairValidator {
|
|||
throw new UncheckedIOException(e);
|
||||
}
|
||||
}
|
||||
Parameter parameter = new Parameter(this, ImmutableList.of(list, EMPTY_PAIR), queryString);
|
||||
Parameter parameter = new Parameter(this, queryString);
|
||||
if (parameterValidator != null) {
|
||||
return parameterValidator.apply(parameter);
|
||||
} else {
|
||||
|
|
|
@ -67,7 +67,7 @@ public class URL implements Comparable<URL> {
|
|||
|
||||
static final String DOUBLE_SLASH = "//";
|
||||
|
||||
private final transient URLBuilder builder;
|
||||
final transient URLBuilder builder;
|
||||
|
||||
private final transient Scheme scheme;
|
||||
|
||||
|
@ -111,6 +111,10 @@ public class URL implements Comparable<URL> {
|
|||
return new URLBuilder();
|
||||
}
|
||||
|
||||
public static URLBuilder builder(URL url) {
|
||||
return new URLBuilder(url.builder);
|
||||
}
|
||||
|
||||
public static URLBuilder http() {
|
||||
return new URLBuilder().scheme(Scheme.HTTP);
|
||||
}
|
||||
|
@ -144,6 +148,15 @@ public class URL implements Comparable<URL> {
|
|||
return NULL_URL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy URL.
|
||||
* @param url the url
|
||||
* @return a new URL object
|
||||
*/
|
||||
public static URL from(URL url) {
|
||||
return builder(url).build();
|
||||
}
|
||||
|
||||
public static URL from(String input) {
|
||||
return from(input, StandardCharsets.UTF_8, CodingErrorAction.REPORT, true, false);
|
||||
}
|
||||
|
|
|
@ -66,6 +66,26 @@ public class URLBuilder {
|
|||
charset(StandardCharsets.UTF_8, CodingErrorAction.REPLACE);
|
||||
}
|
||||
|
||||
URLBuilder(URLBuilder builder) {
|
||||
regNameEncoder = builder.regNameEncoder;
|
||||
percentEncoder = builder.percentEncoder;
|
||||
percentDecoder = builder.percentDecoder;
|
||||
queryParams = Parameter.builder(builder.queryParams);
|
||||
pathSegments = builder.pathSegments;
|
||||
charset = builder.charset;
|
||||
codingErrorAction = builder.codingErrorAction;
|
||||
scheme = builder.scheme;
|
||||
schemeSpecificPart = builder.schemeSpecificPart;
|
||||
userInfo = builder.userInfo;
|
||||
host = builder.host;
|
||||
hostAddress = builder.hostAddress;
|
||||
protocolVersion = builder.protocolVersion;
|
||||
port = builder.port;
|
||||
query = builder.query;
|
||||
fragment = builder.fragment;
|
||||
fatalResolveErrorsEnabled = builder.fatalResolveErrorsEnabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the character set of the URL. Default is UTF-8.
|
||||
*
|
||||
|
|
|
@ -276,6 +276,14 @@ class URLBuilderTest {
|
|||
assertEquals("/foobar?a%25=b%25&c=%20d%20", url.relativeReference());
|
||||
assertEquals("https://google.com:8008/foobar?a%25=b%25&c=%20d%20", url.toExternalForm());
|
||||
assertEquals("https://google.com:8008/foobar?a%=b%&c= d ", url.toString());
|
||||
|
||||
// test inheritance of params added by mutator
|
||||
URL url1 = URL.from("http://example.com");
|
||||
url1.mutator().queryParams.add("a", "b");
|
||||
assertEquals("http://example.com?a=b", url1.toString());
|
||||
URL url2 = URL.from(url1); // copy
|
||||
url2.mutator().queryParams.add("c", "d");
|
||||
assertEquals("http://example.com?a=b&c=d", url2.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -18,7 +18,7 @@ class URLParserTest {
|
|||
|
||||
@Test
|
||||
void testNull() {
|
||||
assertEquals(URL.nullUrl(), URL.from(null));
|
||||
assertEquals(URL.nullUrl(), URL.from((String) null));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
Loading…
Reference in a new issue