From e66620c52d2dd3de323d6c4630690af05c94afcd Mon Sep 17 00:00:00 2001 From: Ken Partlow Date: Wed, 14 Feb 2024 16:23:27 -0500 Subject: [PATCH] Added URL and URI --- .../cedarsoftware/util/convert/Converter.java | 13 +++- .../util/convert/MapConversions.java | 70 +++++++++++++++++++ .../util/convert/StringConversions.java | 24 +++++++ 3 files changed, 106 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cedarsoftware/util/convert/Converter.java b/src/main/java/com/cedarsoftware/util/convert/Converter.java index b4cea50f..811017a2 100644 --- a/src/main/java/com/cedarsoftware/util/convert/Converter.java +++ b/src/main/java/com/cedarsoftware/util/convert/Converter.java @@ -685,7 +685,18 @@ private static void buildFactoryConversions() { CONVERSION_DB.put(pair(Locale.class, String.class), LocaleConversions::toString); CONVERSION_DB.put(pair(URL.class, String.class), StringConversions::toString); CONVERSION_DB.put(pair(URI.class, String.class), StringConversions::toString); - + + // URL conversions + CONVERSION_DB.put(pair(Void.class, URL.class), VoidConversions::toNull); + CONVERSION_DB.put(pair(String.class, URL.class), StringConversions::toURL); + CONVERSION_DB.put(pair(Map.class, URL.class), MapConversions::toURL); + + // URI Conversions + CONVERSION_DB.put(pair(Void.class, URI.class), VoidConversions::toNull); + CONVERSION_DB.put(pair(String.class, URI.class), StringConversions::toURI); + CONVERSION_DB.put(pair(Map.class, URI.class), MapConversions::toURI); + + // Duration conversions supported CONVERSION_DB.put(pair(Void.class, Duration.class), VoidConversions::toNull); CONVERSION_DB.put(pair(Duration.class, Duration.class), Converter::identity); diff --git a/src/main/java/com/cedarsoftware/util/convert/MapConversions.java b/src/main/java/com/cedarsoftware/util/convert/MapConversions.java index 33bc577e..547081e8 100644 --- a/src/main/java/com/cedarsoftware/util/convert/MapConversions.java +++ b/src/main/java/com/cedarsoftware/util/convert/MapConversions.java @@ -2,6 +2,9 @@ import java.math.BigDecimal; import java.math.BigInteger; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; import java.sql.Timestamp; import java.time.Duration; import java.time.Instant; @@ -84,6 +87,13 @@ final class MapConversions { private static final String ID = "id"; public static final String LANGUAGE = "language"; public static final String VARIANT = "variant"; + public static final String JAR = "jar"; + public static final String AUTHORITY = "authority"; + public static final String REF = "ref"; + public static final String PORT = "port"; + public static final String FILE = "file"; + public static final String HOST = "host"; + public static final String PROTOCOL = "protocol"; private static String COUNTRY = "country"; private MapConversions() {} @@ -183,6 +193,18 @@ static Timestamp toTimestamp(Object from, Converter converter) { return fromValueForMultiKey(map, converter, Timestamp.class, TIMESTAMP_PARAMS); } + private static final String[] TIMEZONE_PARAMS = new String[] { ZONE }; + static TimeZone toTimeZone(Object from, Converter converter) { + Map map = (Map) from; + ConverterOptions options = converter.getOptions(); + + if (map.containsKey(ZONE)) { + return converter.convert(map.get(ZONE), TimeZone.class); + } else { + return fromValueForMultiKey(map, converter, TimeZone.class, TIMEZONE_PARAMS); + } + } + private static final String[] CALENDAR_PARAMS = new String[] { TIME, ZONE }; static Calendar toCalendar(Object from, Converter converter) { Map map = (Map) from; @@ -436,6 +458,54 @@ static Year toYear(Object from, Converter converter) { return fromSingleKey(from, converter, YEAR, Year.class); } + static URL toURL(Object from, Converter converter) { + Map map = (Map)from; + StringBuilder builder = new StringBuilder(20); + + try { + if (map.containsKey(VALUE) || map.containsKey(V)) { + return fromValue(map, converter, URL.class); + } + + String protocol = (String) map.get(PROTOCOL); + String host = (String) map.get(HOST); + String file = (String) map.get(FILE); + String authority = (String) map.get(AUTHORITY); + String ref = (String) map.get(REF); + Long port = (Long) map.get(PORT); + + builder.append(protocol); + builder.append(':'); + if (!protocol.equalsIgnoreCase(JAR)) { + builder.append("//"); + } + if (authority != null && !authority.isEmpty()) { + builder.append(authority); + } else { + if (host != null && !host.isEmpty()) { + builder.append(host); + } + if (!port.equals(-1L)) { + builder.append(":" + port); + } + } + if (file != null && !file.isEmpty()) { + builder.append(file); + } + if (ref != null && !ref.isEmpty()) { + builder.append("#" + ref); + } + return URI.create(builder.toString()).toURL(); + } catch (MalformedURLException e) { + throw new IllegalArgumentException("Cannot convert Map to URL. Malformed URL: '" + builder + "'"); + } + } + + static URI toURI(Object from, Converter converter) { + Map map = asMap(from); + return fromValue(map, converter, URI.class); + } + static Map initMap(Object from, Converter converter) { Map map = new CompactLinkedMap<>(); map.put(V, from); diff --git a/src/main/java/com/cedarsoftware/util/convert/StringConversions.java b/src/main/java/com/cedarsoftware/util/convert/StringConversions.java index d12545ca..5e134736 100644 --- a/src/main/java/com/cedarsoftware/util/convert/StringConversions.java +++ b/src/main/java/com/cedarsoftware/util/convert/StringConversions.java @@ -3,6 +3,9 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.math.RoundingMode; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.sql.Timestamp; @@ -241,6 +244,27 @@ static BigDecimal toBigDecimal(Object from, Converter converter) { } } + static URL toURL(Object from, Converter converter) { + String str = StringUtilities.trimToNull(asString(from)); + if (str == null) { + return null; + } + try { + URI uri = URI.create((String) from); + return uri.toURL(); + } catch (MalformedURLException mue) { + throw new IllegalArgumentException("Cannot convert String '" + str); + } + } + + static URI toURI(Object from, Converter converter) { + String str = StringUtilities.trimToNull(asString(from)); + if (str == null) { + return null; + } + return URI.create((String) from); + } + static String enumToString(Object from, Converter converter) { return ((Enum) from).name(); }