diff --git a/lib/src/main/java/rife/render/Abbreviate.java b/lib/src/main/java/rife/render/Abbreviate.java index 6944aa4..89f6991 100644 --- a/lib/src/main/java/rife/render/Abbreviate.java +++ b/lib/src/main/java/rife/render/Abbreviate.java @@ -20,10 +20,6 @@ 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.
* @@ -48,14 +44,9 @@ public class Abbreviate implements ValueRenderer { var max = -1; var defaultValue = template.getDefaultValue(valueId); if (defaultValue != null) { - 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 - } + var properties = RenderUtils.parsePropertiesString(defaultValue); + mark = properties.getProperty("mark", mark); + max = Integer.parseInt(properties.getProperty("max", String.valueOf(max))); } 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 50ac866..9a8bb63 100644 --- a/lib/src/main/java/rife/render/DateTimeIso.java +++ b/lib/src/main/java/rife/render/DateTimeIso.java @@ -20,11 +20,8 @@ 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.
@@ -48,16 +45,11 @@ public class DateTimeIso implements ValueRenderer { public String render(Template template, String valueId, String differentiator) { var defaultValue = template.getDefaultValue(valueId); if (defaultValue != null) { - 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 + 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)))); } } diff --git a/lib/src/main/java/rife/render/Mask.java b/lib/src/main/java/rife/render/Mask.java index a9c1e22..97647eb 100644 --- a/lib/src/main/java/rife/render/Mask.java +++ b/lib/src/main/java/rife/render/Mask.java @@ -20,10 +20,6 @@ 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.
* @@ -48,16 +44,15 @@ public class Mask implements ValueRenderer { var unmasked = 0; var fromStart = false; var defaultValue = template.getDefaultValue(valueId); - if (defaultValue != null) { - var properties = new Properties(); + if (defaultValue != null && !defaultValue.isBlank()) { + var properties = RenderUtils.parsePropertiesString(defaultValue); + mask = properties.getProperty("mask", mask); try { - properties.load(new StringReader(defaultValue)); - mask = properties.getProperty("mask", mask); unmasked = Integer.parseInt(properties.getProperty("unmasked", "0")); - fromStart = "true".equalsIgnoreCase(properties.getProperty("fromStart", "false")); - } catch (IOException | NumberFormatException ignore) { + } catch (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 3521992..2875e99 100644 --- a/lib/src/main/java/rife/render/QrCode.java +++ b/lib/src/main/java/rife/render/QrCode.java @@ -20,10 +20,6 @@ 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.
* @@ -44,17 +40,8 @@ public class QrCode implements ValueRenderer { */ @Override public String render(Template template, String valueId, String differentiator) { - 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 - } - } + var properties = RenderUtils.parsePropertiesString(template.getDefaultValue(valueId)); + var size = properties.getProperty("size", "150x150"); 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 197c97c..220c991 100644 --- a/lib/src/main/java/rife/render/RenderUtils.java +++ b/lib/src/main/java/rife/render/RenderUtils.java @@ -23,6 +23,7 @@ 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; @@ -32,6 +33,8 @@ 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. @@ -44,7 +47,6 @@ public final class RenderUtils { * The encoding property. */ public static final String ENCODING_PROPERTY = "encoding"; - /** * ISO 8601 date formatter. * @@ -82,6 +84,7 @@ 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 @@ -208,15 +211,26 @@ public final class RenderUtils { */ public static String fetchUrl(String url, String defaultContent) { try { - 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); + 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); } } - } catch (IOException ignore) { + } catch (MalformedURLException ignore) { // do nothing } return defaultContent; @@ -338,7 +352,7 @@ public final class RenderUtils { } /** - * Returns a new {@code Properties} containing the properties specified in the given {$String}. + * Returns a new {@code Properties} containing the properties specified in the given {@code 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 0353e6c..09ffc3e 100644 --- a/lib/src/main/java/rife/render/Uptime.java +++ b/lib/src/main/java/rife/render/Uptime.java @@ -20,10 +20,7 @@ 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. @@ -45,16 +42,7 @@ public class Uptime implements ValueRenderer { */ @Override public String render(Template template, String valueId, String differentiator) { - var properties = new Properties(); - var defaultValue = template.getDefaultValue(valueId); - if (defaultValue != null) { - try { - properties.load(new StringReader(defaultValue)); - } catch (IOException ignore) { - // ignore - } - } - + var properties = RenderUtils.parsePropertiesString(template.getDefaultValue(valueId)); String uptime; if (template.hasAttribute(Uptime.class.getName())) { uptime = RenderUtils.uptime((long) template.getAttribute(Uptime.class.getName()), properties);