Skip to content

Commit 09baaaf

Browse files
committed
JAVA-2639: Support parsing of shell syntax for MinKey and MaxKey
1 parent 7aaf94a commit 09baaaf

File tree

2 files changed

+49
-18
lines changed

2 files changed

+49
-18
lines changed

bson/src/main/org/bson/json/JsonReader.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,14 @@ public BsonType readBsonType() {
186186
setCurrentBsonType(BsonType.NULL);
187187
} else if ("undefined".equals(value)) {
188188
setCurrentBsonType(BsonType.UNDEFINED);
189+
} else if ("MinKey".equals(value)) {
190+
visitEmptyConstructor();
191+
setCurrentBsonType(BsonType.MIN_KEY);
192+
currentValue = new MinKey();
193+
} else if ("MaxKey".equals(value)) {
194+
visitEmptyConstructor();
195+
setCurrentBsonType(BsonType.MAX_KEY);
196+
currentValue = new MaxKey();
189197
} else if ("BinData".equals(value)) {
190198
setCurrentBsonType(BsonType.BINARY);
191199
currentValue = visitBinDataConstructor();
@@ -531,7 +539,15 @@ private void visitNew() {
531539

532540
String value = typeToken.getValue(String.class);
533541

534-
if ("BinData".equals(value)) {
542+
if ("MinKey".equals(value)) {
543+
visitEmptyConstructor();
544+
setCurrentBsonType(BsonType.MIN_KEY);
545+
currentValue = new MinKey();
546+
} else if ("MaxKey".equals(value)) {
547+
visitEmptyConstructor();
548+
setCurrentBsonType(BsonType.MAX_KEY);
549+
currentValue = new MaxKey();
550+
} else if ("BinData".equals(value)) {
535551
currentValue = visitBinDataConstructor();
536552
setCurrentBsonType(BsonType.BINARY);
537553
} else if ("Date".equals(value)) {
@@ -657,6 +673,15 @@ private void visitExtendedJSON() {
657673
setCurrentBsonType(BsonType.DOCUMENT);
658674
}
659675

676+
private void visitEmptyConstructor() {
677+
JsonToken nextToken = popToken();
678+
if (nextToken.getType() == JsonTokenType.LEFT_PAREN) {
679+
verifyToken(JsonTokenType.RIGHT_PAREN);
680+
} else {
681+
pushToken(nextToken);
682+
}
683+
}
684+
660685
private BsonBinary visitBinDataConstructor() {
661686
verifyToken(JsonTokenType.LEFT_PAREN);
662687
JsonToken subTypeToken = popToken();

bson/src/test/unit/org/bson/json/JsonReaderTest.java

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@
2929

3030
import java.text.ParsePosition;
3131
import java.text.SimpleDateFormat;
32-
import java.util.Arrays;
3332
import java.util.Date;
3433
import java.util.List;
3534
import java.util.Locale;
3635

36+
import static java.util.Arrays.asList;
3737
import static org.junit.Assert.assertArrayEquals;
3838
import static org.junit.Assert.assertEquals;
3939
import static org.junit.Assert.assertTrue;
@@ -262,7 +262,6 @@ public void testHexData() {
262262
bsonReader = new JsonReader(json);
263263
assertEquals(BsonType.BINARY, bsonReader.readBsonType());
264264
BsonBinary binary = bsonReader.readBinaryData();
265-
byte[] bytes = binary.getData();
266265
assertArrayEquals(expectedBytes, binary.getData());
267266
assertEquals(AbstractBsonReader.State.DONE, bsonReader.getState());
268267
}
@@ -274,7 +273,6 @@ public void testHexDataWithNew() {
274273
bsonReader = new JsonReader(json);
275274
assertEquals(BsonType.BINARY, bsonReader.readBsonType());
276275
BsonBinary binary = bsonReader.readBinaryData();
277-
byte[] bytes = binary.getData();
278276
assertArrayEquals(expectedBytes, binary.getData());
279277
assertEquals(AbstractBsonReader.State.DONE, bsonReader.getState());
280278
}
@@ -309,7 +307,7 @@ public void testNumberLongExtendedJson() {
309307

310308
@Test
311309
public void testNumberLong() {
312-
List<String> jsonTexts = Arrays.asList(
310+
List<String> jsonTexts = asList(
313311
"NumberLong(123)",
314312
"NumberLong(\"123\")",
315313
"new NumberLong(123)",
@@ -324,7 +322,7 @@ public void testNumberLong() {
324322

325323
@Test
326324
public void testNumberInt() {
327-
List<String> jsonTexts = Arrays.asList(
325+
List<String> jsonTexts = asList(
328326
"NumberInt(123)",
329327
"NumberInt(\"123\")",
330328
"new NumberInt(123)",
@@ -432,22 +430,30 @@ public void testJavaScriptWithScope() {
432430

433431
@Test
434432
public void testMaxKey() {
435-
String json = "{ \"$maxKey\" : 1 }";
436-
bsonReader = new JsonReader(json);
437-
assertEquals(BsonType.MAX_KEY, bsonReader.readBsonType());
438-
bsonReader.readMaxKey();
439-
assertEquals(AbstractBsonReader.State.DONE, bsonReader.getState());
440-
433+
for (String maxKeyJson : asList("{ \"$maxKey\" : 1 }", "MaxKey", "MaxKey()", "new MaxKey", "new MaxKey()")) {
434+
String json = "{ maxKey : " + maxKeyJson + " }";
435+
bsonReader = new JsonReader(json);
436+
bsonReader.readStartDocument();
437+
assertEquals("maxKey", bsonReader.readName());
438+
assertEquals(BsonType.MAX_KEY, bsonReader.getCurrentBsonType());
439+
bsonReader.readMaxKey();
440+
bsonReader.readEndDocument();
441+
assertEquals(AbstractBsonReader.State.DONE, bsonReader.getState());
442+
}
441443
}
442444

443445
@Test
444446
public void testMinKey() {
445-
String json = "{ \"$minKey\" : 1 }";
446-
bsonReader = new JsonReader(json);
447-
assertEquals(BsonType.MIN_KEY, bsonReader.readBsonType());
448-
bsonReader.readMinKey();
449-
assertEquals(AbstractBsonReader.State.DONE, bsonReader.getState());
450-
447+
for (String minKeyJson : asList("{ \"$minKey\" : 1 }", "MinKey", "MinKey()", "new MinKey", "new MinKey()")) {
448+
String json = "{ minKey : " + minKeyJson + " }";
449+
bsonReader = new JsonReader(json);
450+
bsonReader.readStartDocument();
451+
assertEquals("minKey", bsonReader.readName());
452+
assertEquals(BsonType.MIN_KEY, bsonReader.getCurrentBsonType());
453+
bsonReader.readMinKey();
454+
bsonReader.readEndDocument();
455+
assertEquals(AbstractBsonReader.State.DONE, bsonReader.getState());
456+
}
451457
}
452458

453459
@Test

0 commit comments

Comments
 (0)