View Javadoc
1   package org.oxerr.viagogo.model;
2   
3   import java.io.UnsupportedEncodingException;
4   import java.net.URI;
5   import java.net.URLDecoder;
6   import java.nio.charset.StandardCharsets;
7   import java.time.Instant;
8   import java.time.LocalDateTime;
9   import java.util.Arrays;
10  import java.util.Collections;
11  import java.util.List;
12  import java.util.Map;
13  import java.util.Optional;
14  import java.util.regex.Pattern;
15  import java.util.stream.Collectors;
16  
17  import io.openapitools.jackson.dataformat.hal.HALLink;
18  
19  public final class Link {
20  
21  	private Map<String, List<String>> params;
22  
23  	public Link(String href) {
24  		URI uri = URI.create(href);
25  		this.params = Pattern.compile("&")
26  			.splitAsStream(uri.getQuery())
27  			.map(s -> Arrays.copyOf(s.split("=", 2), 2))
28  			.collect(Collectors.groupingBy(s -> decode(s[0]), Collectors.mapping(s -> decode(s[1]), Collectors.toList())));
29  	}
30  	public Link(HALLink halLink) {
31  		this(halLink.getHref());
32  	}
33  
34  	public Optional<String> getFirst(String name) {
35  		return Optional.ofNullable(params.get(name))
36  			.orElseGet(Collections::emptyList)
37  			.stream()
38  			.findFirst();
39  	}
40  
41  	public String getFirstAsString(String name) {
42  		return getFirst(name).orElse(null);
43  	}
44  
45  	public Long getFirstAsLong(String name) {
46  		return getFirst(name).map(Long::parseLong).orElse(null);
47  	}
48  
49  	public Integer getFirstAsInteger(String name) {
50  		return getFirst(name).map(Integer::parseInt).orElse(null);
51  	}
52  
53  	public Double getFirstAsDouble(String name) {
54  		return getFirst(name).map(Double::parseDouble).orElse(null);
55  	}
56  
57  	public Instant getFirstAsInstant(String name) {
58  		return getFirst(name).map(Instant::parse).orElse(null);
59  	}
60  
61  	public LocalDateTime getFirstAsLocalDateTime(String name) {
62  		return getFirst(name).map(LocalDateTime::parse).orElse(null);
63  	}
64  
65  	private static String decode(final String encoded) {
66  		return Optional.ofNullable(encoded)
67  			.map(e -> {
68  				try {
69  					return URLDecoder.decode(e, StandardCharsets.UTF_8.name());
70  				} catch (UnsupportedEncodingException ex) {
71  					return e;
72  				}
73  			})
74  			.orElse(null);
75  	}
76  
77  }