diff --git a/bson/src/main/org/bson/codecs/pojo/CollectionPropertyCodecProvider.java b/bson/src/main/org/bson/codecs/pojo/CollectionPropertyCodecProvider.java index 09f0498022..abf5add374 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())); } 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 1bdf3059db..d0ee3cb1cc 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 cba65f487f..53f5d36353 100644 --- a/bson/src/test/unit/org/bson/codecs/pojo/PojoRoundTripTest.java +++ b/bson/src/test/unit/org/bson/codecs/pojo/PojoRoundTripTest.java @@ -218,6 +218,7 @@ private static List testCases() { + "'listListSimple': [[" + SIMPLE_MODEL_JSON + "]]," + "'setSimple': [" + SIMPLE_MODEL_JSON + "]," + "'setSetSimple': [[" + SIMPLE_MODEL_JSON + "]]," + + "'sortedSetSimple': [" + SIMPLE_MODEL_JSON + "]," + "'mapSimple': {'s': " + SIMPLE_MODEL_JSON + "}," + "'mapMapSimple': {'ms': {'s': " + SIMPLE_MODEL_JSON + "}}," + "'mapListSimple': {'ls': [" + SIMPLE_MODEL_JSON + "]}," 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 b1feb09a5e..5b5209435c 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,16 +271,19 @@ 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); } @@ -301,8 +307,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, + 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 ce81e18897..554469249d 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,8 @@ public final class CollectionNestedPojoModel { private Set setSimple; private Set> setSetSimple; + private SortedSet sortedSetSimple; + private Map mapSimple; private Map> mapMapSimple; @@ -47,7 +50,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 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.mapSimple = mapSimple; this.mapMapSimple = mapMapSimple; this.mapListSimple = mapListSimple; @@ -98,6 +103,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; } @@ -193,6 +206,9 @@ 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 (getMapSimple() != null ? !getMapSimple().equals(that.getMapSimple()) : that.getMapSimple() != null) { return false; } @@ -230,6 +246,7 @@ 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 + (getMapSimple() != null ? getMapSimple().hashCode() : 0); result = 31 * result + (getMapMapSimple() != null ? getMapMapSimple().hashCode() : 0); result = 31 * result + (getMapListSimple() != null ? getMapListSimple().hashCode() : 0); @@ -248,6 +265,7 @@ public String toString() { + ", listListSimple=" + listListSimple + ", setSimple=" + setSimple + ", setSetSimple=" + setSetSimple + + ", setSortedSimple=" + sortedSetSimple + ", 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 91e43e1e41..7566066eef 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(final SimpleModel o) { + int integerFieldCompareResult = this.integerField.compareTo(o.integerField); + return integerFieldCompareResult == 0 ? this.stringField.compareTo(o.stringField) : integerFieldCompareResult; + } }