Skip to content

Commit 9b2f70e

Browse files
committed
Ignore _elseNestedEntity if entity is ruled by morph
This reimplemets commit f009e28: "Data which is handled by metamorph rules will NOT be passed through (hence the aptly named "_else"). If you want to use data in the morph AND pass it through, you have to add an explicit rule for this, as usual." This behaviour is not the default, though. It can be achieved by this morph rule: <entity name='$name' sameEntity='true' reset='true' flushWith='$name' flushIncomplete='true'>" where $name is the name of the entity you want to treat. See #338.
1 parent 6f871cc commit 9b2f70e

File tree

2 files changed

+65
-5
lines changed

2 files changed

+65
-5
lines changed

metamorph/src/main/java/org/metafacture/metamorph/Metamorph.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ public final class Metamorph implements StreamPipe<StreamReceiver>, NamedValuePi
103103
private boolean elseNestedEntityStarted;
104104
private String currentLiteralName;
105105
private static final Logger LOG = LoggerFactory.getLogger(Metamorph.class);
106-
106+
final private Pattern literalPatternOfEntityMarker = Pattern.compile(flattener.getEntityMarker(), Pattern.LITERAL);
107107
protected Metamorph() {
108108
// package private
109109
init();
@@ -280,7 +280,6 @@ public void startEntity(final String name) {
280280
++entityCount;
281281
currentEntityCount = entityCount;
282282
entityCountStack.push(Integer.valueOf(entityCount));
283-
284283
flattener.startEntity(name);
285284
}
286285

@@ -318,11 +317,10 @@ public void closeStream() {
318317

319318
private void dispatch(final String path, final String value, final List<NamedValueReceiver> fallbackReceiver, final boolean endEntity) {
320319
final List<NamedValueReceiver> matchingData = dataRegistry.get(path);
321-
322320
if (matchingData != null && !matchingData.isEmpty()) {
323321
send(path, value, matchingData);
324322
}
325-
else if (fallbackReceiver != null) {
323+
else if (fallbackReceiver != null && (literalPatternOfEntityMarker.split(path).length >0 && dataRegistry.get(literalPatternOfEntityMarker.split(path)[0]).isEmpty())) {
326324
if (endEntity) {
327325
if (elseNestedEntityStarted) {
328326
outputStreamReceiver.endEntity();
@@ -337,7 +335,6 @@ else if (fallbackReceiver != null) {
337335
outputStreamReceiver.startEntity(entityName);
338336
elseNestedEntityStarted = true;
339337
}
340-
341338
send(currentLiteralName, value, fallbackReceiver);
342339
}
343340
else {

metamorph/src/test/java/org/metafacture/metamorph/TestMetamorphBasics.java

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,69 @@ else if (separatesFromEntity) {
355355
);
356356
}
357357

358+
@Test
359+
public void shouldNotHandleDataByElseNestedSourceIfDataBelonginToEntityIsRuledByMorph() {
360+
assertMorph(receiver,
361+
"<rules>" +
362+
" <entity name='USA1'>" +
363+
" <data source='USA1.Sylt' name='Hawaii' />" +
364+
" </entity>" +
365+
" <entity name='USA2' sameEntity='true' reset='true' flushWith='USA2' flushIncomplete='true'>" +
366+
" <data source='USA2.Sylt' name='Hawaii' />" +
367+
" <data source='USA2.Langeoog' name='Langeoog' />" +
368+
" </entity>" +
369+
" <entity name='USA3' sameEntity='true' reset='true' flushWith='USA3' flushIncomplete='true'>" +
370+
" <data source='USA3.Sylt' name='Hawaii' />" +
371+
" </entity>" +
372+
" <data source='_elseNested' />" +
373+
"</rules>",
374+
i -> {
375+
i.startRecord("1");
376+
i.literal("Shikotan", "Aekap");
377+
i.startEntity("Germany");
378+
i.literal("Langeoog", "Moin");
379+
i.literal("Baltrum", "Moin Moin");
380+
i.endEntity();
381+
i.startEntity("USA1");
382+
i.literal("Sylt", "Aloha");
383+
i.endEntity();
384+
i.startEntity("USA2");
385+
i.literal("Sylt", "Aloha");
386+
i.literal("Langeoog", "Moin");
387+
i.literal("Baltrum", "Moin Moin");
388+
i.endEntity();
389+
i.startEntity("USA2");
390+
i.literal("Langeoog", "Moin");
391+
i.literal("Baltrum", "Moin Moin");
392+
i.endEntity();
393+
i.startEntity("USA3");
394+
i.literal("Baltrum", "Moin Moin");
395+
i.endEntity();
396+
i.endRecord();
397+
},
398+
(o, f) -> {
399+
o.get().startRecord("1");
400+
o.get().literal("Shikotan", "Aekap");
401+
o.get().startEntity("Germany");
402+
o.get().literal("Langeoog", "Moin");
403+
o.get().literal("Baltrum", "Moin Moin");
404+
o.get().endEntity();
405+
o.get().startEntity("USA1");
406+
o.get().literal("Hawaii", "Aloha");
407+
o.get().endEntity();
408+
o.get().startEntity("USA2");
409+
o.get().literal("Hawaii", "Aloha");
410+
o.get().literal("Langeoog", "Moin");
411+
o.get().endEntity();
412+
o.get().startEntity("USA2");
413+
o.get().literal("Langeoog", "Moin");
414+
o.get().endEntity();
415+
o.get().endRecord();
416+
}
417+
);
418+
}
419+
420+
358421
@Test
359422
public void shouldMatchCharacterWithQuestionMarkWildcard() {
360423
assertMorph(receiver,

0 commit comments

Comments
 (0)