diff --git a/src/main/java/org/xbib/marc/MarcField.java b/src/main/java/org/xbib/marc/MarcField.java index 1f542f2..36b528c 100644 --- a/src/main/java/org/xbib/marc/MarcField.java +++ b/src/main/java/org/xbib/marc/MarcField.java @@ -20,6 +20,7 @@ import org.xbib.marc.label.RecordLabel; import java.util.Deque; import java.util.LinkedList; +import java.util.List; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -533,10 +534,10 @@ public class MarcField implements Comparable { /** * A key is a compact representation of tag/indicator/value - * @param key - * @return + * @param key the key as string + * @return this builder */ - public Builder key(String key, String separator, String value) { + public Builder key(String key, String separator, Object value) { String[] s = key.split(separator); switch (s.length) { case 3: { @@ -547,11 +548,19 @@ public class MarcField implements Comparable { } else { indicator(indicator); } - String subfieldId = s[2].replace('_', ' '); - if (subfieldId.isEmpty()) { - subfield(" ", value); + String subfieldIds = s[2].replace('_', ' '); + if (subfieldIds.isEmpty()) { + subfield(" ", value.toString()); } else { - subfield(subfieldId, value); + if (value instanceof List) { + List list = (List) value; + char[] ch = subfieldIds.toCharArray(); + for (int i = 0; i < list.size(); i++) { + subfield(ch[i]).value(list.get(i).toString()); + } + } else { + subfield(subfieldIds, value.toString()); + } } break; } @@ -563,17 +572,17 @@ public class MarcField implements Comparable { } else { indicator(indicator); } - value(value); + value(value.toString()); break; } case 1: { tag(s[0]); - value(value); + value(value.toString()); break; } case 0: { tag(key); - value(value); + value(value.toString()); break; } default: diff --git a/src/main/java/org/xbib/marc/MarcRecord.java b/src/main/java/org/xbib/marc/MarcRecord.java index e827657..1709cb6 100644 --- a/src/main/java/org/xbib/marc/MarcRecord.java +++ b/src/main/java/org/xbib/marc/MarcRecord.java @@ -30,6 +30,8 @@ import java.util.Set; import java.util.TreeMap; import java.util.function.BiConsumer; import java.util.function.Predicate; +import java.util.logging.Level; +import java.util.logging.Logger; import java.util.regex.Pattern; /** @@ -97,8 +99,15 @@ public class MarcRecord implements Map { String leaderTag, RecordLabel recordLabel) { MarcRecord marcRecord = new MarcRecord(map); - marcRecord.parseMap(map, ".", "", (key, value) -> - marcRecord.marcFields.add(MarcField.builder().key(key, "\\.", value.toString()).build())); + marcRecord.parseMap(map, ".", "", (key, value) -> { + if (value instanceof Collection) { + MarcField.Builder builder = MarcField.builder().key(key); + ((Collection>) value).forEach(e -> builder.subfield(e.getKey(), e.getValue().toString())); + marcRecord.marcFields.add(builder.build()); + } else { + marcRecord.marcFields.add(MarcField.builder().key(key, "\\.", value.toString()).build()); + } + }); if (map.containsKey(formatTag)) { marcRecord.format = map.get(formatTag).toString(); } @@ -350,19 +359,23 @@ public class MarcRecord implements Map { } @SuppressWarnings("unchecked") - private void parseMap(Map source, String separator, String prefix, BiConsumer consumer) { + private void parseMap(Map source, String separator, String prefix, + BiConsumer consumer) { source.forEach((k, v) -> { if (v instanceof Map) { parseMap((Map) v, separator, prefix + k + separator, consumer); } else if (v instanceof Collection) { Collection collection = (Collection) v; + List> list = new LinkedList<>(); for (Object object : collection) { if (object instanceof Map) { - parseMap((Map) object, separator, prefix + k + separator, consumer); + parseMap((Map) object, separator, prefix + k + separator, (a,b) -> list.add(Map.entry(a,b))); } else { - consumer.accept(prefix + k, object); + list.add(Map.entry(prefix + k, object)); } } + Logger.getLogger("").log(Level.INFO, "list = " + list); + consumer.accept(prefix + k, list); } else { consumer.accept(prefix + k, v); } diff --git a/src/test/java/org/xbib/marc/MarcRecordTest.java b/src/test/java/org/xbib/marc/MarcRecordTest.java index cab9f9f..b5749cd 100644 --- a/src/test/java/org/xbib/marc/MarcRecordTest.java +++ b/src/test/java/org/xbib/marc/MarcRecordTest.java @@ -36,6 +36,8 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; import java.util.regex.Pattern; public class MarcRecordTest { @@ -216,6 +218,18 @@ public class MarcRecordTest { assertEquals("Hello World", marcRecord.getFields().stream().filter(m -> m.getTag().equals("100")).findFirst().get().getFirstSubfieldValue("a")); } + @Test + public void testMarcRecordFromMapNested() { + Map map = Map.of("016", Map.of("7_", List.of(Map.of("2", "DE-101", "a", "010000151"), Map.of("2", "DE-600", "a", "23-1")))); + MarcRecord marcRecord = MarcRecord.from(map); + Logger.getLogger("").log(Level.INFO, "marcrecord = " + marcRecord); + Logger.getLogger("").log(Level.INFO, "marcrecord fields = " + marcRecord.getFields()); + marcRecord.filter(f -> "016".equals(f.getTag()), f-> { + Logger.getLogger("").log(Level.INFO, "f = " + f); + }); + } + + @Test public void testMarcRecordFromMapAsMap() throws IOException { Map map = new TreeMap<>(Map.of("001", "123",