diff --git a/gradle.properties b/gradle.properties index d2b8935..4c98a5c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,13 +1,13 @@ group = org.xbib name = marc -version = 2.6.0 +version = 2.7.0 org.gradle.warning.mode = ALL -gradle.wrapper.version = 7.3.2 +gradle.wrapper.version = 7.5.1 xbib-content.version = 4.0.0 xbib-bibliographic-character-sets.version = 2.0.0 xalan.version = 2.7.2 -xmlunit-matchers.version = 2.6.3 +xmlunit-matchers.version = 2.8.4 system-rules.version = 1.19.0 mockito.version = 3.3.3 marc4j.version = 2.9.2 diff --git a/gradle/compile/java.gradle b/gradle/compile/java.gradle index 178355e..7c5f2bc 100644 --- a/gradle/compile/java.gradle +++ b/gradle/compile/java.gradle @@ -6,13 +6,13 @@ java { } compileJava { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } compileTestJava { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } jar { diff --git a/gradle/test/junit5.gradle b/gradle/test/junit5.gradle index d7f6f78..ea84474 100644 --- a/gradle/test/junit5.gradle +++ b/gradle/test/junit5.gradle @@ -24,6 +24,17 @@ test { "${result.skippedTestCount} skipped" } } - // massive heap for for xmlunit DOM comparer - jvmArgs '-Xmx2048m' + jvmArgs '-Xmx2048m', + '--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED', + '--add-exports=java.base/jdk.internal.ref=ALL-UNNAMED', + '--add-exports=java.base/sun.nio.ch=ALL-UNNAMED', + '--add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED', + '--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED', + '--add-opens=jdk.compiler/com.sun.tools.javac=ALL-UNNAMED', + '--add-opens=java.base/java.lang=ALL-UNNAMED', + '--add-opens=java.base/java.lang.reflect=ALL-UNNAMED', + '--add-opens=java.base/java.io=ALL-UNNAMED', + '--add-opens=java.base/java.nio=ALL-UNNAMED', + '--add-opens=java.base/java.util=ALL-UNNAMED' + systemProperty 'java.util.logging.config.file', 'src/test/resources/logging.properties' } diff --git a/src/main/java/org/xbib/marc/label/Encoding.java b/src/main/java/org/xbib/marc/label/Encoding.java index 2530079..190893e 100644 --- a/src/main/java/org/xbib/marc/label/Encoding.java +++ b/src/main/java/org/xbib/marc/label/Encoding.java @@ -59,6 +59,7 @@ public enum Encoding { public static Encoding from(char ch) { switch (ch) { case ' ': + case '#': return MARC8; case 'a': return UCS_UNICODE; diff --git a/src/main/java/org/xbib/marc/label/EncodingLevel.java b/src/main/java/org/xbib/marc/label/EncodingLevel.java index 83f4ec9..ac4763b 100644 --- a/src/main/java/org/xbib/marc/label/EncodingLevel.java +++ b/src/main/java/org/xbib/marc/label/EncodingLevel.java @@ -106,6 +106,7 @@ public enum EncodingLevel { public static EncodingLevel from(char ch) { switch (ch) { case ' ': + case '#': return FULL; case '1': return FULL_NOT_EXAMINED; @@ -125,6 +126,14 @@ public enum EncodingLevel { return UNKNOWN; case 'z': return NOT_APPLICABLE; + case 'I': + return LESS_THAN_FULL_NOT_EXAMINED; + case 'K': + return LESS_THAN_FULL_NOT_EXAMINED; + case 'M': + return LESS_THAN_FULL_NOT_EXAMINED; + case 'U': + return UNKNOWN; default: logger.log(Level.FINEST, () -> "unknown encoding level " + ch); return FULL; diff --git a/src/main/java/org/xbib/marc/label/MultipartResourceRecordLevel.java b/src/main/java/org/xbib/marc/label/MultipartResourceRecordLevel.java index 44ddc69..4251be5 100644 --- a/src/main/java/org/xbib/marc/label/MultipartResourceRecordLevel.java +++ b/src/main/java/org/xbib/marc/label/MultipartResourceRecordLevel.java @@ -63,6 +63,7 @@ public enum MultipartResourceRecordLevel { public static MultipartResourceRecordLevel from(char ch) { switch (ch) { case ' ': + case '#': return NOT_SPECIFIED; case 'a': return SET; diff --git a/src/main/java/org/xbib/marc/label/TypeOfControl.java b/src/main/java/org/xbib/marc/label/TypeOfControl.java index 77f91cb..b0a88eb 100644 --- a/src/main/java/org/xbib/marc/label/TypeOfControl.java +++ b/src/main/java/org/xbib/marc/label/TypeOfControl.java @@ -50,9 +50,10 @@ public enum TypeOfControl { public static TypeOfControl from(char ch) { switch (ch) { - case ' ' : + case ' ': + case '#': return UNSPECIFIED; - case 'a' : + case 'a': return ARCHIVAL; default: logger.log(Level.FINEST, () -> "unknown type of control: " + ch); diff --git a/src/main/java/org/xbib/marc/label/TypeOfRecord.java b/src/main/java/org/xbib/marc/label/TypeOfRecord.java index 61dbcc3..a024cbb 100644 --- a/src/main/java/org/xbib/marc/label/TypeOfRecord.java +++ b/src/main/java/org/xbib/marc/label/TypeOfRecord.java @@ -166,6 +166,7 @@ public enum TypeOfRecord { static TypeOfRecord from(char ch) { switch (ch) { case ' ': + case '#': return UNSPECIFIED; case 'a': return LANGUAGE_MATERIAL; diff --git a/src/main/java/org/xbib/marc/xml/MarcContentHandler.java b/src/main/java/org/xbib/marc/xml/MarcContentHandler.java index c5af016..48754ed 100644 --- a/src/main/java/org/xbib/marc/xml/MarcContentHandler.java +++ b/src/main/java/org/xbib/marc/xml/MarcContentHandler.java @@ -119,11 +119,11 @@ public class MarcContentHandler /** * Set MARC record listener.. - * @param listener the MARC recordlistener + * @param marcRecordListener the MARC recordlistener * @return this handler */ - public MarcContentHandler setMarcRecordListener(MarcRecordListener listener) { - this.marcRecordListener = listener; + public MarcContentHandler setMarcRecordListener(MarcRecordListener marcRecordListener) { + this.marcRecordListener = marcRecordListener; return this; } @@ -161,7 +161,7 @@ public class MarcContentHandler public void beginCollection() { // early setup of MARC listener, even before beginRecord(format, type), it works only // if type is set to this handler. - this.marcListener = listeners.get(this.type); + marcListener = listeners.get(this.type); if (marcListener != null) { marcListener.beginCollection(); } @@ -286,7 +286,7 @@ public class MarcContentHandler } switch (localName) { case COLLECTION: { - if (!isCollection) { + if (!isCollection) {; beginCollection(); isCollection = true; } @@ -485,6 +485,6 @@ public class MarcContentHandler } protected boolean isNamespace(String uri) { - return validNamespaces.contains(uri); + return uri.isEmpty() || validNamespaces.contains(uri); } } diff --git a/src/test/java/org/xbib/marc/xml/AlmaXMLTest.java b/src/test/java/org/xbib/marc/xml/AlmaXMLTest.java new file mode 100644 index 0000000..df20941 --- /dev/null +++ b/src/test/java/org/xbib/marc/xml/AlmaXMLTest.java @@ -0,0 +1,53 @@ +package org.xbib.marc.xml; + +import org.junit.jupiter.api.Test; +import org.xbib.marc.Marc; +import org.xbib.marc.MarcRecord; +import org.xbib.marc.MarcRecordListener; + +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.logging.Level; +import java.util.logging.Logger; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class AlmaXMLTest { + + private static final Logger logger = Logger.getLogger(AlmaXMLTest.class.getName()); + + @Test + public void testAlmaRecordListener() throws Exception { + String s = "alma.xml"; + InputStream in = getClass().getResourceAsStream(s); + AtomicBoolean found = new AtomicBoolean(); + MarcRecordListener marcRecordListener = new MarcRecordListener() { + @Override + public void beginCollection() { + } + + @Override + public void record(MarcRecord marcRecord) { + logger.log(Level.INFO, "record = " + marcRecord); + found.set(true); + } + + @Override + public void endCollection() { + } + }; + // attach record listener + MarcContentHandler marcListener = new MarcContentHandler(); + marcListener.setMarcRecordListener(marcRecordListener); + + Marc.builder() + .setInputStream(in) + .setCharset(StandardCharsets.UTF_8) + .setContentHandler(marcListener) + .build() + .xmlReader() + .parse(); + assertTrue(found.get()); + } +} diff --git a/src/test/resources/logging.properties b/src/test/resources/logging.properties new file mode 100644 index 0000000..d5f5e0b --- /dev/null +++ b/src/test/resources/logging.properties @@ -0,0 +1,9 @@ +handlers=java.util.logging.FileHandler, java.util.logging.ConsoleHandler +.level=ALL +java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS.%1$tL %4$-7s [%3$s] %5$s %6$s%n +java.util.logging.ConsoleHandler.level=ALL +java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter +java.util.logging.FileHandler.level=ALL +java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter +java.util.logging.FileHandler.pattern=build/marc.log +jdk.event.security.level=INFO diff --git a/src/test/resources/org/xbib/marc/xml/alma.xml b/src/test/resources/org/xbib/marc/xml/alma.xml new file mode 100644 index 0000000..b461136 --- /dev/null +++ b/src/test/resources/org/xbib/marc/xml/alma.xml @@ -0,0 +1,2 @@ + +02831cam#a2200673#cb450020210409141003.0tu170103|2016####gw#######m####|||#|#ger#cDE-60599021460011020644116,A3316,H0916,N08dnb960405701OCoLC1082767409DE-101b9783110478679Festeinband : EUR 30.30 (AT), EUR 29.95 (DE), GBP 22.99 (GB) (freier Preis)978-3-11-047867-9(uri) http://www.isbnsearch.org/isbn/9783110478679(DE-605)HT0191976616/AgerDNB6/ArdagerXA-DE-BE333.79413082DDC22ger333.7300DE-101sdnb333.79413082333.794DDC22ger082Offenberger, Ursula(DE-588)1113302925aut(uri) https://portal.dnb.de/opac.htm?method=simpleSearch&cqlMode=true&query=idn=1113302925(uri) http://viaf.org/viaf/sourceID/DNB|1113302925Pragmatistische ImprovisationGeschlecht und GemütlichkeitPaarentscheidungen über das beheizte ZuhauseUrsula OffenbergerBerlinDe Gruyter Oldenbourg[2016]© 2016VI, 157 SeitenIllustrationen, DiagrammetxtnncQualitative SoziologieBand 21DissertationEberhard Karls Universität Tübingen2013Gender and Technology StudiesGrounded Theory/ SituationsanalysePaarsoziologiePragmatismus/Symbolischer InteraktionismusWärmeenergiekonsum in HaushaltenPR: Library titleHochschulschrift(DE-588)4113937-9gnd-contentEigenheims(DE-588)4013770-3(uri) https://portal.dnb.de/opac.htm?method=simpleSearch&cqlMode=true&query=idn=040137708(uri) http://viaf.org/viaf/sourceID/DNB|040137708Heizungs(DE-588)4024271-7(uri) https://portal.dnb.de/opac.htm?method=simpleSearch&cqlMode=true&query=idn=040242714(uri) http://viaf.org/viaf/sourceID/DNB|040242714Erneuerbare Energiens(DE-588)4068598-6(uri) https://portal.dnb.de/opac.htm?method=simpleSearch&cqlMode=true&query=idn=040685985(uri) http://viaf.org/viaf/sourceID/DNB|040685985Ehepaars(DE-588)4124813-2(uri) https://portal.dnb.de/opac.htm?method=simpleSearch&cqlMode=true&query=idn=041248139(uri) http://viaf.org/viaf/sourceID/DNB|041248139Motivations(DE-588)4040364-6(uri) https://portal.dnb.de/opac.htm?method=simpleSearch&cqlMode=true&query=idn=040403645(uri) http://viaf.org/viaf/sourceID/DNB|040403645Geschlechtsunterschieds(DE-588)4071781-1(uri) https://portal.dnb.de/opac.htm?method=simpleSearch&cqlMode=true&query=idn=04071781X(uri) http://viaf.org/viaf/sourceID/DNB|04071781XKonsumsoziologies(DE-588)7704263-3(uri) https://portal.dnb.de/opac.htm?method=simpleSearch&cqlMode=true&query=idn=1003286348(uri) http://viaf.org/viaf/sourceID/DNB|1003286348Eberhard Karls Universität Tübingen(DE-588)36187-2dgg(uri) https://portal.dnb.de/opac.htm?method=simpleSearch&cqlMode=true&query=idn=000361879(uri) http://viaf.org/viaf/sourceID/DNB|000361879De Gruyter Oldenbourg(DE-588)1065492103pbl(uri) https://portal.dnb.de/opac.htm?method=simpleSearch&cqlMode=true&query=idn=1065492103(uri) http://viaf.org/viaf/sourceID/DNB|1065492103Tübingen(DE-588)4061147-4uvp(uri) https://portal.dnb.de/opac.htm?method=simpleSearch&cqlMode=true&query=idn=040611477(uri) http://viaf.org/viaf/sourceID/DNB|040611477Erscheint auch alsOnline-AusgabeOffenberger: Geschlecht und GemütlichkeitErscheint auch alsOnline-Ausgabe, PDF9783110483727(DE-605)HT019080620978-3-11-048372-7Erscheint auch alsOnline-Ausgabe, EPUB9783110481310(DE-605)HT019080620978-3-11-048131-0Qualitative Soziologie(DE-605)HT01294361021O:1B:DE-101application/pdfhttp://digitale-objekte.hbz-nrw.de/storage2/2017/03/25/file_32/7157505.pdfInhaltsverzeichnisO:PKN030a||dr||||||17050a|a|||||||||||051sy||||||(OCoLC)960405701(uri) http://www.worldcat.org/oclc/960405701(DE-599)DNB108276740949HBZ_NETWORK990214600110206441HBZ Network49HBZ_ULM991019232729706449Universität Münster9783110478679Festeinband : EUR 30.30 (AT), EUR 29.95 (DE), GBP 22.99 (GB) (freier Preis)978-3-11-047867-949HBZ_ULMErscheint auch alsOnline-Ausgabe, PDF9783110483727(DE-605)HT019080620978-3-11-048372-749HBZ_ULMErscheint auch alsOnline-Ausgabe, EPUB9783110481310(DE-605)HT019080620978-3-11-048131-049HBZ_ULMQualitative Soziologie(DE-605)HT01294361021O:149HBZ_ULMB:DE-101application/pdfhttp://digitale-objekte.hbz-nrw.de/storage2/2017/03/25/file_32/7157505.pdfInhaltsverzeichnisO:PKN49HBZ_ULMHBZLOCAL49HBZ_ULM(DE-6)5688831LOCAL49HBZ_ULM6dbs_locLOCAL49HBZ_ULMSystemILSmarc2101false2022-09-01 04:26:05 Europe/Berlin021460011-HBZ0160import2021-04-05 08:41:45 Europe/BerlinSOZSOZ_MAGMS 3070/4225407981900064492022-07-11 10:32:172254079819000644949HBZ_ULMfalseimport22540798190006449SOZ_MAGBOOKSOZ_MAGmwinter12022-07-10 10:59:002022-10-06 13:49:07falseSISIS-Ausleihzähler Migrationsjahr: 0 | SISIS-Ausleihzähler Vor-Migrationsjahr: 0 | SISIS-Ausleihzähler vorletztes Migrationsjahr: 049HBZ_ULM08import6-00465646-8Fernleihkonditionen: 023540798180006449DBS-Systematik: 6MS 3070/4LOAN2022-07-11 10:32:17SOZSOZ