1717 */
1818package org .apache .beam .runners .dataflow .worker .fn .control ;
1919
20+ import static com .fasterxml .jackson .core .JsonGenerator .Feature .AUTO_CLOSE_JSON_CONTENT ;
21+ import static com .fasterxml .jackson .core .JsonParser .Feature .ALLOW_SINGLE_QUOTES ;
22+ import static com .fasterxml .jackson .core .JsonParser .Feature .ALLOW_UNQUOTED_FIELD_NAMES ;
2023import static org .junit .Assert .assertEquals ;
2124import static org .junit .Assert .assertNotEquals ;
2225import static org .mockito .Matchers .any ;
2326import static org .mockito .Mockito .when ;
2427
2528import com .google .api .client .json .GenericJson ;
29+ import com .google .api .client .json .JsonFactory ;
30+ import com .google .api .client .json .JsonGenerator ;
2631import com .google .api .client .json .JsonParser ;
27- import com .google .api .client .json .jackson2 .JacksonFactory ;
32+ import com .google .api .client .json .JsonToken ;
33+ import com .google .api .client .util .Preconditions ;
2834import com .google .api .services .dataflow .model .CounterUpdate ;
2935import java .io .IOException ;
36+ import java .io .InputStream ;
37+ import java .io .OutputStream ;
38+ import java .io .Reader ;
39+ import java .io .Writer ;
40+ import java .math .BigDecimal ;
41+ import java .math .BigInteger ;
42+ import java .nio .charset .Charset ;
3043import java .util .HashMap ;
3144import java .util .Map ;
3245import java .util .Optional ;
@@ -116,14 +129,14 @@ public void testTransformReturnsValidCounterUpdateWhenValidMonitoringInfoReceive
116129 // the latter is prone to unnecessary test code maintenance upon internal changes such as field
117130 // ordering and toString implementation.
118131 assertEqualsOnJson (
119- "{\" cumulative\" :true, \" integer\" :{ \" highBits\" :0, \" lowBits\" :0}, "
120- + "\" nameAndKind\" :{ \" kind\" : \" SUM\" , "
121- + "\" name\" : \" transformedValue-ElementCount\" }}" ,
132+ "{cumulative:true, integer:{ highBits:0, lowBits:0}, "
133+ + "nameAndKind:{ kind:' SUM' , "
134+ + "name:' transformedValue-ElementCount' }}" ,
122135 result );
123136 }
124137
125- // The following field and methods should go to shared test utility class (sdks/testing?)
126- private static final JacksonFactory jacksonFactory = JacksonFactory . getDefaultInstance ();
138+ // The following field, methods and classes should go to shared test utility class (sdks/testing?)
139+ private static final NonstrictJacksonFactory jacksonFactory = new NonstrictJacksonFactory ();
127140
128141 public static <T extends GenericJson > void assertEqualsOnJson (String expectedJsonText , T actual ) {
129142 CounterUpdate expected = parse (expectedJsonText , CounterUpdate .class );
@@ -138,4 +151,162 @@ public static <T extends GenericJson> T parse(String text, Class<T> clazz) {
138151 throw new IllegalArgumentException ("Could not parse the text as " + clazz , ex );
139152 }
140153 }
154+
155+ public static class NonstrictJacksonFactory extends JsonFactory {
156+
157+ private final com .fasterxml .jackson .core .JsonFactory factory = new com .fasterxml .jackson .core .JsonFactory ();
158+
159+ public NonstrictJacksonFactory () {
160+ this .factory .configure (AUTO_CLOSE_JSON_CONTENT , false );
161+ this .factory .configure (ALLOW_UNQUOTED_FIELD_NAMES , true );
162+ this .factory .configure (ALLOW_SINGLE_QUOTES , true );
163+ }
164+
165+ @ Override
166+ public JsonParser createJsonParser (InputStream inputStream ) throws IOException {
167+ throw new UnsupportedOperationException ("Not implemented" );
168+ }
169+
170+ @ Override
171+ public JsonParser createJsonParser (InputStream inputStream , Charset charset )
172+ throws IOException {
173+ throw new UnsupportedOperationException ("Not implemented" );
174+ }
175+
176+ @ Override
177+ public JsonParser createJsonParser (String value ) throws IOException {
178+ Preconditions .checkNotNull (value );
179+ return new MyJacksonParser (this , this .factory .createJsonParser (value ));
180+ }
181+
182+ @ Override
183+ public JsonParser createJsonParser (Reader reader ) throws IOException {
184+ throw new UnsupportedOperationException ("Not implemented" );
185+ }
186+
187+ @ Override
188+ public JsonGenerator createJsonGenerator (OutputStream outputStream , Charset charset )
189+ throws IOException {
190+ throw new UnsupportedOperationException ("Not implemented" );
191+ }
192+
193+ @ Override
194+ public JsonGenerator createJsonGenerator (Writer writer ) throws IOException {
195+ throw new UnsupportedOperationException ("Not implemented" );
196+ }
197+
198+
199+ static JsonToken convert (com .fasterxml .jackson .core .JsonToken token ) {
200+ if (token == null ) {
201+ return null ;
202+ } else {
203+ switch (token ) {
204+ case END_ARRAY :
205+ return JsonToken .END_ARRAY ;
206+ case START_ARRAY :
207+ return JsonToken .START_ARRAY ;
208+ case END_OBJECT :
209+ return JsonToken .END_OBJECT ;
210+ case START_OBJECT :
211+ return JsonToken .START_OBJECT ;
212+ case VALUE_FALSE :
213+ return JsonToken .VALUE_FALSE ;
214+ case VALUE_TRUE :
215+ return JsonToken .VALUE_TRUE ;
216+ case VALUE_NULL :
217+ return JsonToken .VALUE_NULL ;
218+ case VALUE_STRING :
219+ return JsonToken .VALUE_STRING ;
220+ case VALUE_NUMBER_FLOAT :
221+ return JsonToken .VALUE_NUMBER_FLOAT ;
222+ case VALUE_NUMBER_INT :
223+ return JsonToken .VALUE_NUMBER_INT ;
224+ case FIELD_NAME :
225+ return JsonToken .FIELD_NAME ;
226+ default :
227+ return JsonToken .NOT_AVAILABLE ;
228+ }
229+ }
230+ }
231+ }
232+
233+ // Google-http-client's JacksonParser is not public
234+ public static class MyJacksonParser extends JsonParser {
235+
236+ private final com .fasterxml .jackson .core .JsonParser parser ;
237+ private final NonstrictJacksonFactory factory ;
238+
239+ @ Override
240+ public NonstrictJacksonFactory getFactory () {
241+ return this .factory ;
242+ }
243+
244+ MyJacksonParser (NonstrictJacksonFactory factory , com .fasterxml .jackson .core .JsonParser parser ) {
245+ this .factory = factory ;
246+ this .parser = parser ;
247+ }
248+ @ Override
249+ public void close () throws IOException {
250+ this .parser .close ();
251+ }
252+ @ Override
253+ public JsonToken nextToken () throws IOException {
254+ return NonstrictJacksonFactory .convert (this .parser .nextToken ());
255+ }
256+ @ Override
257+ public String getCurrentName () throws IOException {
258+ return this .parser .getCurrentName ();
259+ }
260+ @ Override
261+ public JsonToken getCurrentToken () {
262+ return NonstrictJacksonFactory .convert (this .parser .getCurrentToken ());
263+ }
264+ @ Override
265+ public JsonParser skipChildren () throws IOException {
266+ this .parser .skipChildren ();
267+ return this ;
268+ }
269+ @ Override
270+ public String getText () throws IOException {
271+ return this .parser .getText ();
272+ }
273+ @ Override
274+ public byte getByteValue () throws IOException {
275+ return this .parser .getByteValue ();
276+ }
277+ @ Override
278+ public float getFloatValue () throws IOException {
279+ return this .parser .getFloatValue ();
280+ }
281+
282+ @ Override
283+ public int getIntValue () throws IOException {
284+ return this .parser .getIntValue ();
285+ }
286+
287+ @ Override
288+ public short getShortValue () throws IOException {
289+ return this .parser .getShortValue ();
290+ }
291+ @ Override
292+
293+ public BigInteger getBigIntegerValue () throws IOException {
294+ return this .parser .getBigIntegerValue ();
295+ }
296+
297+ @ Override
298+ public BigDecimal getDecimalValue () throws IOException {
299+ return this .parser .getDecimalValue ();
300+ }
301+
302+ @ Override
303+ public double getDoubleValue () throws IOException {
304+ return this .parser .getDoubleValue ();
305+ }
306+
307+ @ Override
308+ public long getLongValue () throws IOException {
309+ return this .parser .getLongValue ();
310+ }
311+ }
141312}
0 commit comments