diff --git a/metafacture-biblio/src/main/java/org/metafacture/biblio/marc21/MarcXmlEncoder.java b/metafacture-biblio/src/main/java/org/metafacture/biblio/marc21/MarcXmlEncoder.java
index 9fe831575..5b9ad3dad 100644
--- a/metafacture-biblio/src/main/java/org/metafacture/biblio/marc21/MarcXmlEncoder.java
+++ b/metafacture-biblio/src/main/java/org/metafacture/biblio/marc21/MarcXmlEncoder.java
@@ -103,8 +103,7 @@ public void setXmlEncoding(String xmlEncoding) {
/**
* Formats the resulting xml, by indentation.
*
- * @param formatted
- * True, if formatting is activated.
+ * @param formatted True, if formatting is activated.
*/
public void setFormatted(boolean formatted) {
this.formatted = formatted;
@@ -156,7 +155,11 @@ public void startEntity(final String name) {
writeRaw(String.format(DATAFIELD_OPEN_TEMPLATE, tag, ind1, ind2));
prettyPrintNewLine();
incrementIndentationLevel();
+ } else {
+ prettyPrintIndentation();
+ writeRaw(LEADER_OPEN_TEMPLATE);
}
+
}
@Override
@@ -172,22 +175,23 @@ public void endEntity() {
@Override
public void literal(final String name, final String value) {
+ if (value == null || value.isEmpty())
+ return;
if (currentEntity.equals("")) {
prettyPrintIndentation();
- writeRaw(String.format(CONTROLFIELD_OPEN_TEMPLATE, name));
+ writeRaw(String.format(CONTROLFIELD_OPEN_TEMPLATE, name.replaceFirst("\\W", "")));
writeEscaped(value.trim());
writeRaw(CONTROLFIELD_CLOSE);
prettyPrintNewLine();
} else if (!currentEntity.equals(Marc21EventNames.LEADER_ENTITY)) {
prettyPrintIndentation();
- writeRaw(String.format(SUBFIELD_OPEN_TEMPLATE, name));
+ writeRaw(String.format(SUBFIELD_OPEN_TEMPLATE, name.charAt(name.indexOf('.') + 1)));
writeEscaped(value.trim());
writeRaw(SUBFIELD_CLOSE);
prettyPrintNewLine();
} else {
- if (name.equals(Marc21EventNames.LEADER_ENTITY)) {
- prettyPrintIndentation();
- writeRaw(LEADER_OPEN_TEMPLATE + value + LEADER_CLOSE_TEMPLATE);
+ {
+ writeRaw(value + LEADER_CLOSE_TEMPLATE);
prettyPrintNewLine();
}
}
@@ -256,4 +260,4 @@ private void sendAndClearData() {
getReceiver().process(builder.toString());
builder.delete(0, builder.length());
}
-}
\ No newline at end of file
+}
diff --git a/metamorph-test/src/main/resources/schemata/metamorph.xsd b/metamorph-test/src/main/resources/schemata/metamorph.xsd
index 52c04d2c4..f314f7f9a 100644
--- a/metamorph-test/src/main/resources/schemata/metamorph.xsd
+++ b/metamorph-test/src/main/resources/schemata/metamorph.xsd
@@ -54,12 +54,14 @@
+
+
@@ -302,9 +304,9 @@
+ default="false" />
+ default="false" />
diff --git a/metamorph/src/main/java/org/metafacture/metamorph/Metamorph.java b/metamorph/src/main/java/org/metafacture/metamorph/Metamorph.java
index 2a141c7fa..ae064d9df 100644
--- a/metamorph/src/main/java/org/metafacture/metamorph/Metamorph.java
+++ b/metamorph/src/main/java/org/metafacture/metamorph/Metamorph.java
@@ -268,8 +268,8 @@ public void startEntity(final String name) {
entityCountStack.push(Integer.valueOf(entityCount));
flattener.startEntity(name);
-
-
+ if (maps.containsKey(METADATA) && maps.get(METADATA).getOrDefault("version","").equals("1.1"))
+ outputStreamReceiver.startEntity(name);
}
@@ -278,7 +278,8 @@ public void endEntity() {
dispatch(flattener.getCurrentPath(), "", null);
currentEntityCount = entityCountStack.pop().intValue();
flattener.endEntity();
-
+ if (maps.containsKey(METADATA) && maps.get(METADATA).getOrDefault("version","").equals("1.1"))
+ outputStreamReceiver.endEntity();
}
diff --git a/metamorph/src/main/resources/schemata/metamorph.xsd b/metamorph/src/main/resources/schemata/metamorph.xsd
index 9bbea22db..832abc480 100644
--- a/metamorph/src/main/resources/schemata/metamorph.xsd
+++ b/metamorph/src/main/resources/schemata/metamorph.xsd
@@ -54,12 +54,14 @@
+
+
diff --git a/metamorph/src/test/java/org/metafacture/metamorph/MetamorphTest.java b/metamorph/src/test/java/org/metafacture/metamorph/MetamorphTest.java
index 8e0715229..f94624287 100644
--- a/metamorph/src/test/java/org/metafacture/metamorph/MetamorphTest.java
+++ b/metamorph/src/test/java/org/metafacture/metamorph/MetamorphTest.java
@@ -21,6 +21,7 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
@@ -30,9 +31,11 @@
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
+import org.metafacture.framework.StreamReceiver;
import org.metafacture.framework.helpers.DefaultStreamReceiver;
import org.metafacture.metamorph.api.Maps;
import org.metafacture.metamorph.api.NamedValueReceiver;
+import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
@@ -45,13 +48,15 @@
* @author Christoph Böhme (rewrite)
*/
public final class MetamorphTest {
-
@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule();
@Mock
private NamedValueReceiver namedValueReceiver;
+ @Mock
+ private StreamReceiver receiver;
+
private Metamorph metamorph;
@Before
@@ -189,4 +194,57 @@ public void shouldThrowIllegalStateExceptionIfEntityIsNotClosed() {
metamorph.endRecord(); // Exception expected
}
+ @Test
+ public void metamorph1() {
+ metamorph = InlineMorph.in(this) //
+ .with("") //
+ .with(" ")//
+ .with("")//
+ .createConnectedTo(receiver);
+
+ metamorph.startRecord("1");
+ metamorph.startEntity("clone");
+ metamorph.literal("id", "0");
+ metamorph.endEntity();
+ metamorph.startEntity("clone");
+ metamorph.literal("id", "1");
+ metamorph.endEntity();
+ metamorph.endRecord();
+
+ final InOrder ordered = inOrder(receiver);
+ ordered.verify(receiver).startRecord("1");
+ ordered.verify(receiver).literal("clone.id", "0");
+ ordered.verify(receiver).literal("clone.id", "1");
+ ordered.verify(receiver).endRecord();
+ }
+
+ @Test
+ public void metamorph1_1() {
+ metamorph = InlineMorph.in(this).with("") //
+ .with("1.1")//
+ .with("")//
+ .with("")//
+ .with(" ")//
+ .with("")//
+ .createConnectedTo(receiver);
+
+ metamorph.startRecord("1");
+ metamorph.startEntity("clone");
+ metamorph.literal("id", "0");
+ metamorph.endEntity();
+ metamorph.startEntity("clone");
+ metamorph.literal("id", "1");
+ metamorph.endEntity();
+ metamorph.endRecord();
+
+ final InOrder ordered = inOrder(receiver);
+ ordered.verify(receiver).startRecord("1");
+ ordered.verify(receiver).startEntity("clone");
+ ordered.verify(receiver).literal("clone.id", "0");
+ ordered.verify(receiver).endEntity();
+ ordered.verify(receiver).startEntity("clone");
+ ordered.verify(receiver).literal("clone.id", "1");
+ ordered.verify(receiver).endEntity();
+ ordered.verify(receiver).endRecord();
+ }
}