diff --git a/lib/src/main/java/rife/render/Abbreviate.java b/lib/src/main/java/rife/render/Abbreviate.java index 89f6991..6944aa4 100644 --- a/lib/src/main/java/rife/render/Abbreviate.java +++ b/lib/src/main/java/rife/render/Abbreviate.java @@ -20,6 +20,10 @@ package rife.render; import rife.template.Template; import rife.template.ValueRenderer; +import java.io.IOException; +import java.io.StringReader; +import java.util.Properties; + /** *

Abbreviate a template value with ellipses.

* @@ -44,9 +48,14 @@ public class Abbreviate implements ValueRenderer { var max = -1; var defaultValue = template.getDefaultValue(valueId); if (defaultValue != null) { - var properties = RenderUtils.parsePropertiesString(defaultValue); - mark = properties.getProperty("mark", mark); - max = Integer.parseInt(properties.getProperty("max", String.valueOf(max))); + var properties = new Properties(); + try { + properties.load(new StringReader(defaultValue)); + mark = properties.getProperty("mark", mark); + max = Integer.parseInt(properties.getProperty("max", String.valueOf(max))); + } catch (IOException | NumberFormatException ignore) { + // do nothing + } } return template.getEncoder().encode( diff --git a/lib/src/main/java/rife/render/DateTimeIso.java b/lib/src/main/java/rife/render/DateTimeIso.java index 9a8bb63..50ac866 100644 --- a/lib/src/main/java/rife/render/DateTimeIso.java +++ b/lib/src/main/java/rife/render/DateTimeIso.java @@ -20,8 +20,11 @@ package rife.render; import rife.template.Template; import rife.template.ValueRenderer; +import java.io.IOException; +import java.io.StringReader; import java.time.ZoneId; import java.time.ZonedDateTime; +import java.util.Properties; /** *

Return the current date and time in ISO 8601 format.

@@ -45,11 +48,16 @@ public class DateTimeIso implements ValueRenderer { public String render(Template template, String valueId, String differentiator) { var defaultValue = template.getDefaultValue(valueId); if (defaultValue != null) { - var properties = RenderUtils.parsePropertiesString(template.getDefaultValue(valueId)); - var tz = "tz"; - if (properties.containsKey(tz)) { - return ZonedDateTime.now().format( - RenderUtils.ISO_8601_FORMATTER.withZone(ZoneId.of(properties.getProperty(tz)))); + var properties = new Properties(); + try { + var tz = "tz"; + properties.load(new StringReader(defaultValue)); + if (properties.containsKey(tz)) { + return ZonedDateTime.now().format( + RenderUtils.ISO_8601_FORMATTER.withZone(ZoneId.of(properties.getProperty(tz)))); + } + } catch (IOException ignore) { + // do nothing } } diff --git a/lib/src/main/java/rife/render/Mask.java b/lib/src/main/java/rife/render/Mask.java index 97647eb..a9c1e22 100644 --- a/lib/src/main/java/rife/render/Mask.java +++ b/lib/src/main/java/rife/render/Mask.java @@ -20,6 +20,10 @@ package rife.render; import rife.template.Template; import rife.template.ValueRenderer; +import java.io.IOException; +import java.io.StringReader; +import java.util.Properties; + /** *

Masks characters of a template value.

* @@ -44,15 +48,16 @@ public class Mask implements ValueRenderer { var unmasked = 0; var fromStart = false; var defaultValue = template.getDefaultValue(valueId); - if (defaultValue != null && !defaultValue.isBlank()) { - var properties = RenderUtils.parsePropertiesString(defaultValue); - mask = properties.getProperty("mask", mask); + if (defaultValue != null) { + var properties = new Properties(); try { + properties.load(new StringReader(defaultValue)); + mask = properties.getProperty("mask", mask); unmasked = Integer.parseInt(properties.getProperty("unmasked", "0")); - } catch (NumberFormatException ignore) { + fromStart = "true".equalsIgnoreCase(properties.getProperty("fromStart", "false")); + } catch (IOException | NumberFormatException ignore) { // do nothing } - fromStart = "true".equalsIgnoreCase(properties.getProperty("fromStart", "false")); } return template.getEncoder().encode( RenderUtils.mask(template.getValueOrAttribute(differentiator), mask, unmasked, fromStart)); diff --git a/lib/src/main/java/rife/render/QrCode.java b/lib/src/main/java/rife/render/QrCode.java index 2875e99..3521992 100644 --- a/lib/src/main/java/rife/render/QrCode.java +++ b/lib/src/main/java/rife/render/QrCode.java @@ -20,6 +20,10 @@ package rife.render; import rife.template.Template; import rife.template.ValueRenderer; +import java.io.IOException; +import java.io.StringReader; +import java.util.Properties; + /** *

Generates an SVG QR Code for a template value using goQR.me.

* @@ -40,8 +44,17 @@ public class QrCode implements ValueRenderer { */ @Override public String render(Template template, String valueId, String differentiator) { - var properties = RenderUtils.parsePropertiesString(template.getDefaultValue(valueId)); - var size = properties.getProperty("size", "150x150"); + var size = "150x150"; + var defaultValue = template.getDefaultValue(valueId); + if (defaultValue != null) { + var properties = new Properties(); + try { + properties.load(new StringReader(defaultValue)); + size = properties.getProperty("size", size); + } catch (IOException ignore) { + // do nothing + } + } return RenderUtils.qrCode(template.getValueOrAttribute(differentiator), size); } } diff --git a/lib/src/main/java/rife/render/RenderUtils.java b/lib/src/main/java/rife/render/RenderUtils.java index 220c991..197c97c 100644 --- a/lib/src/main/java/rife/render/RenderUtils.java +++ b/lib/src/main/java/rife/render/RenderUtils.java @@ -23,7 +23,6 @@ import rife.tools.StringUtils; import java.io.IOException; import java.io.StringReader; import java.net.HttpURLConnection; -import java.net.MalformedURLException; import java.net.URL; import java.nio.charset.StandardCharsets; import java.text.Normalizer; @@ -33,8 +32,6 @@ import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoField; import java.util.Properties; import java.util.concurrent.TimeUnit; -import java.util.logging.Level; -import java.util.logging.Logger; /** * Collection of utility-type methods commonly used by the renderers. @@ -47,6 +44,7 @@ public final class RenderUtils { * The encoding property. */ public static final String ENCODING_PROPERTY = "encoding"; + /** * ISO 8601 date formatter. * @@ -84,7 +82,6 @@ public final class RenderUtils { DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss zzz").withLocale(Localization.getLocale()); private static final String DEFAULT_USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0"; - private final static Logger LOGGER = Logger.getLogger(RenderUtils.class.getName()); private RenderUtils() { // no-op @@ -211,26 +208,15 @@ public final class RenderUtils { */ public static String fetchUrl(String url, String defaultContent) { try { - var fetchUrl = new URL(url); - try { - var connection = (HttpURLConnection) fetchUrl.openConnection(); - connection.setRequestProperty("User-Agent", DEFAULT_USER_AGENT); - var code = connection.getResponseCode(); - if (code >= 200 && code <= 399) { - try (var inputStream = connection.getInputStream()) { - return new String(inputStream.readAllBytes(), StandardCharsets.UTF_8); - } - } else { - if (LOGGER.isLoggable(Level.WARNING)) { - LOGGER.warning("A " + code + " status code was returned by " + fetchUrl.getHost()); - } - } - } catch (IOException ioe) { - if (LOGGER.isLoggable(Level.WARNING)) { - LOGGER.log(Level.WARNING, "An IO error occurred while connecting to " + fetchUrl.getHost(), ioe); + var connection = (HttpURLConnection) new URL(url).openConnection(); + connection.setRequestProperty("User-Agent", DEFAULT_USER_AGENT); + var code = connection.getResponseCode(); + if (code >= 200 && code <= 399) { + try (var inputStream = connection.getInputStream()) { + return new String(inputStream.readAllBytes(), StandardCharsets.UTF_8); } } - } catch (MalformedURLException ignore) { + } catch (IOException ignore) { // do nothing } return defaultContent; @@ -352,7 +338,7 @@ public final class RenderUtils { } /** - * Returns a new {@code Properties} containing the properties specified in the given {@code String}. + * Returns a new {@code Properties} containing the properties specified in the given {$String}. * * @param src the {@code} String containing the properties * @return the new {@code Properties} diff --git a/lib/src/main/java/rife/render/Uptime.java b/lib/src/main/java/rife/render/Uptime.java index 09ffc3e..0353e6c 100644 --- a/lib/src/main/java/rife/render/Uptime.java +++ b/lib/src/main/java/rife/render/Uptime.java @@ -20,7 +20,10 @@ package rife.render; import rife.template.Template; import rife.template.ValueRenderer; +import java.io.IOException; +import java.io.StringReader; import java.lang.management.ManagementFactory; +import java.util.Properties; /** * Renders the server uptime. @@ -42,7 +45,16 @@ public class Uptime implements ValueRenderer { */ @Override public String render(Template template, String valueId, String differentiator) { - var properties = RenderUtils.parsePropertiesString(template.getDefaultValue(valueId)); + var properties = new Properties(); + var defaultValue = template.getDefaultValue(valueId); + if (defaultValue != null) { + try { + properties.load(new StringReader(defaultValue)); + } catch (IOException ignore) { + // ignore + } + } + String uptime; if (template.hasAttribute(Uptime.class.getName())) { uptime = RenderUtils.uptime((long) template.getAttribute(Uptime.class.getName()), properties);