Skip to content

Commit

Permalink
Merge pull request #68 from zalando/feature/currency-unit
Browse files Browse the repository at this point in the history
Re-added support for CurrencyUnit
  • Loading branch information
whiskeysierra committed Sep 20, 2017
2 parents 6731185 + 6d598af commit 093a278
Show file tree
Hide file tree
Showing 7 changed files with 120 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package org.zalando.jackson.datatype.money;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;

import javax.money.CurrencyUnit;
import javax.money.Monetary;
import java.io.IOException;

public final class CurrencyUnitDeserializer extends JsonDeserializer<CurrencyUnit> {

@Override
public Object deserializeWithType(final JsonParser parser, final DeserializationContext context,
final TypeDeserializer deserializer) throws IOException {

// effectively assuming no type information at all
return deserialize(parser, context);
}

@Override
public CurrencyUnit deserialize(final JsonParser parser, final DeserializationContext context) throws IOException {
final String currencyCode = parser.getValueAsString();
return Monetary.getCurrency(currencyCode);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.zalando.jackson.datatype.money;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import javax.money.CurrencyUnit;
import java.io.IOException;

public final class CurrencyUnitSerializer extends JsonSerializer<CurrencyUnit> {

@Override
public void serialize(final CurrencyUnit value, final JsonGenerator generator, final SerializerProvider serializers)
throws IOException {
generator.writeString(value.getCurrencyCode());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@

import javax.annotation.Nullable;
import javax.money.CurrencyUnit;
import javax.money.Monetary;
import javax.money.MonetaryAmount;
import javax.money.NumberValue;
import java.io.IOException;
Expand Down Expand Up @@ -52,7 +51,7 @@ public M deserialize(final JsonParser parser, final DeserializationContext conte
if (field.equals(names.getAmount())) {
amount = DefaultNumberValue.of(context.readValue(parser, BigDecimal.class));
} else if (field.equals(names.getCurrency())) {
currency = Monetary.getCurrency(parser.getValueAsString());
currency = context.readValue(parser, CurrencyUnit.class);
} else if (field.equals(names.getFormatted())) {
//noinspection UnnecessaryContinue
continue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public void serialize(final MonetaryAmount value, final JsonGenerator generator,
generator.writeStartObject();
{
generator.writeObjectField(names.getAmount(), writer.write(value));
generator.writeStringField(names.getCurrency(), currency.getCurrencyCode());
generator.writeObjectField(names.getCurrency(), currency);

if (formatted != null) {
generator.writeStringField(names.getFormatted(), formatted);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@
import org.javamoney.moneta.Money;
import org.javamoney.moneta.RoundedMoney;

import javax.money.CurrencyUnit;
import javax.money.Monetary;
import javax.money.MonetaryAmount;
import javax.money.MonetaryOperator;
import java.util.Currency;

public final class MoneyModule extends Module {

Expand Down Expand Up @@ -61,10 +63,12 @@ public Version version() {
@Override
public void setupModule(final SetupContext context) {
final SimpleSerializers serializers = new SimpleSerializers();
serializers.addSerializer(CurrencyUnit.class, new CurrencyUnitSerializer());
serializers.addSerializer(MonetaryAmount.class, new MonetaryAmountSerializer(names, writer, formatFactory));
context.addSerializers(serializers);

final SimpleDeserializers deserializers = new SimpleDeserializers();
deserializers.addDeserializer(CurrencyUnit.class, new CurrencyUnitDeserializer());
deserializers.addDeserializer(MonetaryAmount.class, new MonetaryAmountDeserializer<>(amountFactory, names));
// for reading into concrete implementation types
deserializers.addDeserializer(Money.class, new MonetaryAmountDeserializer<>(moneyFactory, names));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package org.zalando.jackson.datatype.money;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.javamoney.moneta.CurrencyUnitBuilder;
import org.junit.Test;

import javax.money.CurrencyUnit;
import javax.money.UnknownCurrencyException;
import java.io.IOException;

import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;

public final class CurrencyUnitDeserializerTest {

private final ObjectMapper unit = new ObjectMapper().findAndRegisterModules();

@Test
public void shouldDeserialize() throws IOException {
final CurrencyUnit actual = unit.readValue("\"EUR\"", CurrencyUnit.class);
final CurrencyUnit expected = CurrencyUnitBuilder.of("EUR", "default").build();

assertThat(actual, is(expected));
}

@Test(expected = UnknownCurrencyException.class)
public void shouldNotDeserializeInvalidCurrency() throws IOException {
unit.readValue("\"FOO\"", CurrencyUnit.class);
}

@Test
public void shouldDeserializeWithTyping() throws IOException {
unit.enableDefaultTyping();

final CurrencyUnit actual = unit.readValue("\"EUR\"", CurrencyUnit.class);
final CurrencyUnit expected = CurrencyUnitBuilder.of("EUR", "default").build();

assertThat(actual, is(expected));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.zalando.jackson.datatype.money;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.javamoney.moneta.CurrencyUnitBuilder;
import org.junit.Test;

import javax.money.CurrencyUnit;

import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;

public final class CurrencyUnitSerializerTest {

private final ObjectMapper unit = new ObjectMapper().findAndRegisterModules();

@Test
public void shouldSerialize() throws JsonProcessingException {
final String expected = "EUR";
final CurrencyUnit currency = CurrencyUnitBuilder.of(expected, "default").build();

final String actual = unit.writeValueAsString(currency);

assertThat(actual, is('"' + expected + '"'));
}

}

0 comments on commit 093a278

Please sign in to comment.