Skip to content

Commit 74e9335

Browse files
committed
NonstrictJacksonFactory
1 parent c5dcf58 commit 74e9335

1 file changed

Lines changed: 177 additions & 6 deletions

File tree

runners/google-cloud-dataflow-java/worker/src/test/java/org/apache/beam/runners/dataflow/worker/fn/control/ElementCountMonitoringInfoToCounterUpdateTransformerTest.java

Lines changed: 177 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,29 @@
1717
*/
1818
package 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;
2023
import static org.junit.Assert.assertEquals;
2124
import static org.junit.Assert.assertNotEquals;
2225
import static org.mockito.Matchers.any;
2326
import static org.mockito.Mockito.when;
2427

2528
import com.google.api.client.json.GenericJson;
29+
import com.google.api.client.json.JsonFactory;
30+
import com.google.api.client.json.JsonGenerator;
2631
import 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;
2834
import com.google.api.services.dataflow.model.CounterUpdate;
2935
import 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;
3043
import java.util.HashMap;
3144
import java.util.Map;
3245
import 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

Comments
 (0)