1 package org
.argeo
.naming
;
3 import java
.io
.UnsupportedEncodingException
;
5 import java
.net
.URLDecoder
;
6 import java
.nio
.charset
.StandardCharsets
;
7 import java
.time
.Instant
;
8 import java
.time
.OffsetDateTime
;
9 import java
.time
.ZoneOffset
;
10 import java
.time
.ZonedDateTime
;
11 import java
.time
.format
.DateTimeFormatter
;
12 import java
.time
.temporal
.ChronoField
;
13 import java
.util
.Calendar
;
14 import java
.util
.GregorianCalendar
;
15 import java
.util
.LinkedHashMap
;
16 import java
.util
.LinkedList
;
17 import java
.util
.List
;
20 public class NamingUtils
{
21 private final static DateTimeFormatter utcLdapDate
= DateTimeFormatter
.ofPattern("uuuuMMddHHmmssX")
22 .withZone(ZoneOffset
.UTC
);
24 public static Instant
ldapDateToInstant(String ldapDate
) {
25 return OffsetDateTime
.parse(ldapDate
, utcLdapDate
).toInstant();
28 public static Calendar
ldapDateToCalendar(String ldapDate
) {
29 OffsetDateTime instant
= OffsetDateTime
.parse(ldapDate
, utcLdapDate
);
30 GregorianCalendar calendar
= new GregorianCalendar();
31 calendar
.set(calendar
.DAY_OF_MONTH
, instant
.get(ChronoField
.DAY_OF_MONTH
));
32 calendar
.set(calendar
.MONTH
, instant
.get(ChronoField
.MONTH_OF_YEAR
));
33 calendar
.set(calendar
.YEAR
, instant
.get(ChronoField
.YEAR
));
37 public static String
instantToLdapDate(ZonedDateTime instant
) {
38 return utcLdapDate
.format(instant
.withZoneSameInstant(ZoneOffset
.UTC
));
41 public static String
getQueryValue(Map
<String
, List
<String
>> query
, String key
) {
42 if (!query
.containsKey(key
))
44 List
<String
> val
= query
.get(key
);
48 throw new IllegalArgumentException("There are " + val
.size() + " value(s) for " + key
);
51 public static Map
<String
, List
<String
>> queryToMap(URI uri
) {
52 return queryToMap(uri
.getQuery());
55 private static Map
<String
, List
<String
>> queryToMap(String queryPart
) {
57 final Map
<String
, List
<String
>> query_pairs
= new LinkedHashMap
<String
, List
<String
>>();
58 if (queryPart
== null)
60 final String
[] pairs
= queryPart
.split("&");
61 for (String pair
: pairs
) {
62 final int idx
= pair
.indexOf("=");
63 final String key
= idx
> 0 ? URLDecoder
.decode(pair
.substring(0, idx
), StandardCharsets
.UTF_8
.name())
65 if (!query_pairs
.containsKey(key
)) {
66 query_pairs
.put(key
, new LinkedList
<String
>());
68 final String value
= idx
> 0 && pair
.length() > idx
+ 1
69 ? URLDecoder
.decode(pair
.substring(idx
+ 1), StandardCharsets
.UTF_8
.name()) : null;
70 query_pairs
.get(key
).add(value
);
73 } catch (UnsupportedEncodingException e
) {
74 throw new IllegalArgumentException("Cannot convert " + queryPart
+ " to map", e
);
78 private NamingUtils() {
82 public static void main(String args
[]) {
83 ZonedDateTime now
= ZonedDateTime
.now().withZoneSameInstant(ZoneOffset
.UTC
);
84 String str
= utcLdapDate
.format(now
);
85 System
.out
.println(str
);
86 utcLdapDate
.parse(str
);
87 utcLdapDate
.parse("19520512000000Z");