1 package org
.argeo
.util
.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
.format
.DateTimeParseException
;
13 import java
.time
.temporal
.ChronoField
;
14 import java
.util
.Calendar
;
15 import java
.util
.GregorianCalendar
;
16 import java
.util
.LinkedHashMap
;
17 import java
.util
.LinkedList
;
18 import java
.util
.List
;
21 public class NamingUtils
{
22 /** As per https://tools.ietf.org/html/rfc4517#section-3.3.13 */
23 private final static DateTimeFormatter utcLdapDate
= DateTimeFormatter
.ofPattern("uuuuMMddHHmmssX")
24 .withZone(ZoneOffset
.UTC
);
26 /** @return null if not parseable */
27 public static Instant
ldapDateToInstant(String ldapDate
) {
29 return OffsetDateTime
.parse(ldapDate
, utcLdapDate
).toInstant();
30 } catch (DateTimeParseException e
) {
35 /** @return null if not parseable */
36 public static ZonedDateTime
ldapDateToZonedDateTime(String ldapDate
) {
38 return OffsetDateTime
.parse(ldapDate
, utcLdapDate
).toZonedDateTime();
39 } catch (DateTimeParseException e
) {
44 public static Calendar
ldapDateToCalendar(String ldapDate
) {
45 OffsetDateTime instant
= OffsetDateTime
.parse(ldapDate
, utcLdapDate
);
46 GregorianCalendar calendar
= new GregorianCalendar();
47 calendar
.set(Calendar
.DAY_OF_MONTH
, instant
.get(ChronoField
.DAY_OF_MONTH
));
48 calendar
.set(Calendar
.MONTH
, instant
.get(ChronoField
.MONTH_OF_YEAR
));
49 calendar
.set(Calendar
.YEAR
, instant
.get(ChronoField
.YEAR
));
53 public static String
instantToLdapDate(ZonedDateTime instant
) {
54 return utcLdapDate
.format(instant
.withZoneSameInstant(ZoneOffset
.UTC
));
57 public static String
getQueryValue(Map
<String
, List
<String
>> query
, String key
) {
58 if (!query
.containsKey(key
))
60 List
<String
> val
= query
.get(key
);
64 throw new IllegalArgumentException("There are " + val
.size() + " value(s) for " + key
);
67 public static Map
<String
, List
<String
>> queryToMap(URI uri
) {
68 return queryToMap(uri
.getQuery());
71 private static Map
<String
, List
<String
>> queryToMap(String queryPart
) {
73 final Map
<String
, List
<String
>> query_pairs
= new LinkedHashMap
<String
, List
<String
>>();
74 if (queryPart
== null)
76 final String
[] pairs
= queryPart
.split("&");
77 for (String pair
: pairs
) {
78 final int idx
= pair
.indexOf("=");
79 final String key
= idx
> 0 ? URLDecoder
.decode(pair
.substring(0, idx
), StandardCharsets
.UTF_8
.name())
81 if (!query_pairs
.containsKey(key
)) {
82 query_pairs
.put(key
, new LinkedList
<String
>());
84 final String value
= idx
> 0 && pair
.length() > idx
+ 1
85 ? URLDecoder
.decode(pair
.substring(idx
+ 1), StandardCharsets
.UTF_8
.name())
87 query_pairs
.get(key
).add(value
);
90 } catch (UnsupportedEncodingException e
) {
91 throw new IllegalArgumentException("Cannot convert " + queryPart
+ " to map", e
);
95 private NamingUtils() {
99 public static void main(String args
[]) {
100 ZonedDateTime now
= ZonedDateTime
.now().withZoneSameInstant(ZoneOffset
.UTC
);
101 String str
= utcLdapDate
.format(now
);
102 System
.out
.println(str
);
103 utcLdapDate
.parse(str
);
104 utcLdapDate
.parse("19520512000000Z");