Skip to content

Commit c59096a

Browse files
committed
Escape feedback char in _else data.
Fixes #343.
1 parent 4e2398e commit c59096a

File tree

2 files changed

+17
-3
lines changed

2 files changed

+17
-3
lines changed

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -338,11 +338,11 @@ else if (fallbackReceiver != null) {
338338
elseNestedEntityStarted = true;
339339
}
340340

341-
send(currentLiteralName, value, fallbackReceiver);
341+
send(escapeFeedbackChar(currentLiteralName), value, fallbackReceiver);
342342
}
343343
}
344344
else {
345-
send(path, value, fallbackReceiver);
345+
send(escapeFeedbackChar(path), value, fallbackReceiver);
346346
}
347347
}
348348
}
@@ -363,6 +363,14 @@ private void send(final String path, final String value, final List<NamedValueRe
363363
}
364364
}
365365

366+
private boolean isFeedbackChar(final String name) {
367+
return name.length() != 0 && name.charAt(0) == FEEDBACK_CHAR;
368+
}
369+
370+
private String escapeFeedbackChar(final String name) {
371+
return name == null ? null : (isFeedbackChar(name) ? ESCAPE_CHAR : "") + name;
372+
}
373+
366374
/**
367375
* @param streamReceiver
368376
* the outputHandler to set
@@ -388,7 +396,7 @@ public void receive(final String name, final String value, final NamedValueSourc
388396
"encountered literal with name='null'. This indicates a bug in a function or a collector.");
389397
}
390398

391-
if (name.length() != 0 && name.charAt(0) == FEEDBACK_CHAR) {
399+
if (isFeedbackChar(name)) {
392400
dispatch(name, value, null, false);
393401
return;
394402
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ private void testElseData(final String elseKeyword) {
114114
i.literal("Borkum", "Tach");
115115
i.endEntity();
116116
i.startEntity("Germany");
117+
i.literal("@foo", "bar");
117118
i.literal("Baltrum", "Moin Moin");
118119
i.endEntity();
119120
i.endRecord();
@@ -127,6 +128,7 @@ private void testElseData(final String elseKeyword) {
127128
o.get().literal("Hawaii", "Aloha");
128129
o.get().literal("Germany.Borkum", "Tach");
129130
o.get().endEntity();
131+
o.get().literal("Germany.@foo", "bar");
130132
o.get().literal("Germany.Baltrum", "Moin Moin");
131133
o.get().endRecord();
132134
}
@@ -225,8 +227,10 @@ public void shouldHandleUnmatchedLiteralsAndEntitiesInElseNestedSource() {
225227
"</rules>",
226228
i -> {
227229
i.startRecord("1");
230+
i.literal("@id", "123");
228231
i.literal("Shikotan", "Aekap");
229232
i.startEntity("Germany");
233+
i.literal("@foo", "bar");
230234
i.literal("Langeoog", "Moin");
231235
i.literal("Baltrum", "Moin Moin");
232236
i.endEntity();
@@ -237,8 +241,10 @@ public void shouldHandleUnmatchedLiteralsAndEntitiesInElseNestedSource() {
237241
},
238242
o -> {
239243
o.get().startRecord("1");
244+
o.get().literal("@id", "123");
240245
o.get().literal("Shikotan", "Aekap");
241246
o.get().startEntity("Germany");
247+
o.get().literal("@foo", "bar");
242248
o.get().literal("Langeoog", "Moin");
243249
o.get().literal("Baltrum", "Moin Moin");
244250
o.get().endEntity();

0 commit comments

Comments
 (0)