Skip to content

Commit aed6de7

Browse files
authored
Merge pull request #387 from metafacture/382-recordPath
Tweak `recordPath` code, add test cases
2 parents 5cbd698 + 5ffe4b5 commit aed6de7

File tree

2 files changed

+45
-16
lines changed

2 files changed

+45
-16
lines changed

metafacture-json/src/main/java/org/metafacture/json/JsonDecoder.java

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import java.io.IOException;
3434
import java.util.Arrays;
3535
import java.util.List;
36-
import java.util.stream.Collectors;
36+
import java.util.stream.Stream;
3737

3838
/**
3939
* Decodes a record in JSON format.
@@ -132,21 +132,27 @@ public void resetRecordCount() {
132132
@Override
133133
public void process(final String json) {
134134
assert !isClosed();
135-
final List<String> records = recordPath.isEmpty() ? Arrays.asList(json)
136-
: matches(JsonPath.read(json, recordPath));
137-
records.forEach(record -> {
138-
createParser(record);
139-
try {
140-
decode();
141-
} catch (final IOException e) {
142-
throw new MetafactureException(e);
143-
} finally {
144-
closeParser();
145-
}
146-
});
135+
if (recordPath.isEmpty()) {
136+
processRecord(json);
137+
} else {
138+
matches(JsonPath.read(json, recordPath)).forEach(record -> {
139+
processRecord(record);
140+
});
141+
}
142+
}
143+
144+
private void processRecord(String record) {
145+
createParser(record);
146+
try {
147+
decode();
148+
} catch (final IOException e) {
149+
throw new MetafactureException(e);
150+
} finally {
151+
closeParser();
152+
}
147153
}
148154

149-
private List<String> matches(Object obj) {
155+
private Stream<String> matches(Object obj) {
150156
final List<?> records = (obj instanceof List<?>) ? ((List<?>) obj) : Arrays.asList(obj);
151157
return records.stream().map(doc -> {
152158
try {
@@ -155,7 +161,7 @@ private List<String> matches(Object obj) {
155161
e.printStackTrace();
156162
return doc.toString();
157163
}
158-
}).collect(Collectors.toList());
164+
});
159165
}
160166

161167
@Override

metafacture-json/src/test/java/org/metafacture/json/JsonDecoderTest.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ public void testShouldProcessConcatenatedRecords() {
152152
}
153153

154154
@Test
155-
public void testShouldProcessRecordsInArray() {
155+
public void testShouldProcessRecordsInArrayField() {
156156
jsonDecoder.setRecordPath("$.data");
157157
jsonDecoder.process(
158158
"{\"data\":[" + "{\"lit\": \"record 1\"}," +
@@ -167,6 +167,29 @@ public void testShouldProcessRecordsInArray() {
167167
ordered.verify(receiver).endRecord();
168168
}
169169

170+
@Test
171+
public void testShouldProcessRecordsInArrayRoot() {
172+
jsonDecoder.setRecordPath("$");
173+
jsonDecoder.process(
174+
"[" + "{\"lit\": \"record 1\"}," +
175+
"{\"lit\": \"record 2\"}" + "]");
176+
177+
final InOrder ordered = inOrder(receiver);
178+
ordered.verify(receiver).startRecord("1");
179+
ordered.verify(receiver).literal("lit", "record 1");
180+
ordered.verify(receiver).endRecord();
181+
ordered.verify(receiver).startRecord("2");
182+
ordered.verify(receiver).literal("lit", "record 2");
183+
ordered.verify(receiver).endRecord();
184+
}
185+
186+
@Test(expected=MetafactureException.class)
187+
public void testRootArrayNoRecordPath() {
188+
jsonDecoder.process(
189+
"[" + "{\"lit\": \"record 1\"}," +
190+
"{\"lit\": \"record 2\"}" + "]");
191+
}
192+
170193
@Test
171194
public void testShouldProcessMultipleRecords() {
172195
jsonDecoder.process("{\"lit\": \"record 1\"}");

0 commit comments

Comments
 (0)