Skip to content

Commit f9a952e

Browse files
committed
Introduce Metamorph 1.1
With this version of Metamorph entities (well, entity events) can be passed through. It is slightly incomaptible with the default Metamorph where two tests would fail: - org.metafacture.metamorph.collectors.EntityTest > shouldEmitEntityOnEachFlushEvent - org.metafacture.metamorph.functions.UniqueTest -> shouldAllowSelectingTheUniqueScope So this introduces a "<version>" element under the "<meta>" element in morph. The data is flattened, as with Metamorph 1, but the entity's "start" and "end" events are passed through so that the receiver can handle the flattened data structure, unflatten it etc. By preserving the entity events it's now also possible, without any workarounds, to handle reiterations of entities having the same name. - add "version" element to metamorph.xsd See #107. See also https://github.com/hagbeck/metafacture-sandbox/tree/master/enrich_marcxml.
1 parent 8b6652f commit f9a952e

File tree

4 files changed

+69
-6
lines changed

4 files changed

+69
-6
lines changed

metamorph-test/src/main/resources/schemata/metamorph.xsd

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,14 @@
5454
<complexType>
5555
<sequence>
5656
<element ref="tns:name" maxOccurs="1" minOccurs="0" />
57+
<element ref="tns:version" maxOccurs="1" minOccurs="0" />
5758
<element ref="tns:annotation" maxOccurs="1" minOccurs="0" />
5859
</sequence>
5960
</complexType>
6061
</element>
6162

6263
<element name="name" type="string" />
64+
<element name="version" type="string" />
6365
<element name="annotation" type="string" />
6466

6567
<element name="macros">
@@ -302,9 +304,9 @@
302304
<attribute name="value" type="string" use="required" />
303305

304306
<attribute name="reset" type="boolean" use="optional"
305-
default="false" />
307+
default="false" />
306308
<attribute name="sameEntity" type="boolean" use="optional"
307-
default="false" />
309+
default="false" />
308310
<attribute name="flushWith" type="string" use="optional" />
309311
</complexType>
310312
</element>

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -268,8 +268,8 @@ public void startEntity(final String name) {
268268
entityCountStack.push(Integer.valueOf(entityCount));
269269

270270
flattener.startEntity(name);
271-
272-
271+
if (maps.containsKey(METADATA) && maps.get(METADATA).getOrDefault("version","").equals("1.1"))
272+
outputStreamReceiver.startEntity(name);
273273

274274
}
275275

@@ -278,7 +278,8 @@ public void endEntity() {
278278
dispatch(flattener.getCurrentPath(), "", null);
279279
currentEntityCount = entityCountStack.pop().intValue();
280280
flattener.endEntity();
281-
281+
if (maps.containsKey(METADATA) && maps.get(METADATA).getOrDefault("version","").equals("1.1"))
282+
outputStreamReceiver.endEntity();
282283
}
283284

284285

metamorph/src/main/resources/schemata/metamorph.xsd

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,14 @@
5454
<complexType>
5555
<sequence>
5656
<element ref="tns:name" maxOccurs="1" minOccurs="0" />
57+
<element ref="tns:version" maxOccurs="1" minOccurs="0" />
5758
<element ref="tns:annotation" maxOccurs="1" minOccurs="0" />
5859
</sequence>
5960
</complexType>
6061
</element>
6162

6263
<element name="name" type="string" />
64+
<element name="version" type="string" />
6365
<element name="annotation" type="string" />
6466

6567
<element name="macros">

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

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import static org.mockito.ArgumentMatchers.any;
2222
import static org.mockito.ArgumentMatchers.anyInt;
2323
import static org.mockito.ArgumentMatchers.eq;
24+
import static org.mockito.Mockito.inOrder;
2425
import static org.mockito.Mockito.never;
2526
import static org.mockito.Mockito.verify;
2627

@@ -30,9 +31,11 @@
3031
import org.junit.Before;
3132
import org.junit.Rule;
3233
import org.junit.Test;
34+
import org.metafacture.framework.StreamReceiver;
3335
import org.metafacture.framework.helpers.DefaultStreamReceiver;
3436
import org.metafacture.metamorph.api.Maps;
3537
import org.metafacture.metamorph.api.NamedValueReceiver;
38+
import org.mockito.InOrder;
3639
import org.mockito.Mock;
3740
import org.mockito.junit.MockitoJUnit;
3841
import org.mockito.junit.MockitoRule;
@@ -45,13 +48,15 @@
4548
* @author Christoph Böhme (rewrite)
4649
*/
4750
public final class MetamorphTest {
48-
4951
@Rule
5052
public MockitoRule mockitoRule = MockitoJUnit.rule();
5153

5254
@Mock
5355
private NamedValueReceiver namedValueReceiver;
5456

57+
@Mock
58+
private StreamReceiver receiver;
59+
5560
private Metamorph metamorph;
5661

5762
@Before
@@ -189,4 +194,57 @@ public void shouldThrowIllegalStateExceptionIfEntityIsNotClosed() {
189194
metamorph.endRecord(); // Exception expected
190195
}
191196

197+
@Test
198+
public void metamorph1() {
199+
metamorph = InlineMorph.in(this) //
200+
.with("<rules>") //
201+
.with(" <data source='_else'/>")//
202+
.with("</rules>")//
203+
.createConnectedTo(receiver);
204+
205+
metamorph.startRecord("1");
206+
metamorph.startEntity("clone");
207+
metamorph.literal("id", "0");
208+
metamorph.endEntity();
209+
metamorph.startEntity("clone");
210+
metamorph.literal("id", "1");
211+
metamorph.endEntity();
212+
metamorph.endRecord();
213+
214+
final InOrder ordered = inOrder(receiver);
215+
ordered.verify(receiver).startRecord("1");
216+
ordered.verify(receiver).literal("clone.id", "0");
217+
ordered.verify(receiver).literal("clone.id", "1");
218+
ordered.verify(receiver).endRecord();
219+
}
220+
221+
@Test
222+
public void metamorph1_1() {
223+
metamorph = InlineMorph.in(this).with("<meta>") //
224+
.with("<version>1.1</version>")//
225+
.with("</meta>")//
226+
.with("<rules>")//
227+
.with(" <data source='_else'/>")//
228+
.with("</rules>")//
229+
.createConnectedTo(receiver);
230+
231+
metamorph.startRecord("1");
232+
metamorph.startEntity("clone");
233+
metamorph.literal("id", "0");
234+
metamorph.endEntity();
235+
metamorph.startEntity("clone");
236+
metamorph.literal("id", "1");
237+
metamorph.endEntity();
238+
metamorph.endRecord();
239+
240+
final InOrder ordered = inOrder(receiver);
241+
ordered.verify(receiver).startRecord("1");
242+
ordered.verify(receiver).startEntity("clone");
243+
ordered.verify(receiver).literal("clone.id", "0");
244+
ordered.verify(receiver).endEntity();
245+
ordered.verify(receiver).startEntity("clone");
246+
ordered.verify(receiver).literal("clone.id", "1");
247+
ordered.verify(receiver).endEntity();
248+
ordered.verify(receiver).endRecord();
249+
}
192250
}

0 commit comments

Comments
 (0)