From d6dd8be662c7d8924b0d66f3014677ca18d0a837 Mon Sep 17 00:00:00 2001 From: Patrick Gotthard Date: Wed, 29 Dec 2021 23:31:54 +0100 Subject: [PATCH] Enhance currency and price representation in MediaModule (#508) Closes #372 --- .../mediarss/io/MediaModuleParser.java | 25 ++++++++++++++++--- .../modules/mediarss/types/Price.java | 14 ++++++----- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/rome-modules/src/main/java/com/rometools/modules/mediarss/io/MediaModuleParser.java b/rome-modules/src/main/java/com/rometools/modules/mediarss/io/MediaModuleParser.java index d862f3276..9d4a51136 100644 --- a/rome-modules/src/main/java/com/rometools/modules/mediarss/io/MediaModuleParser.java +++ b/rome-modules/src/main/java/com/rometools/modules/mediarss/io/MediaModuleParser.java @@ -26,11 +26,12 @@ import java.net.URI; import java.net.URL; import java.util.ArrayList; +import java.util.Currency; import java.util.List; import java.util.Locale; +import java.util.StringTokenizer; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.StringTokenizer; import org.jdom2.Element; import org.jdom2.Namespace; @@ -464,10 +465,28 @@ private void parsePrices(final Element e, final Metadata md) { final List priceElements = e.getChildren("price", getNS()); final Price[] prices = new Price[priceElements.size()]; for (int i = 0; i < priceElements.size(); i++) { + final Element priceElement = priceElements.get(i); prices[i] = new Price(); - prices[i].setCurrency(priceElement.getAttributeValue("currency")); - prices[i].setPrice(Doubles.parse(priceElement.getAttributeValue("price"))); + + final String currency = priceElement.getAttributeValue("currency"); + if (currency != null) { + try { + prices[i].setCurrency(Currency.getInstance(currency)); + } catch (IllegalArgumentException ex) { + LOG.warn("Invalid currency", ex); + } + } + + final String price = priceElement.getAttributeValue("price"); + if (price != null) { + try { + prices[i].setPrice(new BigDecimal(price)); + } catch (NumberFormatException ex) { + LOG.warn("Invalid price", ex); + } + } + if (priceElement.getAttributeValue("type") != null) { prices[i].setType(Price.Type.valueOf(priceElement.getAttributeValue("type").toUpperCase())); } diff --git a/rome-modules/src/main/java/com/rometools/modules/mediarss/types/Price.java b/rome-modules/src/main/java/com/rometools/modules/mediarss/types/Price.java index b8e046edd..9a98d9bcd 100644 --- a/rome-modules/src/main/java/com/rometools/modules/mediarss/types/Price.java +++ b/rome-modules/src/main/java/com/rometools/modules/mediarss/types/Price.java @@ -20,7 +20,9 @@ package com.rometools.modules.mediarss.types; import java.io.Serializable; +import java.math.BigDecimal; import java.net.URL; +import java.util.Currency; /** * Optional tag to include pricing information about a media object. @@ -40,8 +42,8 @@ public enum Type { } private Type type; - private Double price; - private String currency; + private BigDecimal price; + private Currency currency; private URL info; /** @@ -69,7 +71,7 @@ public void setType(final Type type) { * * @return the price */ - public Double getPrice() { + public BigDecimal getPrice() { return price; } @@ -80,7 +82,7 @@ public Double getPrice() { * * @param price the price */ - public void setPrice(final Double price) { + public void setPrice(final BigDecimal price) { this.price = price; } @@ -89,7 +91,7 @@ public void setPrice(final Double price) { * * @return ISO 4217 currency code */ - public String getCurrency() { + public Currency getCurrency() { return currency; } @@ -98,7 +100,7 @@ public String getCurrency() { * * @param currency ISO 4217 currency code */ - public void setCurrency(final String currency) { + public void setCurrency(final Currency currency) { this.currency = currency; }