X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.enterprise%2Fsrc%2Forg%2Fargeo%2Fnaming%2FNamingUtils.java;h=5a868ddb42b885afbad49925c247407ff3907182;hb=f9efbe5228615951dd8482a4582aa24e00c10ce5;hp=fc505022fee0f6ac646dd5f215f4fe8f16a7d5ca;hpb=d2057396fab26e7b94e9d479d8429e0ed2487067;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.enterprise/src/org/argeo/naming/NamingUtils.java b/org.argeo.enterprise/src/org/argeo/naming/NamingUtils.java index fc505022f..5a868ddb4 100644 --- a/org.argeo.enterprise/src/org/argeo/naming/NamingUtils.java +++ b/org.argeo.enterprise/src/org/argeo/naming/NamingUtils.java @@ -4,19 +4,54 @@ import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; +import java.time.Instant; 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 { - private final static DateTimeFormatter ldapDateTimeFormatter = DateTimeFormatter - .ofPattern("uuuuMMddHHmmss[,S][.S]X"); + /** As per https://tools.ietf.org/html/rfc4517#section-3.3.13 */ + private final static DateTimeFormatter utcLdapDate = DateTimeFormatter.ofPattern("uuuuMMddHHmmssX") + .withZone(ZoneOffset.UTC); - public static OffsetDateTime ldapDateToInstant(String ldapDate) { - return OffsetDateTime.parse(ldapDate, ldapDateTimeFormatter); + /** @return null if not parseable */ + public static Instant ldapDateToInstant(String ldapDate) { + 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) { + return utcLdapDate.format(instant.withZoneSameInstant(ZoneOffset.UTC)); } public static String getQueryValue(Map> query, String key) { @@ -47,7 +82,8 @@ public class NamingUtils { query_pairs.put(key, new LinkedList()); } 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; @@ -59,4 +95,12 @@ public class NamingUtils { private 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); + utcLdapDate.parse("19520512000000Z"); + } }