Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Re-added support for CurrencyUnit #68

Merged
merged 1 commit into from
Sep 20, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
@@ -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);
}

}
@@ -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());
}

}
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
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
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
@@ -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));
}

}
@@ -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 + '"'));
}

}