diff --git a/gradle/publishing/publication.gradle b/gradle/publishing/publication.gradle index c35fcb9..fd7d7b5 100644 --- a/gradle/publishing/publication.gradle +++ b/gradle/publishing/publication.gradle @@ -52,13 +52,14 @@ if (project.hasProperty("signing.keyId")) { sign publishing.publications.mavenJava } } - -nexusPublishing { - repositories { - sonatype { - username = project.property('ossrhUsername') - password = project.property('ossrhPassword') - packageGroup = "org.xbib" +if (project.hasProperty("ossrhUsername")) { + nexusPublishing { + repositories { + sonatype { + username = project.property('ossrhUsername') + password = project.property('ossrhPassword') + packageGroup = "org.xbib" + } } } } diff --git a/src/main/java/org/xbib/marc/MarcField.java b/src/main/java/org/xbib/marc/MarcField.java index e5db143..acd20d0 100644 --- a/src/main/java/org/xbib/marc/MarcField.java +++ b/src/main/java/org/xbib/marc/MarcField.java @@ -18,9 +18,11 @@ package org.xbib.marc; import org.xbib.marc.dialects.mab.MabSubfieldControl; import org.xbib.marc.label.RecordLabel; +import java.util.Arrays; import java.util.Collection; import java.util.Deque; import java.util.LinkedList; +import java.util.List; import java.util.Map; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -534,22 +536,30 @@ public class MarcField implements Comparable { } /** - * A key is a compact representation of tag/indicator/value + * A key is a compact representation of tag/indicator/value that are separated by a separator. * @param key the key as string + * @param separator the separator in the key + * @param value the value * @return this builder */ - @SuppressWarnings("unchecked") public Builder key(String key, String separator, Object value) { - String[] s = key.split(separator); - switch (s.length) { + return key(Arrays.asList(key.split(separator)), value); + } + + @SuppressWarnings("unchecked") + public Builder key(List key, Object value) { + switch (key.size()) { case 0: { - // is that even possible? - tag(key); - value(value.toString()); + if (value instanceof Collection) { + Collection> collection = (Collection>) value; + for (Map.Entry entry : collection) { + tag(entry.getKey()).value(entry.getValue().toString()); + } + } break; } case 1: { - tag(s[0]); + tag(key.get(0)); if (value instanceof Collection) { Collection> collection = (Collection>) value; for (Map.Entry entry : collection) { @@ -561,8 +571,8 @@ public class MarcField implements Comparable { break; } case 2: { - tag(s[0]); - String indicator = s[1].replace('_', ' '); + tag(key.get(0)); + String indicator = key.get(1).replace('_', ' '); if (indicator.isEmpty()) { indicator(" "); } else { @@ -579,14 +589,14 @@ public class MarcField implements Comparable { break; } case 3: { - tag(s[0]); - String indicator = s[1].replace('_', ' '); + tag(key.get(0)); + String indicator = key.get(1).replace('_', ' '); if (indicator.isEmpty()) { indicator(" "); } else { indicator(indicator); } - String subfieldIds = s[2].replace('_', ' '); + String subfieldIds = key.get(2).replace('_', ' '); if (subfieldIds.isEmpty()) { subfieldIds = " "; } @@ -601,7 +611,7 @@ public class MarcField implements Comparable { break; } default: - throw new IllegalArgumentException("key specification is invalid: " + key + " length = " + s.length); + throw new IllegalArgumentException("key specification is invalid: " + key); } return this; } diff --git a/src/main/java/org/xbib/marc/MarcRecord.java b/src/main/java/org/xbib/marc/MarcRecord.java index 21bcb04..d588e0f 100644 --- a/src/main/java/org/xbib/marc/MarcRecord.java +++ b/src/main/java/org/xbib/marc/MarcRecord.java @@ -22,6 +22,7 @@ import static org.xbib.marc.json.MarcJsonWriter.TYPE_TAG; import org.xbib.marc.label.RecordLabel; import java.util.Collection; +import java.util.Deque; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -30,6 +31,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,12 +100,12 @@ 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).build())); + marcRecord.parseMap(map, "", new LinkedList<>(), (key, value) -> + marcRecord.marcFields.add(MarcField.builder().key(key, value).build())); if (map.containsKey(formatTag)) { marcRecord.format = map.get(formatTag).toString(); } - if ( map.containsKey(typeTag)) { + if (map.containsKey(typeTag)) { marcRecord.type = map.get(typeTag).toString(); } if (map.containsKey(leaderTag)) { @@ -478,17 +481,21 @@ public class MarcRecord implements Map { @SuppressWarnings("unchecked") private void parseMap(Map source, - String separator, String prefix, - BiConsumer consumer) { + String prefix, + LinkedList key, + BiConsumer, Object> consumer) { + if (!prefix.isEmpty()) { + key.addLast(prefix); + } List> list = new LinkedList<>(); source.forEach((k, v) -> { if (v instanceof Map) { - parseMap((Map) v, separator, prefix + k + separator, consumer); + parseMap((Map) v, k, key, consumer); } else if (v instanceof Collection) { Collection collection = (Collection) v; for (Object object : collection) { if (object instanceof Map) { - parseMap((Map) object, separator, prefix + k + separator, consumer); + parseMap((Map) object, k, key, consumer); } else { list.add(Map.entry(k, object)); } @@ -498,7 +505,10 @@ public class MarcRecord implements Map { } }); if (!list.isEmpty()) { - consumer.accept(prefix, list); + consumer.accept(key, list); + } + if (!prefix.isEmpty()) { + key.removeLast(); } } }