Skip to content
This repository was archived by the owner on Sep 16, 2024. It is now read-only.

Commit 01184a5

Browse files
committed
#76 Added WriteToFileConsumer
1 parent d072e59 commit 01184a5

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package com.marklogic.client.ext.datamovement.consumer;
2+
3+
import com.marklogic.client.document.DocumentRecord;
4+
import com.marklogic.client.ext.helper.LoggingObject;
5+
import com.marklogic.client.io.InputStreamHandle;
6+
import org.springframework.util.FileCopyUtils;
7+
8+
import java.io.File;
9+
import java.io.FileOutputStream;
10+
import java.io.IOException;
11+
import java.util.function.Consumer;
12+
13+
/**
14+
* Consumer implementation that is intended to be used with DMSDK's ExportListener. Writes each document to a File based
15+
* on the directory passed to this class's constructor plus the document's URI.
16+
*/
17+
public class WriteToFileConsumer extends LoggingObject implements Consumer<DocumentRecord> {
18+
19+
private File baseDir;
20+
private boolean logErrors = true;
21+
22+
public WriteToFileConsumer(File baseDir) {
23+
this.baseDir = baseDir;
24+
}
25+
26+
@Override
27+
public void accept(DocumentRecord documentRecord) {
28+
String uri = documentRecord.getUri();
29+
File outputFile = getOutputFile(documentRecord);
30+
if (logger.isDebugEnabled()) {
31+
logger.debug("Writing document with URI " + uri + " to file: " + outputFile.getAbsolutePath());
32+
}
33+
try {
34+
writeDocumentToFile(documentRecord, outputFile);
35+
} catch (IOException e) {
36+
String message = "Unable to write document to file; URI: " + uri + "; file: " + outputFile.getAbsolutePath();
37+
if (logErrors) {
38+
logger.warn(message, e);
39+
} else {
40+
throw new RuntimeException(message, e);
41+
}
42+
}
43+
}
44+
45+
protected File getOutputFile(DocumentRecord documentRecord) {
46+
return new File(baseDir, documentRecord.getUri());
47+
}
48+
49+
protected void writeDocumentToFile(DocumentRecord documentRecord, File file) throws IOException {
50+
file.getParentFile().mkdirs();
51+
FileOutputStream fos = new FileOutputStream(file);
52+
try {
53+
InputStreamHandle handle = documentRecord.getContent(new InputStreamHandle());
54+
FileCopyUtils.copy(handle.get(), fos);
55+
} finally {
56+
fos.close();
57+
}
58+
}
59+
60+
protected File getBaseDir() {
61+
return baseDir;
62+
}
63+
64+
protected boolean isLogErrors() {
65+
return logErrors;
66+
}
67+
68+
public void setLogErrors(boolean logErrors) {
69+
this.logErrors = logErrors;
70+
}
71+
}

src/test/java/com/marklogic/client/ext/datamovement/listener/ManageCollectionsTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
package com.marklogic.client.ext.datamovement.listener;
22

33
import com.marklogic.client.datamovement.DeleteListener;
4+
import com.marklogic.client.datamovement.ExportListener;
45
import com.marklogic.client.datamovement.QueryBatch;
56
import com.marklogic.client.datamovement.QueryBatchListener;
67
import com.marklogic.client.ext.AbstractIntegrationTest;
78
import com.marklogic.client.ext.batch.RestBatchWriter;
89
import com.marklogic.client.ext.batch.SimpleDocumentWriteOperation;
910
import com.marklogic.client.ext.datamovement.QueryBatcherTemplate;
1011
import com.marklogic.client.ext.datamovement.UrisQueryQueryBatcherBuilder;
12+
import com.marklogic.client.ext.datamovement.consumer.WriteToFileConsumer;
1113
import com.marklogic.client.ext.helper.ClientHelper;
1214
import org.junit.Test;
1315

16+
import java.io.File;
1417
import java.util.Arrays;
1518
import java.util.List;
1619

@@ -46,6 +49,16 @@ public void processEvent(QueryBatch batch) {
4649
));
4750
writer.waitForCompletion();
4851

52+
// Do a quick test of exporting the data
53+
ExportListener exportListener = new ExportListener();
54+
File exportDir = new File("build/export-test");
55+
exportDir.mkdirs();
56+
WriteToFileConsumer l = new WriteToFileConsumer(exportDir);
57+
exportListener.onDocumentReady(l);
58+
qbt.applyOnCollections(exportListener, COLLECTION);
59+
assertTrue(new File(exportDir, firstUri).exists());
60+
assertTrue(new File(exportDir, secondUri).exists());
61+
4962
// Set collections
5063
qbt.applyOnCollections(new SetCollectionsListener(COLLECTION, "red"), COLLECTION);
5164
assertUriInCollections(firstUri, COLLECTION, "red");
@@ -101,6 +114,7 @@ public void processEvent(QueryBatch batch) {
101114
qbt.apply(new SetCollectionsListener(COLLECTION, "green"), builder);
102115
assertUriInCollections(firstUri, COLLECTION, "blue");
103116
assertUriInCollections(secondUri, COLLECTION, "blue");
117+
104118
}
105119

106120
private void assertUriInCollections(String uri, String... collections) {

0 commit comments

Comments
 (0)