diff --git a/metamorph/src/main/java/org/metafacture/metamorph/Metamorph.java b/metamorph/src/main/java/org/metafacture/metamorph/Metamorph.java index 195afd71b..837d2368b 100644 --- a/metamorph/src/main/java/org/metafacture/metamorph/Metamorph.java +++ b/metamorph/src/main/java/org/metafacture/metamorph/Metamorph.java @@ -103,7 +103,7 @@ public final class Metamorph implements StreamPipe, NamedValuePi private boolean elseNestedEntityStarted; private String currentLiteralName; private static final Logger LOG = LoggerFactory.getLogger(Metamorph.class); - + final private Pattern literalPatternOfEntityMarker = Pattern.compile(flattener.getEntityMarker(), Pattern.LITERAL); protected Metamorph() { // package private init(); @@ -280,7 +280,6 @@ public void startEntity(final String name) { ++entityCount; currentEntityCount = entityCount; entityCountStack.push(Integer.valueOf(entityCount)); - flattener.startEntity(name); } @@ -318,11 +317,10 @@ public void closeStream() { private void dispatch(final String path, final String value, final List fallbackReceiver, final boolean endEntity) { final List matchingData = dataRegistry.get(path); - if (matchingData != null && !matchingData.isEmpty()) { send(path, value, matchingData); } - else if (fallbackReceiver != null) { + else if (fallbackReceiver != null && (literalPatternOfEntityMarker.split(path).length >0 && dataRegistry.get(literalPatternOfEntityMarker.split(path)[0]).isEmpty())) { if (endEntity) { if (elseNestedEntityStarted) { outputStreamReceiver.endEntity(); @@ -337,7 +335,6 @@ else if (fallbackReceiver != null) { outputStreamReceiver.startEntity(entityName); elseNestedEntityStarted = true; } - send(currentLiteralName, value, fallbackReceiver); } else { diff --git a/metamorph/src/test/java/org/metafacture/metamorph/TestMetamorphBasics.java b/metamorph/src/test/java/org/metafacture/metamorph/TestMetamorphBasics.java index ea9599aa6..8263f33e6 100644 --- a/metamorph/src/test/java/org/metafacture/metamorph/TestMetamorphBasics.java +++ b/metamorph/src/test/java/org/metafacture/metamorph/TestMetamorphBasics.java @@ -355,6 +355,69 @@ else if (separatesFromEntity) { ); } + @Test + public void shouldNotHandleDataByElseNestedSourceIfDataBelonginToEntityIsRuledByMorph() { + assertMorph(receiver, + "" + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + " " + + "", + i -> { + i.startRecord("1"); + i.literal("Shikotan", "Aekap"); + i.startEntity("Germany"); + i.literal("Langeoog", "Moin"); + i.literal("Baltrum", "Moin Moin"); + i.endEntity(); + i.startEntity("USA1"); + i.literal("Sylt", "Aloha"); + i.endEntity(); + i.startEntity("USA2"); + i.literal("Sylt", "Aloha"); + i.literal("Langeoog", "Moin"); + i.literal("Baltrum", "Moin Moin"); + i.endEntity(); + i.startEntity("USA2"); + i.literal("Langeoog", "Moin"); + i.literal("Baltrum", "Moin Moin"); + i.endEntity(); + i.startEntity("USA3"); + i.literal("Baltrum", "Moin Moin"); + i.endEntity(); + i.endRecord(); + }, + (o, f) -> { + o.get().startRecord("1"); + o.get().literal("Shikotan", "Aekap"); + o.get().startEntity("Germany"); + o.get().literal("Langeoog", "Moin"); + o.get().literal("Baltrum", "Moin Moin"); + o.get().endEntity(); + o.get().startEntity("USA1"); + o.get().literal("Hawaii", "Aloha"); + o.get().endEntity(); + o.get().startEntity("USA2"); + o.get().literal("Hawaii", "Aloha"); + o.get().literal("Langeoog", "Moin"); + o.get().endEntity(); + o.get().startEntity("USA2"); + o.get().literal("Langeoog", "Moin"); + o.get().endEntity(); + o.get().endRecord(); + } + ); + } + + @Test public void shouldMatchCharacterWithQuestionMarkWildcard() { assertMorph(receiver,