package edu.harvard.iq.dataverse.api; import java.io.StringReader; import java.text.SimpleDateFormat; import java.util.Set; import java.util.TimeZone; import java.util.TreeSet; import javax.json.Json; import javax.json.JsonArray; import javax.json.JsonReader; public class Util { static final Set<String> VALID_BOOLEAN_VALUES; static final Set<String> BOOLEAN_TRUE_VALUES; static { BOOLEAN_TRUE_VALUES = new TreeSet<>(); BOOLEAN_TRUE_VALUES.add("true"); BOOLEAN_TRUE_VALUES.add("yes"); BOOLEAN_TRUE_VALUES.add("1"); VALID_BOOLEAN_VALUES = new TreeSet<>(); VALID_BOOLEAN_VALUES.addAll(BOOLEAN_TRUE_VALUES ); VALID_BOOLEAN_VALUES.add("no"); VALID_BOOLEAN_VALUES.add("false"); VALID_BOOLEAN_VALUES.add("0"); } static JsonArray asJsonArray( String str ) { try ( JsonReader rdr = Json.createReader(new StringReader(str)) ) { return rdr.readArray(); } } static boolean isBoolean( String s ) { return VALID_BOOLEAN_VALUES.contains(s.toLowerCase()); } static boolean isTrue( String s ) { return BOOLEAN_TRUE_VALUES.contains(s.toLowerCase()); } static boolean isNumeric( String s ) { for ( char c : s.toCharArray() ) { if ( ! Character.isDigit(c) ) return false; } return true; } /** * @param date The Date object to convert. * @return A ISO 8601 date/time with UTC time zone (i.e. * 2015-01-23T19:51:50Z) or null. * * <p> * * "Law #1: Use ISO-8601 for your dates" * http://apiux.com/2013/03/20/5-laws-api-dates-and-times/ * * <p> * "All timestamps are returned in ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ" * https://developer.github.com/v3/#schema * * <p> * * "Law #4: Return it in UTC" * http://apiux.com/2013/03/20/5-laws-api-dates-and-times/ * */ private static final String DATE_TIME_FORMAT_STRING = "yyyy-MM-dd'T'HH:mm:ss'Z'"; private static final String DATE_FORMAT_STRING = "yyyy-MM-dd"; private static final ThreadLocal<SimpleDateFormat> DATETIME_FORMAT_TL = new ThreadLocal<SimpleDateFormat>(){ @Override protected SimpleDateFormat initialValue() { SimpleDateFormat format = new SimpleDateFormat(DATE_TIME_FORMAT_STRING); format.setTimeZone(TimeZone.getTimeZone("UTC")); return format; } }; private static final ThreadLocal<SimpleDateFormat> DATE_FORMAT_TL = new ThreadLocal<SimpleDateFormat>(){ @Override protected SimpleDateFormat initialValue() { SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT_STRING); format.setTimeZone(TimeZone.getTimeZone("UTC")); return format; } }; /** * Note: SimpleDateFormat is not thread-safe! Never retain the format returned by this method in a field. * @return The standard API format for date-and-time. */ public static SimpleDateFormat getDateTimeFormat() { return DATETIME_FORMAT_TL.get(); } /** * Note: SimpleDateFormat is not thread-safe! Never retain the format returned by this method in a field. * @return The standard API format for dates. */ public static SimpleDateFormat getDateFormat() { return DATE_FORMAT_TL.get(); } }