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

Move jackson-datatype-money module from zalando #48

Open
wants to merge 1 commit into
base: 2.19
Choose a base branch
from

Conversation

sri-adarsh-kumar
Copy link

@sri-adarsh-kumar sri-adarsh-kumar commented Oct 18, 2024

Moves jackson-datatype-money module from zalando

Context

Related to #5 and zalando/jackson-datatype-money#224

From the above conversations, there is a consensus to move the zalando/jackson-datatype-money library as a sub-module of this repository.

In order to achieve this, I have moved the files almost 1:1 from the source repository.

Only major changes were related to tests. The source repo had Junit Jupiter tests with @ParameterizedTest. The destination library already had other tests using junitParams.Parameters, so this was adopted.

Review Suggestions

Please focus on

  • How to use correct License
  • How to attribute credits correctly
  • Package naming conventions

@@ -0,0 +1,23 @@
TODO What goes here? (This original one or another?)
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Need some support with the License information

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If this code happened to be licensed under Apache License 2, we could just use modified version of other modules' LICENSE, like:

This copy of Jackson Jakarta JSONP extension module is licensed under the
Apache (Software) License, version 2.0 ("the License").
See the License for details about distribution rights, and the
specific rights regarding derivative works.

You may obtain a copy of the License at:

http://www.apache.org/licenses/LICENSE-2.0```

But as long as we know what the license used is (we can't change it), should modify above to refer to whatever license there is.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That is: we have to use the original license -- unless we have original author(s) permission to use some other license.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok so its MIT License instead. So... I guess we could just include full license like so, given it's copyright by Zalando. No changes needed.

But we do need to make sure <license> tag in pom.xml has MIT license (we might have parent pom defaulting to Apache 2)

@@ -0,0 +1,13 @@
//TODO how is this generated
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure how this file is generated.
Is there some documentation for this?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it would be running

../mvnw moditect:generate-module-info

from new modules project dir. Let me try this on PR.

This provides the base, but must be modified; looking at other modules's module-info.java for inspiration.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmmh. Alas, that command throws NPE.

on-behalf-of: Zalando OSS Community
Co-authored-by: Willi Schönborn <[email protected]>
Co-authored-by: Philipp Hirch <[email protected]>
Co-authored-by: Jörn Horstmann <[email protected]>
Co-authored-by: Lauri at Zalando <[email protected]>
Co-authored-by: msparer <[email protected]>
Co-authored-by: Alexander Yastrebov <[email protected]>
Co-authored-by: Alexey Venderov <[email protected]>
Co-authored-by: Alexander Yastrebov <[email protected]>
Co-authored-by: Arnaud BOIVIN <[email protected]>
Co-authored-by: Bartosz Ocytko <[email protected]>
Co-authored-by: Carlos Freund <[email protected]>
Co-authored-by: Dario Seidl <[email protected]>
Co-authored-by: Georgios Andrianakis <[email protected]>
Co-authored-by: Lauri at Zalando <[email protected]>
Co-authored-by: Martin Prebio <[email protected]>
Co-authored-by: Sean Sullivan <[email protected]>
Co-authored-by: Touko Vainio-Kaila <[email protected]>
Co-authored-by: lukasniemeier-zalando <[email protected]>
@sri-adarsh-kumar
Copy link
Author

@cowtowncoder Please review when you have time.

</description>
<url>https://github.com/FasterXML/jackson-datatypes-misc</url>
<licenses>
<license>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Assuming MIT License as per notes further down, this needs to be changed.

<name>Jackson datatype: javax-money</name>
<packaging>jar</packaging>
<version>2.19.0-SNAPSHOT</version>
<description>Support for datatypes of Javax Money library (https://javamoney.github.io/)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe also mention Money API spec is from JSR 354 (can link to https://javamoney.github.io/api.html I suppose)


public final class CurrencyUnitDeserializerTest {

private final ObjectMapper unit = new ObjectMapper().findAndRegisterModules();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is wrong: should specifically add just Money module and not whatever might happen to be in classpath. Ideally would use helper method in test base class or utility/helper class


import static org.assertj.core.api.Assertions.assertThat;

public final class CurrencyUnitSchemaSerializerTest {
Copy link
Member

@cowtowncoder cowtowncoder Oct 25, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need to remove or rewrite this test: it must NOT include cross-module dependency for tests because this now introduces a build/release dependency between modules.

There are ways to test schema-generation aspects (to ensure that correct schema traversal methods are called), I'd need to find examples.
Well, jackson-databind has couple of tests under src/test/java/com/fasterxml/jackson/databind/jsonschema/which might be helpful.


final String content = "{\"amount\":29.95}";

final JsonProcessingException exception = assertThrows(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While technically correct, use of JsonProcessingException is not optimal as we should check specific subtype that is being thrown, JPE is the most generic Jackson exception base class.


<dependency>
<groupId>org.javamoney.moneta</groupId>
<artifactId>moneta-core</artifactId>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this test-only dependency? Or does module require specific Money API implementation?

import static org.apiguardian.api.API.Status.MAINTAINED;

@API(status = MAINTAINED)
public final class CurrencyUnitDeserializer extends JsonDeserializer<CurrencyUnit> {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Usually should extend either StdDeserializer or (if applicable) StdScalarDeserializer.

import static org.apiguardian.api.API.Status.MAINTAINED;

@API(status = MAINTAINED)
public final class CurrencyUnitSerializer extends StdSerializer<CurrencyUnit> {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Possibly should use StdScalarSerializer.

<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As per my earlier note, cannot have this dependency -- adds unwanted cross-module dependency for builds, release process.

<scope>test</scope>
</dependency>
<dependency>
<groupId>com.kjetland</groupId>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This dependency OTOH is fine (as it's not part of Jackson module set -- and even if it had transitive dependencies to some Jackson components that'd be ok as it wouldn't complicate build/release process)

}

@Override
public Object deserializeWithType(final JsonParser parser, final DeserializationContext context,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If extending StdDeserializer (or, StdScaralDeserializer), wouldn't need to implement this method, I think.

private void checkPresent(final JsonParser parser, @Nullable final Object value, final String name)
throws JsonParseException {
if (value == null) {
throw new JsonParseException(parser, format("Missing property: '%s'", name));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sub-optimal exception as it does not indicate value type that has the issue.
Should usually be passed DeserializationContext and call one of methods it provides for throwing more specific (semantic) exceptions.

public void serializeWithType(final MonetaryAmount value, final JsonGenerator generator,
final SerializerProvider provider, final TypeSerializer serializer) throws IOException {

// effectively assuming no type information at all
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

... which is basically wrong :-(

(meaning, won't work with @JsonTypeInfo)


@Override
@SuppressWarnings("deprecation")
public Version version() {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is unnecessarily using VersionUtil instead of referencing generated PackageVersion and doing

public Version version() {
    return PackageVersion.VERSION;
}

@cowtowncoder
Copy link
Member

@sri-adarsh-kumar Ok, so technically I think this looks ok (although I have suggestions and concerns wrt code actually).
But one question I have is whether we need someone else's approval for contribution -- or are you the author? (I understand you work for Zalando from profile?).

I think we need one or more CLAs (from https://github.com/FasterXML/jackson/ either individual or Corporate CLA):

  1. From you (wrt directly adding files here), regardless of authorship of code
  2. Additional CLA(s) from whoever can contribute code itself (if not you).

It might be simplest to get CCLA from Zalando, although that is not a requirement if authors can give individual CLAs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants