]> git.argeo.org Git - lgpl/argeo-commons.git/blob - NamingUtils.java
64fd65faa470aea8721334f0defef883fe9bd7e3
[lgpl/argeo-commons.git] / NamingUtils.java
1 package org.argeo.naming;
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.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;
18 import java.util.Map;
19
20 public class NamingUtils {
21 private final static DateTimeFormatter utcLdapDate = DateTimeFormatter.ofPattern("uuuuMMddHHmmssX")
22 .withZone(ZoneOffset.UTC);
23
24 public static Instant ldapDateToInstant(String ldapDate) {
25 return OffsetDateTime.parse(ldapDate, utcLdapDate).toInstant();
26 }
27
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));
34 return calendar;
35 }
36
37 public static String instantToLdapDate(ZonedDateTime instant) {
38 return utcLdapDate.format(instant.withZoneSameInstant(ZoneOffset.UTC));
39 }
40
41 public static String getQueryValue(Map<String, List<String>> query, String key) {
42 if (!query.containsKey(key))
43 return null;
44 List<String> val = query.get(key);
45 if (val.size() == 1)
46 return val.get(0);
47 else
48 throw new IllegalArgumentException("There are " + val.size() + " value(s) for " + key);
49 }
50
51 public static Map<String, List<String>> queryToMap(URI uri) {
52 return queryToMap(uri.getQuery());
53 }
54
55 private static Map<String, List<String>> queryToMap(String queryPart) {
56 try {
57 final Map<String, List<String>> query_pairs = new LinkedHashMap<String, List<String>>();
58 if (queryPart == null)
59 return query_pairs;
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())
64 : pair;
65 if (!query_pairs.containsKey(key)) {
66 query_pairs.put(key, new LinkedList<String>());
67 }
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);
71 }
72 return query_pairs;
73 } catch (UnsupportedEncodingException e) {
74 throw new IllegalArgumentException("Cannot convert " + queryPart + " to map", e);
75 }
76 }
77
78 private NamingUtils() {
79
80 }
81
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");
88 }
89 }