Skip to content

Commit c3f3ad6

Browse files
committed
Refactor WIP
1 parent 1f2cb3d commit c3f3ad6

File tree

3 files changed

+73
-22
lines changed

3 files changed

+73
-22
lines changed

metafacture-io/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ description = 'Modules for reading and writing data streams'
1919

2020
dependencies {
2121
api project(':metafacture-framework')
22+
api project(':metafacture-formatting')
23+
api project(':metafacture-xml')
2224
implementation project(':metafacture-commons')
2325
implementation "commons-io:commons-io:${versions.commons_io}"
2426
implementation "org.apache.commons:commons-compress:${versions.commons_compress}"

metafacture-biblio/src/main/java/org/metafacture/biblio/SruOpener.java renamed to metafacture-io/src/main/java/org/metafacture/io/SruOpener.java

Lines changed: 48 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,27 @@
11
/* Copyright 2013 Pascal Christoph.
22
* Licensed under the Eclipse Public License 1.0 */
33

4-
package org.metafacture.biblio;
4+
package org.metafacture.io;
55

66
import org.metafacture.framework.FluxCommand;
77
import org.metafacture.framework.MetafactureException;
8-
import org.metafacture.framework.ObjectReceiver;
8+
import org.metafacture.framework.XmlReceiver;
99
import org.metafacture.framework.annotations.Description;
1010
import org.metafacture.framework.annotations.In;
1111
import org.metafacture.framework.annotations.Out;
1212
import org.metafacture.framework.helpers.DefaultObjectPipe;
13+
import org.xml.sax.InputSource;
14+
import org.xml.sax.SAXException;
15+
import org.xml.sax.SAXNotRecognizedException;
16+
import org.xml.sax.SAXNotSupportedException;
17+
import org.xml.sax.XMLReader;
1318

1419
import java.io.IOException;
1520
import java.io.InputStream;
16-
import java.io.InputStreamReader;
17-
import java.io.Reader;
1821
import java.net.HttpURLConnection;
1922
import java.net.URL;
23+
import javax.xml.parsers.ParserConfigurationException;
24+
import javax.xml.parsers.SAXParserFactory;
2025

2126
/**
2227
* Opens an SRU (Search Retrieval by URL) stream and passes a reader to the receiver.
@@ -26,9 +31,9 @@
2631
*/
2732
@Description("Opens a SRU stream and passes a reader to the receiver. The input should be the base URL of the SRU service to be retrieved from. Mandatory argument is: QUERY.")
2833
@In(String.class)
29-
@Out(Reader.class)
34+
@Out(XmlReceiver.class)
3035
@FluxCommand("open-sru")
31-
public final class SruOpener extends DefaultObjectPipe<String, ObjectReceiver<Reader>> {
36+
public final class SruOpener extends DefaultObjectPipe<String, XmlReceiver> {
3237

3338
private static final String OPERATION = "searchRetrieve";
3439
private static final String RECORD_SCHEMA = "MARC21-xml";
@@ -38,6 +43,7 @@ public final class SruOpener extends DefaultObjectPipe<String, ObjectReceiver<Re
3843
private static final int CONNECTION_TIMEOUT = 11000;
3944
private static final int MAXIMUM_RECORDS = 10;
4045
private static final int START_RECORD = 1;
46+
private final XMLReader saxReader;
4147

4248
private String operation = OPERATION;
4349
private String query;
@@ -56,6 +62,14 @@ public final class SruOpener extends DefaultObjectPipe<String, ObjectReceiver<Re
5662
* Creates an instance of {@link SruOpener}
5763
*/
5864
public SruOpener() {
65+
try {
66+
final SAXParserFactory parserFactory = SAXParserFactory.newInstance();
67+
parserFactory.setNamespaceAware(true);
68+
saxReader = parserFactory.newSAXParser().getXMLReader();
69+
}
70+
catch (final ParserConfigurationException | SAXException e) {
71+
throw new MetafactureException(e);
72+
}
5973
}
6074

6175
/**
@@ -171,20 +185,24 @@ private void retrieve(StringBuilder srUrl, int startRecord) throws IOException {
171185
if (!userAgent.isEmpty()) {
172186
connection.setRequestProperty("User-Agent", userAgent);
173187
}
174-
InputStream istream = getInputStream(connection);
175-
try (
176-
InputStreamReader inputStreamReader = new InputStreamReader(istream);
177-
) {
188+
InputStream inputStream = getInputStream(connection);
189+
try {
190+
InputSource inputSource = new InputSource(inputStream);
191+
saxReader.parse(inputSource);
192+
// String sr = saxReader.getProperty("huhu").toString();
193+
// System.out.println(sr);
194+
}
195+
catch (final IOException | SAXException e) {
196+
throw new MetafactureException(e);
197+
}
178198
System.out.println("srUrl="+srUrl);
179199
System.out.println("startRecord="+startRecord);
180-
System.out.println("istream.length="+istream.available());
181-
if (istream.available() < 768){ // we take it that this is a result without a record
200+
System.out.println("istream.length="+inputStream.available());
201+
if (inputStream.available() < 768){ // we take it that this is a result without a record
182202
stopRetrieving = true;
183203
}
184-
185-
getReceiver().process(inputStreamReader);
204+
// getReceiver().process(saxReader);
186205
}
187-
}
188206

189207
private InputStream getInputStream(final HttpURLConnection connection) {
190208
try {
@@ -196,4 +214,19 @@ private InputStream getInputStream(final HttpURLConnection connection) {
196214
}
197215
}
198216

217+
private static final String SAX_PROPERTY_LEXICAL_HANDLER = "http://xml.org/sax/properties/lexical-handler";
218+
@Override
219+
protected void onSetReceiver() {
220+
saxReader.setContentHandler(getReceiver());
221+
saxReader.setDTDHandler(getReceiver());
222+
saxReader.setEntityResolver(getReceiver());
223+
saxReader.setErrorHandler(getReceiver());
224+
try {
225+
saxReader.setProperty(SAX_PROPERTY_LEXICAL_HANDLER, getReceiver());
226+
}
227+
catch (final SAXNotRecognizedException | SAXNotSupportedException e) {
228+
throw new MetafactureException(e);
229+
}
230+
}
231+
199232
}

metafacture-biblio/src/test/java/org/metafacture/biblio/SruOpenerTest.java renamed to metafacture-io/src/test/java/org/metafacture/io/SruOpenerTest.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1-
package org.metafacture.biblio;
1+
package org.metafacture.io;
22

33
import org.junit.Test;
4+
import org.metafacture.formatting.StreamLiteralFormatter;
45
import org.metafacture.framework.ObjectReceiver;
6+
import org.metafacture.framework.XmlReceiver;
7+
import org.metafacture.xml.XmlDecoder;
8+
import org.metafacture.xml.XmlElementSplitter;
9+
import org.xml.sax.XMLReader;
510

611
import java.io.BufferedReader;
712
import java.io.IOException;
@@ -16,11 +21,12 @@ public class SruOpenerTest {
1621
@Test
1722
public void test(){
1823
SruOpener sruOpener = new SruOpener();
19-
sruOpener.setReceiver(new ObjectReceiver<Reader> () {
24+
sruOpener.setReceiver(new ObjectReceiver<XmlReceiver> () {
25+
2026

2127
@Override
22-
public void process(final Reader obj) {
23-
BufferedReader in = new BufferedReader(obj);
28+
public void process(final XmlReceiver obj) {
29+
/* BufferedReader in = new BufferedReader(obj);
2430
String line = null;
2531
StringBuilder rslt = new StringBuilder();
2632
while (true) {
@@ -31,8 +37,16 @@ public void process(final Reader obj) {
3137
throw new RuntimeException(e);
3238
}
3339
rslt.append(line);
34-
}
35-
System.out.println(rslt.toString());
40+
}*/
41+
StreamLiteralFormatter streamLiteralFormatter = new StreamLiteralFormatter();
42+
ObjectStdoutWriter<String> objectStdoutWriter = new ObjectStdoutWriter<String>();
43+
XmlElementSplitter xmlElementSplitter = new XmlElementSplitter();
44+
streamLiteralFormatter.setReceiver(objectStdoutWriter);
45+
xmlElementSplitter.setReceiver(streamLiteralFormatter);
46+
xmlDecoder.setReceiver(xmlElementSplitter);
47+
48+
49+
// System.out.println(rslt.toString());
3650
resultCollector.append(obj);
3751
}
3852

@@ -52,7 +66,9 @@ public void closeStream() {
5266
sruOpener.setRecordSchema("MARC21plus-xml");
5367
sruOpener.setVersion("1.1");
5468
sruOpener.setStartRecord("1890");
55-
sruOpener.process("https://services.dnb.de/sru/dnb");
69+
// sruOpener.process("https://services.dnb.de/sru/dnb");
70+
sruOpener.process("https://amsquery.stadt-zuerich.ch/sru/");
71+
5672
System.out.println(resultCollector.toString());
5773
System.out.println(resultCollector.toString());
5874
}

0 commit comments

Comments
 (0)