From 78012d0b41ba359a64b090df12b985abce3bdc90 Mon Sep 17 00:00:00 2001 From: Ramasai Venkatsitarambhaskar Tadepalli Date: Sun, 4 Feb 2024 22:26:41 -0500 Subject: [PATCH 1/4] JAVA-5319: Allow Decoding Data Into `TreeSet` --- .../org/bson/codecs/pojo/CollectionPropertyCodecProvider.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/bson/src/main/org/bson/codecs/pojo/CollectionPropertyCodecProvider.java b/bson/src/main/org/bson/codecs/pojo/CollectionPropertyCodecProvider.java index 09f04980226..abf5add374c 100644 --- a/bson/src/main/org/bson/codecs/pojo/CollectionPropertyCodecProvider.java +++ b/bson/src/main/org/bson/codecs/pojo/CollectionPropertyCodecProvider.java @@ -15,6 +15,8 @@ */ package org.bson.codecs.pojo; +import java.util.TreeSet; + import org.bson.BsonReader; import org.bson.BsonType; import org.bson.BsonWriter; @@ -89,6 +91,8 @@ private Collection getInstance() { return new ArrayList<>(); } else if (encoderClass.isAssignableFrom(HashSet.class)) { return new HashSet<>(); + } else if (encoderClass.isAssignableFrom(TreeSet.class)) { + return new TreeSet<>(); } else { throw new CodecConfigurationException(format("Unsupported Collection interface of %s!", encoderClass.getName())); } From 8972167e16de11078ce5ad483f0a82aea452e673 Mon Sep 17 00:00:00 2001 From: Ramasai Venkatsitarambhaskar Tadepalli Date: Mon, 5 Feb 2024 11:01:17 -0500 Subject: [PATCH 2/4] Modify POJO round trip test after adding SortedSet --- .../bson/codecs/pojo/PojoRoundTripTest.java | 3 ++ .../org/bson/codecs/pojo/PojoTestCase.java | 11 ++++-- .../entities/CollectionNestedPojoModel.java | 36 ++++++++++++++++++- .../codecs/pojo/entities/SimpleModel.java | 8 ++++- 4 files changed, 54 insertions(+), 4 deletions(-) diff --git a/bson/src/test/unit/org/bson/codecs/pojo/PojoRoundTripTest.java b/bson/src/test/unit/org/bson/codecs/pojo/PojoRoundTripTest.java index 42ad410c884..345365819c6 100644 --- a/bson/src/test/unit/org/bson/codecs/pojo/PojoRoundTripTest.java +++ b/bson/src/test/unit/org/bson/codecs/pojo/PojoRoundTripTest.java @@ -230,6 +230,8 @@ private static List testCases() { + "'listListSimple': [[" + SIMPLE_MODEL_JSON + "]]," + "'setSimple': [" + SIMPLE_MODEL_JSON + "]," + "'setSetSimple': [[" + SIMPLE_MODEL_JSON + "]]," + + "'sortedSetSimple': [" + SIMPLE_MODEL_JSON + "]," + + "'setSortedSetSimple': [[" + SIMPLE_MODEL_JSON + "]]," + "'mapSimple': {'s': " + SIMPLE_MODEL_JSON + "}," + "'mapMapSimple': {'ms': {'s': " + SIMPLE_MODEL_JSON + "}}," + "'mapListSimple': {'ls': [" + SIMPLE_MODEL_JSON + "]}," @@ -244,6 +246,7 @@ private static List testCases() { getPojoCodecProviderBuilder(CollectionNestedPojoModel.class, SimpleModel.class), "{ 'listListSimple': [ null ]," + "'setSetSimple': [ null ]," + + "'sortedSetSimple': [ null ]," + "'mapMapSimple': {'ms': null}," + "'mapListSimple': {'ls': null}," + "'mapListMapSimple': {'lm': [null]}," diff --git a/bson/src/test/unit/org/bson/codecs/pojo/PojoTestCase.java b/bson/src/test/unit/org/bson/codecs/pojo/PojoTestCase.java index 9b3be471db1..2c0b322b132 100644 --- a/bson/src/test/unit/org/bson/codecs/pojo/PojoTestCase.java +++ b/bson/src/test/unit/org/bson/codecs/pojo/PojoTestCase.java @@ -16,6 +16,9 @@ package org.bson.codecs.pojo; +import java.util.SortedSet; +import java.util.TreeSet; + import org.bson.BsonBinaryReader; import org.bson.BsonBinaryWriter; import org.bson.BsonDocument; @@ -268,22 +271,26 @@ static CollectionNestedPojoModel getCollectionNestedPojoModelWithNulls() { private static CollectionNestedPojoModel getCollectionNestedPojoModel(final boolean useNulls) { List listSimple; Set setSimple; + SortedSet sortedSetSimple; Map mapSimple; if (useNulls) { listSimple = null; setSimple = null; + sortedSetSimple = null; mapSimple = null; } else { SimpleModel simpleModel = getSimpleModel(); listSimple = singletonList(simpleModel); setSimple = new HashSet<>(listSimple); + sortedSetSimple = new TreeSet<>(listSimple); mapSimple = new HashMap<>(); mapSimple.put("s", simpleModel); } List> listListSimple = singletonList(listSimple); Set> setSetSimple = new HashSet<>(singletonList(setSimple)); + Set> setSortedSetSimple = new HashSet<>(singletonList(sortedSetSimple)); Map> mapMapSimple = new HashMap<>(); mapMapSimple.put("ms", mapSimple); @@ -301,8 +308,8 @@ private static CollectionNestedPojoModel getCollectionNestedPojoModel(final bool List>> listMapListSimple = singletonList(mapListSimple); List>> listMapSetSimple = singletonList(mapSetSimple); - return new CollectionNestedPojoModel(listSimple, listListSimple, setSimple, setSetSimple, mapSimple, mapMapSimple, mapListSimple, - mapListMapSimple, mapSetSimple, listMapSimple, listMapListSimple, listMapSetSimple); + return new CollectionNestedPojoModel(listSimple, listListSimple, setSimple, setSetSimple, sortedSetSimple, setSortedSetSimple, + mapSimple, mapMapSimple, mapListSimple, mapListMapSimple, mapSetSimple, listMapSimple, listMapListSimple, listMapSetSimple); } static ConventionModel getConventionModel() { diff --git a/bson/src/test/unit/org/bson/codecs/pojo/entities/CollectionNestedPojoModel.java b/bson/src/test/unit/org/bson/codecs/pojo/entities/CollectionNestedPojoModel.java index ce81e18897d..a7b110ebe61 100644 --- a/bson/src/test/unit/org/bson/codecs/pojo/entities/CollectionNestedPojoModel.java +++ b/bson/src/test/unit/org/bson/codecs/pojo/entities/CollectionNestedPojoModel.java @@ -19,6 +19,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.SortedSet; import static java.util.Collections.singletonList; @@ -32,6 +33,9 @@ public final class CollectionNestedPojoModel { private Set setSimple; private Set> setSetSimple; + private SortedSet sortedSetSimple; + private Set> setSortedSetSimple; + private Map mapSimple; private Map> mapMapSimple; @@ -47,7 +51,8 @@ public CollectionNestedPojoModel() { } public CollectionNestedPojoModel(final List listSimple, final List> listListSimple, final - Set setSimple, final Set> setSetSimple, final Map mapSimple, final Map setSimple, final Set> setSetSimple, final SortedSet sortedSetSimple, + final Set> setSortedSetSimple, final Map mapSimple, final Map> mapMapSimple, final Map> mapListSimple, final Map>> mapListMapSimple, final Map> mapSetSimple, final List> listMapSimple, final List>> listMapListSimple, final List listSimple, final List< this.listListSimple = listListSimple; this.setSimple = setSimple; this.setSetSimple = setSetSimple; + this.sortedSetSimple = sortedSetSimple; + this.setSortedSetSimple = setSortedSetSimple; this.mapSimple = mapSimple; this.mapMapSimple = mapMapSimple; this.mapListSimple = mapListSimple; @@ -98,6 +105,14 @@ public void setSetSimple(final Set setSimple) { this.setSimple = setSimple; } + public SortedSet getSortedSetSimple() { + return sortedSetSimple; + } + + public void setSortedSetSimple(final SortedSet sortedSetSimple) { + this.sortedSetSimple = sortedSetSimple; + } + public Set> getSetSetSimple() { return setSetSimple; } @@ -106,6 +121,14 @@ public void setSetSetSimple(final Set> setSetSimple) { this.setSetSimple = setSetSimple; } + public Set> getSetSortedSetSimple() { + return setSortedSetSimple; + } + + public void setSetSortedSetSimple(final Set> setSetSimple) { + this.setSortedSetSimple = setSortedSetSimple; + } + public Map getMapSimple() { return mapSimple; } @@ -193,6 +216,13 @@ public boolean equals(final Object o) { if (getSetSetSimple() != null ? !getSetSetSimple().equals(that.getSetSetSimple()) : that.getSetSetSimple() != null) { return false; } + if (getSortedSetSimple() != null ? !getSortedSetSimple().equals(that.getSortedSetSimple()) : that.getSortedSetSimple() != null) { + return false; + } + if (getSetSortedSetSimple() != null ? !getSetSortedSetSimple().equals(that.getSetSortedSetSimple()) : + that.getSetSortedSetSimple() != null) { + return false; + } if (getMapSimple() != null ? !getMapSimple().equals(that.getMapSimple()) : that.getMapSimple() != null) { return false; } @@ -230,6 +260,8 @@ public int hashCode() { result = 31 * result + (getListListSimple() != null ? getListListSimple().hashCode() : 0); result = 31 * result + (getSetSimple() != null ? getSetSimple().hashCode() : 0); result = 31 * result + (getSetSetSimple() != null ? getSetSetSimple().hashCode() : 0); + result = 31 * result + (getSortedSetSimple() != null ? getSortedSetSimple().hashCode() : 0); + result = 31 * result + (getSetSortedSetSimple() != null ? getSetSortedSetSimple().hashCode() : 0); result = 31 * result + (getMapSimple() != null ? getMapSimple().hashCode() : 0); result = 31 * result + (getMapMapSimple() != null ? getMapMapSimple().hashCode() : 0); result = 31 * result + (getMapListSimple() != null ? getMapListSimple().hashCode() : 0); @@ -248,6 +280,8 @@ public String toString() { + ", listListSimple=" + listListSimple + ", setSimple=" + setSimple + ", setSetSimple=" + setSetSimple + + ", setSortedSimple=" + sortedSetSimple + + ", setSortedSetSimple=" + setSortedSetSimple + ", mapSimple=" + mapSimple + ", mapMapSimple=" + mapMapSimple + ", mapListSimple=" + mapListSimple diff --git a/bson/src/test/unit/org/bson/codecs/pojo/entities/SimpleModel.java b/bson/src/test/unit/org/bson/codecs/pojo/entities/SimpleModel.java index 91e43e1e415..5e0d490709b 100644 --- a/bson/src/test/unit/org/bson/codecs/pojo/entities/SimpleModel.java +++ b/bson/src/test/unit/org/bson/codecs/pojo/entities/SimpleModel.java @@ -16,7 +16,7 @@ package org.bson.codecs.pojo.entities; -public final class SimpleModel { +public final class SimpleModel implements Comparable { private Integer integerField; private String stringField; @@ -79,4 +79,10 @@ public String toString() { + ", stringField='" + stringField + "'" + "}"; } + + @Override + public int compareTo(SimpleModel o) { + int integerFieldCompareResult = this.integerField.compareTo(o.integerField); + return integerFieldCompareResult == 0 ? this.stringField.compareTo(o.stringField) : integerFieldCompareResult; + } } From 4ee029ca33d50b743368ca905d11b01a1a943176 Mon Sep 17 00:00:00 2001 From: Ramasai Venkatsitarambhaskar Tadepalli Date: Mon, 5 Feb 2024 12:18:03 -0500 Subject: [PATCH 3/4] Fix test and formatting --- .../org/bson/codecs/pojo/ClassModelTest.java | 7 ++++++- .../bson/codecs/pojo/PojoRoundTripTest.java | 2 -- .../org/bson/codecs/pojo/PojoTestCase.java | 4 ++-- .../entities/CollectionNestedPojoModel.java | 18 +----------------- .../bson/codecs/pojo/entities/SimpleModel.java | 2 +- 5 files changed, 10 insertions(+), 23 deletions(-) diff --git a/bson/src/test/unit/org/bson/codecs/pojo/ClassModelTest.java b/bson/src/test/unit/org/bson/codecs/pojo/ClassModelTest.java index 1bdf3059db0..d0ee3cb1cc7 100644 --- a/bson/src/test/unit/org/bson/codecs/pojo/ClassModelTest.java +++ b/bson/src/test/unit/org/bson/codecs/pojo/ClassModelTest.java @@ -16,6 +16,8 @@ package org.bson.codecs.pojo; +import java.util.SortedSet; + import org.bson.codecs.pojo.entities.CollectionNestedPojoModel; import org.bson.codecs.pojo.entities.ConcreteAndNestedAbstractInterfaceModel; import org.bson.codecs.pojo.entities.GenericHolderModel; @@ -80,6 +82,7 @@ public void testCollectionNestedPojoModelPropertyTypes() { TypeData listList = createBuilder(List.class).addTypeParameter(list).build(); TypeData set = createBuilder(Set.class).addTypeParameter(simple).build(); TypeData setSet = createBuilder(Set.class).addTypeParameter(set).build(); + TypeData sortedSet = createBuilder(SortedSet.class).addTypeParameter(simple).build(); TypeData map = createBuilder(Map.class).addTypeParameter(string).addTypeParameter(simple).build(); TypeData listMap = createBuilder(List.class).addTypeParameter(map).build(); TypeData mapMap = createBuilder(Map.class).addTypeParameter(string).addTypeParameter(map).build(); @@ -91,13 +94,15 @@ public void testCollectionNestedPojoModelPropertyTypes() { ClassModel classModel = ClassModel.builder(CollectionNestedPojoModel.class).build(); - assertEquals(12, classModel.getPropertyModels().size()); + assertEquals(13, classModel.getPropertyModels().size()); assertEquals(classModel.getPropertyModel("listSimple").getTypeData(), list); assertEquals(classModel.getPropertyModel("listListSimple").getTypeData(), listList); assertEquals(classModel.getPropertyModel("setSimple").getTypeData(), set); assertEquals(classModel.getPropertyModel("setSetSimple").getTypeData(), setSet); + assertEquals(classModel.getPropertyModel("sortedSetSimple").getTypeData(), sortedSet); + assertEquals(classModel.getPropertyModel("mapSimple").getTypeData(), map); assertEquals(classModel.getPropertyModel("mapMapSimple").getTypeData(), mapMap); diff --git a/bson/src/test/unit/org/bson/codecs/pojo/PojoRoundTripTest.java b/bson/src/test/unit/org/bson/codecs/pojo/PojoRoundTripTest.java index 2144ab813b9..53f5d363535 100644 --- a/bson/src/test/unit/org/bson/codecs/pojo/PojoRoundTripTest.java +++ b/bson/src/test/unit/org/bson/codecs/pojo/PojoRoundTripTest.java @@ -219,7 +219,6 @@ private static List testCases() { + "'setSimple': [" + SIMPLE_MODEL_JSON + "]," + "'setSetSimple': [[" + SIMPLE_MODEL_JSON + "]]," + "'sortedSetSimple': [" + SIMPLE_MODEL_JSON + "]," - + "'setSortedSetSimple': [[" + SIMPLE_MODEL_JSON + "]]," + "'mapSimple': {'s': " + SIMPLE_MODEL_JSON + "}," + "'mapMapSimple': {'ms': {'s': " + SIMPLE_MODEL_JSON + "}}," + "'mapListSimple': {'ls': [" + SIMPLE_MODEL_JSON + "]}," @@ -234,7 +233,6 @@ private static List testCases() { getPojoCodecProviderBuilder(CollectionNestedPojoModel.class, SimpleModel.class), "{ 'listListSimple': [ null ]," + "'setSetSimple': [ null ]," - + "'sortedSetSimple': [ null ]," + "'mapMapSimple': {'ms': null}," + "'mapListSimple': {'ls': null}," + "'mapListMapSimple': {'lm': [null]}," diff --git a/bson/src/test/unit/org/bson/codecs/pojo/PojoTestCase.java b/bson/src/test/unit/org/bson/codecs/pojo/PojoTestCase.java index b9e62a52373..3034ad81a0f 100644 --- a/bson/src/test/unit/org/bson/codecs/pojo/PojoTestCase.java +++ b/bson/src/test/unit/org/bson/codecs/pojo/PojoTestCase.java @@ -16,6 +16,7 @@ package org.bson.codecs.pojo; +import java.util.Comparator; import java.util.SortedSet; import java.util.TreeSet; @@ -290,7 +291,6 @@ private static CollectionNestedPojoModel getCollectionNestedPojoModel(final bool List> listListSimple = singletonList(listSimple); Set> setSetSimple = new HashSet<>(singletonList(setSimple)); - Set> setSortedSetSimple = new HashSet<>(singletonList(sortedSetSimple)); Map> mapMapSimple = new HashMap<>(); mapMapSimple.put("ms", mapSimple); @@ -308,7 +308,7 @@ private static CollectionNestedPojoModel getCollectionNestedPojoModel(final bool List>> listMapListSimple = singletonList(mapListSimple); List>> listMapSetSimple = singletonList(mapSetSimple); - return new CollectionNestedPojoModel(listSimple, listListSimple, setSimple, setSetSimple, sortedSetSimple, setSortedSetSimple, + return new CollectionNestedPojoModel(listSimple, listListSimple, setSimple, setSetSimple, sortedSetSimple, mapSimple, mapMapSimple, mapListSimple, mapListMapSimple, mapSetSimple, listMapSimple, listMapListSimple, listMapSetSimple); } diff --git a/bson/src/test/unit/org/bson/codecs/pojo/entities/CollectionNestedPojoModel.java b/bson/src/test/unit/org/bson/codecs/pojo/entities/CollectionNestedPojoModel.java index a7b110ebe61..554469249d8 100644 --- a/bson/src/test/unit/org/bson/codecs/pojo/entities/CollectionNestedPojoModel.java +++ b/bson/src/test/unit/org/bson/codecs/pojo/entities/CollectionNestedPojoModel.java @@ -34,7 +34,6 @@ public final class CollectionNestedPojoModel { private Set> setSetSimple; private SortedSet sortedSetSimple; - private Set> setSortedSetSimple; private Map mapSimple; private Map> mapMapSimple; @@ -52,7 +51,7 @@ public CollectionNestedPojoModel() { public CollectionNestedPojoModel(final List listSimple, final List> listListSimple, final Set setSimple, final Set> setSetSimple, final SortedSet sortedSetSimple, - final Set> setSortedSetSimple, final Map mapSimple, final Map mapSimple, final Map> mapMapSimple, final Map> mapListSimple, final Map>> mapListMapSimple, final Map> mapSetSimple, final List> listMapSimple, final List>> listMapListSimple, final List listSimple, final List< this.setSimple = setSimple; this.setSetSimple = setSetSimple; this.sortedSetSimple = sortedSetSimple; - this.setSortedSetSimple = setSortedSetSimple; this.mapSimple = mapSimple; this.mapMapSimple = mapMapSimple; this.mapListSimple = mapListSimple; @@ -121,14 +119,6 @@ public void setSetSetSimple(final Set> setSetSimple) { this.setSetSimple = setSetSimple; } - public Set> getSetSortedSetSimple() { - return setSortedSetSimple; - } - - public void setSetSortedSetSimple(final Set> setSetSimple) { - this.setSortedSetSimple = setSortedSetSimple; - } - public Map getMapSimple() { return mapSimple; } @@ -219,10 +209,6 @@ public boolean equals(final Object o) { if (getSortedSetSimple() != null ? !getSortedSetSimple().equals(that.getSortedSetSimple()) : that.getSortedSetSimple() != null) { return false; } - if (getSetSortedSetSimple() != null ? !getSetSortedSetSimple().equals(that.getSetSortedSetSimple()) : - that.getSetSortedSetSimple() != null) { - return false; - } if (getMapSimple() != null ? !getMapSimple().equals(that.getMapSimple()) : that.getMapSimple() != null) { return false; } @@ -261,7 +247,6 @@ public int hashCode() { result = 31 * result + (getSetSimple() != null ? getSetSimple().hashCode() : 0); result = 31 * result + (getSetSetSimple() != null ? getSetSetSimple().hashCode() : 0); result = 31 * result + (getSortedSetSimple() != null ? getSortedSetSimple().hashCode() : 0); - result = 31 * result + (getSetSortedSetSimple() != null ? getSetSortedSetSimple().hashCode() : 0); result = 31 * result + (getMapSimple() != null ? getMapSimple().hashCode() : 0); result = 31 * result + (getMapMapSimple() != null ? getMapMapSimple().hashCode() : 0); result = 31 * result + (getMapListSimple() != null ? getMapListSimple().hashCode() : 0); @@ -281,7 +266,6 @@ public String toString() { + ", setSimple=" + setSimple + ", setSetSimple=" + setSetSimple + ", setSortedSimple=" + sortedSetSimple - + ", setSortedSetSimple=" + setSortedSetSimple + ", mapSimple=" + mapSimple + ", mapMapSimple=" + mapMapSimple + ", mapListSimple=" + mapListSimple diff --git a/bson/src/test/unit/org/bson/codecs/pojo/entities/SimpleModel.java b/bson/src/test/unit/org/bson/codecs/pojo/entities/SimpleModel.java index 5e0d490709b..7566066eef5 100644 --- a/bson/src/test/unit/org/bson/codecs/pojo/entities/SimpleModel.java +++ b/bson/src/test/unit/org/bson/codecs/pojo/entities/SimpleModel.java @@ -81,7 +81,7 @@ public String toString() { } @Override - public int compareTo(SimpleModel o) { + public int compareTo(final SimpleModel o) { int integerFieldCompareResult = this.integerField.compareTo(o.integerField); return integerFieldCompareResult == 0 ? this.stringField.compareTo(o.stringField) : integerFieldCompareResult; } From 1bd9be4908ecf60ee4669da51070cbfbf873ac65 Mon Sep 17 00:00:00 2001 From: Ramasai Venkatsitarambhaskar Tadepalli Date: Mon, 5 Feb 2024 12:47:25 -0500 Subject: [PATCH 4/4] Remove unused import and run checkstyle, nothing came up locally --- bson/src/test/unit/org/bson/codecs/pojo/PojoTestCase.java | 1 - 1 file changed, 1 deletion(-) diff --git a/bson/src/test/unit/org/bson/codecs/pojo/PojoTestCase.java b/bson/src/test/unit/org/bson/codecs/pojo/PojoTestCase.java index 3034ad81a0f..5b5209435cb 100644 --- a/bson/src/test/unit/org/bson/codecs/pojo/PojoTestCase.java +++ b/bson/src/test/unit/org/bson/codecs/pojo/PojoTestCase.java @@ -16,7 +16,6 @@ package org.bson.codecs.pojo; -import java.util.Comparator; import java.util.SortedSet; import java.util.TreeSet;