Skip to content

Commit d10ac69

Browse files
committed
Minor fixes to issue related to #700 (current name access via getText() should work)
1 parent 2176981 commit d10ac69

File tree

2 files changed

+67
-8
lines changed

2 files changed

+67
-8
lines changed

src/main/java/com/fasterxml/jackson/core/filter/FilteringParserDelegate.java

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -865,11 +865,44 @@ public JsonParser skipChildren() throws IOException
865865
/**********************************************************
866866
*/
867867

868-
@Override public String getText() throws IOException { return delegate.getText(); }
869-
@Override public boolean hasTextCharacters() { return delegate.hasTextCharacters(); }
870-
@Override public char[] getTextCharacters() throws IOException { return delegate.getTextCharacters(); }
871-
@Override public int getTextLength() throws IOException { return delegate.getTextLength(); }
872-
@Override public int getTextOffset() throws IOException { return delegate.getTextOffset(); }
868+
// 19-Jul-2021, tatu: Cannot quite just delegate these methods due to oddity
869+
// of property name token, which may be buffered.
870+
871+
@Override public String getText() throws IOException {
872+
if (_currToken == JsonToken.FIELD_NAME) {
873+
return currentName();
874+
}
875+
return delegate.getText();
876+
}
877+
878+
@Override public boolean hasTextCharacters() {
879+
if (_currToken == JsonToken.FIELD_NAME) {
880+
return false;
881+
}
882+
return delegate.hasTextCharacters();
883+
}
884+
885+
@Override public char[] getTextCharacters() throws IOException {
886+
// Not optimal but is correct, unlike delegating (as underlying stream
887+
// may point to something else due to buffering)
888+
if (_currToken == JsonToken.FIELD_NAME) {
889+
return currentName().toCharArray();
890+
}
891+
return delegate.getTextCharacters();
892+
}
893+
894+
@Override public int getTextLength() throws IOException {
895+
if (_currToken == JsonToken.FIELD_NAME) {
896+
return currentName().length();
897+
}
898+
return delegate.getTextLength();
899+
}
900+
@Override public int getTextOffset() throws IOException {
901+
if (_currToken == JsonToken.FIELD_NAME) {
902+
return 0;
903+
}
904+
return delegate.getTextOffset();
905+
}
873906

874907
/*
875908
/**********************************************************
@@ -924,9 +957,20 @@ public JsonParser skipChildren() throws IOException
924957
@Override public double getValueAsDouble(double defaultValue) throws IOException { return delegate.getValueAsDouble(defaultValue); }
925958
@Override public boolean getValueAsBoolean() throws IOException { return delegate.getValueAsBoolean(); }
926959
@Override public boolean getValueAsBoolean(boolean defaultValue) throws IOException { return delegate.getValueAsBoolean(defaultValue); }
927-
@Override public String getValueAsString() throws IOException { return delegate.getValueAsString(); }
928-
@Override public String getValueAsString(String defaultValue) throws IOException { return delegate.getValueAsString(defaultValue); }
929-
960+
961+
@Override public String getValueAsString() throws IOException {
962+
if (_currToken == JsonToken.FIELD_NAME) {
963+
return currentName();
964+
}
965+
return delegate.getValueAsString();
966+
}
967+
@Override public String getValueAsString(String defaultValue) throws IOException {
968+
if (_currToken == JsonToken.FIELD_NAME) {
969+
return currentName();
970+
}
971+
return delegate.getValueAsString(defaultValue);
972+
}
973+
930974
/*
931975
/**********************************************************
932976
/* Public API, access to token values, other

src/test/java/com/fasterxml/jackson/core/filter/ParserFiltering700Test.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ public void testSkippingRootLevel() throws Exception
4545

4646
assertToken(JsonToken.FIELD_NAME, p.nextToken());
4747
assertEquals("value", p.currentName());
48+
// 19-Jul-2021, tatu: while not ideal, existing contract is that "getText()"
49+
// ought to return property name as well...
50+
assertEquals("value", p.getText());
51+
4852
assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken());
4953
assertEquals(12, p.getIntValue());
5054

@@ -70,10 +74,13 @@ public void testSkippingOneNested() throws Exception
7074

7175
assertToken(JsonToken.FIELD_NAME, p.nextToken());
7276
assertEquals("value", p.currentName());
77+
// as earlier, this needs to hold true too
78+
assertEquals("value", p.getText());
7379

7480
assertToken(JsonToken.START_OBJECT, p.nextToken());
7581
assertToken(JsonToken.FIELD_NAME, p.nextToken());
7682
assertEquals("a", p.currentName());
83+
assertEquals("a", p.getText());
7784
assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken());
7885
assertEquals(12, p.getIntValue());
7986
assertEquals(JsonToken.END_OBJECT, p.nextToken());
@@ -104,21 +111,29 @@ private void _testSkippingForSingleWithPath(boolean useNextName) throws Exceptio
104111
);
105112

106113
assertToken(JsonToken.START_OBJECT, p.nextToken());
114+
assertTrue(p.isExpectedStartObjectToken());
107115

108116
if (useNextName) {
109117
assertEquals("value", p.nextFieldName());
118+
// as earlier, this needs to hold true too
119+
assertEquals("value", p.getText());
110120
assertToken(JsonToken.START_OBJECT, p.nextToken());
121+
assertTrue(p.isExpectedStartObjectToken());
111122
assertEquals("a", p.nextFieldName());
123+
assertEquals("a", p.getText());
112124
assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken());
113125
assertEquals(99, p.getIntValue());
114126
assertNull(p.nextFieldName());
115127
assertEquals(JsonToken.END_OBJECT, p.currentToken());
116128
} else {
117129
assertToken(JsonToken.FIELD_NAME, p.nextToken());
118130
assertEquals("value", p.currentName());
131+
assertEquals("value", p.getText());
119132
assertToken(JsonToken.START_OBJECT, p.nextToken());
133+
assertTrue(p.isExpectedStartObjectToken());
120134
assertToken(JsonToken.FIELD_NAME, p.nextToken());
121135
assertEquals("a", p.currentName());
136+
assertEquals("a", p.getText());
122137
assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken());
123138
assertEquals(99, p.getIntValue());
124139
assertEquals(JsonToken.END_OBJECT, p.nextToken());

0 commit comments

Comments
 (0)