From 2805b97026da6d1d28c12d695f369d0144fce867 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Prante?= Date: Mon, 8 Apr 2024 16:04:18 +0200 Subject: [PATCH] lift to module path based compiling and testing --- build.gradle | 12 +- content-csv/build.gradle | 11 + content-csv/src/test/java/module-info.java | 6 + .../org/xbib/content/csv/package-info.java | 4 - .../csv/{ => test}/CSVGeneratorTest.java | 4 +- .../content/csv/{ => test}/CSVParserTest.java | 15 +- .../content/csv/{ => test}/TSVParserTest.java | 2 +- .../src/test/resources/log4j2-test.xml | 13 -- .../content/csv/{ => test}/2076831-X-web.txt | 0 .../org/xbib/content/csv/{ => test}/test.csv | 0 .../xbib/content/csv/{ => test}/titleFile.csv | 0 content-json/build.gradle | 12 +- .../content/json/JsonXContentGenerator.java | 1 + .../xbib/content/json/JsonXContentParser.java | 2 +- .../xbib/content/json/jackson/JsonLoader.java | 26 +-- .../content/json/jackson/JsonNodeReader.java | 19 +- .../content/json/pointer/TreePointer.java | 7 +- content-json/src/test/java/module-info.java | 17 ++ .../content/json/jackson/package-info.java | 5 - .../json/{ => test}/XContentBuilderTest.java | 2 +- .../json/{ => test}/XContentParserTest.java | 4 +- .../jackson/JsonNodeReaderTest.java | 6 +- .../{ => test}/jackson/JsonNumEqualsTest.java | 10 +- .../jackson/SampleNodeProvider.java | 4 +- .../pointer/JsonNodeResolverTest.java | 6 +- .../{ => test}/pointer/JsonPointerTest.java | 17 +- .../pointer/ReferenceTokenTest.java | 5 +- .../{ => test}/pointer/TreePointerTest.java | 12 +- .../json/{ => test}/jackson/testfile.json | 0 .../json/{ => test}/pointer/jsonpointer.json | 0 .../java/org/xbib/content/language/Lang.java | 6 +- content-rdf/build.gradle | 10 + .../java/org/xbib/content/rdf/RdfContent.java | 4 +- .../xbib/content/rdf/RdfContentBuilder.java | 10 +- .../xbib/content/rdf/RdfContentFactory.java | 48 +--- .../org/xbib/content/rdf/RdfXContent.java | 6 +- .../xbib/content/rdf/RdfXContentFactory.java | 27 --- .../content/rdf/RdfXContentGenerator.java | 9 +- .../xbib/content/rdf/RdfXContentParams.java | 9 - .../xbib/content/rdf/RouteRdfXContent.java | 12 +- .../rdf/RouteRdfXContentGenerator.java | 4 +- .../content/rdf/RouteRdfXContentParams.java | 19 -- .../content/rdf/internal/DefaultRdfGraph.java | 8 +- .../rdf/internal/DefaultRdfGraphParams.java | 9 +- .../content/rdf/internal/DefaultResource.java | 2 + .../xbib/content/rdf/io/json/JsonContent.java | 11 +- .../rdf/io/json/JsonContentGenerator.java | 9 +- .../rdf/io/json/JsonContentParams.java | 5 - .../rdf/io/json/JsonContentParser.java | 9 +- .../rdf/io/json/JsonResourceHandler.java | 5 +- .../content/rdf/io/json/package-info.java | 4 - .../content/rdf/io/nquads/package-info.java | 4 - .../rdf/io/ntriple/NTripleContent.java | 15 +- .../io/ntriple/NTripleContentGenerator.java | 9 +- .../rdf/io/ntriple/NTripleContentParams.java | 8 - .../rdf/io/ntriple/NTripleContentParser.java | 9 +- .../content/rdf/io/ntriple/package-info.java | 4 - .../content/rdf/io/rdfxml/RdfXmlContent.java | 15 +- .../rdf/io/rdfxml/RdfXmlContentGenerator.java | 13 +- .../rdf/io/rdfxml/RdfXmlContentParams.java | 8 - .../rdf/io/rdfxml/RdfXmlContentParser.java | 9 +- .../content/rdf/io/rdfxml/package-info.java | 4 - .../rdf/io/source/BaseStreamProcessor.java | 5 +- .../content/rdf/io/turtle/TurtleContent.java | 12 +- .../rdf/io/turtle/TurtleContentGenerator.java | 9 +- .../rdf/io/turtle/TurtleContentParams.java | 10 +- .../rdf/io/turtle/TurtleContentParser.java | 9 +- .../rdf/io/xml/AbstractXmlHandler.java | 6 +- .../io/xml/AbstractXmlResourceHandler.java | 2 +- .../xbib/content/rdf/io/xml/XmlContent.java | 11 +- .../rdf/io/xml/XmlContentGenerator.java | 9 +- .../content/rdf/io/xml/XmlContentParams.java | 5 - .../content/rdf/io/xml/XmlContentParser.java | 9 +- .../content/rdf/util/LinkedHashMultiMap.java | 11 +- content-rdf/src/test/java/module-info.java | 17 ++ .../content/rdf/internal/package-info.java | 4 - .../content/rdf/io/json/package-info.java | 4 - .../rdf/io/ntriple/NTripleReaderTest.java | 29 --- .../content/rdf/io/ntriple/package-info.java | 4 - .../org/xbib/content/rdf/io/package-info.java | 4 - .../rdf/io/rdfxml/GNDRdfXmlReaderTest.java | 54 ----- .../rdf/io/rdfxml/RdfXmlReaderTest.java | 28 --- .../rdf/io/rdfxml/VIAFRdfXmlReaderTest.java | 29 --- .../content/rdf/io/rdfxml/package-info.java | 4 - .../rdf/io/turtle/TurtleConformanceTest.java | 30 --- .../content/rdf/io/turtle/package-info.java | 4 - .../content/rdf/io/xml/XmlReaderTest.java | 217 ------------------ .../xbib/content/rdf/io/xml/package-info.java | 4 - .../org/xbib/content/rdf/package-info.java | 4 - .../{ => test}/RdfXContentGeneratorTest.java | 18 +- .../RouteRdfXContentBuilderTest.java | 59 ++--- .../content/rdf/{ => test}/StreamTester.java | 2 +- .../{ => test}/internal/BlankNodeTest.java | 9 +- .../rdf/{ => test}/internal/LiteralTest.java | 3 +- .../rdf/{ => test}/internal/ResourceTest.java | 17 +- .../rdf/{ => test}/internal/TripleTest.java | 5 +- .../content/rdf/{ => test}/io/IOTests.java | 2 +- .../{ => test}/io/json/JsonReaderTest.java | 23 +- .../test/io/ntriple/NTripleReaderTest.java | 34 +++ .../{ => test}/io/ntriple/NTripleTest.java | 29 ++- .../io/rdfxml/EuropeanaEDMReaderTest.java | 42 ++-- .../test/io/rdfxml/GNDRdfXmlReaderTest.java | 61 +++++ .../rdf/test/io/rdfxml/RdfXmlReaderTest.java | 31 +++ .../test/io/rdfxml/VIAFRdfXmlReaderTest.java | 33 +++ .../test/io/turtle/TurtleConformanceTest.java | 34 +++ .../rdf/{ => test}/io/turtle/TurtleTest.java | 135 +++++------ .../rdf/{ => test}/io/xml/OAITest.java | 21 +- .../rdf/test/io/xml/XmlReaderTest.java | 215 +++++++++++++++++ .../io/xml/XmlResourceWriterTest.java | 32 +-- .../rdf/{ => test}/util/MultiMapTest.java | 4 +- .../xbib/content/rdf/util/package-info.java | 4 - .../org/xbib/content/rdf/{ => test}/VIAF.rdf | 0 .../test/internal}/namespace.properties | 0 .../content/{ => rdf/test/io}/json/dc.json | 0 .../rdf/test/io/json/namespace.properties | 36 +++ .../content/rdf/{ => test}/io/ntriple/list.nt | 0 .../rdf/test/io/ntriple/namespace.properties | 36 +++ .../rdf/{ => test}/io/ntriple/rdfxml.ttl | 0 .../rdf/{ => test}/io/rdfxml/118540238.ttl | 0 .../rdf/{ => test}/io/rdfxml/118540238.xml | 0 .../{ => test}/io/rdfxml/11862444X_lds.xml | 0 .../content/rdf/{ => test}/io/rdfxml/GND.nt | 0 .../content/rdf/{ => test}/io/rdfxml/GND.rdf | 0 .../content/rdf/{ => test}/io/rdfxml/VIAF.rdf | 0 .../content/rdf/{ => test}/io/rdfxml/edm.nt | 0 .../content/rdf/{ => test}/io/rdfxml/gnd.ttl | 0 .../rdf/test/io/rdfxml/namespace.properties | 36 +++ .../rdf/{ => test}/io/rdfxml/oai_edm.xml | 0 .../rdf/{ => test}/io/rdfxml/rdfxml.ttl | 0 .../rdf/{ => test}/io/rdfxml/sh87008036.xml | 0 .../content/rdf/{ => test}/io/rdfxml/viaf.ttl | 0 .../content/rdf/{ => test}/io/turtle/GND.ttl | 0 .../content/rdf/test/io}/turtle/README.txt | 0 .../content/rdf/test/io}/turtle/bad-00.ttl | 0 .../content/rdf/test/io}/turtle/bad-01.ttl | 0 .../content/rdf/test/io}/turtle/bad-02.ttl | 0 .../content/rdf/test/io}/turtle/bad-03.ttl | 0 .../content/rdf/test/io}/turtle/bad-04.ttl | 0 .../content/rdf/test/io}/turtle/bad-05.ttl | 0 .../content/rdf/test/io}/turtle/bad-06.ttl | 0 .../content/rdf/test/io}/turtle/bad-07.ttl | 0 .../content/rdf/test/io}/turtle/bad-08.ttl | 0 .../content/rdf/test/io}/turtle/bad-09.ttl | 0 .../content/rdf/test/io}/turtle/bad-10.ttl | 0 .../content/rdf/test/io}/turtle/bad-11.ttl | 0 .../content/rdf/test/io}/turtle/bad-12.ttl | 0 .../content/rdf/test/io}/turtle/bad-13.ttl | 0 .../content/rdf/test/io}/turtle/bad-14.ttl | 0 .../rdf/{ => test}/io/turtle/deep-nested.ttl | 0 .../content/rdf/{ => test}/io/turtle/gnd2.ttl | 0 .../content/rdf/test/io}/turtle/index.html | 0 .../content/rdf/{ => test}/io/turtle/list.ttl | 0 .../rdf/test/io}/turtle/manifest-bad.ttl | 0 .../content/rdf/test/io}/turtle/manifest.ttl | 0 .../rdf/test/io/turtle/namespace.properties | 2 + .../rdf/test/io}/turtle/rdf-schema.out | 0 .../rdf/test/io}/turtle/rdf-schema.ttl | 0 .../rdf/test/io}/turtle/rdfq-results.out | 0 .../rdf/test/io}/turtle/rdfq-results.ttl | 0 .../rdf/test/io}/turtle/rdfs-namespace.out | 0 .../rdf/test/io}/turtle/rdfs-namespace.ttl | 0 .../content/rdf/test/io}/turtle/test-00.out | 0 .../rdf/test/io}/turtle/test-00.result | 0 .../content/rdf/test/io}/turtle/test-00.ttl | 0 .../content/rdf/test/io}/turtle/test-01.out | 0 .../rdf/test/io}/turtle/test-01.result | 0 .../content/rdf/test/io}/turtle/test-01.ttl | 0 .../content/rdf/test/io}/turtle/test-02.out | 0 .../rdf/test/io}/turtle/test-02.result | 0 .../content/rdf/test/io}/turtle/test-02.ttl | 0 .../content/rdf/test/io}/turtle/test-03.out | 0 .../rdf/test/io}/turtle/test-03.result | 0 .../content/rdf/test/io}/turtle/test-03.ttl | 0 .../content/rdf/test/io}/turtle/test-04.out | 0 .../rdf/test/io}/turtle/test-04.result | 0 .../content/rdf/test/io}/turtle/test-04.ttl | 0 .../content/rdf/test/io}/turtle/test-05.out | 0 .../rdf/test/io}/turtle/test-05.result | 0 .../content/rdf/test/io}/turtle/test-05.ttl | 0 .../content/rdf/test/io}/turtle/test-06.out | 0 .../rdf/test/io}/turtle/test-06.result | 0 .../content/rdf/test/io}/turtle/test-06.ttl | 0 .../content/rdf/test/io}/turtle/test-07.out | 0 .../rdf/test/io}/turtle/test-07.result | 0 .../content/rdf/test/io}/turtle/test-07.ttl | 0 .../content/rdf/test/io}/turtle/test-08.out | 0 .../rdf/test/io}/turtle/test-08.result | 0 .../content/rdf/test/io}/turtle/test-08.ttl | 0 .../content/rdf/test/io}/turtle/test-09.out | 0 .../rdf/test/io}/turtle/test-09.result | 0 .../content/rdf/test/io}/turtle/test-09.ttl | 0 .../content/rdf/test/io}/turtle/test-10.out | 0 .../rdf/test/io}/turtle/test-10.result | 0 .../content/rdf/test/io}/turtle/test-10.ttl | 0 .../content/rdf/test/io}/turtle/test-11.out | 0 .../rdf/test/io}/turtle/test-11.result | 0 .../content/rdf/test/io}/turtle/test-11.ttl | 0 .../content/rdf/test/io}/turtle/test-12.out | 0 .../rdf/test/io}/turtle/test-12.result | 0 .../content/rdf/test/io}/turtle/test-12.ttl | 0 .../content/rdf/test/io}/turtle/test-13.out | 0 .../rdf/test/io}/turtle/test-13.result | 0 .../content/rdf/test/io}/turtle/test-13.ttl | 0 .../content/rdf/test/io}/turtle/test-14.out | 0 .../rdf/test/io}/turtle/test-14.result | 0 .../content/rdf/test/io}/turtle/test-14.ttl | 0 .../content/rdf/test/io}/turtle/test-15.out | 0 .../rdf/test/io}/turtle/test-15.result | 0 .../content/rdf/test/io}/turtle/test-15.ttl | 0 .../content/rdf/test/io}/turtle/test-16.out | 0 .../rdf/test/io}/turtle/test-16.result | 0 .../content/rdf/test/io}/turtle/test-16.ttl | 0 .../content/rdf/test/io}/turtle/test-17.out | 0 .../rdf/test/io}/turtle/test-17.result | 0 .../content/rdf/test/io}/turtle/test-17.ttl | 0 .../content/rdf/test/io}/turtle/test-18.out | 0 .../rdf/test/io}/turtle/test-18.result | 0 .../content/rdf/test/io}/turtle/test-18.ttl | 0 .../content/rdf/test/io}/turtle/test-19.out | 0 .../rdf/test/io}/turtle/test-19.result | 0 .../content/rdf/test/io}/turtle/test-19.ttl | 0 .../content/rdf/test/io}/turtle/test-20.out | 0 .../rdf/test/io}/turtle/test-20.result | 0 .../content/rdf/test/io}/turtle/test-20.ttl | 0 .../content/rdf/test/io}/turtle/test-21.out | 0 .../rdf/test/io}/turtle/test-21.result | 0 .../content/rdf/test/io}/turtle/test-21.ttl | 0 .../content/rdf/test/io}/turtle/test-22.out | 0 .../rdf/test/io}/turtle/test-22.result | 0 .../content/rdf/test/io}/turtle/test-22.ttl | 0 .../content/rdf/test/io}/turtle/test-23.out | 0 .../rdf/test/io}/turtle/test-23.result | 0 .../content/rdf/test/io}/turtle/test-23.ttl | 0 .../content/rdf/test/io}/turtle/test-24.out | 0 .../rdf/test/io}/turtle/test-24.result | 0 .../content/rdf/test/io}/turtle/test-24.ttl | 0 .../content/rdf/test/io}/turtle/test-25.out | 0 .../rdf/test/io}/turtle/test-25.result | 0 .../content/rdf/test/io}/turtle/test-25.ttl | 0 .../content/rdf/test/io}/turtle/test-26.out | 0 .../rdf/test/io}/turtle/test-26.result | 0 .../content/rdf/test/io}/turtle/test-26.ttl | 0 .../content/rdf/test/io}/turtle/test-27.out | 0 .../rdf/test/io}/turtle/test-27.result | 0 .../content/rdf/test/io}/turtle/test-27.ttl | 0 .../rdf/test/io}/turtle/test-28-out.ttl | 0 .../content/rdf/test/io}/turtle/test-28.out | 0 .../rdf/test/io}/turtle/test-28.result | 0 .../content/rdf/test/io}/turtle/test-28.ttl | 0 .../content/rdf/test/io}/turtle/test-29.out | 0 .../rdf/test/io}/turtle/test-29.result | 0 .../content/rdf/test/io}/turtle/test-29.ttl | 0 .../content/rdf/test/io}/turtle/test-30.out | 0 .../content/rdf/test/io}/turtle/test-30.ttl | 0 .../rdf/{ => test}/io/turtle/turtle-demo.ttl | 0 .../{ => test}/io/turtle/turtle-indent.ttl | 0 .../rdf/{ => test}/io/turtle/turtle-test.ttl | 0 .../content/rdf/{ => test}/io/xml/array.xml | 0 .../rdf/{ => test}/io/xml/attribute.xml | 0 .../xbib/content/rdf/{ => test}/io/xml/dc.ttl | 0 .../rdf/test/io/xml/namespace.properties | 1 + .../rdf/{ => test}/io/xml/oai-listrecords.xml | 0 .../content/rdf/{ => test}/io/xml/oai.ttl | 0 .../{ => test}/io/xml/oro-eprint-25656.xml | 0 .../content/rdf/{io => test}/json/dc.json | 0 .../json/elasticsearch-hit-example-1.json | 0 .../{ => rdf/test}/json/es-test-20130719.json | 0 .../content/{ => rdf/test}/json/glossary.json | 0 .../content/{ => rdf/test}/json/menu.json | 0 .../rdf/{ => test}/jsonld/Vcard.jsonld | 0 .../content/rdf/{ => test}/jsonld/bib.jsonld | 0 .../content/rdf/{ => test}/jsonld/data.jsonld | 0 .../content/rdf/{ => test}/jsonld/ldp.jsonld | 0 .../rdf/{ => test}/jsonld/schema.jsonld | 0 .../content/rdf/test/namespace.properties | 36 +++ .../test}/sequential/sequential.groupstream | 0 .../org/xbib/content/rdf/{ => test}/viaf.json | 0 content-resource/build.gradle | 10 + .../content/resource/IRINamespaceContext.java | 50 ++-- .../src/test/java/module-info.java | 5 + .../test}/IRINamespaceCompactionTest.java | 14 +- .../xbib/content/resource/test}/IRITest.java | 2 +- .../content/resource/{ => test}/TestIRI.java | 4 +- .../resource/test/namespace.properties | 36 +++ .../content/smile/SmileXContentGenerator.java | 1 + .../content/smile/SmileXContentParser.java | 2 +- content-xml/build.gradle | 10 + .../xbib/content/xml/XmlNamespaceContext.java | 38 +-- .../content/xml/XmlXContentGenerator.java | 1 + .../xbib/content/xml/XmlXContentParser.java | 2 +- .../xbib/content/xml/json/JsonSaxAdapter.java | 11 +- .../xbib/content/xml/json/JsonStaxReader.java | 20 +- .../content/xml/json/JsonXmlStreamer.java | 6 +- .../xml/json/events/CharactersEvent.java | 4 +- .../xml/json/events/EndDocumentEvent.java | 4 +- .../xml/json/events/EndElementEvent.java | 4 +- .../xml/json/events/StartDocumentEvent.java | 4 +- .../xml/json/events/StartElementEvent.java | 4 +- .../xbib/content/xml/stream/StaxSource.java | 8 +- .../xml/transform/TransformerURIResolver.java | 6 +- content-xml/src/test/java/module-info.java | 10 + .../content/xml/XContentXmlBuilderTest.java | 210 ----------------- .../content/xml/XmlNamespaceContextTest.java | 68 ------ .../xbib/content/xml/json/Json2XmlTest.java | 92 -------- .../xml/json/StylesheetTransformerTest.java | 51 ---- .../xbib/content/xml/json/package-info.java | 4 - .../org/xbib/content/xml/package-info.java | 4 - .../xml/test/XContentXmlBuilderTest.java | 215 +++++++++++++++++ .../xml/test/XmlNamespaceContextTest.java | 66 ++++++ .../content/xml/test/json/Json2XmlTest.java | 70 ++++++ .../test/json/StylesheetTransformerTest.java | 42 ++++ .../{ => test}/util/SaxEventConsumerTest.java | 5 +- .../xml/{ => test}/util/XMLUtilTest.java | 12 +- .../xbib/content/xml/util/package-info.java | 4 - .../org/xbib/content/xml/{ => test}/dc.json | 0 .../xbib/content/xml/{ => test}/json/dc.json | 0 .../json/elasticsearch-hit-example-1.json | 0 .../xml/{ => test}/json/es-test-20130719.json | 0 .../content/xml/{ => test}/json/glossary.json | 0 .../content/xml/{ => test}/json/menu.json | 0 .../test}/namespace.properties | 0 content-yaml/build.gradle | 2 +- .../content/yaml/YamlXContentGenerator.java | 7 +- .../xbib/content/yaml/YamlXContentParser.java | 2 +- gradle.properties | 4 +- gradle/compile/java.gradle | 38 ++- gradle/test/junit5.gradle | 24 +- gradle/wrapper/gradle-wrapper.jar | Bin 63721 -> 43453 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew.bat | 20 +- .../src/test/java/module-info.java | 6 + .../json/{ => test}/JsonSettingsTest.java | 3 +- .../src/main/java/module-info.java | 4 +- .../src/test/java/module-info.java | 8 + .../settings/content/test/SettingsTest.java | 3 - .../xbib/settings/content/test}/settings.json | 0 settings.gradle | 33 +-- 337 files changed, 1712 insertions(+), 1583 deletions(-) create mode 100644 content-csv/build.gradle create mode 100644 content-csv/src/test/java/module-info.java delete mode 100644 content-csv/src/test/java/org/xbib/content/csv/package-info.java rename content-csv/src/test/java/org/xbib/content/csv/{ => test}/CSVGeneratorTest.java (88%) rename content-csv/src/test/java/org/xbib/content/csv/{ => test}/CSVParserTest.java (78%) rename content-csv/src/test/java/org/xbib/content/csv/{ => test}/TSVParserTest.java (97%) delete mode 100644 content-csv/src/test/resources/log4j2-test.xml rename content-csv/src/test/resources/org/xbib/content/csv/{ => test}/2076831-X-web.txt (100%) rename content-csv/src/test/resources/org/xbib/content/csv/{ => test}/test.csv (100%) rename content-csv/src/test/resources/org/xbib/content/csv/{ => test}/titleFile.csv (100%) create mode 100644 content-json/src/test/java/module-info.java delete mode 100644 content-json/src/test/java/org/xbib/content/json/jackson/package-info.java rename content-json/src/test/java/org/xbib/content/json/{ => test}/XContentBuilderTest.java (99%) rename content-json/src/test/java/org/xbib/content/json/{ => test}/XContentParserTest.java (92%) rename content-json/src/test/java/org/xbib/content/json/{ => test}/jackson/JsonNodeReaderTest.java (94%) rename content-json/src/test/java/org/xbib/content/json/{ => test}/jackson/JsonNumEqualsTest.java (91%) rename content-json/src/test/java/org/xbib/content/json/{ => test}/jackson/SampleNodeProvider.java (93%) rename content-json/src/test/java/org/xbib/content/json/{ => test}/pointer/JsonNodeResolverTest.java (93%) rename content-json/src/test/java/org/xbib/content/json/{ => test}/pointer/JsonPointerTest.java (92%) rename content-json/src/test/java/org/xbib/content/json/{ => test}/pointer/ReferenceTokenTest.java (94%) rename content-json/src/test/java/org/xbib/content/json/{ => test}/pointer/TreePointerTest.java (93%) rename content-json/src/test/resources/org/xbib/content/json/{ => test}/jackson/testfile.json (100%) rename content-json/src/test/resources/org/xbib/content/json/{ => test}/pointer/jsonpointer.json (100%) delete mode 100644 content-rdf/src/main/java/org/xbib/content/rdf/io/json/package-info.java delete mode 100644 content-rdf/src/main/java/org/xbib/content/rdf/io/nquads/package-info.java delete mode 100644 content-rdf/src/main/java/org/xbib/content/rdf/io/ntriple/package-info.java delete mode 100644 content-rdf/src/main/java/org/xbib/content/rdf/io/rdfxml/package-info.java create mode 100644 content-rdf/src/test/java/module-info.java delete mode 100644 content-rdf/src/test/java/org/xbib/content/rdf/internal/package-info.java delete mode 100644 content-rdf/src/test/java/org/xbib/content/rdf/io/json/package-info.java delete mode 100644 content-rdf/src/test/java/org/xbib/content/rdf/io/ntriple/NTripleReaderTest.java delete mode 100644 content-rdf/src/test/java/org/xbib/content/rdf/io/ntriple/package-info.java delete mode 100644 content-rdf/src/test/java/org/xbib/content/rdf/io/package-info.java delete mode 100644 content-rdf/src/test/java/org/xbib/content/rdf/io/rdfxml/GNDRdfXmlReaderTest.java delete mode 100644 content-rdf/src/test/java/org/xbib/content/rdf/io/rdfxml/RdfXmlReaderTest.java delete mode 100644 content-rdf/src/test/java/org/xbib/content/rdf/io/rdfxml/VIAFRdfXmlReaderTest.java delete mode 100644 content-rdf/src/test/java/org/xbib/content/rdf/io/rdfxml/package-info.java delete mode 100644 content-rdf/src/test/java/org/xbib/content/rdf/io/turtle/TurtleConformanceTest.java delete mode 100644 content-rdf/src/test/java/org/xbib/content/rdf/io/turtle/package-info.java delete mode 100644 content-rdf/src/test/java/org/xbib/content/rdf/io/xml/XmlReaderTest.java delete mode 100644 content-rdf/src/test/java/org/xbib/content/rdf/io/xml/package-info.java delete mode 100644 content-rdf/src/test/java/org/xbib/content/rdf/package-info.java rename content-rdf/src/test/java/org/xbib/content/rdf/{ => test}/RdfXContentGeneratorTest.java (81%) rename content-rdf/src/test/java/org/xbib/content/rdf/{ => test}/RouteRdfXContentBuilderTest.java (50%) rename content-rdf/src/test/java/org/xbib/content/rdf/{ => test}/StreamTester.java (98%) rename content-rdf/src/test/java/org/xbib/content/rdf/{ => test}/internal/BlankNodeTest.java (94%) rename content-rdf/src/test/java/org/xbib/content/rdf/{ => test}/internal/LiteralTest.java (81%) rename content-rdf/src/test/java/org/xbib/content/rdf/{ => test}/internal/ResourceTest.java (93%) rename content-rdf/src/test/java/org/xbib/content/rdf/{ => test}/internal/TripleTest.java (76%) rename content-rdf/src/test/java/org/xbib/content/rdf/{ => test}/io/IOTests.java (51%) rename content-rdf/src/test/java/org/xbib/content/rdf/{ => test}/io/json/JsonReaderTest.java (80%) create mode 100644 content-rdf/src/test/java/org/xbib/content/rdf/test/io/ntriple/NTripleReaderTest.java rename content-rdf/src/test/java/org/xbib/content/rdf/{ => test}/io/ntriple/NTripleTest.java (61%) rename content-rdf/src/test/java/org/xbib/content/rdf/{ => test}/io/rdfxml/EuropeanaEDMReaderTest.java (59%) create mode 100644 content-rdf/src/test/java/org/xbib/content/rdf/test/io/rdfxml/GNDRdfXmlReaderTest.java create mode 100644 content-rdf/src/test/java/org/xbib/content/rdf/test/io/rdfxml/RdfXmlReaderTest.java create mode 100644 content-rdf/src/test/java/org/xbib/content/rdf/test/io/rdfxml/VIAFRdfXmlReaderTest.java create mode 100644 content-rdf/src/test/java/org/xbib/content/rdf/test/io/turtle/TurtleConformanceTest.java rename content-rdf/src/test/java/org/xbib/content/rdf/{ => test}/io/turtle/TurtleTest.java (56%) rename content-rdf/src/test/java/org/xbib/content/rdf/{ => test}/io/xml/OAITest.java (84%) create mode 100644 content-rdf/src/test/java/org/xbib/content/rdf/test/io/xml/XmlReaderTest.java rename content-rdf/src/test/java/org/xbib/content/rdf/{ => test}/io/xml/XmlResourceWriterTest.java (50%) rename content-rdf/src/test/java/org/xbib/content/rdf/{ => test}/util/MultiMapTest.java (88%) delete mode 100644 content-rdf/src/test/java/org/xbib/content/rdf/util/package-info.java rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/VIAF.rdf (100%) rename content-rdf/src/test/resources/org/xbib/content/{resource => rdf/test/internal}/namespace.properties (100%) rename content-rdf/src/test/resources/org/xbib/content/{ => rdf/test/io}/json/dc.json (100%) create mode 100644 content-rdf/src/test/resources/org/xbib/content/rdf/test/io/json/namespace.properties rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/ntriple/list.nt (100%) create mode 100644 content-rdf/src/test/resources/org/xbib/content/rdf/test/io/ntriple/namespace.properties rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/ntriple/rdfxml.ttl (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/rdfxml/118540238.ttl (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/rdfxml/118540238.xml (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/rdfxml/11862444X_lds.xml (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/rdfxml/GND.nt (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/rdfxml/GND.rdf (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/rdfxml/VIAF.rdf (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/rdfxml/edm.nt (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/rdfxml/gnd.ttl (100%) create mode 100644 content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/namespace.properties rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/rdfxml/oai_edm.xml (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/rdfxml/rdfxml.ttl (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/rdfxml/sh87008036.xml (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/rdfxml/viaf.ttl (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/turtle/GND.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/README.txt (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/bad-00.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/bad-01.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/bad-02.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/bad-03.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/bad-04.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/bad-05.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/bad-06.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/bad-07.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/bad-08.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/bad-09.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/bad-10.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/bad-11.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/bad-12.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/bad-13.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/bad-14.ttl (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/turtle/deep-nested.ttl (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/turtle/gnd2.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/index.html (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/turtle/list.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/manifest-bad.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/manifest.ttl (100%) create mode 100644 content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/namespace.properties rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/rdf-schema.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/rdf-schema.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/rdfq-results.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/rdfq-results.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/rdfs-namespace.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/rdfs-namespace.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-00.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-00.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-00.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-01.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-01.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-01.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-02.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-02.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-02.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-03.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-03.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-03.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-04.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-04.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-04.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-05.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-05.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-05.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-06.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-06.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-06.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-07.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-07.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-07.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-08.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-08.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-08.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-09.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-09.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-09.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-10.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-10.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-10.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-11.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-11.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-11.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-12.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-12.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-12.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-13.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-13.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-13.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-14.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-14.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-14.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-15.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-15.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-15.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-16.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-16.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-16.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-17.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-17.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-17.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-18.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-18.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-18.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-19.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-19.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-19.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-20.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-20.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-20.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-21.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-21.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-21.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-22.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-22.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-22.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-23.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-23.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-23.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-24.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-24.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-24.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-25.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-25.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-25.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-26.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-26.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-26.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-27.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-27.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-27.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-28-out.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-28.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-28.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-28.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-29.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-29.result (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-29.ttl (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-30.out (100%) rename content-rdf/src/test/resources/{ => org/xbib/content/rdf/test/io}/turtle/test-30.ttl (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/turtle/turtle-demo.ttl (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/turtle/turtle-indent.ttl (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/turtle/turtle-test.ttl (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/xml/array.xml (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/xml/attribute.xml (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/xml/dc.ttl (100%) create mode 100644 content-rdf/src/test/resources/org/xbib/content/rdf/test/io/xml/namespace.properties rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/xml/oai-listrecords.xml (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/xml/oai.ttl (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/io/xml/oro-eprint-25656.xml (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{io => test}/json/dc.json (100%) rename content-rdf/src/test/resources/org/xbib/content/{ => rdf/test}/json/elasticsearch-hit-example-1.json (100%) rename content-rdf/src/test/resources/org/xbib/content/{ => rdf/test}/json/es-test-20130719.json (100%) rename content-rdf/src/test/resources/org/xbib/content/{ => rdf/test}/json/glossary.json (100%) rename content-rdf/src/test/resources/org/xbib/content/{ => rdf/test}/json/menu.json (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/jsonld/Vcard.jsonld (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/jsonld/bib.jsonld (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/jsonld/data.jsonld (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/jsonld/ldp.jsonld (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/jsonld/schema.jsonld (100%) create mode 100644 content-rdf/src/test/resources/org/xbib/content/rdf/test/namespace.properties rename content-rdf/src/test/resources/org/xbib/{ => content/rdf/test}/sequential/sequential.groupstream (100%) rename content-rdf/src/test/resources/org/xbib/content/rdf/{ => test}/viaf.json (100%) create mode 100644 content-resource/src/test/java/module-info.java rename {content-rdf/src/test/java/org/xbib/content/rdf => content-resource/src/test/java/org/xbib/content/resource/test}/IRINamespaceCompactionTest.java (52%) rename {content-rdf/src/test/java/org/xbib/content/rdf => content-resource/src/test/java/org/xbib/content/resource/test}/IRITest.java (98%) rename content-resource/src/test/java/org/xbib/content/resource/{ => test}/TestIRI.java (90%) create mode 100644 content-resource/src/test/resources/org/xbib/content/resource/test/namespace.properties create mode 100644 content-xml/src/test/java/module-info.java delete mode 100644 content-xml/src/test/java/org/xbib/content/xml/XContentXmlBuilderTest.java delete mode 100644 content-xml/src/test/java/org/xbib/content/xml/XmlNamespaceContextTest.java delete mode 100644 content-xml/src/test/java/org/xbib/content/xml/json/Json2XmlTest.java delete mode 100644 content-xml/src/test/java/org/xbib/content/xml/json/StylesheetTransformerTest.java delete mode 100644 content-xml/src/test/java/org/xbib/content/xml/json/package-info.java delete mode 100644 content-xml/src/test/java/org/xbib/content/xml/package-info.java create mode 100644 content-xml/src/test/java/org/xbib/content/xml/test/XContentXmlBuilderTest.java create mode 100644 content-xml/src/test/java/org/xbib/content/xml/test/XmlNamespaceContextTest.java create mode 100644 content-xml/src/test/java/org/xbib/content/xml/test/json/Json2XmlTest.java create mode 100644 content-xml/src/test/java/org/xbib/content/xml/test/json/StylesheetTransformerTest.java rename content-xml/src/test/java/org/xbib/content/xml/{ => test}/util/SaxEventConsumerTest.java (96%) rename content-xml/src/test/java/org/xbib/content/xml/{ => test}/util/XMLUtilTest.java (68%) delete mode 100644 content-xml/src/test/java/org/xbib/content/xml/util/package-info.java rename content-xml/src/test/resources/org/xbib/content/xml/{ => test}/dc.json (100%) rename content-xml/src/test/resources/org/xbib/content/xml/{ => test}/json/dc.json (100%) rename content-xml/src/test/resources/org/xbib/content/xml/{ => test}/json/elasticsearch-hit-example-1.json (100%) rename content-xml/src/test/resources/org/xbib/content/xml/{ => test}/json/es-test-20130719.json (100%) rename content-xml/src/test/resources/org/xbib/content/xml/{ => test}/json/glossary.json (100%) rename content-xml/src/test/resources/org/xbib/content/xml/{ => test}/json/menu.json (100%) rename content-xml/src/test/resources/org/xbib/content/{resource => xml/test}/namespace.properties (100%) create mode 100644 settings-content-json/src/test/java/module-info.java rename settings-content-json/src/test/java/org/xbib/settings/content/json/{ => test}/JsonSettingsTest.java (96%) create mode 100644 settings-content/src/test/java/module-info.java rename settings-content/src/test/resources/{ => org/xbib/settings/content/test}/settings.json (100%) diff --git a/build.gradle b/build.gradle index 7c9a9f7..b20bbff 100644 --- a/build.gradle +++ b/build.gradle @@ -1,18 +1,13 @@ - plugins { - id "checkstyle" - id "pmd" id 'maven-publish' id 'signing' id "io.github.gradle-nexus.publish-plugin" version "2.0.0-rc-1" - id "com.github.spotbugs" version "6.0.0-beta.3" - id "org.cyclonedx.bom" version "1.7.4" id "org.xbib.gradle.plugin.asciidoctor" version "3.0.0" } wrapper { gradleVersion = libs.versions.gradle.get() - distributionType = Wrapper.DistributionType.ALL + distributionType = Wrapper.DistributionType.BIN } ext { @@ -31,15 +26,10 @@ ext { } subprojects { - //apply from: rootProject.file('gradle/ide/idea.gradle') apply from: rootProject.file('gradle/repositories/maven.gradle') apply from: rootProject.file('gradle/compile/java.gradle') apply from: rootProject.file('gradle/test/junit5.gradle') - apply from: rootProject.file('gradle/quality/checkstyle.gradle') - apply from: rootProject.file('gradle/quality/pmd.gradle') - //apply from: rootProject.file('gradle/quality/spotbugs.gradle') apply from: rootProject.file('gradle/publish/maven.gradle') } apply from: rootProject.file('gradle/publish/sonatype.gradle') apply from: rootProject.file('gradle/publish/forgejo.gradle') -apply from: rootProject.file('gradle/quality/cyclonedx.gradle') diff --git a/content-csv/build.gradle b/content-csv/build.gradle new file mode 100644 index 0000000..d387d38 --- /dev/null +++ b/content-csv/build.gradle @@ -0,0 +1,11 @@ + +def moduleName = 'org.xbib.content.csv.test' +def patchArgs = ['--patch-module', "$moduleName=" + files(sourceSets.test.resources.srcDirs).asPath ] + +tasks.named('compileTestJava') { + options.compilerArgs += patchArgs +} + +tasks.named('test') { + jvmArgs += patchArgs +} diff --git a/content-csv/src/test/java/module-info.java b/content-csv/src/test/java/module-info.java new file mode 100644 index 0000000..a9b3d90 --- /dev/null +++ b/content-csv/src/test/java/module-info.java @@ -0,0 +1,6 @@ +module org.xbib.content.csv.test { + requires org.junit.jupiter.api; + requires org.xbib.content.csv; + exports org.xbib.content.csv.test; + opens org.xbib.content.csv.test to org.junit.platform.commons; +} diff --git a/content-csv/src/test/java/org/xbib/content/csv/package-info.java b/content-csv/src/test/java/org/xbib/content/csv/package-info.java deleted file mode 100644 index 396f5c5..0000000 --- a/content-csv/src/test/java/org/xbib/content/csv/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Classes for testing CSV content. - */ -package org.xbib.content.csv; diff --git a/content-csv/src/test/java/org/xbib/content/csv/CSVGeneratorTest.java b/content-csv/src/test/java/org/xbib/content/csv/test/CSVGeneratorTest.java similarity index 88% rename from content-csv/src/test/java/org/xbib/content/csv/CSVGeneratorTest.java rename to content-csv/src/test/java/org/xbib/content/csv/test/CSVGeneratorTest.java index ed0e325..c173971 100644 --- a/content-csv/src/test/java/org/xbib/content/csv/CSVGeneratorTest.java +++ b/content-csv/src/test/java/org/xbib/content/csv/test/CSVGeneratorTest.java @@ -1,6 +1,8 @@ -package org.xbib.content.csv; +package org.xbib.content.csv.test; import org.junit.jupiter.api.Test; +import org.xbib.content.csv.CSVGenerator; + import java.io.IOException; import java.io.StringWriter; import java.util.Arrays; diff --git a/content-csv/src/test/java/org/xbib/content/csv/CSVParserTest.java b/content-csv/src/test/java/org/xbib/content/csv/test/CSVParserTest.java similarity index 78% rename from content-csv/src/test/java/org/xbib/content/csv/CSVParserTest.java rename to content-csv/src/test/java/org/xbib/content/csv/test/CSVParserTest.java index 48246ee..5d391c0 100644 --- a/content-csv/src/test/java/org/xbib/content/csv/CSVParserTest.java +++ b/content-csv/src/test/java/org/xbib/content/csv/test/CSVParserTest.java @@ -1,7 +1,9 @@ -package org.xbib.content.csv; +package org.xbib.content.csv.test; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; +import org.xbib.content.csv.CSVParser; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -10,16 +12,13 @@ import java.nio.charset.StandardCharsets; import java.util.Iterator; import java.util.List; -/** - * - */ public class CSVParserTest { @Test public void testCommaSeparated() throws IOException { - InputStream in = getClass().getResourceAsStream("test.csv"); + InputStream inputStream = getClass().getResourceAsStream("test.csv"); int count = 0; - try (BufferedReader reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8))) { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) { CSVParser csvParser = new CSVParser(reader); Iterator> it = csvParser.iterator(); while (it.hasNext()) { @@ -32,9 +31,9 @@ public class CSVParserTest { @Test public void testLargeFile() throws IOException { - InputStream in = getClass().getResourceAsStream("titleFile.csv"); + InputStream inputStream = getClass().getResourceAsStream("titleFile.csv"); int count = 0; - try (BufferedReader reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8))) { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) { CSVParser csvParser = new CSVParser(reader); Iterator> it = csvParser.iterator(); while (it.hasNext()) { diff --git a/content-csv/src/test/java/org/xbib/content/csv/TSVParserTest.java b/content-csv/src/test/java/org/xbib/content/csv/test/TSVParserTest.java similarity index 97% rename from content-csv/src/test/java/org/xbib/content/csv/TSVParserTest.java rename to content-csv/src/test/java/org/xbib/content/csv/test/TSVParserTest.java index 6746178..85a9022 100644 --- a/content-csv/src/test/java/org/xbib/content/csv/TSVParserTest.java +++ b/content-csv/src/test/java/org/xbib/content/csv/test/TSVParserTest.java @@ -1,4 +1,4 @@ -package org.xbib.content.csv; +package org.xbib.content.csv.test; import org.junit.jupiter.api.Test; import java.io.BufferedReader; diff --git a/content-csv/src/test/resources/log4j2-test.xml b/content-csv/src/test/resources/log4j2-test.xml deleted file mode 100644 index f71aced..0000000 --- a/content-csv/src/test/resources/log4j2-test.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/content-csv/src/test/resources/org/xbib/content/csv/2076831-X-web.txt b/content-csv/src/test/resources/org/xbib/content/csv/test/2076831-X-web.txt similarity index 100% rename from content-csv/src/test/resources/org/xbib/content/csv/2076831-X-web.txt rename to content-csv/src/test/resources/org/xbib/content/csv/test/2076831-X-web.txt diff --git a/content-csv/src/test/resources/org/xbib/content/csv/test.csv b/content-csv/src/test/resources/org/xbib/content/csv/test/test.csv similarity index 100% rename from content-csv/src/test/resources/org/xbib/content/csv/test.csv rename to content-csv/src/test/resources/org/xbib/content/csv/test/test.csv diff --git a/content-csv/src/test/resources/org/xbib/content/csv/titleFile.csv b/content-csv/src/test/resources/org/xbib/content/csv/test/titleFile.csv similarity index 100% rename from content-csv/src/test/resources/org/xbib/content/csv/titleFile.csv rename to content-csv/src/test/resources/org/xbib/content/csv/test/titleFile.csv diff --git a/content-json/build.gradle b/content-json/build.gradle index a855a9b..bd8eec6 100644 --- a/content-json/build.gradle +++ b/content-json/build.gradle @@ -1,5 +1,15 @@ dependencies { api project(':content-core') api libs.jackson.databind - testImplementation libs.mockito.inline + testImplementation testLibs.mockito.core +} + +def patchArgs = ['--patch-module', "org.xbib.content.json.test=" + sourceSets.test.resources.sourceDirectories.singleFile] + +tasks.named('compileTestJava') { + options.compilerArgs += patchArgs +} + +tasks.named('test') { + jvmArgs += patchArgs } diff --git a/content-json/src/main/java/org/xbib/content/json/JsonXContentGenerator.java b/content-json/src/main/java/org/xbib/content/json/JsonXContentGenerator.java index d013cb7..318754e 100644 --- a/content-json/src/main/java/org/xbib/content/json/JsonXContentGenerator.java +++ b/content-json/src/main/java/org/xbib/content/json/JsonXContentGenerator.java @@ -19,6 +19,7 @@ public class JsonXContentGenerator extends AbstractXContentGenerator { private final JsonGeneratorDelegate delegate; + @SuppressWarnings("this-escape") public JsonXContentGenerator(JsonGenerator generator) { this.delegate = new JsonGeneratorDelegate(generator); super.setGenerator(delegate); diff --git a/content-json/src/main/java/org/xbib/content/json/JsonXContentParser.java b/content-json/src/main/java/org/xbib/content/json/JsonXContentParser.java index 8f73a76..8713081 100644 --- a/content-json/src/main/java/org/xbib/content/json/JsonXContentParser.java +++ b/content-json/src/main/java/org/xbib/content/json/JsonXContentParser.java @@ -53,7 +53,7 @@ public class JsonXContentParser extends AbstractXContentParser { @Override public String currentName() throws IOException { - return parser.getCurrentName(); + return parser.currentName(); } @Override diff --git a/content-json/src/main/java/org/xbib/content/json/jackson/JsonLoader.java b/content-json/src/main/java/org/xbib/content/json/jackson/JsonLoader.java index 738bcf2..fbbab9b 100644 --- a/content-json/src/main/java/org/xbib/content/json/jackson/JsonLoader.java +++ b/content-json/src/main/java/org/xbib/content/json/jackson/JsonLoader.java @@ -6,11 +6,9 @@ import java.io.IOException; import java.io.InputStream; import java.io.Reader; import java.io.StringReader; -import java.net.URL; /** * Utility class to load JSON values from various sources as {@link com.fasterxml.jackson.databind.JsonNode}s. - * * This class uses a {@link JsonNodeReader} to parse JSON inputs. * * @see JsonNodeReader @@ -25,34 +23,28 @@ public final class JsonLoader { } /** - * Read a {@link com.fasterxml.jackson.databind.JsonNode} from a resource path. - * - * This method first tries and loads the resource using {@link - * Class#getResource(String)}; if not found, is tries and uses the context - * classloader and if this is not found, this class's classloader. - * + * Read a {@link com.fasterxml.jackson.databind.JsonNode} from an input stream. * This method throws an {@link java.io.IOException} if the resource does not * exist. * - * @param classLoader the class loader - * @param resource the path to the resource (must begin - * with a {@code /}) + * @param inputStream the input stream * @return the JSON document at the resource * @throws IllegalArgumentException resource path does not begin with a * {@code /} * @throws java.io.IOException there was a problem loading the resource, or the JSON * document is invalid */ - public static JsonNode fromResource(ClassLoader classLoader, final String resource) + public static JsonNode fromResource(InputStream inputStream) throws IOException { - URL url = JsonLoader.class.getResource(resource); - InputStream in = url != null ? url.openStream() : classLoader.getResourceAsStream(resource); final JsonNode ret; try { - ret = READER.fromInputStream(in); + if (inputStream == null) { + throw new IOException("not found"); + } + ret = READER.fromInputStream(inputStream); } finally { - if (in != null) { - in.close(); + if (inputStream != null) { + inputStream.close(); } } return ret; diff --git a/content-json/src/main/java/org/xbib/content/json/jackson/JsonNodeReader.java b/content-json/src/main/java/org/xbib/content/json/jackson/JsonNodeReader.java index 1cc9b3d..b103308 100644 --- a/content-json/src/main/java/org/xbib/content/json/jackson/JsonNodeReader.java +++ b/content-json/src/main/java/org/xbib/content/json/jackson/JsonNodeReader.java @@ -1,5 +1,6 @@ package org.xbib.content.json.jackson; +import com.fasterxml.jackson.core.ErrorReportConfiguration; import com.fasterxml.jackson.core.JsonLocation; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonParser; @@ -35,7 +36,7 @@ public final class JsonNodeReader { private final ObjectReader reader; public JsonNodeReader(final ObjectMapper mapper) { - reader = mapper.configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true) + this.reader = mapper.configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true) .readerFor(JsonNode.class); } @@ -64,13 +65,14 @@ public final class JsonNodeReader { /** * Read a JSON value from an {@link java.io.InputStream}. * - * @param in the input stream + * @param inputStream the input stream * @return the value * @throws java.io.IOException malformed input, or problem encountered when reading * from the stream */ - public JsonNode fromInputStream(final InputStream in) throws IOException { - try (JsonParser parser = reader.getFactory().createParser(in); MappingIterator iterator = reader.readValues(parser)) { + public JsonNode fromInputStream(final InputStream inputStream) throws IOException { + try (JsonParser parser = reader.getFactory().createParser(inputStream); + MappingIterator iterator = reader.readValues(parser)) { return readNode(iterator); } } @@ -78,13 +80,14 @@ public final class JsonNodeReader { /** * Read a JSON value from a {@link java.io.Reader}. * - * @param r the reader + * @param reader the reader * @return the value * @throws java.io.IOException malformed input, or problem encountered when reading * from the reader */ - public JsonNode fromReader(final Reader r) throws IOException { - try (JsonParser parser = reader.getFactory().createParser(r); MappingIterator iterator = reader.readValues(parser)) { + public JsonNode fromReader(final Reader reader) throws IOException { + try (JsonParser parser = this.reader.getFactory().createParser(reader); + MappingIterator iterator = this.reader.readValues(parser)) { return readNode(iterator); } } @@ -97,7 +100,7 @@ public final class JsonNodeReader { private JsonParseExceptionBuilder(final JsonParser jsonParser, final Object source) { this.jsonParser = jsonParser; - location = new JsonLocation(ContentReference.construct(false, source), 0L, 1, 1); + location = new JsonLocation(ContentReference.construct(false, source, ErrorReportConfiguration.defaults()), 0L, 1, 1); } JsonParseExceptionBuilder setLocation(final JsonLocation location) { diff --git a/content-json/src/main/java/org/xbib/content/json/pointer/TreePointer.java b/content-json/src/main/java/org/xbib/content/json/pointer/TreePointer.java index 324d75c..bd541be 100644 --- a/content-json/src/main/java/org/xbib/content/json/pointer/TreePointer.java +++ b/content-json/src/main/java/org/xbib/content/json/pointer/TreePointer.java @@ -45,8 +45,7 @@ public abstract class TreePointer implements Iterable> tokenResolvers) { + protected TreePointer(final T missing, final List> tokenResolvers) { this.missing = missing; this.tokenResolvers = new ArrayList<>(tokenResolvers); } @@ -58,7 +57,7 @@ public abstract class TreePointer implements Iterable> tokenResolvers) { + TreePointer(final List> tokenResolvers) { this(null, tokenResolvers); } @@ -70,7 +69,7 @@ public abstract class TreePointer implements Iterable tokensFromInput(final String input) + public static List tokensFromInput(final String input) throws JsonPointerException { String s = input; final List ret = new ArrayList<>(); diff --git a/content-json/src/test/java/module-info.java b/content-json/src/test/java/module-info.java new file mode 100644 index 0000000..52ae8a9 --- /dev/null +++ b/content-json/src/test/java/module-info.java @@ -0,0 +1,17 @@ +module org.xbib.content.json.test { + requires com.fasterxml.jackson.core; + requires com.fasterxml.jackson.databind; + requires java.logging; + requires jdk.unsupported; // sun.reflect for objenesis in mockito + requires org.mockito; + requires org.junit.jupiter.api; + requires org.xbib.content.api; + requires org.xbib.content.core; + requires org.xbib.content.json; + exports org.xbib.content.json.test; + exports org.xbib.content.json.test.jackson; + exports org.xbib.content.json.test.pointer; + opens org.xbib.content.json.test to org.junit.platform.commons; + opens org.xbib.content.json.test.jackson to org.junit.platform.commons; + opens org.xbib.content.json.test.pointer to org.junit.platform.commons; +} diff --git a/content-json/src/test/java/org/xbib/content/json/jackson/package-info.java b/content-json/src/test/java/org/xbib/content/json/jackson/package-info.java deleted file mode 100644 index ed13dac..0000000 --- a/content-json/src/test/java/org/xbib/content/json/jackson/package-info.java +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Classes for testing JSON jackson. - */ -package org.xbib.content.json.jackson; - diff --git a/content-json/src/test/java/org/xbib/content/json/XContentBuilderTest.java b/content-json/src/test/java/org/xbib/content/json/test/XContentBuilderTest.java similarity index 99% rename from content-json/src/test/java/org/xbib/content/json/XContentBuilderTest.java rename to content-json/src/test/java/org/xbib/content/json/test/XContentBuilderTest.java index fecb89e..2a7dd5e 100644 --- a/content-json/src/test/java/org/xbib/content/json/XContentBuilderTest.java +++ b/content-json/src/test/java/org/xbib/content/json/test/XContentBuilderTest.java @@ -1,4 +1,4 @@ -package org.xbib.content.json; +package org.xbib.content.json.test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; diff --git a/content-json/src/test/java/org/xbib/content/json/XContentParserTest.java b/content-json/src/test/java/org/xbib/content/json/test/XContentParserTest.java similarity index 92% rename from content-json/src/test/java/org/xbib/content/json/XContentParserTest.java rename to content-json/src/test/java/org/xbib/content/json/test/XContentParserTest.java index aac3f21..cb2edbd 100644 --- a/content-json/src/test/java/org/xbib/content/json/XContentParserTest.java +++ b/content-json/src/test/java/org/xbib/content/json/test/XContentParserTest.java @@ -1,8 +1,10 @@ -package org.xbib.content.json; +package org.xbib.content.json.test; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; import org.xbib.content.XContentParser; +import org.xbib.content.json.JsonXContent; + import java.io.IOException; import java.util.Map; import java.util.logging.Level; diff --git a/content-json/src/test/java/org/xbib/content/json/jackson/JsonNodeReaderTest.java b/content-json/src/test/java/org/xbib/content/json/test/jackson/JsonNodeReaderTest.java similarity index 94% rename from content-json/src/test/java/org/xbib/content/json/jackson/JsonNodeReaderTest.java rename to content-json/src/test/java/org/xbib/content/json/test/jackson/JsonNodeReaderTest.java index c1f2d4a..cf9d0ea 100644 --- a/content-json/src/test/java/org/xbib/content/json/jackson/JsonNodeReaderTest.java +++ b/content-json/src/test/java/org/xbib/content/json/test/jackson/JsonNodeReaderTest.java @@ -1,4 +1,4 @@ -package org.xbib.content.json.jackson; +package org.xbib.content.json.test.jackson; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.spy; @@ -7,8 +7,9 @@ import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.xbib.content.json.jackson.JsonNodeReader; + import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; @@ -16,7 +17,6 @@ import java.io.Reader; import java.io.StringReader; import java.nio.charset.StandardCharsets; -@Disabled("mockito defunct") public final class JsonNodeReaderTest { @Test diff --git a/content-json/src/test/java/org/xbib/content/json/jackson/JsonNumEqualsTest.java b/content-json/src/test/java/org/xbib/content/json/test/jackson/JsonNumEqualsTest.java similarity index 91% rename from content-json/src/test/java/org/xbib/content/json/jackson/JsonNumEqualsTest.java rename to content-json/src/test/java/org/xbib/content/json/test/jackson/JsonNumEqualsTest.java index bd25316..d1e98f7 100644 --- a/content-json/src/test/java/org/xbib/content/json/jackson/JsonNumEqualsTest.java +++ b/content-json/src/test/java/org/xbib/content/json/test/jackson/JsonNumEqualsTest.java @@ -1,4 +1,4 @@ -package org.xbib.content.json.jackson; +package org.xbib.content.json.test.jackson; import static org.junit.jupiter.api.Assertions.assertTrue; import com.fasterxml.jackson.databind.JsonNode; @@ -6,14 +6,14 @@ import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; import org.junit.jupiter.api.Test; +import org.xbib.content.json.jackson.JsonLoader; +import org.xbib.content.json.jackson.JsonNumEquals; + import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; -/** - * - */ public final class JsonNumEqualsTest { private static final JsonNodeFactory FACTORY = JsonNodeFactory.instance; @@ -62,7 +62,7 @@ public final class JsonNumEqualsTest { private Iterator getInputs() throws IOException { final List list = new ArrayList<>(); JsonNode reference; - JsonNode testData = JsonLoader.fromResource(this.getClass().getClassLoader(), "testfile.json"); + JsonNode testData = JsonLoader.fromResource(getClass().getResourceAsStream("testfile.json")); for (final JsonNode element : testData) { reference = element.get("reference"); for (final JsonNode node : element.get("equivalences")) { diff --git a/content-json/src/test/java/org/xbib/content/json/jackson/SampleNodeProvider.java b/content-json/src/test/java/org/xbib/content/json/test/jackson/SampleNodeProvider.java similarity index 93% rename from content-json/src/test/java/org/xbib/content/json/jackson/SampleNodeProvider.java rename to content-json/src/test/java/org/xbib/content/json/test/jackson/SampleNodeProvider.java index ec2461a..09f6730 100644 --- a/content-json/src/test/java/org/xbib/content/json/jackson/SampleNodeProvider.java +++ b/content-json/src/test/java/org/xbib/content/json/test/jackson/SampleNodeProvider.java @@ -1,7 +1,9 @@ -package org.xbib.content.json.jackson; +package org.xbib.content.json.test.jackson; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import org.xbib.content.json.jackson.JacksonUtils; +import org.xbib.content.json.jackson.NodeType; import java.math.BigDecimal; import java.util.ArrayList; diff --git a/content-json/src/test/java/org/xbib/content/json/pointer/JsonNodeResolverTest.java b/content-json/src/test/java/org/xbib/content/json/test/pointer/JsonNodeResolverTest.java similarity index 93% rename from content-json/src/test/java/org/xbib/content/json/pointer/JsonNodeResolverTest.java rename to content-json/src/test/java/org/xbib/content/json/test/pointer/JsonNodeResolverTest.java index 9a35772..4ed16ce 100644 --- a/content-json/src/test/java/org/xbib/content/json/pointer/JsonNodeResolverTest.java +++ b/content-json/src/test/java/org/xbib/content/json/test/pointer/JsonNodeResolverTest.java @@ -1,4 +1,4 @@ -package org.xbib.content.json.pointer; +package org.xbib.content.json.test.pointer; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; @@ -9,7 +9,9 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import org.junit.jupiter.api.Test; import org.xbib.content.json.jackson.JacksonUtils; import org.xbib.content.json.jackson.NodeType; -import org.xbib.content.json.jackson.SampleNodeProvider; +import org.xbib.content.json.pointer.JsonNodeResolver; +import org.xbib.content.json.pointer.ReferenceToken; +import org.xbib.content.json.test.jackson.SampleNodeProvider; import java.util.ArrayList; import java.util.List; diff --git a/content-json/src/test/java/org/xbib/content/json/pointer/JsonPointerTest.java b/content-json/src/test/java/org/xbib/content/json/test/pointer/JsonPointerTest.java similarity index 92% rename from content-json/src/test/java/org/xbib/content/json/pointer/JsonPointerTest.java rename to content-json/src/test/java/org/xbib/content/json/test/pointer/JsonPointerTest.java index e910b8b..6582477 100644 --- a/content-json/src/test/java/org/xbib/content/json/pointer/JsonPointerTest.java +++ b/content-json/src/test/java/org/xbib/content/json/test/pointer/JsonPointerTest.java @@ -1,4 +1,4 @@ -package org.xbib.content.json.pointer; +package org.xbib.content.json.test.pointer; import static org.junit.jupiter.api.Assertions.assertEquals; import com.fasterxml.jackson.databind.JsonNode; @@ -7,7 +7,9 @@ import org.junit.jupiter.api.Test; import org.xbib.content.json.jackson.JacksonUtils; import org.xbib.content.json.jackson.JsonLoader; import org.xbib.content.json.jackson.NodeType; -import org.xbib.content.json.jackson.SampleNodeProvider; +import org.xbib.content.json.pointer.JsonPointer; +import org.xbib.content.json.pointer.JsonPointerException; +import org.xbib.content.json.test.jackson.SampleNodeProvider; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; @@ -17,19 +19,14 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -/** - * - */ public final class JsonPointerTest { - private static final String PACKAGE = JsonPointerTest.class.getPackage().getName().replace('.', '/'); private final JsonNode testData; + private final JsonNode document; - public JsonPointerTest() - throws IOException { - testData = JsonLoader.fromResource(this.getClass().getClassLoader(), - PACKAGE + "/jsonpointer.json"); + public JsonPointerTest() throws IOException { + testData = JsonLoader.fromResource(getClass().getResourceAsStream("jsonpointer.json")); document = testData.get("document"); } diff --git a/content-json/src/test/java/org/xbib/content/json/pointer/ReferenceTokenTest.java b/content-json/src/test/java/org/xbib/content/json/test/pointer/ReferenceTokenTest.java similarity index 94% rename from content-json/src/test/java/org/xbib/content/json/pointer/ReferenceTokenTest.java rename to content-json/src/test/java/org/xbib/content/json/test/pointer/ReferenceTokenTest.java index 3214b2a..6306d8a 100644 --- a/content-json/src/test/java/org/xbib/content/json/pointer/ReferenceTokenTest.java +++ b/content-json/src/test/java/org/xbib/content/json/test/pointer/ReferenceTokenTest.java @@ -1,9 +1,12 @@ -package org.xbib.content.json.pointer; +package org.xbib.content.json.test.pointer; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.xbib.content.json.pointer.JsonPointerException; +import org.xbib.content.json.pointer.ReferenceToken; + import java.util.Arrays; import java.util.List; diff --git a/content-json/src/test/java/org/xbib/content/json/pointer/TreePointerTest.java b/content-json/src/test/java/org/xbib/content/json/test/pointer/TreePointerTest.java similarity index 93% rename from content-json/src/test/java/org/xbib/content/json/pointer/TreePointerTest.java rename to content-json/src/test/java/org/xbib/content/json/test/pointer/TreePointerTest.java index 93d2c5b..14811c8 100644 --- a/content-json/src/test/java/org/xbib/content/json/pointer/TreePointerTest.java +++ b/content-json/src/test/java/org/xbib/content/json/test/pointer/TreePointerTest.java @@ -1,4 +1,4 @@ -package org.xbib.content.json.pointer; +package org.xbib.content.json.test.pointer; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -13,14 +13,17 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import com.fasterxml.jackson.core.TreeNode; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.xbib.content.json.pointer.JsonPointerException; +import org.xbib.content.json.pointer.ReferenceToken; +import org.xbib.content.json.pointer.TokenResolver; +import org.xbib.content.json.pointer.TreePointer; + import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; -@Disabled("mockito defunct") public final class TreePointerTest { @Test @@ -145,8 +148,7 @@ public final class TreePointerTest { assertTrue(dummy.isEmpty()); } - private static final class DummyPointer - extends TreePointer { + private static final class DummyPointer extends TreePointer { private DummyPointer(final TreeNode missing, final List> tokenResolvers) { super(missing, tokenResolvers); } diff --git a/content-json/src/test/resources/org/xbib/content/json/jackson/testfile.json b/content-json/src/test/resources/org/xbib/content/json/test/jackson/testfile.json similarity index 100% rename from content-json/src/test/resources/org/xbib/content/json/jackson/testfile.json rename to content-json/src/test/resources/org/xbib/content/json/test/jackson/testfile.json diff --git a/content-json/src/test/resources/org/xbib/content/json/pointer/jsonpointer.json b/content-json/src/test/resources/org/xbib/content/json/test/pointer/jsonpointer.json similarity index 100% rename from content-json/src/test/resources/org/xbib/content/json/pointer/jsonpointer.json rename to content-json/src/test/resources/org/xbib/content/json/test/pointer/jsonpointer.json diff --git a/content-language/src/main/java/org/xbib/content/language/Lang.java b/content-language/src/main/java/org/xbib/content/language/Lang.java index 2084f66..2767ffb 100644 --- a/content-language/src/main/java/org/xbib/content/language/Lang.java +++ b/content-language/src/main/java/org/xbib/content/language/Lang.java @@ -176,11 +176,11 @@ public final class Lang extends SubtagSet { Subtag region = getRegion(); Subtag variant = getVariant(); if (variant != null && region != null) { - return new Locale(primary.toString(), region.toString(), variant.toString()); + return Locale.of(primary.toString(), region.toString(), variant.toString()); } else if (region != null) { - return new Locale(primary.toString(), region.toString()); + return Locale.of(primary.toString(), region.toString()); } else { - return new Locale(primary.toString()); + return Locale.of(primary.toString()); } } diff --git a/content-rdf/build.gradle b/content-rdf/build.gradle index cee2286..9719b94 100644 --- a/content-rdf/build.gradle +++ b/content-rdf/build.gradle @@ -3,3 +3,13 @@ dependencies { implementation project(':content-xml') implementation project(':content-json') } + +def patchArgs = ['--patch-module', "org.xbib.content.rdf.test=" + sourceSets.test.resources.sourceDirectories.singleFile] + +tasks.named('compileTestJava') { + options.compilerArgs += patchArgs +} + +tasks.named('test') { + jvmArgs += patchArgs +} diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/RdfContent.java b/content-rdf/src/main/java/org/xbib/content/rdf/RdfContent.java index 8e3962b..512f9cc 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/RdfContent.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/RdfContent.java @@ -11,7 +11,7 @@ public interface RdfContent

{ StandardRdfContentType type(); - RdfContentGenerator

createGenerator(OutputStream out) throws IOException; + RdfContentGenerator

createGenerator(P params, OutputStream out) throws IOException; - RdfContentParser

createParser(InputStream in) throws IOException; + RdfContentParser

createParser(P params, InputStream in) throws IOException; } diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/RdfContentBuilder.java b/content-rdf/src/main/java/org/xbib/content/rdf/RdfContentBuilder.java index 296bdbd..f4d6a7c 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/RdfContentBuilder.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/RdfContentBuilder.java @@ -17,7 +17,7 @@ public class RdfContentBuilder

implements RdfContent private final RdfContentGenerator

generator; - private final OutputStream out; + private final OutputStream outputStream; private IRI subject; @@ -25,9 +25,9 @@ public class RdfContentBuilder

implements RdfContent this(rdfContent, rdfParams, new BytesStreamOutput()); } - public RdfContentBuilder(RdfContent

rdfContent, P rdfContentParams, OutputStream out) throws IOException { - this.out = out; - this.generator = rdfContent.createGenerator(out); + public RdfContentBuilder(RdfContent

rdfContent, P rdfContentParams, OutputStream outputStream) throws IOException { + this.outputStream = outputStream; + this.generator = rdfContent.createGenerator(rdfContentParams, outputStream); this.generator.setParams(rdfContentParams); } @@ -54,7 +54,7 @@ public class RdfContentBuilder

implements RdfContent public BytesReference bytes() throws IOException { close(); - return ((BytesStreamOutput) out).bytes(); + return ((BytesStreamOutput) outputStream).bytes(); } public InputStream streamInput() throws IOException { diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/RdfContentFactory.java b/content-rdf/src/main/java/org/xbib/content/rdf/RdfContentFactory.java index 453f36d..3ef9ed3 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/RdfContentFactory.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/RdfContentFactory.java @@ -14,74 +14,42 @@ import org.xbib.content.rdf.io.xml.XmlContentParams; import java.io.IOException; import java.io.OutputStream; -/** - * - */ public class RdfContentFactory { private RdfContentFactory() { } - public static RdfContentBuilder ntripleBuilder() throws IOException { - return NTripleContent.contentBuilder(NTripleContentParams.N_TRIPLE_CONTENT_PARAMS); - } - public static RdfContentBuilder ntripleBuilder(NTripleContentParams params) throws IOException { return NTripleContent.contentBuilder(params); } - public static RdfContentBuilder ntripleBuilder(OutputStream out) throws IOException { - return NTripleContent.contentBuilder(out, NTripleContentParams.N_TRIPLE_CONTENT_PARAMS); - } - - public static RdfContentBuilder ntripleBuilder(OutputStream out, NTripleContentParams params) + public static RdfContentBuilder ntripleBuilder(NTripleContentParams params, OutputStream outputStream) throws IOException { - return NTripleContent.contentBuilder(out, params); - } - - public static RdfContentBuilder rdfXmlBuilder() throws IOException { - return RdfXmlContent.contentBuilder(RdfXmlContentParams.RDF_XML_CONTENT_PARAMS); + return NTripleContent.contentBuilder(params, outputStream); } public static RdfContentBuilder rdfXmlBuilder(RdfXmlContentParams params) throws IOException { return RdfXmlContent.contentBuilder(params); } - public static RdfContentBuilder rdfXmlBuilder(OutputStream out) throws IOException { - return RdfXmlContent.contentBuilder(out, RdfXmlContentParams.RDF_XML_CONTENT_PARAMS); - } - - public static RdfContentBuilder rdfXmlBuilder(OutputStream out, RdfXmlContentParams params) + public static RdfContentBuilder rdfXmlBuilder(RdfXmlContentParams params, OutputStream outputStream) throws IOException { - return RdfXmlContent.contentBuilder(out, params); - } - - public static RdfContentBuilder turtleBuilder() throws IOException { - return TurtleContent.contentBuilder(TurtleContentParams.TURTLE_CONTENT_PARAMS); + return RdfXmlContent.contentBuilder(params, outputStream); } public static RdfContentBuilder turtleBuilder(TurtleContentParams params) throws IOException { return TurtleContent.contentBuilder(params); } - public static RdfContentBuilder turtleBuilder(OutputStream out) throws IOException { - return TurtleContent.contentBuilder(out, TurtleContentParams.TURTLE_CONTENT_PARAMS); - } - - public static RdfContentBuilder turtleBuilder(OutputStream out, TurtleContentParams params) - throws IOException { - return TurtleContent.contentBuilder(out, params); - } - - public static RdfContentBuilder xmlBuilder() throws IOException { - return XmlContent.contentBuilder(XmlContentParams.XML_CONTENT_PARAMS); + public static RdfContentBuilder turtleBuilder(TurtleContentParams params, OutputStream outputStream) throws IOException { + return TurtleContent.contentBuilder(params, outputStream); } public static RdfContentBuilder xmlBuilder(XmlContentParams params) throws IOException { return XmlContent.contentBuilder(params); } - public static RdfContentBuilder jsonBuilder() throws IOException { - return JsonContent.contentBuilder(JsonContentParams.JSON_CONTENT_PARAMS); + public static RdfContentBuilder jsonBuilder(JsonContentParams params) throws IOException { + return JsonContent.contentBuilder(params); } } diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/RdfXContent.java b/content-rdf/src/main/java/org/xbib/content/rdf/RdfXContent.java index 55e7c80..f5c07cc 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/RdfXContent.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/RdfXContent.java @@ -28,12 +28,12 @@ public class RdfXContent implements RdfContent { } @Override - public RdfContentGenerator createGenerator(OutputStream out) { - return new RdfXContentGenerator<>(out); + public RdfContentGenerator createGenerator(RdfXContentParams params, OutputStream outputStream) { + return new RdfXContentGenerator<>(params, outputStream); } @Override - public RdfContentParser createParser(InputStream in) { + public RdfContentParser createParser(RdfXContentParams params, InputStream inputStream) { throw new UnsupportedOperationException(); } } diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/RdfXContentFactory.java b/content-rdf/src/main/java/org/xbib/content/rdf/RdfXContentFactory.java index 28e3dea..b7c727d 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/RdfXContentFactory.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/RdfXContentFactory.java @@ -11,61 +11,34 @@ import org.xbib.content.rdf.io.xml.XmlContentParams; import java.io.IOException; -/** - * - */ public class RdfXContentFactory { private RdfXContentFactory() { } - public static RdfContentBuilder ntripleBuilder() throws IOException { - return NTripleContent.contentBuilder(NTripleContentParams.N_TRIPLE_CONTENT_PARAMS); - } - public static RdfContentBuilder ntripleBuilder(NTripleContentParams params) throws IOException { return NTripleContent.contentBuilder(params); } - public static RdfContentBuilder rdfXmlBuilder() throws IOException { - return RdfXmlContent.contentBuilder(RdfXmlContentParams.RDF_XML_CONTENT_PARAMS); - } public static RdfContentBuilder rdfXmlBuilder(RdfXmlContentParams params) throws IOException { return RdfXmlContent.contentBuilder(params); } - public static RdfContentBuilder turtleBuilder() throws IOException { - return TurtleContent.contentBuilder(TurtleContentParams.TURTLE_CONTENT_PARAMS); - } - public static RdfContentBuilder turtleBuilder(TurtleContentParams params) throws IOException { return TurtleContent.contentBuilder(params); } - public static RdfContentBuilder xmlBuilder() throws IOException { - return XmlContent.contentBuilder(XmlContentParams.XML_CONTENT_PARAMS); - } - public static RdfContentBuilder xmlBuilder(XmlContentParams params) throws IOException { return XmlContent.contentBuilder(params); } - public static RdfContentBuilder rdfXContentBuilder() throws IOException { - return RdfXContent.contentBuilder(RdfXContentParams.RDF_X_CONTENT_PARAMS); - } - public static RdfContentBuilder rdfXContentBuilder(RdfXContentParams params) throws IOException { return RdfXContent.contentBuilder(params); } - public static RdfContentBuilder routeRdfXContentBuilder() throws IOException { - return RouteRdfXContent.contentBuilder(RouteRdfXContentParams.ROUTE_RDF_X_CONTENT_PARAMS); - } - public static RdfContentBuilder routeRdfXContentBuilder(RouteRdfXContentParams params) throws IOException { return RouteRdfXContent.contentBuilder(params); } - } diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/RdfXContentGenerator.java b/content-rdf/src/main/java/org/xbib/content/rdf/RdfXContentGenerator.java index 2e5548a..3d3fc52 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/RdfXContentGenerator.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/RdfXContentGenerator.java @@ -19,7 +19,7 @@ import java.util.List; */ public class RdfXContentGenerator

implements RdfContentGenerator

{ - protected final OutputStream out; + protected final OutputStream outputStream; protected Resource resource; @@ -29,8 +29,9 @@ public class RdfXContentGenerator

implements RdfCon private boolean flushed; - RdfXContentGenerator(OutputStream out) { - this.out = out; + RdfXContentGenerator(P params, OutputStream outputStream) { + this.params = params; + this.outputStream = outputStream; } @Override @@ -105,7 +106,7 @@ public class RdfXContentGenerator

implements RdfCon return; } flushed = true; - builder = DefaultXContentBuilder.builder(JsonXContent.jsonContent(), out); + builder = DefaultXContentBuilder.builder(JsonXContent.jsonContent(), outputStream); builder.startObject(); build(this.resource); builder.endObject(); diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/RdfXContentParams.java b/content-rdf/src/main/java/org/xbib/content/rdf/RdfXContentParams.java index de0f714..a401bcc 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/RdfXContentParams.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/RdfXContentParams.java @@ -2,21 +2,12 @@ package org.xbib.content.rdf; import org.xbib.content.resource.IRINamespaceContext; -/** - * - */ public class RdfXContentParams implements RdfContentParams { - public static final RdfXContentParams RDF_X_CONTENT_PARAMS = new RdfXContentParams(); - private final IRINamespaceContext namespaceContext; private RdfXContentGenerator generator; - public RdfXContentParams() { - this.namespaceContext = IRINamespaceContext.newInstance(); - } - public RdfXContentParams(IRINamespaceContext namespaceContext) { this.namespaceContext = namespaceContext; } diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/RouteRdfXContent.java b/content-rdf/src/main/java/org/xbib/content/rdf/RouteRdfXContent.java index 76fc1a0..6701f0f 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/RouteRdfXContent.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/RouteRdfXContent.java @@ -4,9 +4,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -/** - * - */ public class RouteRdfXContent implements RdfContent { private static final RouteRdfXContent ROUTE_RDF_X_CONTENT = new RouteRdfXContent(); @@ -28,18 +25,15 @@ public class RouteRdfXContent implements RdfContent { } @Override - public RdfContentGenerator createGenerator(OutputStream out) { - return new RouteRdfXContentGenerator<>(out); + public RdfContentGenerator createGenerator(RouteRdfXContentParams params, OutputStream outputStream) { + return new RouteRdfXContentGenerator<>(params, outputStream); } @Override - public RdfContentParser createParser(InputStream in) { + public RdfContentParser createParser(RouteRdfXContentParams params, InputStream inputStream) { throw new UnsupportedOperationException(); } - /** - * - */ @FunctionalInterface public interface RouteHandler { void complete(String content, RouteRdfXContentParams params) throws IOException; diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/RouteRdfXContentGenerator.java b/content-rdf/src/main/java/org/xbib/content/rdf/RouteRdfXContentGenerator.java index de0d9e7..a0d1b75 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/RouteRdfXContentGenerator.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/RouteRdfXContentGenerator.java @@ -13,8 +13,8 @@ public class RouteRdfXContentGenerator extends private boolean flushed; - RouteRdfXContentGenerator(OutputStream out) { - super(out); + RouteRdfXContentGenerator(R params, OutputStream outputStream) { + super(params, outputStream); } @Override diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/RouteRdfXContentParams.java b/content-rdf/src/main/java/org/xbib/content/rdf/RouteRdfXContentParams.java index 6215d7d..6449e30 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/RouteRdfXContentParams.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/RouteRdfXContentParams.java @@ -2,13 +2,8 @@ package org.xbib.content.rdf; import org.xbib.content.resource.IRINamespaceContext; -/** - * - */ public class RouteRdfXContentParams extends RdfXContentParams { - public static final RouteRdfXContentParams ROUTE_RDF_X_CONTENT_PARAMS = new RouteRdfXContentParams(); - private String index; private String type; @@ -23,20 +18,6 @@ public class RouteRdfXContentParams extends RdfXContentParams { private RouteRdfXContent.RouteHandler handler; - public RouteRdfXContentParams() { - super(); - } - - public RouteRdfXContentParams(String index, String type) { - super(); - this.index = index; - this.type = type; - } - - public RouteRdfXContentParams(IRINamespaceContext namespaceContext) { - super(namespaceContext); - } - public RouteRdfXContentParams(IRINamespaceContext namespaceContext, String index, String type) { super(namespaceContext); this.index = index; diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/internal/DefaultRdfGraph.java b/content-rdf/src/main/java/org/xbib/content/rdf/internal/DefaultRdfGraph.java index 5448b88..6a01c2d 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/internal/DefaultRdfGraph.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/internal/DefaultRdfGraph.java @@ -14,16 +14,14 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -/** - * - */ public class DefaultRdfGraph implements RdfGraph { - private RdfGraphParams params = DefaultRdfGraphParams.DEFAULT_PARAMS; + private RdfGraphParams params; private final Map resources = new LinkedHashMap<>(); - public DefaultRdfGraph() { + public DefaultRdfGraph(RdfGraphParams params) { + this.params = params; } @Override diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/internal/DefaultRdfGraphParams.java b/content-rdf/src/main/java/org/xbib/content/rdf/internal/DefaultRdfGraphParams.java index a6226a6..05aa835 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/internal/DefaultRdfGraphParams.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/internal/DefaultRdfGraphParams.java @@ -3,17 +3,14 @@ package org.xbib.content.rdf.internal; import org.xbib.content.rdf.RdfGraphParams; import org.xbib.content.resource.IRINamespaceContext; -/** - * - */ public class DefaultRdfGraphParams implements RdfGraphParams { - public static final DefaultRdfGraphParams DEFAULT_PARAMS = new DefaultRdfGraphParams(); private final IRINamespaceContext namespaceContext; + private final boolean writeNamespaceContext; - public DefaultRdfGraphParams() { - this.namespaceContext = IRINamespaceContext.newInstance(); + public DefaultRdfGraphParams(IRINamespaceContext namespaceContext) { + this.namespaceContext = namespaceContext; this.writeNamespaceContext = true; } diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/internal/DefaultResource.java b/content-rdf/src/main/java/org/xbib/content/rdf/internal/DefaultResource.java index ee5210a..e826aa3 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/internal/DefaultResource.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/internal/DefaultResource.java @@ -45,11 +45,13 @@ public class DefaultResource implements Resource, Comparable, XSDResou this(iri, new LinkedHashMultiMap<>(), new LinkedHashMap<>()); } + @SuppressWarnings("this-escape") public DefaultResource(DefaultResource resource) { this(resource.id(), resource.getAttributes(), resource.getChildren()); this.deleted = resource.isDeleted(); } + @SuppressWarnings("this-escape") public DefaultResource(IRI iri, MultiMap attributes, Map children) { setId(iri); this.attributes = attributes; diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/io/json/JsonContent.java b/content-rdf/src/main/java/org/xbib/content/rdf/io/json/JsonContent.java index 02d0401..7807d3a 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/io/json/JsonContent.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/io/json/JsonContent.java @@ -10,9 +10,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -/** - * - */ public class JsonContent implements RdfContent { private static final JsonContent JSON_CONTENT = new JsonContent(); @@ -39,12 +36,12 @@ public class JsonContent implements RdfContent { } @Override - public RdfContentGenerator createGenerator(OutputStream out) throws IOException { - return new JsonContentGenerator(out); + public RdfContentGenerator createGenerator(JsonContentParams params, OutputStream outputStream) throws IOException { + return new JsonContentGenerator(params, outputStream); } @Override - public RdfContentParser createParser(InputStream in) throws IOException { - return new JsonContentParser<>(in); + public RdfContentParser createParser(JsonContentParams params, InputStream inputStream) throws IOException { + return new JsonContentParser<>(params, inputStream); } } diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/io/json/JsonContentGenerator.java b/content-rdf/src/main/java/org/xbib/content/rdf/io/json/JsonContentGenerator.java index 9fc1fed..d08dba0 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/io/json/JsonContentGenerator.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/io/json/JsonContentGenerator.java @@ -24,13 +24,14 @@ public class JsonContentGenerator implements RdfContentGenerator implements RdfContentParser { + private final JsonContentParams params; + private final Reader reader; private XmlHandler handler; @@ -31,11 +33,12 @@ public class JsonContentParser implements RdfContent private QName root; - public JsonContentParser(InputStream in) throws IOException { - this(new InputStreamReader(in, StandardCharsets.UTF_8)); + public JsonContentParser(JsonContentParams params, InputStream inputStream) throws IOException { + this(params, new InputStreamReader(inputStream, StandardCharsets.UTF_8)); } - public JsonContentParser(Reader reader) { + public JsonContentParser(JsonContentParams params, Reader reader) { + this.params = params; this.reader = reader; } diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/io/json/JsonResourceHandler.java b/content-rdf/src/main/java/org/xbib/content/rdf/io/json/JsonResourceHandler.java index ef5dc85..4cc33d4 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/io/json/JsonResourceHandler.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/io/json/JsonResourceHandler.java @@ -2,14 +2,11 @@ package org.xbib.content.rdf.io.json; import org.xbib.content.rdf.io.xml.AbstractXmlResourceHandler; -/** - * - */ public abstract class JsonResourceHandler extends AbstractXmlResourceHandler { + @SuppressWarnings("this-escape") public JsonResourceHandler(JsonContentParams params) { super(params); super.setDefaultNamespace("", "http://json.org"); } - } diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/io/json/package-info.java b/content-rdf/src/main/java/org/xbib/content/rdf/io/json/package-info.java deleted file mode 100644 index 846b5fd..0000000 --- a/content-rdf/src/main/java/org/xbib/content/rdf/io/json/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Classes for RDF JSON. - */ -package org.xbib.content.rdf.io.json; diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/io/nquads/package-info.java b/content-rdf/src/main/java/org/xbib/content/rdf/io/nquads/package-info.java deleted file mode 100644 index dd8ca0b..0000000 --- a/content-rdf/src/main/java/org/xbib/content/rdf/io/nquads/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Classes for RDF N-Quads. - */ -package org.xbib.content.rdf.io.nquads; diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/io/ntriple/NTripleContent.java b/content-rdf/src/main/java/org/xbib/content/rdf/io/ntriple/NTripleContent.java index 4377d16..d7afc10 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/io/ntriple/NTripleContent.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/io/ntriple/NTripleContent.java @@ -10,9 +10,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -/** - * - */ public class NTripleContent implements RdfContent { private static final NTripleContent N_TRIPLE_CONTENT = new NTripleContent(); @@ -28,9 +25,9 @@ public class NTripleContent implements RdfContent { return new RdfContentBuilder<>(N_TRIPLE_CONTENT, params); } - public static RdfContentBuilder contentBuilder(OutputStream out, NTripleContentParams params) + public static RdfContentBuilder contentBuilder(NTripleContentParams params, OutputStream outputStream) throws IOException { - return new RdfContentBuilder<>(N_TRIPLE_CONTENT, params, out); + return new RdfContentBuilder<>(N_TRIPLE_CONTENT, params, outputStream); } @Override @@ -39,12 +36,12 @@ public class NTripleContent implements RdfContent { } @Override - public RdfContentGenerator createGenerator(OutputStream out) throws IOException { - return new NTripleContentGenerator(out); + public RdfContentGenerator createGenerator(NTripleContentParams params, OutputStream outputStream) throws IOException { + return new NTripleContentGenerator(params, outputStream); } @Override - public RdfContentParser createParser(InputStream in) throws IOException { - return new NTripleContentParser<>(in); + public RdfContentParser createParser(NTripleContentParams params, InputStream inputStream) throws IOException { + return new NTripleContentParser<>(params, inputStream); } } diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/io/ntriple/NTripleContentGenerator.java b/content-rdf/src/main/java/org/xbib/content/rdf/io/ntriple/NTripleContentGenerator.java index f1355a2..76bbe82 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/io/ntriple/NTripleContentGenerator.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/io/ntriple/NTripleContentGenerator.java @@ -24,13 +24,14 @@ public class NTripleContentGenerator private final Writer writer; - private NTripleContentParams params = NTripleContentParams.N_TRIPLE_CONTENT_PARAMS; + private NTripleContentParams params; - NTripleContentGenerator(OutputStream out) throws IOException { - this(new OutputStreamWriter(out, StandardCharsets.UTF_8)); + NTripleContentGenerator(NTripleContentParams params, OutputStream out) throws IOException { + this(params, new OutputStreamWriter(out, StandardCharsets.UTF_8)); } - NTripleContentGenerator(Writer writer) throws IOException { + NTripleContentGenerator(NTripleContentParams params, Writer writer) throws IOException { + this.params = params; this.writer = writer; } diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/io/ntriple/NTripleContentParams.java b/content-rdf/src/main/java/org/xbib/content/rdf/io/ntriple/NTripleContentParams.java index 1ecdbb0..fb27f16 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/io/ntriple/NTripleContentParams.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/io/ntriple/NTripleContentParams.java @@ -3,18 +3,10 @@ package org.xbib.content.rdf.io.ntriple; import org.xbib.content.rdf.RdfContentParams; import org.xbib.content.resource.IRINamespaceContext; -/** - * - */ public class NTripleContentParams implements RdfContentParams { - public static final NTripleContentParams N_TRIPLE_CONTENT_PARAMS = new NTripleContentParams(); private final IRINamespaceContext namespaceContext; - public NTripleContentParams() { - this.namespaceContext = IRINamespaceContext.newInstance(); - } - public NTripleContentParams(IRINamespaceContext namespaceContext) { this.namespaceContext = namespaceContext; } diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/io/ntriple/NTripleContentParser.java b/content-rdf/src/main/java/org/xbib/content/rdf/io/ntriple/NTripleContentParser.java index b6f853f..2d2fe4f 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/io/ntriple/NTripleContentParser.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/io/ntriple/NTripleContentParser.java @@ -52,11 +52,14 @@ public class NTripleContentParser implements RdfCont private RdfContentBuilder builder; - public NTripleContentParser(InputStream in) throws IOException { - this(new InputStreamReader(in, StandardCharsets.UTF_8)); + private NTripleContentParams params; + + public NTripleContentParser(NTripleContentParams params, InputStream inputStream) throws IOException { + this(params, new InputStreamReader(inputStream, StandardCharsets.UTF_8)); } - public NTripleContentParser(Reader reader) { + public NTripleContentParser(NTripleContentParams params, Reader reader) { + this.params = params; this.reader = reader; } diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/io/ntriple/package-info.java b/content-rdf/src/main/java/org/xbib/content/rdf/io/ntriple/package-info.java deleted file mode 100644 index 9e27ca6..0000000 --- a/content-rdf/src/main/java/org/xbib/content/rdf/io/ntriple/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Classes for RDF N-Triples. - */ -package org.xbib.content.rdf.io.ntriple; diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/io/rdfxml/RdfXmlContent.java b/content-rdf/src/main/java/org/xbib/content/rdf/io/rdfxml/RdfXmlContent.java index 5fba803..a231c04 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/io/rdfxml/RdfXmlContent.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/io/rdfxml/RdfXmlContent.java @@ -10,9 +10,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -/** - * - */ public class RdfXmlContent implements RdfContent { private static final RdfXmlContent RDF_XML_CONTENT = new RdfXmlContent(); @@ -28,9 +25,9 @@ public class RdfXmlContent implements RdfContent { return new RdfContentBuilder<>(RDF_XML_CONTENT, params); } - public static RdfContentBuilder contentBuilder(OutputStream out, RdfXmlContentParams params) + public static RdfContentBuilder contentBuilder(RdfXmlContentParams params, OutputStream outputStream) throws IOException { - return new RdfContentBuilder<>(RDF_XML_CONTENT, params, out); + return new RdfContentBuilder<>(RDF_XML_CONTENT, params, outputStream); } @Override @@ -39,12 +36,12 @@ public class RdfXmlContent implements RdfContent { } @Override - public RdfContentGenerator createGenerator(OutputStream os) throws IOException { - return new RdfXmlContentGenerator(os); + public RdfContentGenerator createGenerator(RdfXmlContentParams params, OutputStream outputStream) throws IOException { + return new RdfXmlContentGenerator(params, outputStream); } @Override - public RdfContentParser createParser(InputStream in) throws IOException { - return new RdfXmlContentParser<>(in); + public RdfContentParser createParser(RdfXmlContentParams params, InputStream inputStream) throws IOException { + return new RdfXmlContentParser<>(params, inputStream); } } diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/io/rdfxml/RdfXmlContentGenerator.java b/content-rdf/src/main/java/org/xbib/content/rdf/io/rdfxml/RdfXmlContentGenerator.java index b3a067a..e1ba0dd 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/io/rdfxml/RdfXmlContentGenerator.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/io/rdfxml/RdfXmlContentGenerator.java @@ -19,9 +19,6 @@ import java.io.Writer; import java.nio.charset.StandardCharsets; import java.util.Map; -/** - * RDF/XML writer. - */ public class RdfXmlContentGenerator implements RdfContentGenerator, Flushable, RdfConstants { private final Writer writer; @@ -34,18 +31,18 @@ public class RdfXmlContentGenerator implements RdfContentGenerator implements RdfConstants, RdfContentParser { + private R params; + private final Reader reader; private final Resource resource = new DefaultAnonymousResource(); @@ -69,11 +71,12 @@ public class RdfXmlContentParser implements RdfConst // counter for blank node generation private int bn = 0; - public RdfXmlContentParser(InputStream inputStream) { - this(createReader(inputStream)); + public RdfXmlContentParser(R params, InputStream inputStream) { + this(params, createReader(inputStream)); } - public RdfXmlContentParser(Reader reader) { + public RdfXmlContentParser(R params, Reader reader) { + this.params = params; this.reader = reader; } diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/io/rdfxml/package-info.java b/content-rdf/src/main/java/org/xbib/content/rdf/io/rdfxml/package-info.java deleted file mode 100644 index 6852d29..0000000 --- a/content-rdf/src/main/java/org/xbib/content/rdf/io/rdfxml/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Classes for RDF XML. - */ -package org.xbib.content.rdf.io.rdfxml; diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/io/source/BaseStreamProcessor.java b/content-rdf/src/main/java/org/xbib/content/rdf/io/source/BaseStreamProcessor.java index 009909b..63c2663 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/io/source/BaseStreamProcessor.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/io/source/BaseStreamProcessor.java @@ -3,11 +3,10 @@ package org.xbib.content.rdf.io.source; import java.io.IOException; import java.io.InputStream; import java.io.Reader; +import java.net.URI; import java.net.URL; import java.net.URLConnection; -/** - */ public abstract class BaseStreamProcessor { public BaseStreamProcessor() { @@ -39,7 +38,7 @@ public abstract class BaseStreamProcessor { * @throws IOException if process fails */ public final void process(String uri, String baseUri) throws IOException { - URL url = new URL(uri); + URL url = URI.create(uri).toURL(); URLConnection urlConnection = url.openConnection(); String mimeType = urlConnection.getContentType(); try (InputStream inputStream = urlConnection.getInputStream()) { diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/io/turtle/TurtleContent.java b/content-rdf/src/main/java/org/xbib/content/rdf/io/turtle/TurtleContent.java index a566cfa..d3f5b6e 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/io/turtle/TurtleContent.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/io/turtle/TurtleContent.java @@ -28,9 +28,9 @@ public class TurtleContent implements RdfContent { return new RdfContentBuilder<>(TURTLE_CONTENT, params); } - public static RdfContentBuilder contentBuilder(OutputStream out, TurtleContentParams params) + public static RdfContentBuilder contentBuilder(TurtleContentParams params, OutputStream outputStream) throws IOException { - return new RdfContentBuilder<>(TURTLE_CONTENT, params, out); + return new RdfContentBuilder<>(TURTLE_CONTENT, params, outputStream); } @Override @@ -39,13 +39,13 @@ public class TurtleContent implements RdfContent { } @Override - public RdfContentGenerator createGenerator(OutputStream outputStream) throws IOException { - return new TurtleContentGenerator(outputStream); + public RdfContentGenerator createGenerator(TurtleContentParams params, OutputStream outputStream) throws IOException { + return new TurtleContentGenerator(params, outputStream); } @Override - public RdfContentParser createParser(InputStream inputStream) throws IOException { - return new TurtleContentParser<>(inputStream); + public RdfContentParser createParser(TurtleContentParams params, InputStream inputStream) throws IOException { + return new TurtleContentParser<>(params, inputStream); } } diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/io/turtle/TurtleContentGenerator.java b/content-rdf/src/main/java/org/xbib/content/rdf/io/turtle/TurtleContentGenerator.java index bfa7ba2..3d58d04 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/io/turtle/TurtleContentGenerator.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/io/turtle/TurtleContentGenerator.java @@ -53,13 +53,14 @@ public class TurtleContentGenerator implements RdfContentGenerator implements RdfContentParser { + private TurtleContentParams params; + private final Resource resource = new DefaultAnonymousResource(); private final HashMap bnodes = new HashMap<>(); @@ -92,11 +94,12 @@ public class TurtleContentParser implements RdfConte */ private NamespaceContext context; - public TurtleContentParser(InputStream in) throws IOException { - this(new InputStreamReader(in, StandardCharsets.UTF_8)); + public TurtleContentParser(TurtleContentParams params, InputStream inputStream) throws IOException { + this(params, new InputStreamReader(inputStream, StandardCharsets.UTF_8)); } - public TurtleContentParser(Reader reader) { + public TurtleContentParser(TurtleContentParams params, Reader reader) { + this.params = params; this.reader = new PushbackReader(reader, 2); this.context = XmlNamespaceContext.newInstance(); } diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/io/xml/AbstractXmlHandler.java b/content-rdf/src/main/java/org/xbib/content/rdf/io/xml/AbstractXmlHandler.java index b72d206..856356a 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/io/xml/AbstractXmlHandler.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/io/xml/AbstractXmlHandler.java @@ -23,7 +23,7 @@ import javax.xml.namespace.QName; public abstract class AbstractXmlHandler

extends DefaultHandler implements XmlHandler

{ - protected final RdfContentParams params; + protected final P params; protected final StringBuilder content; @@ -39,14 +39,14 @@ public abstract class AbstractXmlHandler

private int lastlevel; - public AbstractXmlHandler(RdfContentParams params) { + public AbstractXmlHandler(P params) { this.params = params; this.content = new StringBuilder(); this.parents = new LinkedList<>(); this.resource = new DefaultAnonymousResource(); } - public RdfContentParams getParams() { + public P getParams() { return params; } diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/io/xml/AbstractXmlResourceHandler.java b/content-rdf/src/main/java/org/xbib/content/rdf/io/xml/AbstractXmlResourceHandler.java index 0326b0b..1b2cd11 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/io/xml/AbstractXmlResourceHandler.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/io/xml/AbstractXmlResourceHandler.java @@ -20,7 +20,7 @@ public abstract class AbstractXmlResourceHandler

protected final LinkedList stack = new LinkedList<>(); - public AbstractXmlResourceHandler(RdfContentParams params) { + public AbstractXmlResourceHandler(P params) { super(params); } diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/io/xml/XmlContent.java b/content-rdf/src/main/java/org/xbib/content/rdf/io/xml/XmlContent.java index 815c442..932bd9e 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/io/xml/XmlContent.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/io/xml/XmlContent.java @@ -10,9 +10,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -/** - * - */ public class XmlContent implements RdfContent { private static final XmlContent XML_CONTENT = new XmlContent(); @@ -39,12 +36,12 @@ public class XmlContent implements RdfContent { } @Override - public RdfContentGenerator createGenerator(OutputStream outputStream) throws IOException { - return new XmlContentGenerator(outputStream); + public RdfContentGenerator createGenerator(XmlContentParams params, OutputStream outputStream) throws IOException { + return new XmlContentGenerator(params, outputStream); } @Override - public RdfContentParser createParser(InputStream inputStream) throws IOException { - return new XmlContentParser<>(inputStream); + public RdfContentParser createParser(XmlContentParams params, InputStream inputStream) throws IOException { + return new XmlContentParser<>(params, inputStream); } } diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/io/xml/XmlContentGenerator.java b/content-rdf/src/main/java/org/xbib/content/rdf/io/xml/XmlContentGenerator.java index d33c1db..e8120d7 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/io/xml/XmlContentGenerator.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/io/xml/XmlContentGenerator.java @@ -36,13 +36,14 @@ public class XmlContentGenerator implements RdfContentGenerator implements RdfContentParser

{ + private final P params; + private final Reader reader; private RdfContentBuilder

builder; @@ -35,11 +37,12 @@ public class XmlContentParser

implements RdfContentP private boolean validate = false; - public XmlContentParser(InputStream in) { - this(new InputStreamReader(in, StandardCharsets.UTF_8)); + public XmlContentParser(P params, InputStream inputStream) { + this(params, new InputStreamReader(inputStream, StandardCharsets.UTF_8)); } - public XmlContentParser(Reader reader) { + public XmlContentParser(P params, Reader reader) { + this.params = params; this.reader = new NormalizeEolFilter(reader, System.getProperty("line.separator"), true); } diff --git a/content-rdf/src/main/java/org/xbib/content/rdf/util/LinkedHashMultiMap.java b/content-rdf/src/main/java/org/xbib/content/rdf/util/LinkedHashMultiMap.java index 6d4e19b..d948d47 100644 --- a/content-rdf/src/main/java/org/xbib/content/rdf/util/LinkedHashMultiMap.java +++ b/content-rdf/src/main/java/org/xbib/content/rdf/util/LinkedHashMultiMap.java @@ -4,7 +4,6 @@ import java.util.Collection; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; -import java.util.Objects; import java.util.Set; /** @@ -20,14 +19,6 @@ public class LinkedHashMultiMap implements MultiMap { this.map = new LinkedHashMap<>(); } - public LinkedHashMultiMap(MultiMap multiMap) { - Objects.requireNonNull(multiMap); - this.map = new LinkedHashMap<>(); - for (K k : multiMap.keySet()) { - putAll(k, multiMap.get(k)); - } - } - @Override public int size() { return map.size(); @@ -98,7 +89,7 @@ public class LinkedHashMultiMap implements MultiMap { @Override public boolean equals(Object obj) { - return obj != null && obj instanceof LinkedHashMultiMap && map.equals(((LinkedHashMultiMap) obj).map); + return obj instanceof LinkedHashMultiMap && map.equals(((LinkedHashMultiMap) obj).map); } @Override diff --git a/content-rdf/src/test/java/module-info.java b/content-rdf/src/test/java/module-info.java new file mode 100644 index 0000000..56225c2 --- /dev/null +++ b/content-rdf/src/test/java/module-info.java @@ -0,0 +1,17 @@ +module org.xbib.content.rdf.test { + requires java.logging; + requires java.xml; + requires org.junit.jupiter.api; + requires org.xbib.content.rdf; + requires org.xbib.content.resource; + requires org.xbib.net; + opens org.xbib.content.rdf.test to org.junit.platform.commons; + opens org.xbib.content.rdf.test.internal to org.junit.platform.commons; + opens org.xbib.content.rdf.test.io to org.junit.platform.commons; + opens org.xbib.content.rdf.test.io.json to org.junit.platform.commons; + opens org.xbib.content.rdf.test.io.ntriple to org.junit.platform.commons; + opens org.xbib.content.rdf.test.io.rdfxml to org.junit.platform.commons; + opens org.xbib.content.rdf.test.io.turtle to org.junit.platform.commons; + opens org.xbib.content.rdf.test.io.xml to org.junit.platform.commons; + opens org.xbib.content.rdf.test.util to org.junit.platform.commons; +} diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/internal/package-info.java b/content-rdf/src/test/java/org/xbib/content/rdf/internal/package-info.java deleted file mode 100644 index 1761480..0000000 --- a/content-rdf/src/test/java/org/xbib/content/rdf/internal/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Classes for testing internal RDF. - */ -package org.xbib.content.rdf.internal; diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/io/json/package-info.java b/content-rdf/src/test/java/org/xbib/content/rdf/io/json/package-info.java deleted file mode 100644 index c639400..0000000 --- a/content-rdf/src/test/java/org/xbib/content/rdf/io/json/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Classes for testing RDF JSON. - */ -package org.xbib.content.rdf.io.json; diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/io/ntriple/NTripleReaderTest.java b/content-rdf/src/test/java/org/xbib/content/rdf/io/ntriple/NTripleReaderTest.java deleted file mode 100644 index 1976079..0000000 --- a/content-rdf/src/test/java/org/xbib/content/rdf/io/ntriple/NTripleReaderTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.xbib.content.rdf.io.ntriple; - -import static org.xbib.content.rdf.RdfContentFactory.ntripleBuilder; - -import org.junit.jupiter.api.Test; -import org.xbib.content.rdf.RdfContentBuilder; -import org.xbib.content.rdf.StreamTester; - -import java.io.IOException; -import java.io.InputStream; - -public class NTripleReaderTest extends StreamTester { - - @Test - public void testReader() throws Exception { - String filename = "list.nt"; - InputStream in = getClass().getResourceAsStream(filename); - if (in == null) { - throw new IOException("file " + filename + " not found"); - } - RdfContentBuilder builder = ntripleBuilder(); - NTripleContentParser reader = new NTripleContentParser<>(in); - reader.setBuilder(builder); - reader.parse(); - assertStream("", getClass().getResource("rdfxml.ttl").openStream(), - builder.streamInput()); - } - -} diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/io/ntriple/package-info.java b/content-rdf/src/test/java/org/xbib/content/rdf/io/ntriple/package-info.java deleted file mode 100644 index 1f0acd7..0000000 --- a/content-rdf/src/test/java/org/xbib/content/rdf/io/ntriple/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Classes for testing RDF N-Triples. - */ -package org.xbib.content.rdf.io.ntriple; diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/io/package-info.java b/content-rdf/src/test/java/org/xbib/content/rdf/io/package-info.java deleted file mode 100644 index c6481f6..0000000 --- a/content-rdf/src/test/java/org/xbib/content/rdf/io/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Classes for testing RDF input/output. - */ -package org.xbib.content.rdf.io; diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/io/rdfxml/GNDRdfXmlReaderTest.java b/content-rdf/src/test/java/org/xbib/content/rdf/io/rdfxml/GNDRdfXmlReaderTest.java deleted file mode 100644 index c7ea928..0000000 --- a/content-rdf/src/test/java/org/xbib/content/rdf/io/rdfxml/GNDRdfXmlReaderTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.xbib.content.rdf.io.rdfxml; - -import static org.xbib.content.rdf.RdfContentFactory.turtleBuilder; - -import org.junit.jupiter.api.Test; -import org.xbib.content.rdf.RdfContentFactory; -import org.xbib.content.rdf.io.ntriple.NTripleContentParams; -import org.xbib.content.rdf.io.turtle.TurtleContentParams; -import org.xbib.content.resource.IRINamespaceContext; -import org.xbib.content.rdf.StreamTester; - -import java.io.InputStream; - -public class GNDRdfXmlReaderTest extends StreamTester { - - @Test - public void testGNDfromRdfXmltoTurtle() throws Exception { - String filename = "GND.rdf"; - InputStream in = getClass().getResourceAsStream(filename); - TurtleContentParams params = new TurtleContentParams(IRINamespaceContext.newInstance(), false); - RdfXmlContentParser reader = new RdfXmlContentParser<>(in); - StringBuilder sb = new StringBuilder(); - reader.setRdfContentBuilderProvider(() -> turtleBuilder(params)); - reader.setRdfContentBuilderHandler(builder -> sb.append(builder.string())); - reader.parse(); - assertStream("gnd.ttl", getClass().getResourceAsStream("gnd.ttl"), sb.toString()); - } - - @Test - public void testAnotherGNDfromRdfXmltoTurtle() throws Exception { - String filename = "GND.rdf"; - InputStream in = getClass().getResourceAsStream(filename); - TurtleContentParams params = new TurtleContentParams(IRINamespaceContext.newInstance(), false); - RdfXmlContentParser reader = new RdfXmlContentParser<>(in); - StringBuilder sb = new StringBuilder(); - reader.setRdfContentBuilderProvider(() -> turtleBuilder(params)); - reader.setRdfContentBuilderHandler(builder -> sb.append(builder.string())); - reader.parse(); - assertStream("gnd.ttl", getClass().getResourceAsStream("gnd.ttl"), sb.toString()); - } - - @Test - public void testGNDtoNtriple() throws Exception { - String filename = "GND.rdf"; - InputStream in = getClass().getResourceAsStream(filename); - RdfXmlContentParser reader = new RdfXmlContentParser<>(in); - StringBuilder sb = new StringBuilder(); - reader.setRdfContentBuilderProvider(RdfContentFactory::ntripleBuilder); - reader.setRdfContentBuilderHandler(builder -> sb.append(builder.string())); - reader.parse(); - assertStream("GND.nt", getClass().getResourceAsStream("GND.nt"), sb.toString()); - } - -} diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/io/rdfxml/RdfXmlReaderTest.java b/content-rdf/src/test/java/org/xbib/content/rdf/io/rdfxml/RdfXmlReaderTest.java deleted file mode 100644 index fb67865..0000000 --- a/content-rdf/src/test/java/org/xbib/content/rdf/io/rdfxml/RdfXmlReaderTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.xbib.content.rdf.io.rdfxml; - -import static org.xbib.content.rdf.RdfContentFactory.turtleBuilder; - -import org.junit.jupiter.api.Test; -import org.xbib.content.rdf.internal.DefaultAnonymousResource; -import org.xbib.content.rdf.io.turtle.TurtleContentParams; -import org.xbib.content.resource.IRINamespaceContext; -import org.xbib.content.rdf.StreamTester; - -import java.io.InputStream; - -public class RdfXmlReaderTest extends StreamTester { - - @Test - public void testReader() throws Exception { - String filename = "118540238.xml"; - InputStream in = getClass().getResourceAsStream(filename); - DefaultAnonymousResource.reset(); - TurtleContentParams params = new TurtleContentParams(IRINamespaceContext.getInstance(), false); - RdfXmlContentParser reader = new RdfXmlContentParser<>(in); - StringBuilder sb = new StringBuilder(); - reader.setRdfContentBuilderProvider(() -> turtleBuilder(params)); - reader.setRdfContentBuilderHandler(builder -> sb.append(builder.string())); - reader.parse(); - assertStream("118540238.ttl", getClass().getResourceAsStream("118540238.ttl"), sb.toString()); - } -} diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/io/rdfxml/VIAFRdfXmlReaderTest.java b/content-rdf/src/test/java/org/xbib/content/rdf/io/rdfxml/VIAFRdfXmlReaderTest.java deleted file mode 100644 index 6edbff7..0000000 --- a/content-rdf/src/test/java/org/xbib/content/rdf/io/rdfxml/VIAFRdfXmlReaderTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.xbib.content.rdf.io.rdfxml; - -import static org.xbib.content.rdf.RdfContentFactory.turtleBuilder; - -import org.junit.jupiter.api.Test; -import org.xbib.content.rdf.io.turtle.TurtleContentParams; -import org.xbib.content.resource.IRINamespaceContext; -import org.xbib.content.rdf.StreamTester; - -import java.io.IOException; -import java.io.InputStream; - -public class VIAFRdfXmlReaderTest extends StreamTester { - - @Test - public void testVIAF() throws Exception { - InputStream in = getClass().getResource("VIAF.rdf").openStream(); - if (in == null) { - throw new IOException("VIAF.rdf not found"); - } - TurtleContentParams params = new TurtleContentParams(IRINamespaceContext.newInstance(), false); - StringBuilder sb = new StringBuilder(); - new RdfXmlContentParser(in) - .setRdfContentBuilderProvider(() -> turtleBuilder(params)) - .setRdfContentBuilderHandler(builder -> sb.append(builder.string())) - .parse(); - assertStream("viaf.ttl", getClass().getResource("viaf.ttl").openStream(), sb.toString()); - } -} diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/io/rdfxml/package-info.java b/content-rdf/src/test/java/org/xbib/content/rdf/io/rdfxml/package-info.java deleted file mode 100644 index 982bcdd..0000000 --- a/content-rdf/src/test/java/org/xbib/content/rdf/io/rdfxml/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Classes for testing RDF XML. - */ -package org.xbib.content.rdf.io.rdfxml; diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/io/turtle/TurtleConformanceTest.java b/content-rdf/src/test/java/org/xbib/content/rdf/io/turtle/TurtleConformanceTest.java deleted file mode 100644 index 6c269be..0000000 --- a/content-rdf/src/test/java/org/xbib/content/rdf/io/turtle/TurtleConformanceTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.xbib.content.rdf.io.turtle; - -import org.junit.jupiter.api.Test; -import org.xbib.content.rdf.RdfContentFactory; -import org.xbib.content.resource.IRI; -import org.xbib.content.rdf.StreamTester; - -import java.io.InputStream; -import java.text.MessageFormat; - -/** - * - */ -public class TurtleConformanceTest extends StreamTester { - - @Test - public void conformance() throws Exception { - for (int n = 0; n < 30; n++) { - String testNum = String.format("%02d", n); - InputStream in = getClass().getResource("/turtle/test-" + testNum + ".ttl").openStream(); - TurtleContentParser turtleParser = new TurtleContentParser(in) - .setBaseIRI(IRI.create("http://example/base/")); - turtleParser.setRdfContentBuilderProvider(RdfContentFactory::turtleBuilder); - turtleParser.setRdfContentBuilderHandler(b -> { - //logger.log(Level.INFO, MessageFormat.format("turtle test {0}", b.string())); - }); - turtleParser.parse(); - } - } -} diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/io/turtle/package-info.java b/content-rdf/src/test/java/org/xbib/content/rdf/io/turtle/package-info.java deleted file mode 100644 index faa5efd..0000000 --- a/content-rdf/src/test/java/org/xbib/content/rdf/io/turtle/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Classes for testing RDF Turtle. - */ -package org.xbib.content.rdf.io.turtle; diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/io/xml/XmlReaderTest.java b/content-rdf/src/test/java/org/xbib/content/rdf/io/xml/XmlReaderTest.java deleted file mode 100644 index 558bedc..0000000 --- a/content-rdf/src/test/java/org/xbib/content/rdf/io/xml/XmlReaderTest.java +++ /dev/null @@ -1,217 +0,0 @@ -package org.xbib.content.rdf.io.xml; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.xbib.content.rdf.RdfContentFactory.turtleBuilder; - -import org.junit.jupiter.api.Test; -import org.xbib.content.rdf.RdfContentBuilder; -import org.xbib.content.rdf.Resource; -import org.xbib.content.rdf.Triple; -import org.xbib.content.rdf.internal.DefaultAnonymousResource; -import org.xbib.content.rdf.internal.DefaultResource; -import org.xbib.content.rdf.io.ntriple.NTripleContent; -import org.xbib.content.rdf.io.ntriple.NTripleContentParams; -import org.xbib.content.rdf.io.turtle.TurtleContentParams; -import org.xbib.content.resource.IRI; -import org.xbib.content.resource.IRINamespaceContext; -import org.xbib.content.resource.NamespaceContext; -import org.xbib.content.rdf.StreamTester; -import org.xbib.net.PercentEncoders; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.LinkedList; -import java.util.List; - -import javax.xml.namespace.QName; - -/** - * - */ -public class XmlReaderTest extends StreamTester { - - @Test - public void testOAIDC() throws Exception { - String filename = "oro-eprint-25656.xml"; - InputStream in = getClass().getResourceAsStream(filename); - if (in == null) { - throw new IOException("file " + filename + " not found"); - } - - IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(); - namespaceContext.addNamespace("oaidc", "http://www.openarchives.org/OAI/2.0/oai_dc/"); - namespaceContext.addNamespace("dc", "http://purl.org/dc/elements/1.1/"); - - XmlContentParams params = new XmlContentParams(namespaceContext); - XmlHandler xmlHandler = new AbstractXmlResourceHandler<>(params) { - - @Override - public boolean isResourceDelimiter(QName name) { - return "oai_dc".equals(name.getLocalPart()); - } - - @Override - public void identify(QName name, String value, IRI identifier) { - if ("identifier".equals(name.getLocalPart()) && DefaultResource.isBlank(getResource())) { - try { - // make sure we can build an opaque IRI, whatever is out there - getResource().setId(IRI.create("id:" + - PercentEncoders.getRegNameEncoder(StandardCharsets.UTF_8).encode(value))); - } catch (IOException e) { - // swallow - } - } - } - - @Override - public boolean skip(QName name) { - // skip dc:dc element - return "dc".equals(name.getLocalPart()); - } - - @Override - public XmlHandler setNamespaceContext(NamespaceContext namespaceContext) { - return this; - } - - @Override - public IRINamespaceContext getNamespaceContext() { - return namespaceContext; - } - }; - TurtleContentParams turtleParams = new TurtleContentParams(namespaceContext, true); - RdfContentBuilder builder = turtleBuilder(turtleParams); - xmlHandler.setBuilder(builder); - new XmlContentParser(in) - .setHandler(xmlHandler) - .parse(); - assertStream("dc.ttl", getClass().getResource("dc.ttl").openStream(), - builder.streamInput()); - } - - @Test - public void testXmlArray() throws Exception { - String filename = "array.xml"; - InputStream in = getClass().getResourceAsStream(filename); - if (in == null) { - throw new IOException("file " + filename + " not found"); - } - IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(); - XmlContentParams params = new XmlContentParams(namespaceContext); - AbstractXmlHandler xmlHandler = new AbstractXmlResourceHandler<>(params) { - - @Override - public boolean isResourceDelimiter(QName name) { - return false; - } - - @Override - public void identify(QName name, String value, IRI identifier) { - getResource().setId(IRI.create("id:1")); - } - - @Override - public boolean skip(QName name) { - return false; - } - - @Override - public XmlHandler setNamespaceContext(NamespaceContext namespaceContext) { - return this; - } - - @Override - public IRINamespaceContext getNamespaceContext() { - return namespaceContext; - } - }; - - MyBuilder builder = new MyBuilder(); - xmlHandler.setDefaultNamespace("xml", "http://xmltest") - .setBuilder(builder); - DefaultAnonymousResource.reset(); - new XmlContentParser(in) - .setHandler(xmlHandler) - .parse(); - assertEquals("[id:1 xml:dates _:b2, _:b2 xml:date 2001, _:b2 xml:date 2002, _:b2 xml:date 2003]", - builder.getTriples().toString() - ); - } - - @Test - public void testXmlAttribute() throws Exception { - String filename = "attribute.xml"; - InputStream in = getClass().getResourceAsStream(filename); - if (in == null) { - throw new IOException("file " + filename + " not found"); - } - IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(); - XmlContentParams params = new XmlContentParams(namespaceContext); - AbstractXmlHandler xmlHandler = new AbstractXmlResourceHandler<>(params) { - @Override - public boolean isResourceDelimiter(QName name) { - return false; - } - - @Override - public void identify(QName name, String value, IRI identifier) { - getResource().setId(IRI.create("id:1")); - } - - @Override - public boolean skip(QName name) { - return false; - } - - @Override - public XmlHandler setNamespaceContext(NamespaceContext namespaceContext) { - return this; - } - - @Override - public IRINamespaceContext getNamespaceContext() { - return namespaceContext; - } - }; - - MyBuilder builder = new MyBuilder(); - - xmlHandler.setDefaultNamespace("xml", "http://localhost") - .setBuilder(builder); - DefaultAnonymousResource.reset(); - new XmlContentParser(in) - .setHandler(xmlHandler) - .parse(); - assertEquals("[id:1 xml:dates _:b2, _:b2 xml:date _:b3, _:b3 xml:@href 1, _:b2 xml:date _:b5, " - + "_:b5 xml:@href 2, _:b2 xml:date _:b7, _:b7 xml:@href 3, _:b2 xml:date _:b9, _:b9 xml:hello World]", - builder.getTriples().toString() - ); - } - - private static class MyBuilder extends RdfContentBuilder { - - final List triples = new LinkedList<>(); - - MyBuilder() throws IOException { - super(NTripleContent.nTripleContent(), NTripleContentParams.N_TRIPLE_CONTENT_PARAMS); - } - - @Override - public MyBuilder receive(Triple triple) { - triples.add(triple); - return this; - } - - @Override - public MyBuilder receive(Resource resource) throws IOException { - triples.addAll(resource.triples()); - return this; - } - - List getTriples() { - return triples; - } - } - -} diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/io/xml/package-info.java b/content-rdf/src/test/java/org/xbib/content/rdf/io/xml/package-info.java deleted file mode 100644 index 4bdd16d..0000000 --- a/content-rdf/src/test/java/org/xbib/content/rdf/io/xml/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Classes for testing XML to RDF. - */ -package org.xbib.content.rdf.io.xml; diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/package-info.java b/content-rdf/src/test/java/org/xbib/content/rdf/package-info.java deleted file mode 100644 index 9995d31..0000000 --- a/content-rdf/src/test/java/org/xbib/content/rdf/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Classes for testing RDF content. - */ -package org.xbib.content.rdf; diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/RdfXContentGeneratorTest.java b/content-rdf/src/test/java/org/xbib/content/rdf/test/RdfXContentGeneratorTest.java similarity index 81% rename from content-rdf/src/test/java/org/xbib/content/rdf/RdfXContentGeneratorTest.java rename to content-rdf/src/test/java/org/xbib/content/rdf/test/RdfXContentGeneratorTest.java index f4d171b..404c506 100644 --- a/content-rdf/src/test/java/org/xbib/content/rdf/RdfXContentGeneratorTest.java +++ b/content-rdf/src/test/java/org/xbib/content/rdf/test/RdfXContentGeneratorTest.java @@ -1,12 +1,16 @@ -package org.xbib.content.rdf; +package org.xbib.content.rdf.test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.xbib.content.rdf.RdfXContentFactory.rdfXContentBuilder; import org.junit.jupiter.api.Test; +import org.xbib.content.rdf.RdfContentBuilder; +import org.xbib.content.rdf.RdfXContentParams; +import org.xbib.content.rdf.Resource; import org.xbib.content.rdf.internal.DefaultLiteral; import org.xbib.content.rdf.internal.DefaultResource; import org.xbib.content.resource.IRI; +import org.xbib.content.resource.IRINamespaceContext; /** * @@ -21,7 +25,8 @@ public class RdfXContentGeneratorTest { resource.add("urn:property", "Hello World") .add("urn:date", l) .add("urn:link", IRI.create("urn:pointer")); - RdfXContentParams params = new RdfXContentParams(); + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + RdfXContentParams params = new RdfXContentParams(namespaceContext); try (RdfContentBuilder builder = rdfXContentBuilder(params)) { builder.receive(resource); } @@ -40,7 +45,8 @@ public class RdfXContentGeneratorTest { .add("rdf:type", IRI.create("urn:type1")) .newResource("urn:embedded") .add("rdf:type", IRI.create("urn:type2")); - RdfXContentParams params = new RdfXContentParams(); + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + RdfXContentParams params = new RdfXContentParams(namespaceContext); try (RdfContentBuilder builder = rdfXContentBuilder(params)) { builder.receive(resource); } @@ -61,7 +67,8 @@ public class RdfXContentGeneratorTest { .add("rdf:type", IRI.create("urn:type2")); resource.newResource("urn:embedded2") .add("rdf:type", IRI.create("urn:type3")); - RdfXContentParams params = new RdfXContentParams(); + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + RdfXContentParams params = new RdfXContentParams(namespaceContext); try (RdfContentBuilder builder = rdfXContentBuilder(params)) { builder.receive(resource); } @@ -79,7 +86,8 @@ public class RdfXContentGeneratorTest { .add("urn:date", l) .add("rdf:type", IRI.create("urn:type1")) .newResource("urn:embedded"); // empty resource, do not copy - RdfXContentParams params = new RdfXContentParams(); + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + RdfXContentParams params = new RdfXContentParams(namespaceContext); try (RdfContentBuilder builder = rdfXContentBuilder(params)) { builder.receive(resource); } diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/RouteRdfXContentBuilderTest.java b/content-rdf/src/test/java/org/xbib/content/rdf/test/RouteRdfXContentBuilderTest.java similarity index 50% rename from content-rdf/src/test/java/org/xbib/content/rdf/RouteRdfXContentBuilderTest.java rename to content-rdf/src/test/java/org/xbib/content/rdf/test/RouteRdfXContentBuilderTest.java index 67c4e1b..1cd28d4 100644 --- a/content-rdf/src/test/java/org/xbib/content/rdf/RouteRdfXContentBuilderTest.java +++ b/content-rdf/src/test/java/org/xbib/content/rdf/test/RouteRdfXContentBuilderTest.java @@ -1,9 +1,9 @@ -package org.xbib.content.rdf; +package org.xbib.content.rdf.test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.xbib.content.rdf.RdfXContentFactory.routeRdfXContentBuilder; -import static org.xbib.content.rdf.StreamTester.assertStream; +import static org.xbib.content.rdf.test.StreamTester.assertStream; import java.text.MessageFormat; import java.util.concurrent.atomic.AtomicBoolean; @@ -11,10 +11,14 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; import org.junit.jupiter.api.Test; +import org.xbib.content.rdf.RdfContentBuilder; +import org.xbib.content.rdf.Resource; +import org.xbib.content.rdf.RouteRdfXContentParams; import org.xbib.content.rdf.internal.DefaultLiteral; import org.xbib.content.rdf.internal.DefaultResource; import org.xbib.content.rdf.io.rdfxml.RdfXmlContentParser; import org.xbib.content.resource.IRI; +import org.xbib.content.resource.IRINamespaceContext; import java.io.IOException; import java.io.InputStream; @@ -31,7 +35,8 @@ public class RouteRdfXContentBuilderTest { resource.add("urn:property", "Hello World") .add("urn:date", l) .add("urn:link", IRI.create("urn:pointer")); - RouteRdfXContentParams params = new RouteRdfXContentParams("index", "type"); + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + RouteRdfXContentParams params = new RouteRdfXContentParams(namespaceContext, "index", "type"); AtomicBoolean found = new AtomicBoolean(); params.setHandler((content, p) -> { assertEquals(p.getIndex() + " " + p.getType() + " 1 " + content, @@ -46,29 +51,31 @@ public class RouteRdfXContentBuilderTest { @Test public void testVIAF() throws Exception { - InputStream in = getClass().getResourceAsStream("VIAF.rdf"); - if (in == null) { - throw new IOException("VIAF.rdf not found"); + try (InputStream inputStream = getClass().getResourceAsStream("VIAF.rdf")) { + if (inputStream == null) { + throw new IOException("VIAF.rdf not found"); + } + StringBuilder sb = new StringBuilder(); + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + RouteRdfXContentParams params = new RouteRdfXContentParams(namespaceContext, "index", "type"); + AtomicInteger counter = new AtomicInteger(); + params.setHandler((content, p) -> { + logger.log(Level.INFO, MessageFormat.format("handle: {0} {1} {2} {3}", + p.getIndex(), p.getType(), p.getId(), content)); + counter.incrementAndGet(); + }); + RdfXmlContentParser parser = new RdfXmlContentParser<>(params, inputStream); + parser.setRdfContentBuilderProvider(() -> routeRdfXContentBuilder(params)) + .setRdfContentBuilderHandler(builder -> { + if (!sb.isEmpty()) { + sb.append("\n"); + } + sb.append(builder.string()); + }) + .parse(); + assertStream("viaf.json", getClass().getResourceAsStream("viaf.json"), + sb.toString()); + assertEquals(5, counter.get()); } - StringBuilder sb = new StringBuilder(); - RouteRdfXContentParams params = new RouteRdfXContentParams("index", "type"); - AtomicInteger counter = new AtomicInteger(); - params.setHandler((content, p) -> { - logger.log(Level.INFO, MessageFormat.format("handle: {0} {1} {2} {3}", - p.getIndex(), p.getType(), p.getId(), content)); - counter.incrementAndGet(); - }); - new RdfXmlContentParser(in) - .setRdfContentBuilderProvider(() -> routeRdfXContentBuilder(params)) - .setRdfContentBuilderHandler(builder -> { - if (sb.length() > 0) { - sb.append("\n"); - } - sb.append(builder.string()); - }) - .parse(); - assertStream("viaf.json", getClass().getResourceAsStream("viaf.json"), - sb.toString()); - assertEquals(5, counter.get()); } } diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/StreamTester.java b/content-rdf/src/test/java/org/xbib/content/rdf/test/StreamTester.java similarity index 98% rename from content-rdf/src/test/java/org/xbib/content/rdf/StreamTester.java rename to content-rdf/src/test/java/org/xbib/content/rdf/test/StreamTester.java index aee16df..acd8486 100644 --- a/content-rdf/src/test/java/org/xbib/content/rdf/StreamTester.java +++ b/content-rdf/src/test/java/org/xbib/content/rdf/test/StreamTester.java @@ -1,4 +1,4 @@ -package org.xbib.content.rdf; +package org.xbib.content.rdf.test; import static org.junit.jupiter.api.Assertions.fail; import java.io.ByteArrayInputStream; diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/internal/BlankNodeTest.java b/content-rdf/src/test/java/org/xbib/content/rdf/test/internal/BlankNodeTest.java similarity index 94% rename from content-rdf/src/test/java/org/xbib/content/rdf/internal/BlankNodeTest.java rename to content-rdf/src/test/java/org/xbib/content/rdf/test/internal/BlankNodeTest.java index 1cf6258..a5654f5 100644 --- a/content-rdf/src/test/java/org/xbib/content/rdf/internal/BlankNodeTest.java +++ b/content-rdf/src/test/java/org/xbib/content/rdf/test/internal/BlankNodeTest.java @@ -1,20 +1,19 @@ -package org.xbib.content.rdf.internal; +package org.xbib.content.rdf.test.internal; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; import org.xbib.content.rdf.Resource; import org.xbib.content.rdf.Triple; +import org.xbib.content.rdf.internal.DefaultAnonymousResource; +import org.xbib.content.rdf.internal.DefaultResource; import org.xbib.content.resource.IRI; import java.util.Iterator; -/** - * - */ public class BlankNodeTest { @Test - public void testBlankNodeRenumbering() throws Exception { + public void testBlankNodeRenumbering() { DefaultAnonymousResource.reset(); Resource r = new DefaultResource(IRI.create("urn:meta1")); // test order of adding diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/internal/LiteralTest.java b/content-rdf/src/test/java/org/xbib/content/rdf/test/internal/LiteralTest.java similarity index 81% rename from content-rdf/src/test/java/org/xbib/content/rdf/internal/LiteralTest.java rename to content-rdf/src/test/java/org/xbib/content/rdf/test/internal/LiteralTest.java index 2fdbd04..123cf9e 100644 --- a/content-rdf/src/test/java/org/xbib/content/rdf/internal/LiteralTest.java +++ b/content-rdf/src/test/java/org/xbib/content/rdf/test/internal/LiteralTest.java @@ -1,7 +1,8 @@ -package org.xbib.content.rdf.internal; +package org.xbib.content.rdf.test.internal; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; +import org.xbib.content.rdf.internal.DefaultLiteral; import org.xbib.content.resource.IRI; /** diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/internal/ResourceTest.java b/content-rdf/src/test/java/org/xbib/content/rdf/test/internal/ResourceTest.java similarity index 93% rename from content-rdf/src/test/java/org/xbib/content/rdf/internal/ResourceTest.java rename to content-rdf/src/test/java/org/xbib/content/rdf/test/internal/ResourceTest.java index 26fe152..89e7f55 100644 --- a/content-rdf/src/test/java/org/xbib/content/rdf/internal/ResourceTest.java +++ b/content-rdf/src/test/java/org/xbib/content/rdf/test/internal/ResourceTest.java @@ -1,4 +1,4 @@ -package org.xbib.content.rdf.internal; +package org.xbib.content.rdf.test.internal; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -10,6 +10,10 @@ import org.xbib.content.rdf.Literal; import org.xbib.content.rdf.RdfContentBuilder; import org.xbib.content.rdf.Resource; import org.xbib.content.rdf.Triple; +import org.xbib.content.rdf.internal.DefaultAnonymousResource; +import org.xbib.content.rdf.internal.DefaultLiteral; +import org.xbib.content.rdf.internal.DefaultResource; +import org.xbib.content.rdf.internal.DefaultTriple; import org.xbib.content.rdf.io.ntriple.NTripleContentParams; import org.xbib.content.resource.IRI; import org.xbib.content.resource.IRINamespaceContext; @@ -133,7 +137,6 @@ public class ResourceTest { assertEquals("urn:doc1 urn:res1 _:b2", it.next().toString()); assertEquals("_:b2 urn:has a second res value", it.next().toString()); assertFalse(it.hasNext()); - Iterator itp = r.predicates().iterator(); IRI pred = itp.next(); assertEquals("urn:valueURI", pred.toString()); @@ -227,11 +230,11 @@ public class ResourceTest { @Test public void testTripleAdder() throws IOException { - IRINamespaceContext context = IRINamespaceContext.newInstance(); - context.addNamespace("vcard", "http://www.w3.org/2006/vcard/ns#"); - context.addNamespace("owl", "http://www.w3.org/2002/07/owl#"); + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + namespaceContext.addNamespace("vcard", "http://www.w3.org/2006/vcard/ns#"); + namespaceContext.addNamespace("owl", "http://www.w3.org/2002/07/owl#"); // ID with compact IRI, will be expanded - Resource r = DefaultResource.create(context, "vcard:value"); + Resource r = DefaultResource.create(namespaceContext, "vcard:value"); // triples with expanded IRIs Triple t1 = new DefaultTriple(DefaultResource.create("http://www.w3.org/2006/vcard/ns#value"), IRI.create("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), @@ -240,7 +243,7 @@ public class ResourceTest { IRI.create("http://www.w3.org/1999/02/22-rdf-syntax-ns#label"), new DefaultLiteral("value@en")); r.add(t1).add(t2); - NTripleContentParams params = new NTripleContentParams(context); + NTripleContentParams params = new NTripleContentParams(namespaceContext); RdfContentBuilder builder = ntripleBuilder(params); builder.receive(r); assertEquals(" .\n" + diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/internal/TripleTest.java b/content-rdf/src/test/java/org/xbib/content/rdf/test/internal/TripleTest.java similarity index 76% rename from content-rdf/src/test/java/org/xbib/content/rdf/internal/TripleTest.java rename to content-rdf/src/test/java/org/xbib/content/rdf/test/internal/TripleTest.java index ad8dc38..54e8732 100644 --- a/content-rdf/src/test/java/org/xbib/content/rdf/internal/TripleTest.java +++ b/content-rdf/src/test/java/org/xbib/content/rdf/test/internal/TripleTest.java @@ -1,8 +1,11 @@ -package org.xbib.content.rdf.internal; +package org.xbib.content.rdf.test.internal; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; import org.xbib.content.rdf.Resource; +import org.xbib.content.rdf.internal.DefaultLiteral; +import org.xbib.content.rdf.internal.DefaultResource; +import org.xbib.content.rdf.internal.DefaultTriple; import org.xbib.content.resource.IRI; import org.xbib.content.resource.Node; diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/io/IOTests.java b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/IOTests.java similarity index 51% rename from content-rdf/src/test/java/org/xbib/content/rdf/io/IOTests.java rename to content-rdf/src/test/java/org/xbib/content/rdf/test/io/IOTests.java index dfdd02e..06ae568 100644 --- a/content-rdf/src/test/java/org/xbib/content/rdf/io/IOTests.java +++ b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/IOTests.java @@ -1,4 +1,4 @@ -package org.xbib.content.rdf.io; +package org.xbib.content.rdf.test.io; /** * diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/io/json/JsonReaderTest.java b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/json/JsonReaderTest.java similarity index 80% rename from content-rdf/src/test/java/org/xbib/content/rdf/io/json/JsonReaderTest.java rename to content-rdf/src/test/java/org/xbib/content/rdf/test/io/json/JsonReaderTest.java index dd53abb..9d852bd 100644 --- a/content-rdf/src/test/java/org/xbib/content/rdf/io/json/JsonReaderTest.java +++ b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/json/JsonReaderTest.java @@ -1,33 +1,33 @@ -package org.xbib.content.rdf.io.json; +package org.xbib.content.rdf.test.io.json; import static org.xbib.content.rdf.RdfContentFactory.jsonBuilder; import org.junit.jupiter.api.Test; import org.xbib.content.rdf.RdfContentBuilder; +import org.xbib.content.rdf.io.json.JsonContentParams; +import org.xbib.content.rdf.io.json.JsonContentParser; +import org.xbib.content.rdf.io.json.JsonResourceHandler; import org.xbib.content.rdf.io.xml.XmlHandler; import org.xbib.content.resource.IRI; import org.xbib.content.resource.IRINamespaceContext; import org.xbib.content.resource.NamespaceContext; -import org.xbib.content.rdf.StreamTester; +import org.xbib.content.rdf.test.StreamTester; import java.io.IOException; import java.io.InputStream; import javax.xml.namespace.QName; -/** - * - */ public class JsonReaderTest extends StreamTester { @Test public void testGenericJsonReader() throws Exception { String filename = "dc.json"; - InputStream in = getClass().getResourceAsStream(filename); - if (in == null) { + InputStream inputStream = getClass().getResourceAsStream(filename); + if (inputStream == null) { throw new IOException("file " + filename + " not found"); } - IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(); + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); namespaceContext.addNamespace("dc", "http://purl.org/dc/elements/1.1/"); namespaceContext.addNamespace("dcterms", "http://purl.org/dc/terms/"); namespaceContext.addNamespace("bib", "info:srw/cql-context-set/1/bib-v1/"); @@ -63,12 +63,11 @@ public class JsonReaderTest extends StreamTester { return namespaceContext; } }; - RdfContentBuilder builder = jsonBuilder(); + RdfContentBuilder builder = jsonBuilder(params); jsonHandler.setBuilder(builder); - new JsonContentParser(in) - .setHandler(jsonHandler) + JsonContentParser parser = new JsonContentParser(params, inputStream); + parser.setHandler(jsonHandler) .root(new QName("http://purl.org/dc/elements/1.1/", "root", "dc")) .parse(); } - } diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/test/io/ntriple/NTripleReaderTest.java b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/ntriple/NTripleReaderTest.java new file mode 100644 index 0000000..6489332 --- /dev/null +++ b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/ntriple/NTripleReaderTest.java @@ -0,0 +1,34 @@ +package org.xbib.content.rdf.test.io.ntriple; + +import static org.xbib.content.rdf.RdfContentFactory.ntripleBuilder; + +import org.junit.jupiter.api.Test; +import org.xbib.content.rdf.RdfContentBuilder; +import org.xbib.content.rdf.test.StreamTester; +import org.xbib.content.rdf.io.ntriple.NTripleContentParams; +import org.xbib.content.rdf.io.ntriple.NTripleContentParser; +import org.xbib.content.resource.IRINamespaceContext; + +import java.io.IOException; +import java.io.InputStream; + +public class NTripleReaderTest extends StreamTester { + + @Test + public void testReader() throws Exception { + String filename = "list.nt"; + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + NTripleContentParams params = new NTripleContentParams(namespaceContext); + try (InputStream inputStream = getClass().getResourceAsStream(filename)) { + if (inputStream == null) { + throw new IOException("file " + filename + " not found"); + } + RdfContentBuilder builder = ntripleBuilder(params); + NTripleContentParser reader = new NTripleContentParser<>(params, inputStream); + reader.setBuilder(builder); + reader.parse(); + assertStream("", getClass().getResource("rdfxml.ttl").openStream(), + builder.streamInput()); + } + } +} diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/io/ntriple/NTripleTest.java b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/ntriple/NTripleTest.java similarity index 61% rename from content-rdf/src/test/java/org/xbib/content/rdf/io/ntriple/NTripleTest.java rename to content-rdf/src/test/java/org/xbib/content/rdf/test/io/ntriple/NTripleTest.java index ff79f14..c2a9b43 100644 --- a/content-rdf/src/test/java/org/xbib/content/rdf/io/ntriple/NTripleTest.java +++ b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/ntriple/NTripleTest.java @@ -1,7 +1,7 @@ -package org.xbib.content.rdf.io.ntriple; +package org.xbib.content.rdf.test.io.ntriple; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.xbib.content.rdf.RdfContentFactory.ntripleBuilder; import org.junit.jupiter.api.Test; @@ -10,28 +10,33 @@ import org.xbib.content.rdf.Resource; import org.xbib.content.rdf.XSDResourceIdentifiers; import org.xbib.content.rdf.internal.DefaultLiteral; import org.xbib.content.rdf.internal.DefaultResource; +import org.xbib.content.rdf.io.ntriple.NTripleContentParams; import org.xbib.content.resource.IRI; +import org.xbib.content.resource.IRINamespaceContext; -/** - * - */ public class NTripleTest { @Test public void testNTripleBuilder() throws Exception { - RdfContentBuilder builder = ntripleBuilder(); - Resource resource = createResource(); - builder.receive(resource); - assertTrue(builder.string().length() > 0); + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + NTripleContentParams params = new NTripleContentParams(namespaceContext); + try (RdfContentBuilder builder = ntripleBuilder(params)) { + Resource resource = createResource(); + builder.receive(resource); + assertFalse(builder.string().isEmpty()); + } } @Test public void testNTripleWriteInt() throws Exception { + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + NTripleContentParams params = new NTripleContentParams(namespaceContext); Resource resource = new DefaultResource(IRI.create("urn:doc1")); resource.add("http://purl.org/dc/elements/1.1/date", new DefaultLiteral("2010").type(XSDResourceIdentifiers.INTEGER)); - RdfContentBuilder builder = ntripleBuilder(); - builder.receive(resource); - assertEquals(" \"2010\"^^ .\n", builder.string()); + try (RdfContentBuilder builder = ntripleBuilder(params)) { + builder.receive(resource); + assertEquals(" \"2010\"^^ .\n", builder.string()); + } } private Resource createResource() { diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/io/rdfxml/EuropeanaEDMReaderTest.java b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/rdfxml/EuropeanaEDMReaderTest.java similarity index 59% rename from content-rdf/src/test/java/org/xbib/content/rdf/io/rdfxml/EuropeanaEDMReaderTest.java rename to content-rdf/src/test/java/org/xbib/content/rdf/test/io/rdfxml/EuropeanaEDMReaderTest.java index 8b84f94..6c1192c 100644 --- a/content-rdf/src/test/java/org/xbib/content/rdf/io/rdfxml/EuropeanaEDMReaderTest.java +++ b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/rdfxml/EuropeanaEDMReaderTest.java @@ -1,4 +1,4 @@ -package org.xbib.content.rdf.io.rdfxml; +package org.xbib.content.rdf.test.io.rdfxml; import static org.xbib.content.rdf.RdfContentFactory.ntripleBuilder; @@ -9,12 +9,15 @@ import org.xbib.content.rdf.Resource; import org.xbib.content.rdf.Triple; import org.xbib.content.rdf.internal.DefaultLiteral; import org.xbib.content.rdf.internal.DefaultRdfGraph; +import org.xbib.content.rdf.internal.DefaultRdfGraphParams; import org.xbib.content.rdf.internal.DefaultTriple; import org.xbib.content.rdf.io.ntriple.NTripleContent; import org.xbib.content.rdf.io.ntriple.NTripleContentParams; +import org.xbib.content.rdf.io.rdfxml.RdfXmlContentParser; import org.xbib.content.resource.IRI; +import org.xbib.content.resource.IRINamespaceContext; import org.xbib.content.resource.Node; -import org.xbib.content.rdf.StreamTester; +import org.xbib.content.rdf.test.StreamTester; import java.io.IOException; import java.io.InputStream; @@ -29,23 +32,26 @@ public class EuropeanaEDMReaderTest extends StreamTester { @Test public void testEuropeana() throws Exception { String filename = "oai_edm.xml"; - InputStream in = getClass().getResourceAsStream(filename); - if (in == null) { - throw new IOException("file " + filename + " not found"); + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + NTripleContentParams params = new NTripleContentParams(namespaceContext); + try (InputStream inputStream = getClass().getResourceAsStream(filename); + DefaultRdfGraph graph = new DefaultRdfGraph(new DefaultRdfGraphParams(namespaceContext)); + RdfContentBuilder builder = ntripleBuilder(params)) { + if (inputStream == null) { + throw new IOException("file " + filename + " not found"); + } + RdfXmlContentParser reader = new RdfXmlContentParser<>(params, inputStream); + reader.setRdfContentBuilderProvider(() -> new GeoJSONFilter(NTripleContent.nTripleContent(), + params, graph)); + reader.parse(); + Iterator resourceIterator = graph.getResources(); + while (resourceIterator.hasNext()) { + Resource resource = resourceIterator.next(); + builder.receive(resource); + } + assertStream("edm.nt", getClass().getResource("edm.nt").openStream(), + builder.streamInput()); } - DefaultRdfGraph graph = new DefaultRdfGraph(); - RdfXmlContentParser reader = new RdfXmlContentParser<>(in); - reader.setRdfContentBuilderProvider(() -> new GeoJSONFilter(NTripleContent.nTripleContent(), - NTripleContentParams.N_TRIPLE_CONTENT_PARAMS, graph)); - reader.parse(); - RdfContentBuilder builder = ntripleBuilder(); - Iterator resourceIterator = graph.getResources(); - while (resourceIterator.hasNext()) { - Resource resource = resourceIterator.next(); - builder.receive(resource); - } - assertStream("edm.nt", getClass().getResource("edm.nt").openStream(), - builder.streamInput()); } private static class GeoJSONFilter extends RdfContentBuilder { diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/test/io/rdfxml/GNDRdfXmlReaderTest.java b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/rdfxml/GNDRdfXmlReaderTest.java new file mode 100644 index 0000000..95169aa --- /dev/null +++ b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/rdfxml/GNDRdfXmlReaderTest.java @@ -0,0 +1,61 @@ +package org.xbib.content.rdf.test.io.rdfxml; + +import static org.xbib.content.rdf.RdfContentFactory.ntripleBuilder; +import static org.xbib.content.rdf.RdfContentFactory.turtleBuilder; + +import org.junit.jupiter.api.Test; +import org.xbib.content.rdf.io.ntriple.NTripleContentParams; +import org.xbib.content.rdf.io.rdfxml.RdfXmlContentParser; +import org.xbib.content.rdf.io.turtle.TurtleContentParams; +import org.xbib.content.resource.IRINamespaceContext; +import org.xbib.content.rdf.test.StreamTester; + +import java.io.InputStream; + +public class GNDRdfXmlReaderTest extends StreamTester { + + @Test + public void testGNDfromRdfXmltoTurtle() throws Exception { + String filename = "GND.rdf"; + try (InputStream inputStream = getClass().getResourceAsStream(filename)) { + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + TurtleContentParams params = new TurtleContentParams(namespaceContext, false); + RdfXmlContentParser reader = new RdfXmlContentParser<>(params, inputStream); + StringBuilder sb = new StringBuilder(); + reader.setRdfContentBuilderProvider(() -> turtleBuilder(params)); + reader.setRdfContentBuilderHandler(builder -> sb.append(builder.string())); + reader.parse(); + assertStream("gnd.ttl", getClass().getResourceAsStream("gnd.ttl"), sb.toString()); + } + } + + @Test + public void testAnotherGNDfromRdfXmltoTurtle() throws Exception { + String filename = "GND.rdf"; + try (InputStream inputStream = getClass().getResourceAsStream(filename)) { + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + TurtleContentParams params = new TurtleContentParams(namespaceContext, false); + RdfXmlContentParser reader = new RdfXmlContentParser<>(params, inputStream); + StringBuilder sb = new StringBuilder(); + reader.setRdfContentBuilderProvider(() -> turtleBuilder(params)); + reader.setRdfContentBuilderHandler(builder -> sb.append(builder.string())); + reader.parse(); + assertStream("gnd.ttl", getClass().getResourceAsStream("gnd.ttl"), sb.toString()); + } + } + + @Test + public void testGNDtoNtriple() throws Exception { + String filename = "GND.rdf"; + try (InputStream inputStream = getClass().getResourceAsStream(filename)) { + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + NTripleContentParams params = new NTripleContentParams(namespaceContext); + RdfXmlContentParser reader = new RdfXmlContentParser<>(params, inputStream); + StringBuilder sb = new StringBuilder(); + reader.setRdfContentBuilderProvider(() -> ntripleBuilder(params)); + reader.setRdfContentBuilderHandler(builder -> sb.append(builder.string())); + reader.parse(); + assertStream("GND.nt", getClass().getResourceAsStream("GND.nt"), sb.toString()); + } + } +} diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/test/io/rdfxml/RdfXmlReaderTest.java b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/rdfxml/RdfXmlReaderTest.java new file mode 100644 index 0000000..8e466fc --- /dev/null +++ b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/rdfxml/RdfXmlReaderTest.java @@ -0,0 +1,31 @@ +package org.xbib.content.rdf.test.io.rdfxml; + +import static org.xbib.content.rdf.RdfContentFactory.turtleBuilder; + +import org.junit.jupiter.api.Test; +import org.xbib.content.rdf.internal.DefaultAnonymousResource; +import org.xbib.content.rdf.io.rdfxml.RdfXmlContentParser; +import org.xbib.content.rdf.io.turtle.TurtleContentParams; +import org.xbib.content.resource.IRINamespaceContext; +import org.xbib.content.rdf.test.StreamTester; + +import java.io.InputStream; + +public class RdfXmlReaderTest extends StreamTester { + + @Test + public void testReader() throws Exception { + String filename = "118540238.xml"; + try (InputStream inputStream = getClass().getResourceAsStream(filename)) { + DefaultAnonymousResource.reset(); + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + TurtleContentParams params = new TurtleContentParams(namespaceContext, false); + RdfXmlContentParser reader = new RdfXmlContentParser<>(params, inputStream); + StringBuilder sb = new StringBuilder(); + reader.setRdfContentBuilderProvider(() -> turtleBuilder(params)); + reader.setRdfContentBuilderHandler(builder -> sb.append(builder.string())); + reader.parse(); + assertStream("118540238.ttl", getClass().getResourceAsStream("118540238.ttl"), sb.toString()); + } + } +} diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/test/io/rdfxml/VIAFRdfXmlReaderTest.java b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/rdfxml/VIAFRdfXmlReaderTest.java new file mode 100644 index 0000000..d7e3124 --- /dev/null +++ b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/rdfxml/VIAFRdfXmlReaderTest.java @@ -0,0 +1,33 @@ +package org.xbib.content.rdf.test.io.rdfxml; + +import static org.xbib.content.rdf.RdfContentFactory.turtleBuilder; + +import org.junit.jupiter.api.Test; +import org.xbib.content.rdf.io.rdfxml.RdfXmlContentParams; +import org.xbib.content.rdf.io.rdfxml.RdfXmlContentParser; +import org.xbib.content.rdf.io.turtle.TurtleContentParams; +import org.xbib.content.resource.IRINamespaceContext; +import org.xbib.content.rdf.test.StreamTester; + +import java.io.IOException; +import java.io.InputStream; + +public class VIAFRdfXmlReaderTest extends StreamTester { + + @Test + public void testVIAF() throws Exception { + try (InputStream inputStream = getClass().getResourceAsStream("VIAF.rdf")) { + if (inputStream == null) { + throw new IOException("VIAF.rdf not found"); + } + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + TurtleContentParams params = new TurtleContentParams(namespaceContext, false); + StringBuilder sb = new StringBuilder(); + RdfXmlContentParser parser = new RdfXmlContentParser<>(params, inputStream); + parser.setRdfContentBuilderProvider(() -> turtleBuilder(params)) + .setRdfContentBuilderHandler(builder -> sb.append(builder.string())) + .parse(); + assertStream("viaf.ttl", getClass().getResource("viaf.ttl").openStream(), sb.toString()); + } + } +} diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/test/io/turtle/TurtleConformanceTest.java b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/turtle/TurtleConformanceTest.java new file mode 100644 index 0000000..8483819 --- /dev/null +++ b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/turtle/TurtleConformanceTest.java @@ -0,0 +1,34 @@ +package org.xbib.content.rdf.test.io.turtle; + +import org.junit.jupiter.api.Test; +import org.xbib.content.rdf.RdfContentFactory; +import org.xbib.content.rdf.io.turtle.TurtleContentParams; +import org.xbib.content.rdf.io.turtle.TurtleContentParser; +import org.xbib.content.resource.IRI; +import org.xbib.content.rdf.test.StreamTester; +import org.xbib.content.resource.IRINamespaceContext; + +import java.io.InputStream; + +import static org.xbib.content.rdf.RdfContentFactory.turtleBuilder; + +public class TurtleConformanceTest extends StreamTester { + + @Test + public void conformance() throws Exception { + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + TurtleContentParams params = new TurtleContentParams(namespaceContext, false); + for (int n = 0; n < 30; n++) { + String testNum = String.format("%02d", n); + try (InputStream inputStream = getClass().getResourceAsStream("test-" + testNum + ".ttl")) { + TurtleContentParser turtleParser = new TurtleContentParser(params, inputStream) + .setBaseIRI(IRI.create("http://example/base/")); + turtleParser.setRdfContentBuilderProvider(() -> turtleBuilder(params)); + turtleParser.setRdfContentBuilderHandler(b -> { + //logger.log(Level.INFO, MessageFormat.format("turtle test {0}", b.string())); + }); + turtleParser.parse(); + } + } + } +} diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/io/turtle/TurtleTest.java b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/turtle/TurtleTest.java similarity index 56% rename from content-rdf/src/test/java/org/xbib/content/rdf/io/turtle/TurtleTest.java rename to content-rdf/src/test/java/org/xbib/content/rdf/test/io/turtle/TurtleTest.java index 9904769..940b2db 100644 --- a/content-rdf/src/test/java/org/xbib/content/rdf/io/turtle/TurtleTest.java +++ b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/turtle/TurtleTest.java @@ -1,90 +1,87 @@ -package org.xbib.content.rdf.io.turtle; +package org.xbib.content.rdf.test.io.turtle; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.xbib.content.rdf.RdfContentFactory.turtleBuilder; import org.junit.jupiter.api.Test; import org.xbib.content.rdf.RdfContentBuilder; -import org.xbib.content.rdf.RdfContentFactory; import org.xbib.content.rdf.Resource; import org.xbib.content.rdf.internal.DefaultResource; +import org.xbib.content.rdf.io.turtle.TurtleContentParams; +import org.xbib.content.rdf.io.turtle.TurtleContentParser; import org.xbib.content.resource.IRI; import org.xbib.content.resource.IRINamespaceContext; -import org.xbib.content.resource.NamespaceContext; -import org.xbib.content.rdf.StreamTester; +import org.xbib.content.rdf.test.StreamTester; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; -/** - * - */ public class TurtleTest extends StreamTester { @Test public void testTurtleGND() throws Exception { - NamespaceContext context = IRINamespaceContext.newInstance(); - context.addNamespace("gnd", "http://d-nb.info/gnd/"); - InputStream in = getClass().getResourceAsStream("GND.ttl"); - TurtleContentParser reader = new TurtleContentParser(in) - .setBaseIRI(IRI.create("http://d-nb.info/gnd/")) - .context(context); - reader.parse(); - in.close(); + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + namespaceContext.addNamespace("gnd", "http://d-nb.info/gnd/"); + try (InputStream inputStream = getClass().getResourceAsStream("GND.ttl")) { + TurtleContentParams params = new TurtleContentParams(namespaceContext, false); + TurtleContentParser parser = new TurtleContentParser(params, inputStream); + parser.setBaseIRI(IRI.create("http://d-nb.info/gnd/")) + .context(namespaceContext); + parser.parse(); + } } @Test public void testTurtleGND2() throws Exception { - IRINamespaceContext context = IRINamespaceContext.newInstance(); - InputStream in = getClass().getResourceAsStream("gnd2.ttl"); - TurtleContentParser reader = new TurtleContentParser(in) - .setBaseIRI(IRI.create("http://d-nb.info/gnd/")) - .context(context); - reader.parse(); - in.close(); + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + try (InputStream inputStream = getClass().getResourceAsStream("gnd2.ttl")) { + TurtleContentParams params = new TurtleContentParams(namespaceContext, false); + TurtleContentParser parser = new TurtleContentParser(params, inputStream); + parser.setBaseIRI(IRI.create("http://d-nb.info/gnd/")) + .context(namespaceContext); + parser.parse(); + } } @Test public void testTurtleGND3() throws Exception { - IRINamespaceContext context = IRINamespaceContext.newInstance(); - InputStream in = getClass().getResourceAsStream("gnd2.ttl"); - TurtleContentParser reader = new TurtleContentParser(in) - .setBaseIRI(IRI.create("http://d-nb.info/gnd/")) - .context(context); - reader.setRdfContentBuilderProvider(RdfContentFactory::turtleBuilder); - reader.setRdfContentBuilderHandler(b -> { - //logger.info("doc id={} content={}", b.getSubject(), b.string()); - }); - reader.parse(); - in.close(); + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + try (InputStream inputStream = getClass().getResourceAsStream("gnd2.ttl")) { + TurtleContentParams params = new TurtleContentParams(namespaceContext, false); + TurtleContentParser parser = new TurtleContentParser(params, inputStream); + parser.setBaseIRI(IRI.create("http://d-nb.info/gnd/")) + .context(namespaceContext); + parser.setRdfContentBuilderProvider(() ->turtleBuilder(params)); + parser.setRdfContentBuilderHandler(b -> { + //logger.info("doc id={} content={}", b.getSubject(), b.string()); + }); + parser.parse(); + } } @Test public void testTurtle() throws Exception { StringBuilder sb = new StringBuilder(); String filename = "turtle-demo.ttl"; - InputStream in = getClass().getResource(filename).openStream(); - BufferedReader reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8)); - String line; - while ((line = reader.readLine()) != null) { - sb.append(line).append("\n"); - } - reader.close(); - String s1 = sb.toString().trim(); - Resource resource = createResource(); - - IRINamespaceContext context = IRINamespaceContext.newInstance(); + IRINamespaceContext context = IRINamespaceContext.newInstance(getClass()); context.addNamespace("dc", "http://purl.org/dc/elements/1.1/"); context.addNamespace("dcterms", "http://purl.org/dc/terms/"); - TurtleContentParams params = new TurtleContentParams(context, true); - RdfContentBuilder builder = turtleBuilder(params); - builder.receive(resource); - String s2 = builder.string().trim(); - assertEquals(s2, s1); - in.close(); + try (InputStream inputStream = getClass().getResourceAsStream(filename); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); + RdfContentBuilder builder = turtleBuilder(params)) { + String line; + while ((line = reader.readLine()) != null) { + sb.append(line).append("\n"); + } + String s1 = sb.toString().trim(); + Resource resource = createResource(); + builder.receive(resource); + String s2 = builder.string().trim(); + assertEquals(s2, s1); + } } private Resource createResource() { @@ -106,11 +103,13 @@ public class TurtleTest extends StreamTester { @Test public void testTurtleBuilder() throws Exception { Resource resource = createResource2(); - IRINamespaceContext context = IRINamespaceContext.getInstance(); + IRINamespaceContext context = IRINamespaceContext.newInstance(getClass()); + context.addNamespace("xbib", "http://xbib.org/elements/"); TurtleContentParams params = new TurtleContentParams(context, false); - RdfContentBuilder builder = turtleBuilder(params); - builder.receive(resource); - assertStream("turtle-test.ttl", getClass().getResource("turtle-test.ttl").openStream(), builder.streamInput()); + try (RdfContentBuilder builder = turtleBuilder(params)) { + builder.receive(resource); + assertStream("turtle-test.ttl", getClass().getResource("turtle-test.ttl").openStream(), builder.streamInput()); + } } private Resource createResource2() { @@ -139,11 +138,14 @@ public class TurtleTest extends StreamTester { @Test public void testTurtleResourceIndent() throws Exception { Resource resource = createNestedResources(); - TurtleContentParams params = new TurtleContentParams(IRINamespaceContext.getInstance(), false); - RdfContentBuilder builder = turtleBuilder(params); - builder.receive(resource); - assertStream("turtle-indent.ttl", getClass().getResourceAsStream("turtle-indent.ttl"), - builder.streamInput()); + IRINamespaceContext context = IRINamespaceContext.newInstance(getClass()); + context.addNamespace("xbib", "http://xbib.org/elements/"); + TurtleContentParams params = new TurtleContentParams(context, false); + try (RdfContentBuilder builder = turtleBuilder(params)) { + builder.receive(resource); + assertStream("turtle-indent.ttl", getClass().getResourceAsStream("turtle-indent.ttl"), + builder.streamInput()); + } } private Resource createNestedResources() { @@ -177,11 +179,14 @@ public class TurtleTest extends StreamTester { @Test public void testTurtleDeepNest() throws Exception { Resource resource = createDeepNestedResources(); - TurtleContentParams params = new TurtleContentParams(IRINamespaceContext.getInstance(), false); - RdfContentBuilder builder = turtleBuilder(params); - builder.receive(resource); - assertStream("deep-nested.ttl", getClass().getResourceAsStream("deep-nested.ttl"), - builder.streamInput()); + IRINamespaceContext context = IRINamespaceContext.newInstance(getClass()); + context.addNamespace("xbib", "http://xbib.org/elements/"); + TurtleContentParams params = new TurtleContentParams(context, false); + try (RdfContentBuilder builder = turtleBuilder(params)) { + builder.receive(resource); + assertStream("deep-nested.ttl", getClass().getResourceAsStream("deep-nested.ttl"), + builder.streamInput()); + } } private Resource createDeepNestedResources() { @@ -207,6 +212,4 @@ public class TurtleTest extends StreamTester { .add("property10", "value10"); return r; } - - } diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/io/xml/OAITest.java b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/xml/OAITest.java similarity index 84% rename from content-rdf/src/test/java/org/xbib/content/rdf/io/xml/OAITest.java rename to content-rdf/src/test/java/org/xbib/content/rdf/test/io/xml/OAITest.java index 693bf90..45cfc01 100644 --- a/content-rdf/src/test/java/org/xbib/content/rdf/io/xml/OAITest.java +++ b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/xml/OAITest.java @@ -1,14 +1,17 @@ -package org.xbib.content.rdf.io.xml; +package org.xbib.content.rdf.test.io.xml; import static org.xbib.content.rdf.RdfContentFactory.turtleBuilder; import org.junit.jupiter.api.Test; import org.xbib.content.rdf.RdfContentBuilder; import org.xbib.content.rdf.io.turtle.TurtleContentParams; +import org.xbib.content.rdf.io.xml.AbstractXmlResourceHandler; +import org.xbib.content.rdf.io.xml.XmlContentParser; +import org.xbib.content.rdf.io.xml.XmlHandler; import org.xbib.content.resource.IRI; import org.xbib.content.resource.IRINamespaceContext; import org.xbib.content.resource.NamespaceContext; -import org.xbib.content.rdf.StreamTester; +import org.xbib.content.rdf.test.StreamTester; import org.xbib.net.PercentEncoders; import java.io.IOException; @@ -17,21 +20,17 @@ import java.nio.charset.StandardCharsets; import javax.xml.namespace.QName; -/** - * - */ public class OAITest extends StreamTester { @Test public void testOAIListRecordsToTurtle() throws Exception { String filename = "oai-listrecords.xml"; - InputStream in = getClass().getResourceAsStream(filename); - if (in == null) { + InputStream inputStream = getClass().getResourceAsStream(filename); + if (inputStream == null) { throw new IOException("file " + filename + " not found"); } - - IRINamespaceContext context = IRINamespaceContext.newInstance(); - XmlContentParams params = new XmlContentParams(context); + IRINamespaceContext context = IRINamespaceContext.newInstance(getClass()); + TurtleContentParams params = new TurtleContentParams(context, true); XmlHandler xmlHandler = new AbstractXmlResourceHandler<>(params) { @Override @@ -72,7 +71,7 @@ public class OAITest extends StreamTester { xmlHandler.setBuilder(builder) .setNamespaceContext(context) .setDefaultNamespace("oai", "http://www.openarchives.org/OAI/2.0/oai_dc/"); - XmlContentParser parser = new XmlContentParser<>(in); + XmlContentParser parser = new XmlContentParser<>(turtleParams, inputStream); parser.builder(builder); parser.setHandler(xmlHandler).parse(); assertStream("oai.ttl", getClass().getResourceAsStream("oai.ttl"), builder.streamInput()); diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/test/io/xml/XmlReaderTest.java b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/xml/XmlReaderTest.java new file mode 100644 index 0000000..0d29477 --- /dev/null +++ b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/xml/XmlReaderTest.java @@ -0,0 +1,215 @@ +package org.xbib.content.rdf.test.io.xml; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.xbib.content.rdf.RdfContentFactory.turtleBuilder; + +import org.junit.jupiter.api.Test; +import org.xbib.content.rdf.RdfContentBuilder; +import org.xbib.content.rdf.Resource; +import org.xbib.content.rdf.Triple; +import org.xbib.content.rdf.internal.DefaultAnonymousResource; +import org.xbib.content.rdf.internal.DefaultResource; +import org.xbib.content.rdf.io.ntriple.NTripleContent; +import org.xbib.content.rdf.io.ntriple.NTripleContentParams; +import org.xbib.content.rdf.io.turtle.TurtleContentParams; +import org.xbib.content.rdf.io.xml.AbstractXmlHandler; +import org.xbib.content.rdf.io.xml.AbstractXmlResourceHandler; +import org.xbib.content.rdf.io.xml.XmlContentParser; +import org.xbib.content.rdf.io.xml.XmlHandler; +import org.xbib.content.resource.IRI; +import org.xbib.content.resource.IRINamespaceContext; +import org.xbib.content.resource.NamespaceContext; +import org.xbib.content.rdf.test.StreamTester; +import org.xbib.net.PercentEncoders; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.LinkedList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.xml.namespace.QName; + +public class XmlReaderTest extends StreamTester { + + @Test + public void testOAIDC() throws Exception { + String filename = "oro-eprint-25656.xml"; + try (InputStream inputStream = getClass().getResourceAsStream(filename)) { + if (inputStream == null) { + throw new IOException("file " + filename + " not found"); + } + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + namespaceContext.addNamespace("oaidc", "http://www.openarchives.org/OAI/2.0/oai_dc/"); + namespaceContext.addNamespace("dc", "http://purl.org/dc/elements/1.1/"); + TurtleContentParams turtleParams = new TurtleContentParams(namespaceContext, true); + XmlHandler turtleHandler = new AbstractXmlResourceHandler<>(turtleParams) { + + @Override + public boolean isResourceDelimiter(QName name) { + return "oai_dc".equals(name.getLocalPart()); + } + + @Override + public void identify(QName name, String value, IRI identifier) { + if ("identifier".equals(name.getLocalPart()) && DefaultResource.isBlank(getResource())) { + try { + // make sure we can build an opaque IRI, whatever is out there + getResource().setId(IRI.create("id:" + + PercentEncoders.getRegNameEncoder(StandardCharsets.UTF_8).encode(value))); + } catch (IOException e) { + // swallow + } + } + } + + @Override + public boolean skip(QName name) { + // skip dc:dc element + return "dc".equals(name.getLocalPart()); + } + + @Override + public XmlHandler setNamespaceContext(NamespaceContext namespaceContext) { + return this; + } + + @Override + public IRINamespaceContext getNamespaceContext() { + return namespaceContext; + } + }; + RdfContentBuilder builder = turtleBuilder(turtleParams); + turtleHandler.setBuilder(builder); + XmlContentParser parser = new XmlContentParser<>(turtleParams, inputStream); + parser.setHandler(turtleHandler).parse(); + assertStream("dc.ttl", getClass().getResource("dc.ttl").openStream(), + builder.streamInput()); + } + } + + @Test + public void testXmlArray() throws Exception { + String filename = "array.xml"; + try (InputStream inputStream = getClass().getResourceAsStream(filename)) { + if (inputStream == null) { + throw new IOException("file " + filename + " not found"); + } + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + NTripleContentParams nTripleContentParams = new NTripleContentParams(namespaceContext); + AbstractXmlResourceHandler xmlHandler = new AbstractXmlResourceHandler<>(nTripleContentParams) { + + @Override + public boolean isResourceDelimiter(QName name) { + return false; + } + + @Override + public void identify(QName name, String value, IRI identifier) { + getResource().setId(IRI.create("id:1")); + } + + @Override + public boolean skip(QName name) { + return false; + } + + @Override + public AbstractXmlResourceHandler setNamespaceContext(NamespaceContext namespaceContext) { + return this; + } + + @Override + public IRINamespaceContext getNamespaceContext() { + return namespaceContext; + } + }; + + MyBuilder builder = new MyBuilder(); + xmlHandler.setDefaultNamespace("xml", "http://xmltest") + .setBuilder(builder); + DefaultAnonymousResource.reset(); + XmlContentParser parser = new XmlContentParser<>(xmlHandler.getParams(), inputStream); + parser.setHandler(xmlHandler).parse(); + assertEquals("[id:1 xml:dates _:b2, _:b2 xml:date 2001, _:b2 xml:date 2002, _:b2 xml:date 2003]", + builder.getTriples().toString() + ); + } + } + + @Test + public void testXmlAttribute() throws Exception { + String filename = "attribute.xml"; + try (InputStream inputStream = getClass().getResourceAsStream(filename)) { + if (inputStream == null) { + throw new IOException("file " + filename + " not found"); + } + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + NTripleContentParams params = new NTripleContentParams(namespaceContext); + AbstractXmlHandler xmlHandler = new AbstractXmlResourceHandler<>(params) { + @Override + public boolean isResourceDelimiter(QName name) { + return false; + } + + @Override + public void identify(QName name, String value, IRI identifier) { + getResource().setId(IRI.create("id:1")); + } + + @Override + public boolean skip(QName name) { + return false; + } + + @Override + public XmlHandler setNamespaceContext(NamespaceContext namespaceContext) { + return this; + } + + @Override + public IRINamespaceContext getNamespaceContext() { + return namespaceContext; + } + }; + MyBuilder builder = new MyBuilder(); + xmlHandler.setDefaultNamespace("xml", "http://localhost") + .setBuilder(builder); + DefaultAnonymousResource.reset(); + XmlContentParser parser = new XmlContentParser<>(xmlHandler.getParams(), inputStream); + parser.setHandler(xmlHandler).parse(); + assertEquals("[id:1 xml:dates _:b2, _:b2 xml:date _:b3, _:b3 xml:@href 1, _:b2 xml:date _:b5, " + + "_:b5 xml:@href 2, _:b2 xml:date _:b7, _:b7 xml:@href 3, _:b2 xml:date _:b9, _:b9 xml:hello World]", + builder.getTriples().toString() + ); + } + } + + private static class MyBuilder extends RdfContentBuilder { + + private final List triples = new LinkedList<>(); + + MyBuilder() throws IOException { + super(NTripleContent.nTripleContent(), new NTripleContentParams(IRINamespaceContext.newInstance(MyBuilder.class))); + } + + @Override + public MyBuilder receive(Triple triple) { + triples.add(triple); + return this; + } + + @Override + public MyBuilder receive(Resource resource) throws IOException { + triples.addAll(resource.triples()); + return this; + } + + List getTriples() { + return triples; + } + } + +} diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/io/xml/XmlResourceWriterTest.java b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/xml/XmlResourceWriterTest.java similarity index 50% rename from content-rdf/src/test/java/org/xbib/content/rdf/io/xml/XmlResourceWriterTest.java rename to content-rdf/src/test/java/org/xbib/content/rdf/test/io/xml/XmlResourceWriterTest.java index 615920f..5f29ca4 100644 --- a/content-rdf/src/test/java/org/xbib/content/rdf/io/xml/XmlResourceWriterTest.java +++ b/content-rdf/src/test/java/org/xbib/content/rdf/test/io/xml/XmlResourceWriterTest.java @@ -1,18 +1,18 @@ -package org.xbib.content.rdf.io.xml; +package org.xbib.content.rdf.test.io.xml; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.xbib.content.rdf.RdfContentFactory.xmlBuilder; import org.junit.jupiter.api.Test; import org.xbib.content.rdf.RdfContentBuilder; +import org.xbib.content.rdf.RdfContentParams; import org.xbib.content.rdf.Resource; import org.xbib.content.rdf.internal.DefaultAnonymousResource; import org.xbib.content.rdf.internal.DefaultResource; +import org.xbib.content.rdf.io.xml.XmlContentParams; import org.xbib.content.resource.IRI; +import org.xbib.content.resource.IRINamespaceContext; -/** - * - */ public class XmlResourceWriterTest { @Test @@ -23,11 +23,14 @@ public class XmlResourceWriterTest { resource.add("urn:property", "value"); Resource nestedResource = resource.newResource("urn:nestedresource"); nestedResource.add("urn:nestedproperty", "nestedvalue"); - RdfContentBuilder builder = xmlBuilder(); - builder.receive(root); - assertEquals("value" - + "nestedvalue", - builder.string()); + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + XmlContentParams params = new XmlContentParams(namespaceContext); + try (RdfContentBuilder builder = xmlBuilder(params)) { + builder.receive(root); + assertEquals("value" + + "nestedvalue", + builder.string()); + } } @Test @@ -36,10 +39,11 @@ public class XmlResourceWriterTest { Resource parent = new DefaultResource(IRI.create("urn:doc3")); Resource child = parent.newResource("urn:res"); child.add("urn:property", "value"); - RdfContentBuilder builder = xmlBuilder(); - builder.receive(parent); - assertEquals( - builder.string(), - "value"); + IRINamespaceContext namespaceContext = IRINamespaceContext.newInstance(getClass()); + XmlContentParams params = new XmlContentParams(namespaceContext); + try (RdfContentBuilder builder = xmlBuilder(params)) { + builder.receive(parent); + assertEquals("value", builder.string()); + } } } diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/util/MultiMapTest.java b/content-rdf/src/test/java/org/xbib/content/rdf/test/util/MultiMapTest.java similarity index 88% rename from content-rdf/src/test/java/org/xbib/content/rdf/util/MultiMapTest.java rename to content-rdf/src/test/java/org/xbib/content/rdf/test/util/MultiMapTest.java index ece8abf..58bccd9 100644 --- a/content-rdf/src/test/java/org/xbib/content/rdf/util/MultiMapTest.java +++ b/content-rdf/src/test/java/org/xbib/content/rdf/test/util/MultiMapTest.java @@ -1,8 +1,10 @@ -package org.xbib.content.rdf.util; +package org.xbib.content.rdf.test.util; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; +import org.xbib.content.rdf.util.LinkedHashMultiMap; + import java.util.Arrays; public class MultiMapTest { diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/util/package-info.java b/content-rdf/src/test/java/org/xbib/content/rdf/util/package-info.java deleted file mode 100644 index 6f0bc4f..0000000 --- a/content-rdf/src/test/java/org/xbib/content/rdf/util/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Classes for testing multi maps. - */ -package org.xbib.content.rdf.util; diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/VIAF.rdf b/content-rdf/src/test/resources/org/xbib/content/rdf/test/VIAF.rdf similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/VIAF.rdf rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/VIAF.rdf diff --git a/content-rdf/src/test/resources/org/xbib/content/resource/namespace.properties b/content-rdf/src/test/resources/org/xbib/content/rdf/test/internal/namespace.properties similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/resource/namespace.properties rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/internal/namespace.properties diff --git a/content-rdf/src/test/resources/org/xbib/content/json/dc.json b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/json/dc.json similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/json/dc.json rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/json/dc.json diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/json/namespace.properties b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/json/namespace.properties new file mode 100644 index 0000000..7cf3d07 --- /dev/null +++ b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/json/namespace.properties @@ -0,0 +1,36 @@ +# XML namespace +xml = http://www.w3.org/XML/1998/namespace +xsl = http://www.w3.org/1999/XSL/Transform + +# Atom +atom = http://www.w3.org/2005/Atom + +# RDF namespace +rdf = http://www.w3.org/1999/02/22-rdf-syntax-ns# +rdfs = http://www.w3.org/2000/01/rdf-schema# +owl = http://www.w3.org/2002/07/owl# + +foaf = http://xmlns.com/foaf/0.1/ + +# Apache +xalan = http://xml.apache.org/xslt + +# Dublin Core Namespaces +# http://dublincore.org/documents/dcmi-namespace/ +dc = http://purl.org/dc/elements/1.1/ +dcterms = http://purl.org/dc/terms/ +rel = http://purl.org/vocab/relationship/ + +# Library of Congress +mods = http://www.loc.gov/mods/v3 +bib = info:srw/cql-context-set/1/bib-v1/ + +# RDA, MARC +rdagr2 = http://RDVocab.info/ElementsGr2/ + +# DNB +gnd = http://d-nb.info/standards/elementset/gnd# + +# xbib +xbib = http://xbib.org/elements/ +lia = http://xbib.org/namespaces/lia/ \ No newline at end of file diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/ntriple/list.nt b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/ntriple/list.nt similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/ntriple/list.nt rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/ntriple/list.nt diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/ntriple/namespace.properties b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/ntriple/namespace.properties new file mode 100644 index 0000000..7cf3d07 --- /dev/null +++ b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/ntriple/namespace.properties @@ -0,0 +1,36 @@ +# XML namespace +xml = http://www.w3.org/XML/1998/namespace +xsl = http://www.w3.org/1999/XSL/Transform + +# Atom +atom = http://www.w3.org/2005/Atom + +# RDF namespace +rdf = http://www.w3.org/1999/02/22-rdf-syntax-ns# +rdfs = http://www.w3.org/2000/01/rdf-schema# +owl = http://www.w3.org/2002/07/owl# + +foaf = http://xmlns.com/foaf/0.1/ + +# Apache +xalan = http://xml.apache.org/xslt + +# Dublin Core Namespaces +# http://dublincore.org/documents/dcmi-namespace/ +dc = http://purl.org/dc/elements/1.1/ +dcterms = http://purl.org/dc/terms/ +rel = http://purl.org/vocab/relationship/ + +# Library of Congress +mods = http://www.loc.gov/mods/v3 +bib = info:srw/cql-context-set/1/bib-v1/ + +# RDA, MARC +rdagr2 = http://RDVocab.info/ElementsGr2/ + +# DNB +gnd = http://d-nb.info/standards/elementset/gnd# + +# xbib +xbib = http://xbib.org/elements/ +lia = http://xbib.org/namespaces/lia/ \ No newline at end of file diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/ntriple/rdfxml.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/ntriple/rdfxml.ttl similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/ntriple/rdfxml.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/ntriple/rdfxml.ttl diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/rdfxml/118540238.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/118540238.ttl similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/rdfxml/118540238.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/118540238.ttl diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/rdfxml/118540238.xml b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/118540238.xml similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/rdfxml/118540238.xml rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/118540238.xml diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/rdfxml/11862444X_lds.xml b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/11862444X_lds.xml similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/rdfxml/11862444X_lds.xml rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/11862444X_lds.xml diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/rdfxml/GND.nt b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/GND.nt similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/rdfxml/GND.nt rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/GND.nt diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/rdfxml/GND.rdf b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/GND.rdf similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/rdfxml/GND.rdf rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/GND.rdf diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/rdfxml/VIAF.rdf b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/VIAF.rdf similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/rdfxml/VIAF.rdf rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/VIAF.rdf diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/rdfxml/edm.nt b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/edm.nt similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/rdfxml/edm.nt rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/edm.nt diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/rdfxml/gnd.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/gnd.ttl similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/rdfxml/gnd.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/gnd.ttl diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/namespace.properties b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/namespace.properties new file mode 100644 index 0000000..7cf3d07 --- /dev/null +++ b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/namespace.properties @@ -0,0 +1,36 @@ +# XML namespace +xml = http://www.w3.org/XML/1998/namespace +xsl = http://www.w3.org/1999/XSL/Transform + +# Atom +atom = http://www.w3.org/2005/Atom + +# RDF namespace +rdf = http://www.w3.org/1999/02/22-rdf-syntax-ns# +rdfs = http://www.w3.org/2000/01/rdf-schema# +owl = http://www.w3.org/2002/07/owl# + +foaf = http://xmlns.com/foaf/0.1/ + +# Apache +xalan = http://xml.apache.org/xslt + +# Dublin Core Namespaces +# http://dublincore.org/documents/dcmi-namespace/ +dc = http://purl.org/dc/elements/1.1/ +dcterms = http://purl.org/dc/terms/ +rel = http://purl.org/vocab/relationship/ + +# Library of Congress +mods = http://www.loc.gov/mods/v3 +bib = info:srw/cql-context-set/1/bib-v1/ + +# RDA, MARC +rdagr2 = http://RDVocab.info/ElementsGr2/ + +# DNB +gnd = http://d-nb.info/standards/elementset/gnd# + +# xbib +xbib = http://xbib.org/elements/ +lia = http://xbib.org/namespaces/lia/ \ No newline at end of file diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/rdfxml/oai_edm.xml b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/oai_edm.xml similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/rdfxml/oai_edm.xml rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/oai_edm.xml diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/rdfxml/rdfxml.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/rdfxml.ttl similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/rdfxml/rdfxml.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/rdfxml.ttl diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/rdfxml/sh87008036.xml b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/sh87008036.xml similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/rdfxml/sh87008036.xml rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/sh87008036.xml diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/rdfxml/viaf.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/viaf.ttl similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/rdfxml/viaf.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/rdfxml/viaf.ttl diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/turtle/GND.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/GND.ttl similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/turtle/GND.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/GND.ttl diff --git a/content-rdf/src/test/resources/turtle/README.txt b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/README.txt similarity index 100% rename from content-rdf/src/test/resources/turtle/README.txt rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/README.txt diff --git a/content-rdf/src/test/resources/turtle/bad-00.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-00.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/bad-00.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-00.ttl diff --git a/content-rdf/src/test/resources/turtle/bad-01.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-01.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/bad-01.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-01.ttl diff --git a/content-rdf/src/test/resources/turtle/bad-02.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-02.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/bad-02.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-02.ttl diff --git a/content-rdf/src/test/resources/turtle/bad-03.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-03.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/bad-03.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-03.ttl diff --git a/content-rdf/src/test/resources/turtle/bad-04.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-04.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/bad-04.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-04.ttl diff --git a/content-rdf/src/test/resources/turtle/bad-05.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-05.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/bad-05.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-05.ttl diff --git a/content-rdf/src/test/resources/turtle/bad-06.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-06.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/bad-06.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-06.ttl diff --git a/content-rdf/src/test/resources/turtle/bad-07.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-07.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/bad-07.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-07.ttl diff --git a/content-rdf/src/test/resources/turtle/bad-08.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-08.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/bad-08.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-08.ttl diff --git a/content-rdf/src/test/resources/turtle/bad-09.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-09.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/bad-09.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-09.ttl diff --git a/content-rdf/src/test/resources/turtle/bad-10.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-10.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/bad-10.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-10.ttl diff --git a/content-rdf/src/test/resources/turtle/bad-11.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-11.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/bad-11.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-11.ttl diff --git a/content-rdf/src/test/resources/turtle/bad-12.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-12.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/bad-12.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-12.ttl diff --git a/content-rdf/src/test/resources/turtle/bad-13.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-13.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/bad-13.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-13.ttl diff --git a/content-rdf/src/test/resources/turtle/bad-14.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-14.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/bad-14.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/bad-14.ttl diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/turtle/deep-nested.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/deep-nested.ttl similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/turtle/deep-nested.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/deep-nested.ttl diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/turtle/gnd2.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/gnd2.ttl similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/turtle/gnd2.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/gnd2.ttl diff --git a/content-rdf/src/test/resources/turtle/index.html b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/index.html similarity index 100% rename from content-rdf/src/test/resources/turtle/index.html rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/index.html diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/turtle/list.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/list.ttl similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/turtle/list.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/list.ttl diff --git a/content-rdf/src/test/resources/turtle/manifest-bad.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/manifest-bad.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/manifest-bad.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/manifest-bad.ttl diff --git a/content-rdf/src/test/resources/turtle/manifest.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/manifest.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/manifest.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/manifest.ttl diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/namespace.properties b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/namespace.properties new file mode 100644 index 0000000..08bdee8 --- /dev/null +++ b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/namespace.properties @@ -0,0 +1,2 @@ +dc = http://purl.org/dc/elements/1.1/ +dcterms = http://purl.org/dc/terms/ diff --git a/content-rdf/src/test/resources/turtle/rdf-schema.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/rdf-schema.out similarity index 100% rename from content-rdf/src/test/resources/turtle/rdf-schema.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/rdf-schema.out diff --git a/content-rdf/src/test/resources/turtle/rdf-schema.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/rdf-schema.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/rdf-schema.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/rdf-schema.ttl diff --git a/content-rdf/src/test/resources/turtle/rdfq-results.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/rdfq-results.out similarity index 100% rename from content-rdf/src/test/resources/turtle/rdfq-results.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/rdfq-results.out diff --git a/content-rdf/src/test/resources/turtle/rdfq-results.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/rdfq-results.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/rdfq-results.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/rdfq-results.ttl diff --git a/content-rdf/src/test/resources/turtle/rdfs-namespace.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/rdfs-namespace.out similarity index 100% rename from content-rdf/src/test/resources/turtle/rdfs-namespace.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/rdfs-namespace.out diff --git a/content-rdf/src/test/resources/turtle/rdfs-namespace.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/rdfs-namespace.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/rdfs-namespace.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/rdfs-namespace.ttl diff --git a/content-rdf/src/test/resources/turtle/test-00.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-00.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-00.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-00.out diff --git a/content-rdf/src/test/resources/turtle/test-00.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-00.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-00.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-00.result diff --git a/content-rdf/src/test/resources/turtle/test-00.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-00.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-00.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-00.ttl diff --git a/content-rdf/src/test/resources/turtle/test-01.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-01.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-01.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-01.out diff --git a/content-rdf/src/test/resources/turtle/test-01.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-01.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-01.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-01.result diff --git a/content-rdf/src/test/resources/turtle/test-01.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-01.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-01.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-01.ttl diff --git a/content-rdf/src/test/resources/turtle/test-02.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-02.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-02.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-02.out diff --git a/content-rdf/src/test/resources/turtle/test-02.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-02.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-02.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-02.result diff --git a/content-rdf/src/test/resources/turtle/test-02.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-02.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-02.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-02.ttl diff --git a/content-rdf/src/test/resources/turtle/test-03.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-03.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-03.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-03.out diff --git a/content-rdf/src/test/resources/turtle/test-03.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-03.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-03.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-03.result diff --git a/content-rdf/src/test/resources/turtle/test-03.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-03.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-03.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-03.ttl diff --git a/content-rdf/src/test/resources/turtle/test-04.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-04.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-04.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-04.out diff --git a/content-rdf/src/test/resources/turtle/test-04.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-04.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-04.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-04.result diff --git a/content-rdf/src/test/resources/turtle/test-04.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-04.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-04.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-04.ttl diff --git a/content-rdf/src/test/resources/turtle/test-05.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-05.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-05.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-05.out diff --git a/content-rdf/src/test/resources/turtle/test-05.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-05.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-05.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-05.result diff --git a/content-rdf/src/test/resources/turtle/test-05.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-05.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-05.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-05.ttl diff --git a/content-rdf/src/test/resources/turtle/test-06.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-06.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-06.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-06.out diff --git a/content-rdf/src/test/resources/turtle/test-06.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-06.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-06.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-06.result diff --git a/content-rdf/src/test/resources/turtle/test-06.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-06.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-06.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-06.ttl diff --git a/content-rdf/src/test/resources/turtle/test-07.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-07.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-07.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-07.out diff --git a/content-rdf/src/test/resources/turtle/test-07.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-07.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-07.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-07.result diff --git a/content-rdf/src/test/resources/turtle/test-07.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-07.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-07.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-07.ttl diff --git a/content-rdf/src/test/resources/turtle/test-08.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-08.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-08.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-08.out diff --git a/content-rdf/src/test/resources/turtle/test-08.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-08.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-08.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-08.result diff --git a/content-rdf/src/test/resources/turtle/test-08.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-08.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-08.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-08.ttl diff --git a/content-rdf/src/test/resources/turtle/test-09.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-09.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-09.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-09.out diff --git a/content-rdf/src/test/resources/turtle/test-09.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-09.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-09.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-09.result diff --git a/content-rdf/src/test/resources/turtle/test-09.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-09.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-09.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-09.ttl diff --git a/content-rdf/src/test/resources/turtle/test-10.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-10.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-10.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-10.out diff --git a/content-rdf/src/test/resources/turtle/test-10.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-10.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-10.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-10.result diff --git a/content-rdf/src/test/resources/turtle/test-10.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-10.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-10.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-10.ttl diff --git a/content-rdf/src/test/resources/turtle/test-11.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-11.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-11.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-11.out diff --git a/content-rdf/src/test/resources/turtle/test-11.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-11.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-11.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-11.result diff --git a/content-rdf/src/test/resources/turtle/test-11.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-11.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-11.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-11.ttl diff --git a/content-rdf/src/test/resources/turtle/test-12.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-12.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-12.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-12.out diff --git a/content-rdf/src/test/resources/turtle/test-12.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-12.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-12.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-12.result diff --git a/content-rdf/src/test/resources/turtle/test-12.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-12.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-12.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-12.ttl diff --git a/content-rdf/src/test/resources/turtle/test-13.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-13.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-13.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-13.out diff --git a/content-rdf/src/test/resources/turtle/test-13.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-13.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-13.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-13.result diff --git a/content-rdf/src/test/resources/turtle/test-13.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-13.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-13.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-13.ttl diff --git a/content-rdf/src/test/resources/turtle/test-14.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-14.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-14.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-14.out diff --git a/content-rdf/src/test/resources/turtle/test-14.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-14.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-14.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-14.result diff --git a/content-rdf/src/test/resources/turtle/test-14.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-14.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-14.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-14.ttl diff --git a/content-rdf/src/test/resources/turtle/test-15.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-15.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-15.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-15.out diff --git a/content-rdf/src/test/resources/turtle/test-15.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-15.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-15.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-15.result diff --git a/content-rdf/src/test/resources/turtle/test-15.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-15.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-15.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-15.ttl diff --git a/content-rdf/src/test/resources/turtle/test-16.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-16.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-16.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-16.out diff --git a/content-rdf/src/test/resources/turtle/test-16.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-16.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-16.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-16.result diff --git a/content-rdf/src/test/resources/turtle/test-16.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-16.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-16.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-16.ttl diff --git a/content-rdf/src/test/resources/turtle/test-17.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-17.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-17.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-17.out diff --git a/content-rdf/src/test/resources/turtle/test-17.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-17.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-17.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-17.result diff --git a/content-rdf/src/test/resources/turtle/test-17.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-17.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-17.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-17.ttl diff --git a/content-rdf/src/test/resources/turtle/test-18.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-18.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-18.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-18.out diff --git a/content-rdf/src/test/resources/turtle/test-18.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-18.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-18.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-18.result diff --git a/content-rdf/src/test/resources/turtle/test-18.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-18.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-18.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-18.ttl diff --git a/content-rdf/src/test/resources/turtle/test-19.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-19.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-19.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-19.out diff --git a/content-rdf/src/test/resources/turtle/test-19.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-19.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-19.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-19.result diff --git a/content-rdf/src/test/resources/turtle/test-19.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-19.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-19.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-19.ttl diff --git a/content-rdf/src/test/resources/turtle/test-20.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-20.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-20.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-20.out diff --git a/content-rdf/src/test/resources/turtle/test-20.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-20.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-20.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-20.result diff --git a/content-rdf/src/test/resources/turtle/test-20.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-20.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-20.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-20.ttl diff --git a/content-rdf/src/test/resources/turtle/test-21.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-21.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-21.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-21.out diff --git a/content-rdf/src/test/resources/turtle/test-21.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-21.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-21.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-21.result diff --git a/content-rdf/src/test/resources/turtle/test-21.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-21.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-21.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-21.ttl diff --git a/content-rdf/src/test/resources/turtle/test-22.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-22.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-22.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-22.out diff --git a/content-rdf/src/test/resources/turtle/test-22.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-22.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-22.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-22.result diff --git a/content-rdf/src/test/resources/turtle/test-22.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-22.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-22.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-22.ttl diff --git a/content-rdf/src/test/resources/turtle/test-23.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-23.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-23.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-23.out diff --git a/content-rdf/src/test/resources/turtle/test-23.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-23.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-23.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-23.result diff --git a/content-rdf/src/test/resources/turtle/test-23.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-23.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-23.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-23.ttl diff --git a/content-rdf/src/test/resources/turtle/test-24.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-24.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-24.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-24.out diff --git a/content-rdf/src/test/resources/turtle/test-24.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-24.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-24.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-24.result diff --git a/content-rdf/src/test/resources/turtle/test-24.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-24.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-24.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-24.ttl diff --git a/content-rdf/src/test/resources/turtle/test-25.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-25.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-25.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-25.out diff --git a/content-rdf/src/test/resources/turtle/test-25.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-25.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-25.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-25.result diff --git a/content-rdf/src/test/resources/turtle/test-25.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-25.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-25.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-25.ttl diff --git a/content-rdf/src/test/resources/turtle/test-26.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-26.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-26.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-26.out diff --git a/content-rdf/src/test/resources/turtle/test-26.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-26.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-26.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-26.result diff --git a/content-rdf/src/test/resources/turtle/test-26.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-26.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-26.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-26.ttl diff --git a/content-rdf/src/test/resources/turtle/test-27.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-27.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-27.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-27.out diff --git a/content-rdf/src/test/resources/turtle/test-27.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-27.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-27.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-27.result diff --git a/content-rdf/src/test/resources/turtle/test-27.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-27.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-27.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-27.ttl diff --git a/content-rdf/src/test/resources/turtle/test-28-out.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-28-out.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-28-out.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-28-out.ttl diff --git a/content-rdf/src/test/resources/turtle/test-28.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-28.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-28.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-28.out diff --git a/content-rdf/src/test/resources/turtle/test-28.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-28.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-28.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-28.result diff --git a/content-rdf/src/test/resources/turtle/test-28.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-28.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-28.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-28.ttl diff --git a/content-rdf/src/test/resources/turtle/test-29.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-29.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-29.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-29.out diff --git a/content-rdf/src/test/resources/turtle/test-29.result b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-29.result similarity index 100% rename from content-rdf/src/test/resources/turtle/test-29.result rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-29.result diff --git a/content-rdf/src/test/resources/turtle/test-29.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-29.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-29.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-29.ttl diff --git a/content-rdf/src/test/resources/turtle/test-30.out b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-30.out similarity index 100% rename from content-rdf/src/test/resources/turtle/test-30.out rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-30.out diff --git a/content-rdf/src/test/resources/turtle/test-30.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-30.ttl similarity index 100% rename from content-rdf/src/test/resources/turtle/test-30.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/test-30.ttl diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/turtle/turtle-demo.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/turtle-demo.ttl similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/turtle/turtle-demo.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/turtle-demo.ttl diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/turtle/turtle-indent.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/turtle-indent.ttl similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/turtle/turtle-indent.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/turtle-indent.ttl diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/turtle/turtle-test.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/turtle-test.ttl similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/turtle/turtle-test.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/turtle/turtle-test.ttl diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/xml/array.xml b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/xml/array.xml similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/xml/array.xml rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/xml/array.xml diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/xml/attribute.xml b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/xml/attribute.xml similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/xml/attribute.xml rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/xml/attribute.xml diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/xml/dc.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/xml/dc.ttl similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/xml/dc.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/xml/dc.ttl diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/xml/namespace.properties b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/xml/namespace.properties new file mode 100644 index 0000000..bc63beb --- /dev/null +++ b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/xml/namespace.properties @@ -0,0 +1 @@ +# empty \ No newline at end of file diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/xml/oai-listrecords.xml b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/xml/oai-listrecords.xml similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/xml/oai-listrecords.xml rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/xml/oai-listrecords.xml diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/xml/oai.ttl b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/xml/oai.ttl similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/xml/oai.ttl rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/xml/oai.ttl diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/xml/oro-eprint-25656.xml b/content-rdf/src/test/resources/org/xbib/content/rdf/test/io/xml/oro-eprint-25656.xml similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/xml/oro-eprint-25656.xml rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/io/xml/oro-eprint-25656.xml diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/io/json/dc.json b/content-rdf/src/test/resources/org/xbib/content/rdf/test/json/dc.json similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/io/json/dc.json rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/json/dc.json diff --git a/content-rdf/src/test/resources/org/xbib/content/json/elasticsearch-hit-example-1.json b/content-rdf/src/test/resources/org/xbib/content/rdf/test/json/elasticsearch-hit-example-1.json similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/json/elasticsearch-hit-example-1.json rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/json/elasticsearch-hit-example-1.json diff --git a/content-rdf/src/test/resources/org/xbib/content/json/es-test-20130719.json b/content-rdf/src/test/resources/org/xbib/content/rdf/test/json/es-test-20130719.json similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/json/es-test-20130719.json rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/json/es-test-20130719.json diff --git a/content-rdf/src/test/resources/org/xbib/content/json/glossary.json b/content-rdf/src/test/resources/org/xbib/content/rdf/test/json/glossary.json similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/json/glossary.json rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/json/glossary.json diff --git a/content-rdf/src/test/resources/org/xbib/content/json/menu.json b/content-rdf/src/test/resources/org/xbib/content/rdf/test/json/menu.json similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/json/menu.json rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/json/menu.json diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/jsonld/Vcard.jsonld b/content-rdf/src/test/resources/org/xbib/content/rdf/test/jsonld/Vcard.jsonld similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/jsonld/Vcard.jsonld rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/jsonld/Vcard.jsonld diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/jsonld/bib.jsonld b/content-rdf/src/test/resources/org/xbib/content/rdf/test/jsonld/bib.jsonld similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/jsonld/bib.jsonld rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/jsonld/bib.jsonld diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/jsonld/data.jsonld b/content-rdf/src/test/resources/org/xbib/content/rdf/test/jsonld/data.jsonld similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/jsonld/data.jsonld rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/jsonld/data.jsonld diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/jsonld/ldp.jsonld b/content-rdf/src/test/resources/org/xbib/content/rdf/test/jsonld/ldp.jsonld similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/jsonld/ldp.jsonld rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/jsonld/ldp.jsonld diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/jsonld/schema.jsonld b/content-rdf/src/test/resources/org/xbib/content/rdf/test/jsonld/schema.jsonld similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/jsonld/schema.jsonld rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/jsonld/schema.jsonld diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/test/namespace.properties b/content-rdf/src/test/resources/org/xbib/content/rdf/test/namespace.properties new file mode 100644 index 0000000..7cf3d07 --- /dev/null +++ b/content-rdf/src/test/resources/org/xbib/content/rdf/test/namespace.properties @@ -0,0 +1,36 @@ +# XML namespace +xml = http://www.w3.org/XML/1998/namespace +xsl = http://www.w3.org/1999/XSL/Transform + +# Atom +atom = http://www.w3.org/2005/Atom + +# RDF namespace +rdf = http://www.w3.org/1999/02/22-rdf-syntax-ns# +rdfs = http://www.w3.org/2000/01/rdf-schema# +owl = http://www.w3.org/2002/07/owl# + +foaf = http://xmlns.com/foaf/0.1/ + +# Apache +xalan = http://xml.apache.org/xslt + +# Dublin Core Namespaces +# http://dublincore.org/documents/dcmi-namespace/ +dc = http://purl.org/dc/elements/1.1/ +dcterms = http://purl.org/dc/terms/ +rel = http://purl.org/vocab/relationship/ + +# Library of Congress +mods = http://www.loc.gov/mods/v3 +bib = info:srw/cql-context-set/1/bib-v1/ + +# RDA, MARC +rdagr2 = http://RDVocab.info/ElementsGr2/ + +# DNB +gnd = http://d-nb.info/standards/elementset/gnd# + +# xbib +xbib = http://xbib.org/elements/ +lia = http://xbib.org/namespaces/lia/ \ No newline at end of file diff --git a/content-rdf/src/test/resources/org/xbib/sequential/sequential.groupstream b/content-rdf/src/test/resources/org/xbib/content/rdf/test/sequential/sequential.groupstream similarity index 100% rename from content-rdf/src/test/resources/org/xbib/sequential/sequential.groupstream rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/sequential/sequential.groupstream diff --git a/content-rdf/src/test/resources/org/xbib/content/rdf/viaf.json b/content-rdf/src/test/resources/org/xbib/content/rdf/test/viaf.json similarity index 100% rename from content-rdf/src/test/resources/org/xbib/content/rdf/viaf.json rename to content-rdf/src/test/resources/org/xbib/content/rdf/test/viaf.json diff --git a/content-resource/build.gradle b/content-resource/build.gradle index 857d9f7..86f0ad0 100644 --- a/content-resource/build.gradle +++ b/content-resource/build.gradle @@ -2,3 +2,13 @@ dependencies { api libs.net testImplementation libs.jackson.databind } + +def patchArgs = ['--patch-module', "org.xbib.content.resource.test=" + sourceSets.test.resources.sourceDirectories.singleFile] + +tasks.named('compileTestJava') { + options.compilerArgs += patchArgs +} + +tasks.named('test') { + jvmArgs += patchArgs +} diff --git a/content-resource/src/main/java/org/xbib/content/resource/IRINamespaceContext.java b/content-resource/src/main/java/org/xbib/content/resource/IRINamespaceContext.java index 464e84d..4aeee4d 100644 --- a/content-resource/src/main/java/org/xbib/content/resource/IRINamespaceContext.java +++ b/content-resource/src/main/java/org/xbib/content/resource/IRINamespaceContext.java @@ -1,5 +1,6 @@ package org.xbib.content.resource; +import java.io.IOException; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashSet; @@ -11,35 +12,44 @@ import java.util.ResourceBundle; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; +import java.util.logging.Level; +import java.util.logging.Logger; public final class IRINamespaceContext implements NamespaceContext { - private static final IRINamespaceContext DEFAULT_INSTANCE; + private static final Logger logger = Logger.getLogger(IRINamespaceContext.class.getName()); - static { - DEFAULT_INSTANCE = new IRINamespaceContext(); - try { - String bundleName = IRINamespaceContext.class.getPackage().getName().replace('.', '/') + '/' + "namespace"; - Locale locale = Locale.getDefault(); - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - ResourceBundle resourceBundle = ResourceBundle.getBundle(bundleName, locale, classLoader); - Enumeration en = resourceBundle.getKeys(); - while (en.hasMoreElements()) { - String prefix = en.nextElement(); - String namespace = resourceBundle.getString(prefix); - DEFAULT_INSTANCE.addNamespace(prefix, namespace); - } - } catch (Exception e) { - // - } - } + private static final IRINamespaceContext INSTANCE = new IRINamespaceContext(); public static IRINamespaceContext getInstance() { - return DEFAULT_INSTANCE; + return INSTANCE; } public static IRINamespaceContext newInstance() { - return new IRINamespaceContext(); + return newInstance(IRINamespaceContext.class); + } + + public static IRINamespaceContext newInstance(Class clazz) { + IRINamespaceContext iriNamespaceContext = new IRINamespaceContext(); + try { + iriNamespaceContext.loadNamespaces(clazz); + return iriNamespaceContext; + } catch (IOException e) { + logger.log(Level.SEVERE, e.getMessage(), e); + throw new IllegalArgumentException(); + } + } + + private void loadNamespaces(Class clazz) throws IOException { + String bundleName = clazz.getPackage().getName().replace('.', '/') + '/' + "namespace"; + Locale locale = Locale.getDefault(); + ResourceBundle resourceBundle = ResourceBundle.getBundle(bundleName, locale, clazz.getClassLoader()); + Enumeration en = resourceBundle.getKeys(); + while (en.hasMoreElements()) { + String prefix = en.nextElement(); + String namespace = resourceBundle.getString(prefix); + addNamespace(prefix, namespace); + } } // sort namespace by length in descending order, useful for compacting prefix diff --git a/content-resource/src/test/java/module-info.java b/content-resource/src/test/java/module-info.java new file mode 100644 index 0000000..d18bd7b --- /dev/null +++ b/content-resource/src/test/java/module-info.java @@ -0,0 +1,5 @@ +module org.xbib.content.resource.test { + requires org.junit.jupiter.api; + requires org.xbib.content.resource; + opens org.xbib.content.resource.test to org.junit.platform.commons; +} diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/IRINamespaceCompactionTest.java b/content-resource/src/test/java/org/xbib/content/resource/test/IRINamespaceCompactionTest.java similarity index 52% rename from content-rdf/src/test/java/org/xbib/content/rdf/IRINamespaceCompactionTest.java rename to content-resource/src/test/java/org/xbib/content/resource/test/IRINamespaceCompactionTest.java index 632f14b..ffda7f9 100644 --- a/content-rdf/src/test/java/org/xbib/content/rdf/IRINamespaceCompactionTest.java +++ b/content-resource/src/test/java/org/xbib/content/resource/test/IRINamespaceCompactionTest.java @@ -1,22 +1,18 @@ -package org.xbib.content.rdf; +package org.xbib.content.resource.test; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; import org.xbib.content.resource.IRI; import org.xbib.content.resource.IRINamespaceContext; -/** - * - */ public class IRINamespaceCompactionTest { @Test - public void testCompaction() throws Exception { - IRINamespaceContext context = IRINamespaceContext.getInstance(); - assertEquals(context.getNamespaceURI("dc"), "http://purl.org/dc/elements/1.1/"); - assertEquals(context.getPrefix("http://purl.org/dc/elements/1.1/"), "dc"); + public void testCompaction() { + IRINamespaceContext context = IRINamespaceContext.newInstance(getClass()); + assertEquals("dc", context.getPrefix("http://purl.org/dc/elements/1.1/")); + assertEquals("http://purl.org/dc/elements/1.1/", context.getNamespaceURI("dc")); IRI dc = IRI.create("http://purl.org/dc/elements/1.1/creator"); assertEquals(context.compact(dc), "dc:creator"); } - } diff --git a/content-rdf/src/test/java/org/xbib/content/rdf/IRITest.java b/content-resource/src/test/java/org/xbib/content/resource/test/IRITest.java similarity index 98% rename from content-rdf/src/test/java/org/xbib/content/rdf/IRITest.java rename to content-resource/src/test/java/org/xbib/content/resource/test/IRITest.java index 06d21e6..d0713ad 100644 --- a/content-rdf/src/test/java/org/xbib/content/rdf/IRITest.java +++ b/content-resource/src/test/java/org/xbib/content/resource/test/IRITest.java @@ -1,4 +1,4 @@ -package org.xbib.content.rdf; +package org.xbib.content.resource.test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; diff --git a/content-resource/src/test/java/org/xbib/content/resource/TestIRI.java b/content-resource/src/test/java/org/xbib/content/resource/test/TestIRI.java similarity index 90% rename from content-resource/src/test/java/org/xbib/content/resource/TestIRI.java rename to content-resource/src/test/java/org/xbib/content/resource/test/TestIRI.java index fe86bb1..7f58c66 100644 --- a/content-resource/src/test/java/org/xbib/content/resource/TestIRI.java +++ b/content-resource/src/test/java/org/xbib/content/resource/test/TestIRI.java @@ -1,7 +1,9 @@ -package org.xbib.content.resource; +package org.xbib.content.resource.test; import java.net.URISyntaxException; import org.junit.jupiter.api.Test; +import org.xbib.content.resource.IRI; + import static org.junit.jupiter.api.Assertions.assertEquals; public class TestIRI { diff --git a/content-resource/src/test/resources/org/xbib/content/resource/test/namespace.properties b/content-resource/src/test/resources/org/xbib/content/resource/test/namespace.properties new file mode 100644 index 0000000..7cf3d07 --- /dev/null +++ b/content-resource/src/test/resources/org/xbib/content/resource/test/namespace.properties @@ -0,0 +1,36 @@ +# XML namespace +xml = http://www.w3.org/XML/1998/namespace +xsl = http://www.w3.org/1999/XSL/Transform + +# Atom +atom = http://www.w3.org/2005/Atom + +# RDF namespace +rdf = http://www.w3.org/1999/02/22-rdf-syntax-ns# +rdfs = http://www.w3.org/2000/01/rdf-schema# +owl = http://www.w3.org/2002/07/owl# + +foaf = http://xmlns.com/foaf/0.1/ + +# Apache +xalan = http://xml.apache.org/xslt + +# Dublin Core Namespaces +# http://dublincore.org/documents/dcmi-namespace/ +dc = http://purl.org/dc/elements/1.1/ +dcterms = http://purl.org/dc/terms/ +rel = http://purl.org/vocab/relationship/ + +# Library of Congress +mods = http://www.loc.gov/mods/v3 +bib = info:srw/cql-context-set/1/bib-v1/ + +# RDA, MARC +rdagr2 = http://RDVocab.info/ElementsGr2/ + +# DNB +gnd = http://d-nb.info/standards/elementset/gnd# + +# xbib +xbib = http://xbib.org/elements/ +lia = http://xbib.org/namespaces/lia/ \ No newline at end of file diff --git a/content-smile/src/main/java/org/xbib/content/smile/SmileXContentGenerator.java b/content-smile/src/main/java/org/xbib/content/smile/SmileXContentGenerator.java index 29fe10c..fb7b2d5 100644 --- a/content-smile/src/main/java/org/xbib/content/smile/SmileXContentGenerator.java +++ b/content-smile/src/main/java/org/xbib/content/smile/SmileXContentGenerator.java @@ -21,6 +21,7 @@ public class SmileXContentGenerator extends AbstractXContentGenerator { private final SmileGeneratorDelegate delegate; + @SuppressWarnings("this-escape") public SmileXContentGenerator(SmileGenerator generator) { this.delegate = new SmileGeneratorDelegate(generator); super.setGenerator(delegate); diff --git a/content-smile/src/main/java/org/xbib/content/smile/SmileXContentParser.java b/content-smile/src/main/java/org/xbib/content/smile/SmileXContentParser.java index fdd13a2..3b5cf05 100644 --- a/content-smile/src/main/java/org/xbib/content/smile/SmileXContentParser.java +++ b/content-smile/src/main/java/org/xbib/content/smile/SmileXContentParser.java @@ -54,7 +54,7 @@ public class SmileXContentParser extends AbstractXContentParser { @Override public String currentName() throws IOException { - return parser.getCurrentName(); + return parser.currentName(); } @Override diff --git a/content-xml/build.gradle b/content-xml/build.gradle index 30e6a64..58400b3 100644 --- a/content-xml/build.gradle +++ b/content-xml/build.gradle @@ -5,3 +5,13 @@ dependencies { runtimeOnly libs.woodstox testImplementation project(':content-json') // for XContentHelper reading JSON } + +def patchArgs = ['--patch-module', "org.xbib.content.xml.test=" + sourceSets.test.resources.sourceDirectories.singleFile] + +tasks.named('compileTestJava') { + options.compilerArgs += patchArgs +} + +tasks.named('test') { + jvmArgs += patchArgs +} diff --git a/content-xml/src/main/java/org/xbib/content/xml/XmlNamespaceContext.java b/content-xml/src/main/java/org/xbib/content/xml/XmlNamespaceContext.java index 0d57f32..07f2762 100644 --- a/content-xml/src/main/java/org/xbib/content/xml/XmlNamespaceContext.java +++ b/content-xml/src/main/java/org/xbib/content/xml/XmlNamespaceContext.java @@ -1,10 +1,10 @@ package org.xbib.content.xml; +import java.io.IOException; import java.util.Enumeration; import java.util.HashSet; import java.util.Iterator; import java.util.Locale; -import java.util.MissingResourceException; import java.util.ResourceBundle; import java.util.Set; import java.util.SortedMap; @@ -30,16 +30,6 @@ public class XmlNamespaceContext implements NamespaceContext, org.xbib.content.r this.lock = new Object(); } - protected XmlNamespaceContext(ResourceBundle bundle) { - this(); - Enumeration en = bundle.getKeys(); - while (en.hasMoreElements()) { - String prefix = en.nextElement(); - String namespace = bundle.getString(prefix); - addNamespace(prefix, namespace); - } - } - /** * Empty namespace context. * @@ -49,15 +39,29 @@ public class XmlNamespaceContext implements NamespaceContext, org.xbib.content.r return new XmlNamespaceContext(); } - public static XmlNamespaceContext newInstance(String bundleName, Locale locale, ClassLoader classLoader) { + public static XmlNamespaceContext newInstance(Class clazz) { + XmlNamespaceContext xmlNamespaceContext = new XmlNamespaceContext(); try { - ResourceBundle bundle = ResourceBundle.getBundle(bundleName, locale, classLoader); - return new XmlNamespaceContext(bundle); - } catch (MissingResourceException e) { - return new XmlNamespaceContext(); + xmlNamespaceContext.loadNamespaces(clazz); + return xmlNamespaceContext; + } catch (IOException e) { + throw new IllegalArgumentException(); } } + private void loadNamespaces(Class clazz) throws IOException { + String bundleName = clazz.getPackage().getName().replace('.', '/') + '/' + "namespace"; + Locale locale = Locale.getDefault(); + ResourceBundle resourceBundle = ResourceBundle.getBundle(bundleName, locale, clazz.getClassLoader()); + Enumeration en = resourceBundle.getKeys(); + while (en.hasMoreElements()) { + String prefix = en.nextElement(); + String namespace = resourceBundle.getString(prefix); + addNamespace(prefix, namespace); + } + } + + @Override public void addNamespace(String prefix, String namespace) { if (prefix != null && namespace != null) { synchronized (lock) { @@ -73,6 +77,7 @@ public class XmlNamespaceContext implements NamespaceContext, org.xbib.content.r } } + @Override public SortedMap getNamespaces() { return namespaces; } @@ -104,5 +109,4 @@ public class XmlNamespaceContext implements NamespaceContext, org.xbib.content.r public String toString() { return namespaces.toString(); } - } diff --git a/content-xml/src/main/java/org/xbib/content/xml/XmlXContentGenerator.java b/content-xml/src/main/java/org/xbib/content/xml/XmlXContentGenerator.java index 8ff2300..a31dde5 100644 --- a/content-xml/src/main/java/org/xbib/content/xml/XmlXContentGenerator.java +++ b/content-xml/src/main/java/org/xbib/content/xml/XmlXContentGenerator.java @@ -35,6 +35,7 @@ public class XmlXContentGenerator extends AbstractXContentGenerator { this(generator, XmlXParams.getDefaultParams()); } + @SuppressWarnings("this-escape") public XmlXContentGenerator(ToXmlGenerator generator, XmlXParams params) { this.params = params; generator.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, false); diff --git a/content-xml/src/main/java/org/xbib/content/xml/XmlXContentParser.java b/content-xml/src/main/java/org/xbib/content/xml/XmlXContentParser.java index 9454981..da4be7f 100644 --- a/content-xml/src/main/java/org/xbib/content/xml/XmlXContentParser.java +++ b/content-xml/src/main/java/org/xbib/content/xml/XmlXContentParser.java @@ -56,7 +56,7 @@ public class XmlXContentParser extends AbstractXContentParser { @Override public String currentName() throws IOException { - return parser.getCurrentName(); + return parser.currentName(); } @Override diff --git a/content-xml/src/main/java/org/xbib/content/xml/json/JsonSaxAdapter.java b/content-xml/src/main/java/org/xbib/content/xml/json/JsonSaxAdapter.java index b2e3496..4d791ff 100644 --- a/content-xml/src/main/java/org/xbib/content/xml/json/JsonSaxAdapter.java +++ b/content-xml/src/main/java/org/xbib/content/xml/json/JsonSaxAdapter.java @@ -106,13 +106,13 @@ public class JsonSaxAdapter { int elementsWritten = 0; while (jsonParser.nextToken() != null && jsonParser.getCurrentToken() != END_OBJECT) { if (FIELD_NAME.equals(jsonParser.getCurrentToken())) { - String elementName = jsonParser.getCurrentName(); + String elementName = jsonParser.currentName(); jsonParser.nextToken(); parseElement(elementName); elementsWritten++; } else { throw new JsonParseException(jsonParser, "expected field name, but got " + jsonParser.getCurrentToken(), - jsonParser.getCurrentLocation()); + jsonParser.currentLocation()); } } return elementsWritten; @@ -177,7 +177,7 @@ public class JsonSaxAdapter { @Override public String getPublicId() { - Object sourceRef = jsonParser.getCurrentLocation().contentReference().getRawContent(); + Object sourceRef = jsonParser.currentLocation().contentReference().getRawContent(); if (sourceRef != null) { return sourceRef.toString(); } else { @@ -192,13 +192,12 @@ public class JsonSaxAdapter { @Override public int getLineNumber() { - return jsonParser.getCurrentLocation() != null ? jsonParser.getCurrentLocation().getLineNr() : -1; + return jsonParser.currentLocation() != null ? jsonParser.currentLocation().getLineNr() : -1; } @Override public int getColumnNumber() { - return jsonParser.getCurrentLocation() != null ? jsonParser.getCurrentLocation().getColumnNr() : -1; + return jsonParser.currentLocation() != null ? jsonParser.currentLocation().getColumnNr() : -1; } } - } diff --git a/content-xml/src/main/java/org/xbib/content/xml/json/JsonStaxReader.java b/content-xml/src/main/java/org/xbib/content/xml/json/JsonStaxReader.java index 9e93cd5..5a6fc0c 100644 --- a/content-xml/src/main/java/org/xbib/content/xml/json/JsonStaxReader.java +++ b/content-xml/src/main/java/org/xbib/content/xml/json/JsonStaxReader.java @@ -98,7 +98,7 @@ public class JsonStaxReader implements XMLStreamReader { switch (jtok) { case FIELD_NAME: // start tag - String currentName = parser.getCurrentName(); + String currentName = parser.currentName(); if (currentName.startsWith("@")) { currentName = currentName.substring(1); } @@ -106,14 +106,14 @@ public class JsonStaxReader implements XMLStreamReader { if (!("$".equals(currentName))) { final QName currentQName = getQNameForTagLocName(currentName); eventQueue.add(new StartElementEvent(currentQName, - new StaxLocation(parser.getCurrentLocation()))); + new StaxLocation(parser.currentLocation()))); processingStack.add(new ProcessingInfo(currentQName, false, true)); return; } else { parser.nextToken(); if (valueTokens.contains(parser.getCurrentToken())) { eventQueue.add(new CharactersEvent(parser.getText(), - new StaxLocation(parser.getCurrentLocation()))); + new StaxLocation(parser.currentLocation()))); return; } else { throw new IOException("Not a xml value, expected primitive value!"); @@ -125,7 +125,7 @@ public class JsonStaxReader implements XMLStreamReader { return; } if (pi.isArray && !pi.isFirstElement) { - eventQueue.add(new StartElementEvent(pi.name, new StaxLocation(parser.getCurrentLocation()))); + eventQueue.add(new StartElementEvent(pi.name, new StaxLocation(parser.currentLocation()))); return; } else { pi.isFirstElement = false; @@ -133,12 +133,12 @@ public class JsonStaxReader implements XMLStreamReader { break; case END_OBJECT: // end tag - eventQueue.add(new EndElementEvent(pi.name, new StaxLocation(parser.getCurrentLocation()))); + eventQueue.add(new EndElementEvent(pi.name, new StaxLocation(parser.currentLocation()))); if (!pi.isArray) { processingStack.pop(); } if (processingStack.isEmpty()) { - eventQueue.add(new EndDocumentEvent(new StaxLocation(parser.getCurrentLocation()))); + eventQueue.add(new EndDocumentEvent(new StaxLocation(parser.currentLocation()))); } return; case VALUE_FALSE: @@ -148,20 +148,20 @@ public class JsonStaxReader implements XMLStreamReader { case VALUE_TRUE: case VALUE_STRING: if (!pi.isFirstElement) { - eventQueue.add(new StartElementEvent(pi.name, new StaxLocation(parser.getCurrentLocation()))); + eventQueue.add(new StartElementEvent(pi.name, new StaxLocation(parser.currentLocation()))); } else { pi.isFirstElement = false; } if (jtok != JsonToken.VALUE_NULL) { eventQueue.add(new CharactersEvent(parser.getText(), - new StaxLocation(parser.getCurrentLocation()))); + new StaxLocation(parser.currentLocation()))); } - eventQueue.add(new EndElementEvent(pi.name, new StaxLocation(parser.getCurrentLocation()))); + eventQueue.add(new EndElementEvent(pi.name, new StaxLocation(parser.currentLocation()))); if (!pi.isArray) { processingStack.pop(); } if (processingStack.isEmpty()) { - eventQueue.add(new EndDocumentEvent(new StaxLocation(parser.getCurrentLocation()))); + eventQueue.add(new EndDocumentEvent(new StaxLocation(parser.currentLocation()))); } return; case START_ARRAY: diff --git a/content-xml/src/main/java/org/xbib/content/xml/json/JsonXmlStreamer.java b/content-xml/src/main/java/org/xbib/content/xml/json/JsonXmlStreamer.java index a1a1baf..8b815fd 100644 --- a/content-xml/src/main/java/org/xbib/content/xml/json/JsonXmlStreamer.java +++ b/content-xml/src/main/java/org/xbib/content/xml/json/JsonXmlStreamer.java @@ -150,7 +150,7 @@ public class JsonXmlStreamer { qname = elements.pop(); break; case FIELD_NAME: - qname = ToQName.toQName(root, context, parser.getCurrentName()); + qname = ToQName.toQName(root, context, parser.currentName()); break; case VALUE_STRING: case VALUE_NUMBER_INT: @@ -158,8 +158,8 @@ public class JsonXmlStreamer { case VALUE_NULL: case VALUE_TRUE: case VALUE_FALSE: - if (parser.getCurrentName() != null) { - qname = ToQName.toQName(root, context, parser.getCurrentName()); + if (parser.currentName() != null) { + qname = ToQName.toQName(root, context, parser.currentName()); } String text = parser.getText(); int len = text.length(); diff --git a/content-xml/src/main/java/org/xbib/content/xml/json/events/CharactersEvent.java b/content-xml/src/main/java/org/xbib/content/xml/json/events/CharactersEvent.java index 3733de3..95dd8e1 100644 --- a/content-xml/src/main/java/org/xbib/content/xml/json/events/CharactersEvent.java +++ b/content-xml/src/main/java/org/xbib/content/xml/json/events/CharactersEvent.java @@ -3,11 +3,9 @@ package org.xbib.content.xml.json.events; import javax.xml.stream.Location; import javax.xml.stream.XMLStreamConstants; -/** - * - */ public class CharactersEvent extends JsonReaderXmlEvent { + @SuppressWarnings("this-escape") public CharactersEvent(String text, Location location) { setText(text); setLocation(location); diff --git a/content-xml/src/main/java/org/xbib/content/xml/json/events/EndDocumentEvent.java b/content-xml/src/main/java/org/xbib/content/xml/json/events/EndDocumentEvent.java index 311d49a..75cd734 100644 --- a/content-xml/src/main/java/org/xbib/content/xml/json/events/EndDocumentEvent.java +++ b/content-xml/src/main/java/org/xbib/content/xml/json/events/EndDocumentEvent.java @@ -3,11 +3,9 @@ package org.xbib.content.xml.json.events; import javax.xml.stream.Location; import javax.xml.stream.XMLStreamConstants; -/** - * - */ public class EndDocumentEvent extends JsonReaderXmlEvent { + @SuppressWarnings("this-escape") public EndDocumentEvent(Location location) { setLocation(location); } diff --git a/content-xml/src/main/java/org/xbib/content/xml/json/events/EndElementEvent.java b/content-xml/src/main/java/org/xbib/content/xml/json/events/EndElementEvent.java index c305eec..8ee0ff4 100644 --- a/content-xml/src/main/java/org/xbib/content/xml/json/events/EndElementEvent.java +++ b/content-xml/src/main/java/org/xbib/content/xml/json/events/EndElementEvent.java @@ -4,11 +4,9 @@ import javax.xml.namespace.QName; import javax.xml.stream.Location; import javax.xml.stream.XMLStreamConstants; -/** - * - */ public class EndElementEvent extends JsonReaderXmlEvent { + @SuppressWarnings("this-escape") public EndElementEvent(QName name, Location location) { setQName(name); setLocation(location); diff --git a/content-xml/src/main/java/org/xbib/content/xml/json/events/StartDocumentEvent.java b/content-xml/src/main/java/org/xbib/content/xml/json/events/StartDocumentEvent.java index 45585f3..32354fd 100644 --- a/content-xml/src/main/java/org/xbib/content/xml/json/events/StartDocumentEvent.java +++ b/content-xml/src/main/java/org/xbib/content/xml/json/events/StartDocumentEvent.java @@ -3,11 +3,9 @@ package org.xbib.content.xml.json.events; import javax.xml.stream.Location; import javax.xml.stream.XMLStreamConstants; -/** - * - */ public class StartDocumentEvent extends JsonReaderXmlEvent { + @SuppressWarnings("this-escape") public StartDocumentEvent(Location location) { setLocation(location); } diff --git a/content-xml/src/main/java/org/xbib/content/xml/json/events/StartElementEvent.java b/content-xml/src/main/java/org/xbib/content/xml/json/events/StartElementEvent.java index 9a1e638..de1e2d2 100644 --- a/content-xml/src/main/java/org/xbib/content/xml/json/events/StartElementEvent.java +++ b/content-xml/src/main/java/org/xbib/content/xml/json/events/StartElementEvent.java @@ -4,11 +4,9 @@ import javax.xml.namespace.QName; import javax.xml.stream.Location; import javax.xml.stream.XMLStreamConstants; -/** - * - */ public class StartElementEvent extends JsonReaderXmlEvent { + @SuppressWarnings("this-escape") public StartElementEvent(QName name, Location location) { setQName(name); setLocation(location); diff --git a/content-xml/src/main/java/org/xbib/content/xml/stream/StaxSource.java b/content-xml/src/main/java/org/xbib/content/xml/stream/StaxSource.java index d399f36..178c1a2 100644 --- a/content-xml/src/main/java/org/xbib/content/xml/stream/StaxSource.java +++ b/content-xml/src/main/java/org/xbib/content/xml/stream/StaxSource.java @@ -52,12 +52,11 @@ public class StaxSource extends SAXSource { // SAX allows ContentHandler to be changed during the parsing, // but JAXB doesn't. So this repeater will sit between those // two components. - private XMLFilterImpl repeater = new XMLFilterImpl(); + private final XMLFilterImpl repeater = new XMLFilterImpl(); /** * Creates a new {@link javax.xml.transform.Source} for the given * {@link XMLStreamReader}. - * * The XMLStreamReader must be pointing at either a * {@link javax.xml.stream.XMLStreamConstants#START_DOCUMENT} or * {@link javax.xml.stream.XMLStreamConstants#START_ELEMENT} event. @@ -68,19 +67,17 @@ public class StaxSource extends SAXSource { * @throws IllegalStateException iff the reader is not pointing at either a * START_DOCUMENT or START_ELEMENT event */ + @SuppressWarnings("this-escape") public StaxSource(XMLStreamReader reader, boolean eagerQuit) { if (reader == null) { throw new IllegalArgumentException(); } - int eventType = reader.getEventType(); if (eventType != XMLStreamConstants.START_DOCUMENT && eventType != XMLStreamConstants.START_ELEMENT) { throw new IllegalStateException(); } - final XMLStreamReaderToContentHandler reader1 = new XMLStreamReaderToContentHandler(reader, repeater, eagerQuit); - XMLReader pseudoParser = new XMLReader() { private LexicalHandler lexicalHandler; // we will store this value but never use it by ourselves. @@ -199,5 +196,4 @@ public class StaxSource extends SAXSource { // pass a dummy InputSource. We don't care super.setInputSource(new InputSource()); } - } diff --git a/content-xml/src/main/java/org/xbib/content/xml/transform/TransformerURIResolver.java b/content-xml/src/main/java/org/xbib/content/xml/transform/TransformerURIResolver.java index 947ceb5..8e92433 100644 --- a/content-xml/src/main/java/org/xbib/content/xml/transform/TransformerURIResolver.java +++ b/content-xml/src/main/java/org/xbib/content/xml/transform/TransformerURIResolver.java @@ -28,9 +28,9 @@ import javax.xml.transform.sax.SAXSource; */ public class TransformerURIResolver implements URIResolver, Closeable { - private List inputStreams = new LinkedList<>(); + private final List inputStreams = new LinkedList<>(); - private List bases = new LinkedList<>(); + private final List bases = new LinkedList<>(); private ClassLoader classLoader; @@ -63,7 +63,7 @@ public class TransformerURIResolver implements URIResolver, Closeable { URI uri = URI.create(href); // relative href? if (!uri.isAbsolute() && base != null) { - url = new URL(new URL(base), href); + url = URI.create(base).resolve(href).toURL(); href = url.toURI().getRawSchemeSpecificPart(); // drop scheme } } catch (MalformedURLException | URISyntaxException e) { diff --git a/content-xml/src/test/java/module-info.java b/content-xml/src/test/java/module-info.java new file mode 100644 index 0000000..867ca5d --- /dev/null +++ b/content-xml/src/test/java/module-info.java @@ -0,0 +1,10 @@ +module org.xbib.content.xml.test { + requires java.xml; + requires org.junit.jupiter.api; + requires org.xbib.content.api; + requires org.xbib.content.core; + requires org.xbib.content.xml; + opens org.xbib.content.xml.test to org.junit.platform.commons; + opens org.xbib.content.xml.test.json to org.junit.platform.commons; + opens org.xbib.content.xml.test.util to org.junit.platform.commons; +} diff --git a/content-xml/src/test/java/org/xbib/content/xml/XContentXmlBuilderTest.java b/content-xml/src/test/java/org/xbib/content/xml/XContentXmlBuilderTest.java deleted file mode 100644 index f194715..0000000 --- a/content-xml/src/test/java/org/xbib/content/xml/XContentXmlBuilderTest.java +++ /dev/null @@ -1,210 +0,0 @@ -package org.xbib.content.xml; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.xbib.content.xml.XmlXContent.contentBuilder; -import org.junit.jupiter.api.Test; -import org.xbib.content.XContentBuilder; -import org.xbib.content.core.XContentHelper; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Map; -import javax.xml.namespace.QName; - -/** - * - */ -public class XContentXmlBuilderTest { - - @Test - public void testConstructorForServiceLoader() { - XmlXContent xmlXContent = new XmlXContent(); - assertEquals("xml", xmlXContent.name()); - } - - @Test - public void testEmpty() throws Exception { - QName root = new QName("root"); - XContentBuilder builder = contentBuilder(new XmlXParams(root)); - builder.startObject().field("Hello", "World").endObject(); - assertEquals("World", builder.string()); - } - - @Test - public void testContextNamespace() throws Exception { - QName root = new QName("root"); - XmlNamespaceContext context = XmlNamespaceContext.newInstance(); - XContentBuilder builder = contentBuilder(new XmlXParams(root, context)); - builder.startObject().field("Hello", "World").endObject(); - assertEquals("World", builder.string()); - } - - @Test - public void testXml() throws Exception { - XContentBuilder builder = contentBuilder(); - builder.startObject().field("Hello", "World").endObject(); - assertEquals("World", builder.string()); - } - - @Test - public void testXmlParams() throws Exception { - XmlXParams params = new XmlXParams(); - XContentBuilder builder = contentBuilder(params); - builder.startObject().field("Hello", "World").endObject(); - assertEquals("World", builder.string()); - } - - @Test - public void testXmlObject() throws Exception { - QName root = XmlXParams.getDefaultParams().getRoot(); - XmlXParams params = new XmlXParams(root); - XContentBuilder builder = contentBuilder(params); - builder.startObject() - .startObject("author") - .field("creator", "John Doe") - .field("role", "writer") - .endObject() - .startObject("author") - .field("creator", "Joe Smith") - .field("role", "illustrator") - .endObject() - .endObject(); - assertEquals("John Doewriter" - + "Joe Smithillustrator", - builder.string()); - } - - @Test - public void testXmlAttributes() throws Exception { - QName root = XmlXParams.getDefaultParams().getRoot(); - XmlXParams params = new XmlXParams(root); - XContentBuilder builder = contentBuilder(params); - builder.startObject() - .startObject("author") - .field("@name", "John Doe") - .field("@id", 1) - .endObject() - .endObject(); - assertEquals("John Doe1", builder.string()); - } - - @Test - public void testXmlArrayOfValues() throws Exception { - QName root = XmlXParams.getDefaultParams().getRoot(); - XmlXParams params = new XmlXParams(root); - XContentBuilder builder = contentBuilder(params); - builder.startObject() - .array("author", "John Doe", "Joe Smith") - .endObject(); - assertEquals("John DoeJoe Smith", builder.string()); - } - - @Test - public void testXmlArrayOfObjects() throws Exception { - QName root = XmlXParams.getDefaultParams().getRoot(); - XmlXParams params = new XmlXParams(root); - XContentBuilder builder = contentBuilder(params); - builder.startObject() - .startArray("author") - .startObject() - .field("creator", "John Doe") - .field("role", "writer") - .endObject() - .startObject() - .field("creator", "Joe Smith") - .field("role", "illustrator") - .endObject() - .endArray() - .endObject(); - assertEquals("John Doewriter" - + "Joe Smithillustrator", - builder.string()); - } - - @Test - public void testParseJson() throws Exception { - XmlNamespaceContext context = XmlNamespaceContext.newInstance(); - context.addNamespace("bib", "info:srw/cql-context-set/1/bib-v1/"); - context.addNamespace("xbib", "http://xbib.org/"); - context.addNamespace("abc", "http://localhost/"); - context.addNamespace("lia", "http://xbib.org/namespaces/lia/"); - InputStream in = getClass().getResourceAsStream("dc.json"); - ByteArrayOutputStream out = new ByteArrayOutputStream(); - copy(in, out); - byte[] buf = out.toByteArray(); - Map map = XContentHelper.convertToMap(buf, false); - assertEquals("{dc:description={xbib:creatorDescription=Otis Gospodnetić ; Erik Hatcher, " - + "dcterms:extent=XXXIV, 421 S. : Ill.}, dc:language={xbib:languageISO6392b=eng, " - + "xbib:languageISO6391=en}, dc:subject={xbib:rswk={xbib:subjectTopic=Lucene, " - + "xbib:hasGND=4800725-0}}, dc:relation=[{xbib:relationName=Später u.d.T., " - + "xbib:relationValue=McCandless, Michael: Lucene in action}, " - + "{lia:lia={lia:access=[{lia:library={lia:name=DE-1010, lia:authority=ISIL}, " - + "lia:name=DE-605, lia:authority=ISIL, lia:service=[inter-library-loan, copy], " - + "lia:item={lia:preferredTransport=physical, lia:identifier=DE-1010 GE 01TYD1110, " - + "lia:shelfmark=01TYD1110, lia:type=hard-cover, lia:preferredDelivery=physical, " - + "lia:number=GE}}, {lia:library={lia:name=DE-6-282, lia:authority=ISIL}, lia:name=DE-605, " - + "lia:authority=ISIL, lia:service=restricted, lia:item={lia:preferredTransport=physical, " - + "lia:identifier=DE-6-282 00071001 WI 14 822, lia:shelfmark=WI 14 822, lia:type=hard-cover, " - + "lia:preferredDelivery=physical, lia:number=00071001}}, {lia:library={lia:name=DE-361, " - + "lia:authority=ISIL}, lia:name=DE-605, lia:authority=ISIL, lia:service=[inter-library-loan, copy], " - + "lia:item={lia:preferredTransport=physical, lia:identifier=DE-361 00000010 HK520 G676, " - + "lia:shelfmark=HK520 G676, lia:type=hard-cover, lia:preferredDelivery=physical, " - + "lia:number=00000010}}, {lia:library={lia:name=DE-6, lia:authority=ISIL}, lia:name=DE-605, " - + "lia:authority=ISIL, lia:service=[inter-library-loan, copy], " - + "lia:item={lia:preferredTransport=physical, lia:identifier=DE-6 00000040 3W 622, " - + "lia:shelfmark=3W 622, lia:type=hard-cover, lia:preferredDelivery=physical, lia:number=00000040}}, " - + "{lia:library={lia:name=DE-1044, lia:authority=ISIL}, lia:name=DE-605, lia:authority=ISIL, " - + "lia:service=[inter-library-loan, copy], lia:item={lia:preferredTransport=physical, " - + "lia:identifier=DE-1044 00000001 11 = TYD6810, lia:shelfmark=11 = TYD6810, lia:type=hard-cover, " - + "lia:preferredDelivery=physical, lia:number=00000001}}, {lia:library={lia:name=DE-1044, " - + "lia:authority=ISIL}, lia:name=DE-605, lia:authority=ISIL, lia:service=[inter-library-loan, copy], " - + "lia:item={lia:preferredTransport=physical, lia:identifier=DE-1044 00000001 11 = TYD6810+1, " - + "lia:shelfmark=11 = TYD6810+1, lia:type=hard-cover, lia:preferredDelivery=physical, " - + "lia:number=00000001}}, {lia:library={lia:name=DE-467, lia:authority=ISIL}, lia:name=DE-605, " - + "lia:authority=ISIL, lia:service=[inter-library-loan, copy], " - + "lia:item={lia:preferredTransport=physical, lia:identifier=DE-467 51 51TWYD3730, " - + "lia:shelfmark=51TWYD3730, lia:type=hard-cover, lia:preferredDelivery=physical, " - + "lia:number=51}}]}}], dc:creator=[{xbib:namePersonalID=HP02672128, " - + "bib:namePersonal=Gospodnetić, Otis}, {xbib:namePersonalAlt=Hatcher, E., " - + "xbib:namePersonalID=128668350, bib:namePersonal=Hatcher, Erik}], " - + "xbib:updated=2012-05-17T17:02:24Z, dc:format={dcterms:format=print, dcterms:medium=paper}, " - + "dc:type={bib:issuance=monographic, xbib:recordType=h}, dc:contributor=[{xbib:namePersonalRole=cre, " - + "xbib:namePersonalID=HP02672128, bib:namePersonal=Gospodnetić, Otis}, " - + "{xbib:namePersonalAlt=Hatcher, E., xbib:namePersonalRole=cre, xbib:namePersonalID=128668350, " - + "bib:namePersonal=Hatcher, Erik}], dc:title={xbib:title=Lucene in action, " - + "xbib:titleSub=[a guide to the Java search engine]}, dc:date={dcterms:issued=2005}, " - + "dc:identifier={xbib:identifierAuthorityEKI=HBZHT014262244, xbib:sysID=013391972, " - + "xbib:identifierAuthorityISIL=[DE-1010, DE-6-282, DE-361, DE-6, DE-1044, DE-467], " - + "xbib:identifierAuthorityOriginISBN=1-932394-28-1, xbib:identifierAuthorityMAB=HT014262244, " - + "xbib:identifierAuthorityISBN=1932394281, xbib:identifierAuthorityEAN=9781932394283}, " - + "dc:publisher={xbib:publisherPlace=Greenwich, Conn., xbib:publisherName=Manning}}", - map.toString()); - } - - @Test - public void testInvalidWhiteSpaceCharacter() throws Exception { - QName root = new QName("root"); - XContentBuilder builder = contentBuilder(new XmlXParams(root)); - builder.startObject().field("Hello", "World\u001b").endObject(); - assertEquals("World", builder.string()); - } - - @Test - public void testSuppressEmptyNamespace() throws Exception { - XmlNamespaceContext context = XmlNamespaceContext.newInstance(); - context.addNamespace("", ""); - QName root = new QName("root"); - XContentBuilder builder = contentBuilder(new XmlXParams(root, context)); - builder.startObject().field("Hello", "World").endObject(); - assertEquals("World", builder.string()); - } - - private void copy(InputStream in, OutputStream out) throws IOException { - byte[] buffer = new byte[1024]; - int len; - while ((len = in.read(buffer)) != -1) { - out.write(buffer, 0, len); - } - } -} diff --git a/content-xml/src/test/java/org/xbib/content/xml/XmlNamespaceContextTest.java b/content-xml/src/test/java/org/xbib/content/xml/XmlNamespaceContextTest.java deleted file mode 100644 index d45d196..0000000 --- a/content-xml/src/test/java/org/xbib/content/xml/XmlNamespaceContextTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.xbib.content.xml; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.xbib.content.xml.XmlXContent.contentBuilder; -import org.junit.jupiter.api.Test; -import org.xbib.content.XContentBuilder; -import org.xbib.content.xml.transform.StylesheetTransformer; -import java.util.Locale; -import javax.xml.namespace.QName; - -/** - * - */ -public class XmlNamespaceContextTest { - - @Test - public void testDefaultNamespace() { - XmlNamespaceContext context = XmlNamespaceContext.newInstance(); - assertEquals(0, context.getNamespaces().size()); - } - - @Test - public void testDefaultNamespaces() throws Exception { - XmlNamespaceContext context = - XmlNamespaceContext.newInstance("org/xbib/content/resource/namespace", - Locale.getDefault(), StylesheetTransformer.class.getClassLoader()); - XmlXParams params = new XmlXParams(context); - XContentBuilder builder = contentBuilder(params); - builder.startObject() - .field("dc:creator", "John Doe") - .endObject(); - assertEquals("John Doe", - builder.string()); - } - - @Test - public void testCustomNamespaces() throws Exception { - QName root = new QName("result"); - XmlNamespaceContext context = XmlNamespaceContext.newInstance(); - context.addNamespace("abc", "http://localhost"); - XmlXParams params = new XmlXParams(root, context); - XContentBuilder builder = contentBuilder(params); - builder.startObject() - .field("abc:creator", "John Doe") - .endObject(); - assertEquals("John Doe", - builder.string()); - } - - @Test - public void testRootNamespace() throws Exception { - QName root = new QName("http://content", "root", "abc"); - XmlNamespaceContext context = XmlNamespaceContext.newInstance(); - context.addNamespace("", "http://localhost"); - context.addNamespace("abc", "http://content"); - XmlXParams params = new XmlXParams(root, context); - XContentBuilder builder = contentBuilder(params); - builder.startObject() - .field("creator", "John Doe") - .endObject(); - assertEquals("" - + "John Doe", builder.string()); - } -} diff --git a/content-xml/src/test/java/org/xbib/content/xml/json/Json2XmlTest.java b/content-xml/src/test/java/org/xbib/content/xml/json/Json2XmlTest.java deleted file mode 100644 index e9a1d6b..0000000 --- a/content-xml/src/test/java/org/xbib/content/xml/json/Json2XmlTest.java +++ /dev/null @@ -1,92 +0,0 @@ -package org.xbib.content.xml.json; - -import org.junit.jupiter.api.Test; -import org.xbib.content.xml.XmlNamespaceContext; -import org.xml.sax.InputSource; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.io.Reader; -import java.io.Writer; -import java.nio.charset.StandardCharsets; -import java.util.Locale; -import javax.xml.namespace.QName; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.sax.SAXSource; -import javax.xml.transform.stream.StreamResult; - -/** - * - */ -public class Json2XmlTest { - - private static final String PACKAGE = '/' + Json2XmlTest.class.getPackage().getName().replace('.', '/'); - - private static final String[] jsons = { - "dc", - "elasticsearch-hit-example-1", - "es-test-20130719", - "glossary", - "menu" - }; - - @Test - public void testJSON() throws Exception { - for (String s : jsons) { - testJSONXmlReader(s); - testJSONStreamer(s); - } - } - - private void testJSONXmlReader(String path) throws Exception { - Reader r = getInput(path); - InputSource in = new InputSource(r); - JsonXmlReader parser = new JsonXmlReader().root(root()).context(context()); - TransformerFactory tFactory = TransformerFactory.newInstance(); - Transformer transformer = tFactory.newTransformer(); - Writer w = getOutput("test-jsonxmlreader-" + path + ".xml"); - StreamResult stream = new StreamResult(w); - transformer.transform(new SAXSource(parser, in), stream); - w.close(); - r.close(); - } - - private void testJSONStreamer(String path) throws Exception { - Reader r = getInput(path); - Writer w = getOutput("test-jsonxmlstreamer-" + path + ".xml"); - JsonXmlStreamer jsonXml = new JsonXmlStreamer().root(root()).context(context()); - jsonXml.toXML(r, w); - w.close(); - r.close(); - } - - private Reader getInput(String path) throws IOException { - InputStream in = getClass().getResourceAsStream(PACKAGE + "/" + path + ".json"); - return new InputStreamReader(in, StandardCharsets.UTF_8); - } - - private Writer getOutput(String path) throws IOException { - File file = File.createTempFile(path, ".dat"); - return new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8); - } - - private QName root() { - return new QName("http://elasticsearch.org/ns/1.0/", "result", "es"); - } - - private XmlNamespaceContext context() { - XmlNamespaceContext context = - XmlNamespaceContext.newInstance("org/xbib/content/resource/namespace", - Locale.getDefault(), Json2XmlTest.class.getClassLoader()); - context.addNamespace("bib", "info:srw/cql-context-set/1/bib-v1/"); - context.addNamespace("xbib", "http://xbib.org/"); - context.addNamespace("abc", "http://localhost/"); - context.addNamespace("lia", "http://xbib.org/namespaces/lia/"); - return context; - } - -} diff --git a/content-xml/src/test/java/org/xbib/content/xml/json/StylesheetTransformerTest.java b/content-xml/src/test/java/org/xbib/content/xml/json/StylesheetTransformerTest.java deleted file mode 100644 index 6942179..0000000 --- a/content-xml/src/test/java/org/xbib/content/xml/json/StylesheetTransformerTest.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.xbib.content.xml.json; - -import org.junit.jupiter.api.Test; -import org.xbib.content.xml.XmlNamespaceContext; -import org.xbib.content.xml.transform.StylesheetTransformer; -import org.xml.sax.InputSource; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.util.Locale; -import javax.xml.namespace.QName; -import javax.xml.transform.sax.SAXSource; - -/** - * - */ -public class StylesheetTransformerTest { - - private final QName root = new QName("http://example.org", "result", "ex"); - - private final XmlNamespaceContext context = - XmlNamespaceContext.newInstance("org/xbib/content/resource/namespace", - Locale.getDefault(), StylesheetTransformer.class.getClassLoader()); - - @Test - public void testJsonAsXML() throws Exception { - InputStream in = getClass().getResourceAsStream("dc.json"); - if (in == null) { - throw new IOException("dc.json not found"); - } - context.addNamespace("xbib", "http://xbib.org/"); - context.addNamespace("bib", "info:bib"); - context.addNamespace("lia", "http://xbib.org/lia/"); - - JsonXmlReader reader = new JsonXmlReader() - .root(root) - .context(context); - File file = File.createTempFile("dc.", ".xml"); - FileWriter out = new FileWriter(file); - StylesheetTransformer transformer = new StylesheetTransformer().setPath( - "src/main/resources", - "src/main/resources/xsl"); - // no style sheet, just a simple copy - transformer.setSource(new SAXSource(reader, new InputSource(in))) - .setResult(out) - .transform(); - out.close(); - transformer.close(); - } -} diff --git a/content-xml/src/test/java/org/xbib/content/xml/json/package-info.java b/content-xml/src/test/java/org/xbib/content/xml/json/package-info.java deleted file mode 100644 index 2f1c38a..0000000 --- a/content-xml/src/test/java/org/xbib/content/xml/json/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Classes for testing JSON XML. - */ -package org.xbib.content.xml.json; diff --git a/content-xml/src/test/java/org/xbib/content/xml/package-info.java b/content-xml/src/test/java/org/xbib/content/xml/package-info.java deleted file mode 100644 index 922da86..0000000 --- a/content-xml/src/test/java/org/xbib/content/xml/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Classes for testing XML content. - */ -package org.xbib.content.xml; diff --git a/content-xml/src/test/java/org/xbib/content/xml/test/XContentXmlBuilderTest.java b/content-xml/src/test/java/org/xbib/content/xml/test/XContentXmlBuilderTest.java new file mode 100644 index 0000000..395f62d --- /dev/null +++ b/content-xml/src/test/java/org/xbib/content/xml/test/XContentXmlBuilderTest.java @@ -0,0 +1,215 @@ +package org.xbib.content.xml.test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.xbib.content.xml.XmlXContent.contentBuilder; +import org.junit.jupiter.api.Test; +import org.xbib.content.XContentBuilder; +import org.xbib.content.core.XContentHelper; +import org.xbib.content.xml.XmlNamespaceContext; +import org.xbib.content.xml.XmlXContent; +import org.xbib.content.xml.XmlXParams; + +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.util.Map; +import javax.xml.namespace.QName; + +public class XContentXmlBuilderTest { + + @Test + public void testConstructorForServiceLoader() { + XmlXContent xmlXContent = new XmlXContent(); + assertEquals("xml", xmlXContent.name()); + } + + @Test + public void testEmpty() throws Exception { + QName root = new QName("root"); + try (XContentBuilder builder = XmlXContent.contentBuilder(new XmlXParams(root))) { + builder.startObject().field("Hello", "World").endObject(); + assertEquals("World", builder.string()); + } + } + + @Test + public void testContextNamespace() throws Exception { + QName root = new QName("root"); + XmlNamespaceContext context = XmlNamespaceContext.newInstance(); + try (XContentBuilder builder = contentBuilder(new XmlXParams(root, context))) { + builder.startObject().field("Hello", "World").endObject(); + assertEquals("World", builder.string()); + } + } + + @Test + public void testXml() throws Exception { + try (XContentBuilder builder = contentBuilder()) { + builder.startObject().field("Hello", "World").endObject(); + assertEquals("World", builder.string()); + } + } + + @Test + public void testXmlParams() throws Exception { + XmlXParams params = new XmlXParams(); + try (XContentBuilder builder = contentBuilder(params)) { + builder.startObject().field("Hello", "World").endObject(); + assertEquals("World", builder.string()); + } + } + + @Test + public void testXmlObject() throws Exception { + QName root = XmlXParams.getDefaultParams().getRoot(); + XmlXParams params = new XmlXParams(root); + try (XContentBuilder builder = contentBuilder(params)) { + builder.startObject() + .startObject("author") + .field("creator", "John Doe") + .field("role", "writer") + .endObject() + .startObject("author") + .field("creator", "Joe Smith") + .field("role", "illustrator") + .endObject() + .endObject(); + assertEquals("John Doewriter" + + "Joe Smithillustrator", + builder.string()); + } + } + + @Test + public void testXmlAttributes() throws Exception { + QName root = XmlXParams.getDefaultParams().getRoot(); + XmlXParams params = new XmlXParams(root); + try (XContentBuilder builder = contentBuilder(params)) { + builder.startObject() + .startObject("author") + .field("@name", "John Doe") + .field("@id", 1) + .endObject() + .endObject(); + assertEquals("John Doe1", builder.string()); + } + } + + @Test + public void testXmlArrayOfValues() throws Exception { + QName root = XmlXParams.getDefaultParams().getRoot(); + XmlXParams params = new XmlXParams(root); + try (XContentBuilder builder = contentBuilder(params)) { + builder.startObject() + .array("author", "John Doe", "Joe Smith") + .endObject(); + assertEquals("John DoeJoe Smith", builder.string()); + } + } + + @Test + public void testXmlArrayOfObjects() throws Exception { + QName root = XmlXParams.getDefaultParams().getRoot(); + XmlXParams params = new XmlXParams(root); + try (XContentBuilder builder = contentBuilder(params)) { + builder.startObject() + .startArray("author") + .startObject() + .field("creator", "John Doe") + .field("role", "writer") + .endObject() + .startObject() + .field("creator", "Joe Smith") + .field("role", "illustrator") + .endObject() + .endArray() + .endObject(); + assertEquals("John Doewriter" + + "Joe Smithillustrator", + builder.string()); + } + } + + @Test + public void testParseJson() throws Exception { + XmlNamespaceContext context = XmlNamespaceContext.newInstance(getClass()); + context.addNamespace("bib", "info:srw/cql-context-set/1/bib-v1/"); + context.addNamespace("xbib", "http://xbib.org/"); + context.addNamespace("abc", "http://localhost/"); + context.addNamespace("lia", "http://xbib.org/namespaces/lia/"); + try (InputStream inputStream = getClass().getResourceAsStream("dc.json")) { + if (inputStream == null) { + throw new IllegalArgumentException(); + } + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + inputStream.transferTo(outputStream); + byte[] buf = outputStream.toByteArray(); + Map map = XContentHelper.convertToMap(buf, false); + assertEquals("{dc:description={xbib:creatorDescription=Otis Gospodnetić ; Erik Hatcher, " + + "dcterms:extent=XXXIV, 421 S. : Ill.}, dc:language={xbib:languageISO6392b=eng, " + + "xbib:languageISO6391=en}, dc:subject={xbib:rswk={xbib:subjectTopic=Lucene, " + + "xbib:hasGND=4800725-0}}, dc:relation=[{xbib:relationName=Später u.d.T., " + + "xbib:relationValue=McCandless, Michael: Lucene in action}, " + + "{lia:lia={lia:access=[{lia:library={lia:name=DE-1010, lia:authority=ISIL}, " + + "lia:name=DE-605, lia:authority=ISIL, lia:service=[inter-library-loan, copy], " + + "lia:item={lia:preferredTransport=physical, lia:identifier=DE-1010 GE 01TYD1110, " + + "lia:shelfmark=01TYD1110, lia:type=hard-cover, lia:preferredDelivery=physical, " + + "lia:number=GE}}, {lia:library={lia:name=DE-6-282, lia:authority=ISIL}, lia:name=DE-605, " + + "lia:authority=ISIL, lia:service=restricted, lia:item={lia:preferredTransport=physical, " + + "lia:identifier=DE-6-282 00071001 WI 14 822, lia:shelfmark=WI 14 822, lia:type=hard-cover, " + + "lia:preferredDelivery=physical, lia:number=00071001}}, {lia:library={lia:name=DE-361, " + + "lia:authority=ISIL}, lia:name=DE-605, lia:authority=ISIL, lia:service=[inter-library-loan, copy], " + + "lia:item={lia:preferredTransport=physical, lia:identifier=DE-361 00000010 HK520 G676, " + + "lia:shelfmark=HK520 G676, lia:type=hard-cover, lia:preferredDelivery=physical, " + + "lia:number=00000010}}, {lia:library={lia:name=DE-6, lia:authority=ISIL}, lia:name=DE-605, " + + "lia:authority=ISIL, lia:service=[inter-library-loan, copy], " + + "lia:item={lia:preferredTransport=physical, lia:identifier=DE-6 00000040 3W 622, " + + "lia:shelfmark=3W 622, lia:type=hard-cover, lia:preferredDelivery=physical, lia:number=00000040}}, " + + "{lia:library={lia:name=DE-1044, lia:authority=ISIL}, lia:name=DE-605, lia:authority=ISIL, " + + "lia:service=[inter-library-loan, copy], lia:item={lia:preferredTransport=physical, " + + "lia:identifier=DE-1044 00000001 11 = TYD6810, lia:shelfmark=11 = TYD6810, lia:type=hard-cover, " + + "lia:preferredDelivery=physical, lia:number=00000001}}, {lia:library={lia:name=DE-1044, " + + "lia:authority=ISIL}, lia:name=DE-605, lia:authority=ISIL, lia:service=[inter-library-loan, copy], " + + "lia:item={lia:preferredTransport=physical, lia:identifier=DE-1044 00000001 11 = TYD6810+1, " + + "lia:shelfmark=11 = TYD6810+1, lia:type=hard-cover, lia:preferredDelivery=physical, " + + "lia:number=00000001}}, {lia:library={lia:name=DE-467, lia:authority=ISIL}, lia:name=DE-605, " + + "lia:authority=ISIL, lia:service=[inter-library-loan, copy], " + + "lia:item={lia:preferredTransport=physical, lia:identifier=DE-467 51 51TWYD3730, " + + "lia:shelfmark=51TWYD3730, lia:type=hard-cover, lia:preferredDelivery=physical, " + + "lia:number=51}}]}}], dc:creator=[{xbib:namePersonalID=HP02672128, " + + "bib:namePersonal=Gospodnetić, Otis}, {xbib:namePersonalAlt=Hatcher, E., " + + "xbib:namePersonalID=128668350, bib:namePersonal=Hatcher, Erik}], " + + "xbib:updated=2012-05-17T17:02:24Z, dc:format={dcterms:format=print, dcterms:medium=paper}, " + + "dc:type={bib:issuance=monographic, xbib:recordType=h}, dc:contributor=[{xbib:namePersonalRole=cre, " + + "xbib:namePersonalID=HP02672128, bib:namePersonal=Gospodnetić, Otis}, " + + "{xbib:namePersonalAlt=Hatcher, E., xbib:namePersonalRole=cre, xbib:namePersonalID=128668350, " + + "bib:namePersonal=Hatcher, Erik}], dc:title={xbib:title=Lucene in action, " + + "xbib:titleSub=[a guide to the Java search engine]}, dc:date={dcterms:issued=2005}, " + + "dc:identifier={xbib:identifierAuthorityEKI=HBZHT014262244, xbib:sysID=013391972, " + + "xbib:identifierAuthorityISIL=[DE-1010, DE-6-282, DE-361, DE-6, DE-1044, DE-467], " + + "xbib:identifierAuthorityOriginISBN=1-932394-28-1, xbib:identifierAuthorityMAB=HT014262244, " + + "xbib:identifierAuthorityISBN=1932394281, xbib:identifierAuthorityEAN=9781932394283}, " + + "dc:publisher={xbib:publisherPlace=Greenwich, Conn., xbib:publisherName=Manning}}", + map.toString()); + } + } + + @Test + public void testInvalidWhiteSpaceCharacter() throws Exception { + QName root = new QName("root"); + try (XContentBuilder builder = contentBuilder(new XmlXParams(root))) { + builder.startObject().field("Hello", "World\u001b").endObject(); + assertEquals("World", builder.string()); + } + } + + @Test + public void testSuppressEmptyNamespace() throws Exception { + XmlNamespaceContext context = XmlNamespaceContext.newInstance(getClass()); + context.addNamespace("", ""); + QName root = new QName("root"); + try (XContentBuilder builder = contentBuilder(new XmlXParams(root, context));) { + builder.startObject().field("Hello", "World").endObject(); + assertEquals("World", builder.string()); + } + } +} diff --git a/content-xml/src/test/java/org/xbib/content/xml/test/XmlNamespaceContextTest.java b/content-xml/src/test/java/org/xbib/content/xml/test/XmlNamespaceContextTest.java new file mode 100644 index 0000000..3920636 --- /dev/null +++ b/content-xml/src/test/java/org/xbib/content/xml/test/XmlNamespaceContextTest.java @@ -0,0 +1,66 @@ +package org.xbib.content.xml.test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.xbib.content.xml.XmlXContent.contentBuilder; +import org.junit.jupiter.api.Test; +import org.xbib.content.XContentBuilder; +import org.xbib.content.xml.XmlNamespaceContext; +import org.xbib.content.xml.XmlXParams; +import javax.xml.namespace.QName; + +public class XmlNamespaceContextTest { + + @Test + public void testDefaultNamespace() { + XmlNamespaceContext context = XmlNamespaceContext.newInstance(); + assertEquals(0, context.getNamespaces().size()); + } + + @Test + public void testDefaultNamespaces() throws Exception { + XmlNamespaceContext context = XmlNamespaceContext.newInstance(getClass()); + XmlXParams params = new XmlXParams(context); + try (XContentBuilder builder = contentBuilder(params)) { + builder.startObject() + .field("dc:creator", "John Doe") + .endObject(); + assertEquals("John Doe", + builder.string()); + } + } + + @Test + public void testCustomNamespaces() throws Exception { + QName root = new QName("result"); + XmlNamespaceContext context = XmlNamespaceContext.newInstance(getClass()); + context.addNamespace("abc", "http://localhost"); + XmlXParams params = new XmlXParams(root, context); + try (XContentBuilder builder = contentBuilder(params)) { + builder.startObject() + .field("abc:creator", "John Doe") + .endObject(); + assertEquals("John Doe", + builder.string()); + } + } + + @Test + public void testRootNamespace() throws Exception { + QName root = new QName("http://content", "root", "abc"); + XmlNamespaceContext context = XmlNamespaceContext.newInstance(getClass()); + context.addNamespace("", "http://localhost"); + context.addNamespace("abc", "http://content"); + XmlXParams params = new XmlXParams(root, context); + try (XContentBuilder builder = contentBuilder(params)) { + builder.startObject() + .field("creator", "John Doe") + .endObject(); + assertEquals("" + + "John Doe", builder.string()); + } + } +} diff --git a/content-xml/src/test/java/org/xbib/content/xml/test/json/Json2XmlTest.java b/content-xml/src/test/java/org/xbib/content/xml/test/json/Json2XmlTest.java new file mode 100644 index 0000000..78c86e5 --- /dev/null +++ b/content-xml/src/test/java/org/xbib/content/xml/test/json/Json2XmlTest.java @@ -0,0 +1,70 @@ +package org.xbib.content.xml.test.json; + +import org.junit.jupiter.api.Test; +import org.xbib.content.xml.XmlNamespaceContext; +import org.xbib.content.xml.json.JsonXmlReader; +import org.xbib.content.xml.json.JsonXmlStreamer; +import org.xml.sax.InputSource; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.StringWriter; +import java.io.Writer; +import java.nio.charset.StandardCharsets; +import javax.xml.namespace.QName; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.sax.SAXSource; +import javax.xml.transform.stream.StreamResult; + +public class Json2XmlTest { + + @Test + public void testJSON() throws Exception { + String[] jsons = { + "dc", + "elasticsearch-hit-example-1", + "es-test-20130719", + "glossary", + "menu" + }; + for (String s : jsons) { + testJSONXmlReader(s); + testJSONStreamer(s); + } + } + + private void testJSONXmlReader(String path) throws Exception { + try (InputStream inputStream = getClass().getResourceAsStream(path + ".json"); + Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8); + Writer writer = new StringWriter()) { + JsonXmlReader parser = new JsonXmlReader().root(root()).context(context()); + TransformerFactory tFactory = TransformerFactory.newInstance(); + Transformer transformer = tFactory.newTransformer(); + StreamResult stream = new StreamResult(writer); + transformer.transform(new SAXSource(parser, new InputSource(reader)), stream); + } + } + + private void testJSONStreamer(String path) throws Exception { + try (InputStream inputStream = getClass().getResourceAsStream(path + ".json"); + Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8); + Writer writer = new StringWriter()) { + JsonXmlStreamer jsonXml = new JsonXmlStreamer().root(root()).context(context()); + jsonXml.toXML(reader, writer); + } + } + + private QName root() { + return new QName("http://elasticsearch.org/ns/1.0/", "result", "es"); + } + + private XmlNamespaceContext context() { + XmlNamespaceContext context = XmlNamespaceContext.newInstance(getClass()); + context.addNamespace("bib", "info:srw/cql-context-set/1/bib-v1/"); + context.addNamespace("xbib", "http://xbib.org/"); + context.addNamespace("abc", "http://localhost/"); + context.addNamespace("lia", "http://xbib.org/namespaces/lia/"); + return context; + } +} diff --git a/content-xml/src/test/java/org/xbib/content/xml/test/json/StylesheetTransformerTest.java b/content-xml/src/test/java/org/xbib/content/xml/test/json/StylesheetTransformerTest.java new file mode 100644 index 0000000..0a9c114 --- /dev/null +++ b/content-xml/src/test/java/org/xbib/content/xml/test/json/StylesheetTransformerTest.java @@ -0,0 +1,42 @@ +package org.xbib.content.xml.test.json; + +import org.junit.jupiter.api.Test; +import org.xbib.content.xml.XmlNamespaceContext; +import org.xbib.content.xml.json.JsonXmlReader; +import org.xbib.content.xml.transform.StylesheetTransformer; +import org.xml.sax.InputSource; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; +import java.io.Writer; +import java.util.Locale; +import javax.xml.namespace.QName; +import javax.xml.transform.sax.SAXSource; + +public class StylesheetTransformerTest { + + @Test + public void testJsonAsXML() throws Exception { + QName root = new QName("http://example.org", "result", "ex"); + try (InputStream inputStream = getClass().getResourceAsStream("dc.json"); + Writer writer = new StringWriter()) { + if (inputStream == null) { + throw new IOException("dc.json not found"); + } + XmlNamespaceContext context = XmlNamespaceContext.newInstance(getClass()); + context.addNamespace("xbib", "http://xbib.org/"); + context.addNamespace("bib", "info:bib"); + context.addNamespace("lia", "http://xbib.org/lia/"); + JsonXmlReader reader = new JsonXmlReader() + .root(root) + .context(context); + StylesheetTransformer transformer = new StylesheetTransformer(); + transformer.setSource(new SAXSource(reader, new InputSource(inputStream))) + .setResult(writer) + .transform(); + transformer.close(); + } + } +} diff --git a/content-xml/src/test/java/org/xbib/content/xml/util/SaxEventConsumerTest.java b/content-xml/src/test/java/org/xbib/content/xml/test/util/SaxEventConsumerTest.java similarity index 96% rename from content-xml/src/test/java/org/xbib/content/xml/util/SaxEventConsumerTest.java rename to content-xml/src/test/java/org/xbib/content/xml/test/util/SaxEventConsumerTest.java index d64a36c..f636ce7 100644 --- a/content-xml/src/test/java/org/xbib/content/xml/util/SaxEventConsumerTest.java +++ b/content-xml/src/test/java/org/xbib/content/xml/test/util/SaxEventConsumerTest.java @@ -1,4 +1,4 @@ -package org.xbib.content.xml.util; +package org.xbib.content.xml.test.util; import org.junit.jupiter.api.Test; import org.xbib.content.xml.stream.SaxEventConsumer; @@ -10,9 +10,6 @@ import javax.xml.stream.XMLEventFactory; import javax.xml.stream.events.Attribute; import javax.xml.stream.events.Namespace; -/** - * - */ public class SaxEventConsumerTest { private final XMLEventFactory eventFactory = XMLEventFactory.newInstance(); diff --git a/content-xml/src/test/java/org/xbib/content/xml/util/XMLUtilTest.java b/content-xml/src/test/java/org/xbib/content/xml/test/util/XMLUtilTest.java similarity index 68% rename from content-xml/src/test/java/org/xbib/content/xml/util/XMLUtilTest.java rename to content-xml/src/test/java/org/xbib/content/xml/test/util/XMLUtilTest.java index 45206a0..40b98bf 100644 --- a/content-xml/src/test/java/org/xbib/content/xml/util/XMLUtilTest.java +++ b/content-xml/src/test/java/org/xbib/content/xml/test/util/XMLUtilTest.java @@ -1,17 +1,17 @@ -package org.xbib.content.xml.util; +package org.xbib.content.xml.test.util; import static org.junit.jupiter.api.Assertions.assertEquals; -import org.junit.jupiter.api.Test; -/** - * - */ +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.xbib.content.xml.util.XMLUtil; + public class XMLUtilTest { @Test public void testWhitespaceCleaner() { String s = "Hello World\u001b"; - assertEquals(XMLUtil.sanitize(s), "Hello World"); + Assertions.assertEquals(XMLUtil.sanitize(s), "Hello World"); } @Test diff --git a/content-xml/src/test/java/org/xbib/content/xml/util/package-info.java b/content-xml/src/test/java/org/xbib/content/xml/util/package-info.java deleted file mode 100644 index dde601d..0000000 --- a/content-xml/src/test/java/org/xbib/content/xml/util/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Classes for testing XML content utilities. - */ -package org.xbib.content.xml.util; diff --git a/content-xml/src/test/resources/org/xbib/content/xml/dc.json b/content-xml/src/test/resources/org/xbib/content/xml/test/dc.json similarity index 100% rename from content-xml/src/test/resources/org/xbib/content/xml/dc.json rename to content-xml/src/test/resources/org/xbib/content/xml/test/dc.json diff --git a/content-xml/src/test/resources/org/xbib/content/xml/json/dc.json b/content-xml/src/test/resources/org/xbib/content/xml/test/json/dc.json similarity index 100% rename from content-xml/src/test/resources/org/xbib/content/xml/json/dc.json rename to content-xml/src/test/resources/org/xbib/content/xml/test/json/dc.json diff --git a/content-xml/src/test/resources/org/xbib/content/xml/json/elasticsearch-hit-example-1.json b/content-xml/src/test/resources/org/xbib/content/xml/test/json/elasticsearch-hit-example-1.json similarity index 100% rename from content-xml/src/test/resources/org/xbib/content/xml/json/elasticsearch-hit-example-1.json rename to content-xml/src/test/resources/org/xbib/content/xml/test/json/elasticsearch-hit-example-1.json diff --git a/content-xml/src/test/resources/org/xbib/content/xml/json/es-test-20130719.json b/content-xml/src/test/resources/org/xbib/content/xml/test/json/es-test-20130719.json similarity index 100% rename from content-xml/src/test/resources/org/xbib/content/xml/json/es-test-20130719.json rename to content-xml/src/test/resources/org/xbib/content/xml/test/json/es-test-20130719.json diff --git a/content-xml/src/test/resources/org/xbib/content/xml/json/glossary.json b/content-xml/src/test/resources/org/xbib/content/xml/test/json/glossary.json similarity index 100% rename from content-xml/src/test/resources/org/xbib/content/xml/json/glossary.json rename to content-xml/src/test/resources/org/xbib/content/xml/test/json/glossary.json diff --git a/content-xml/src/test/resources/org/xbib/content/xml/json/menu.json b/content-xml/src/test/resources/org/xbib/content/xml/test/json/menu.json similarity index 100% rename from content-xml/src/test/resources/org/xbib/content/xml/json/menu.json rename to content-xml/src/test/resources/org/xbib/content/xml/test/json/menu.json diff --git a/content-xml/src/test/resources/org/xbib/content/resource/namespace.properties b/content-xml/src/test/resources/org/xbib/content/xml/test/namespace.properties similarity index 100% rename from content-xml/src/test/resources/org/xbib/content/resource/namespace.properties rename to content-xml/src/test/resources/org/xbib/content/xml/test/namespace.properties diff --git a/content-yaml/build.gradle b/content-yaml/build.gradle index 7612e11..6751d0e 100644 --- a/content-yaml/build.gradle +++ b/content-yaml/build.gradle @@ -1,5 +1,5 @@ dependencies { api project(':content-core') api libs.jackson.dataformat.yaml - implementation libs.snakeyaml + runtimeOnly libs.snakeyaml } diff --git a/content-yaml/src/main/java/org/xbib/content/yaml/YamlXContentGenerator.java b/content-yaml/src/main/java/org/xbib/content/yaml/YamlXContentGenerator.java index 3c5faa2..b7cd295 100644 --- a/content-yaml/src/main/java/org/xbib/content/yaml/YamlXContentGenerator.java +++ b/content-yaml/src/main/java/org/xbib/content/yaml/YamlXContentGenerator.java @@ -19,6 +19,7 @@ public class YamlXContentGenerator extends AbstractXContentGenerator { private final YAMLGeneratorDelegate delegate; + @SuppressWarnings("this-escape") public YamlXContentGenerator(YAMLGenerator generator) { this.delegate = new YAMLGeneratorDelegate(generator); super.setGenerator(delegate); @@ -66,8 +67,7 @@ public class YamlXContentGenerator extends AbstractXContentGenerator { @Override public void copy(XContentBuilder builder, OutputStream outputStream) throws IOException { flush(); - if (builder instanceof DefaultXContentBuilder) { - DefaultXContentBuilder xContentBuilder = (DefaultXContentBuilder) builder; + if (builder instanceof DefaultXContentBuilder xContentBuilder) { xContentBuilder.bytes().streamOutput(outputStream); } } @@ -286,8 +286,7 @@ public class YamlXContentGenerator extends AbstractXContentGenerator { @Override public void copy(XContentBuilder builder, OutputStream outputStream) throws IOException { flush(); - if (builder instanceof DefaultXContentBuilder) { - DefaultXContentBuilder xContentBuilder = (DefaultXContentBuilder) builder; + if (builder instanceof DefaultXContentBuilder xContentBuilder) { xContentBuilder.bytes().streamOutput(outputStream); } } diff --git a/content-yaml/src/main/java/org/xbib/content/yaml/YamlXContentParser.java b/content-yaml/src/main/java/org/xbib/content/yaml/YamlXContentParser.java index 068de90..de29341 100644 --- a/content-yaml/src/main/java/org/xbib/content/yaml/YamlXContentParser.java +++ b/content-yaml/src/main/java/org/xbib/content/yaml/YamlXContentParser.java @@ -55,7 +55,7 @@ public class YamlXContentParser extends AbstractXContentParser { @Override public String currentName() throws IOException { - return parser.getCurrentName(); + return parser.currentName(); } @Override diff --git a/gradle.properties b/gradle.properties index 92fcc62..f6a089a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,3 @@ group = org.xbib name = content -version = 5.1.0 - -org.gradle.warning.mode = ALL +version = 5.2.0 diff --git a/gradle/compile/java.gradle b/gradle/compile/java.gradle index 6767006..25a53d9 100644 --- a/gradle/compile/java.gradle +++ b/gradle/compile/java.gradle @@ -1,4 +1,3 @@ - apply plugin: 'java-library' java { @@ -8,24 +7,41 @@ java { modularity.inferModulePath.set(true) withSourcesJar() withJavadocJar() - } jar { manifest { attributes('Implementation-Version': project.version) - attributes('X-Java-Compiler-Version': JavaLanguageVersion.of(21).toString()) + } + duplicatesStrategy = DuplicatesStrategy.INCLUDE +} + +tasks.withType(JavaCompile).configureEach { + doFirst { + options.fork = true + options.forkOptions.jvmArgs += ['-Duser.language=en', '-Duser.country=US'] + options.encoding = 'UTF-8' + options.compilerArgs.add('-Xlint:all') + // enforce presence of module-info.java + options.compilerArgs.add("--module-version") + options.compilerArgs.add(project.version as String) + options.compilerArgs.add("--module-path") + options.compilerArgs.add(classpath.asPath) + classpath = files() } } -tasks.withType(JavaCompile) { - options.fork = true - options.forkOptions.jvmArgs += ['-Duser.language=en','-Duser.country=US'] - options.compilerArgs << '-Xlint:all' - options.encoding = 'UTF-8' +tasks.withType(Javadoc).configureEach { + doFirst { + options.addStringOption('Xdoclint:none', '-quiet') + options.encoding = 'UTF-8' + } } -tasks.withType(Javadoc) { - options.addStringOption('Xdoclint:none', '-quiet') - options.encoding = 'UTF-8' +tasks.withType(JavaExec).configureEach { + doFirst { + jvmArguments.add("--module-path") + jvmArguments.add(classpath.asPath) + classpath = files() + } } diff --git a/gradle/test/junit5.gradle b/gradle/test/junit5.gradle index 419f037..8816efd 100644 --- a/gradle/test/junit5.gradle +++ b/gradle/test/junit5.gradle @@ -1,14 +1,28 @@ dependencies { - testImplementation libs.junit.jupiter.api - testImplementation libs.junit.jupiter.params - testImplementation libs.hamcrest - testRuntimeOnly libs.junit.jupiter.engine - testRuntimeOnly libs.junit.jupiter.platform.launcher + testImplementation testLibs.junit.jupiter.api + testImplementation testLibs.junit.jupiter.params + testImplementation testLibs.hamcrest + testRuntimeOnly testLibs.junit.jupiter.engine + testRuntimeOnly testLibs.junit.jupiter.platform.launcher } test { useJUnitPlatform() failFast = false + systemProperty 'java.util.logging.config.file', 'src/test/resources/logging.properties' + + /*jvmArgs '--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.unsupported/sun.reflect=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', + '--add-opens=jdk.unsupported/sun.misc=ALL-UNNAMED', + '--add-opens=jdk.unsupported/sun.reflect=ALL-UNNAMED'*/ testLogging { events 'STARTED', 'PASSED', 'FAILED', 'SKIPPED' } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7f93135c49b765f8051ef9d0a6055ff8e46073d8..e6441136f3d4ba8a0da8d277868979cfbc8ad796 100644 GIT binary patch literal 43453 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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

NnX)EH+Nua)3Y(c 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鯊%1Et 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⁢ zv5o9#E7!G0XmdzfsS{efPNi`1b44~SZ4Z8fuX!I}#8g+(wxzQwUT#Xb2(tbY1+EUhGKoT@KEU9Ktl>_0 z%bjDJg;#*gtJZv!-Zs`?^}v5eKmnbjqlvnSzE@_SP|LG_PJ6CYU+6zY6>92%E+ z=j@TZf-iW4(%U{lnYxQA;7Q!b;^brF8n0D>)`q5>|WDDXLrqYU_tKN2>=#@~OE7grMnNh?UOz-O~6 z6%rHy{#h9K0AT+lDC7q4{hw^|q6*Ry;;L%Q@)Ga}$60_q%D)rv(CtS$CQbpq9|y1e zRSrN4;$Jyl{m5bZw`$8TGvb}(LpY{-cQ)fcyJv7l3S52TLXVDsphtv&aPuDk1OzCA z4A^QtC(!11`IsNx_HnSy?>EKpHJWT^wmS~hc^p^zIIh@9f6U@I2 zC=Mve{j2^)mS#U$e{@Q?SO6%LDsXz@SY+=cK_QMmXBIU)j!$ajc-zLx3V60EXJ!qC zi<%2x8Q24YN+&8U@CIlN zrZkcT9yh%LrlGS9`G)KdP(@9Eo-AQz@8GEFWcb7U=a0H^ZVbLmz{+&M7W(nXJ4sN8 zJLR7eeK(K8`2-}j(T7JsO`L!+CvbueT%izanm-^A1Dn{`1Nw`9P?cq;7no+XfC`K(GO9?O^5zNIt4M+M8LM0=7Gz8UA@Z0N+lg+cX)NfazRu z5D)~HA^(u%w^cz+@2@_#S|u>GpB+j4KzQ^&Wcl9f z&hG#bCA(Yk0D&t&aJE^xME^&E-&xGHhXn%}psEIj641H+Nl-}boj;)Zt*t(4wZ5DN z@GXF$bL=&pBq-#vkTkh>7hl%K5|3 z{`Vn9b$iR-SoGENp}bn4;fR3>9sA%X2@1L3aE9yTra;Wb#_`xWwLSLdfu+PAu+o3| zGVnpzPr=ch{uuoHjtw7+_!L_2;knQ!DuDl0R`|%jr+}jFzXtrHIKc323?JO{l&;VF z*L1+}JU7%QJOg|5|Tc|D8fN zJORAg=_vsy{ak|o);@)Yh8Lkcg@$FG3k@ep36BRa^>~UmnRPziS>Z=`Jb2x*Q#`%A zU*i3&Vg?TluO@X0O;r2Jl6LKLUOVhSqg1*qOt^|8*c7 zo(298@+r$k_wQNGHv{|$tW(T8L+4_`FQ{kEW5Jgg{yf7ey4ss_(SNKfz(N9lx&a;< je(UuV8hP?p&}TPdm1I$XmG#(RzlD&B2izSj9sl%y5~4qc diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8838ba9..e7646de 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew.bat b/gradlew.bat index 6689b85..7101f8e 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -43,11 +43,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail diff --git a/settings-content-json/src/test/java/module-info.java b/settings-content-json/src/test/java/module-info.java new file mode 100644 index 0000000..5f50194 --- /dev/null +++ b/settings-content-json/src/test/java/module-info.java @@ -0,0 +1,6 @@ +module org.xbib.settings.content.json.test { + requires org.junit.jupiter.api; + requires org.xbib.settings.api; + requires org.xbib.settings.content.json; + opens org.xbib.settings.content.json.test to org.junit.platform.commons; +} diff --git a/settings-content-json/src/test/java/org/xbib/settings/content/json/JsonSettingsTest.java b/settings-content-json/src/test/java/org/xbib/settings/content/json/test/JsonSettingsTest.java similarity index 96% rename from settings-content-json/src/test/java/org/xbib/settings/content/json/JsonSettingsTest.java rename to settings-content-json/src/test/java/org/xbib/settings/content/json/test/JsonSettingsTest.java index c4c390a..a950c16 100644 --- a/settings-content-json/src/test/java/org/xbib/settings/content/json/JsonSettingsTest.java +++ b/settings-content-json/src/test/java/org/xbib/settings/content/json/test/JsonSettingsTest.java @@ -1,8 +1,9 @@ -package org.xbib.settings.content.json; +package org.xbib.settings.content.json.test; import org.junit.jupiter.api.Test; import org.xbib.settings.Settings; import org.xbib.settings.SettingsLoader; +import org.xbib.settings.content.json.JsonSettingsLoader; import java.io.IOException; import java.util.Arrays; diff --git a/settings-content/src/main/java/module-info.java b/settings-content/src/main/java/module-info.java index ce2a470..f71a330 100644 --- a/settings-content/src/main/java/module-info.java +++ b/settings-content/src/main/java/module-info.java @@ -9,6 +9,6 @@ module org.xbib.settings.content { uses SettingsBuilder; provides SettingsBuilder with ContentSettingsBuilder; exports org.xbib.settings.content; - requires org.xbib.settings.api; - requires org.xbib.content.core; + requires transitive org.xbib.settings.api; + requires transitive org.xbib.content.core; } diff --git a/settings-content/src/test/java/module-info.java b/settings-content/src/test/java/module-info.java new file mode 100644 index 0000000..ff2639f --- /dev/null +++ b/settings-content/src/test/java/module-info.java @@ -0,0 +1,8 @@ +module org.xbib.settings.content.test { + requires org.junit.jupiter.api; + requires org.xbib.content.core; + requires org.xbib.content.json; + requires org.xbib.settings.api; + requires org.xbib.settings.content.json; + opens org.xbib.settings.content.test to org.junit.platform.commons; +} diff --git a/settings-content/src/test/java/org/xbib/settings/content/test/SettingsTest.java b/settings-content/src/test/java/org/xbib/settings/content/test/SettingsTest.java index 540b71b..4705d90 100644 --- a/settings-content/src/test/java/org/xbib/settings/content/test/SettingsTest.java +++ b/settings-content/src/test/java/org/xbib/settings/content/test/SettingsTest.java @@ -26,9 +26,6 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; -/** - * - */ public class SettingsTest { @Test diff --git a/settings-content/src/test/resources/settings.json b/settings-content/src/test/resources/org/xbib/settings/content/test/settings.json similarity index 100% rename from settings-content/src/test/resources/settings.json rename to settings-content/src/test/resources/org/xbib/settings/content/test/settings.json diff --git a/settings.gradle b/settings.gradle index dc7562d..49c6a33 100644 --- a/settings.gradle +++ b/settings.gradle @@ -15,27 +15,30 @@ pluginManagement { dependencyResolutionManagement { versionCatalogs { libs { - version('gradle', '8.4') - version('junit', '5.10.0') - version('jackson', '2.15.2') - version('settings', '5.0.5') + version('gradle', '8.7') + version('jackson', '2.17.0') + version('settings', '5.0.7') + version('net', '4.3.2') + library('jackson-core', 'com.fasterxml.jackson.core', 'jackson-core').versionRef('jackson') + library('jackson-databind', 'com.fasterxml.jackson.core', 'jackson-databind').versionRef('jackson') + library('jackson-dataformat-smile', 'com.fasterxml.jackson.dataformat', 'jackson-dataformat-smile').versionRef('jackson') + library('jackson-dataformat-xml', 'com.fasterxml.jackson.dataformat', 'jackson-dataformat-xml').versionRef('jackson') + library('jackson-dataformat-yaml', 'com.fasterxml.jackson.dataformat', 'jackson-dataformat-yaml').versionRef('jackson') + library('woodstox', 'com.fasterxml.woodstox', 'woodstox-core').version('6.6.2') + library('snakeyaml', 'org.yaml', 'snakeyaml').version('2.2') + library('settings-api', 'org.xbib', 'settings-api').versionRef('settings') + library('net', 'org.xbib', 'net').versionRef('net') + } + testLibs { + version('junit', '5.10.2') library('junit-jupiter-api', 'org.junit.jupiter', 'junit-jupiter-api').versionRef('junit') library('junit-jupiter-params', 'org.junit.jupiter', 'junit-jupiter-params').versionRef('junit') library('junit-jupiter-engine', 'org.junit.jupiter', 'junit-jupiter-engine').versionRef('junit') library('junit-jupiter-platform-launcher', 'org.junit.platform', 'junit-platform-launcher').version('1.10.0') library('junit4', 'junit', 'junit').version('4.13.2') library('hamcrest', 'org.hamcrest:hamcrest-library:2.2') - library('jackson-core', 'com.fasterxml.jackson.core', 'jackson-core').versionRef('jackson') - library('jackson-databind', 'com.fasterxml.jackson.core', 'jackson-databind').versionRef('jackson') - library('jackson-dataformat-smile', 'com.fasterxml.jackson.dataformat', 'jackson-dataformat-smile').versionRef('jackson') - library('jackson-dataformat-xml', 'com.fasterxml.jackson.dataformat', 'jackson-dataformat-xml').versionRef('jackson') - library('jackson-dataformat-yaml', 'com.fasterxml.jackson.dataformat', 'jackson-dataformat-yaml').versionRef('jackson') - library('settings-api', 'org.xbib', 'settings-api').versionRef('settings') - library('mockito-core', 'org.mockito', 'mockito-core').version('5.2.0') - library('mockito-inline', 'org.mockito', 'mockito-inline').version('5.2.0') - library('net', 'org.xbib', 'net').version('4.0.0') - library('woodstox', 'com.fasterxml.woodstox', 'woodstox-core').version('6.5.1') - library('snakeyaml', 'org.yaml', 'snakeyaml').version('2.2') + library('mockito-core', 'org.mockito', 'mockito-core').version('5.11.0') + //library('mockito-inline', 'org.mockito', 'mockito-inline').version('5.2.0') } } }