Improve tokens
[lgpl/argeo-commons.git] / org.argeo.enterprise / src / org / argeo / naming / NamingUtils.java
index 0b74ee18c4f4521ad4ceb48994594665fecbd9b6..5a868ddb42b885afbad49925c247407ff3907182 100644 (file)
@@ -9,17 +9,45 @@ import java.time.OffsetDateTime;
 import java.time.ZoneOffset;
 import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.time.temporal.ChronoField;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
 public class NamingUtils {
+       /** As per https://tools.ietf.org/html/rfc4517#section-3.3.13 */
        private final static DateTimeFormatter utcLdapDate = DateTimeFormatter.ofPattern("uuuuMMddHHmmssX")
                        .withZone(ZoneOffset.UTC);
 
+       /** @return null if not parseable */
        public static Instant ldapDateToInstant(String ldapDate) {
-               return OffsetDateTime.parse(ldapDate, utcLdapDate).toInstant();
+               try {
+                       return OffsetDateTime.parse(ldapDate, utcLdapDate).toInstant();
+               } catch (DateTimeParseException e) {
+                       return null;
+               }
+       }
+
+       /** @return null if not parseable */
+       public static ZonedDateTime ldapDateToZonedDateTime(String ldapDate) {
+               try {
+                       return OffsetDateTime.parse(ldapDate, utcLdapDate).toZonedDateTime();
+               } catch (DateTimeParseException e) {
+                       return null;
+               }
+       }
+
+       public static Calendar ldapDateToCalendar(String ldapDate) {
+               OffsetDateTime instant = OffsetDateTime.parse(ldapDate, utcLdapDate);
+               GregorianCalendar calendar = new GregorianCalendar();
+               calendar.set(Calendar.DAY_OF_MONTH, instant.get(ChronoField.DAY_OF_MONTH));
+               calendar.set(Calendar.MONTH, instant.get(ChronoField.MONTH_OF_YEAR));
+               calendar.set(Calendar.YEAR, instant.get(ChronoField.YEAR));
+               return calendar;
        }
 
        public static String instantToLdapDate(ZonedDateTime instant) {
@@ -54,7 +82,8 @@ public class NamingUtils {
                                        query_pairs.put(key, new LinkedList<String>());
                                }
                                final String value = idx > 0 && pair.length() > idx + 1
-                                               ? URLDecoder.decode(pair.substring(idx + 1), StandardCharsets.UTF_8.name()) : null;
+                                               ? URLDecoder.decode(pair.substring(idx + 1), StandardCharsets.UTF_8.name())
+                                               : null;
                                query_pairs.get(key).add(value);
                        }
                        return query_pairs;
@@ -67,10 +96,11 @@ public class NamingUtils {
 
        }
 
-//     public static void main(String args[]) {
-//             ZonedDateTime now = ZonedDateTime.now().withZoneSameInstant(ZoneOffset.UTC);
-//             String str = utcLdapDate.format(now);
-//             System.out.println(str);
-//             utcLdapDate.parse(str);
-//     }
+       public static void main(String args[]) {
+               ZonedDateTime now = ZonedDateTime.now().withZoneSameInstant(ZoneOffset.UTC);
+               String str = utcLdapDate.format(now);
+               System.out.println(str);
+               utcLdapDate.parse(str);
+               utcLdapDate.parse("19520512000000Z");
+       }
 }