Skip to content
This repository was archived by the owner on Feb 27, 2023. It is now read-only.

Commit d4f0c23

Browse files
authored
Merge pull request #168 from sastafford/feature/166-addTransformSupportToMarkLogicItemWriter
Feature/166 add transform support to mark logic item writer
2 parents 26353ea + 8b43474 commit d4f0c23

File tree

4 files changed

+148
-8
lines changed

4 files changed

+148
-8
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ subprojects {
2222

2323
dependencies {
2424
compile "org.springframework.batch:spring-batch-core:3.0.7.RELEASE"
25-
compile "com.marklogic:ml-javaclient-util:2.10.0-alpha"
25+
compile "com.marklogic:ml-javaclient-util:2.10.0"
2626
}
2727

2828
task wrapper(type: Wrapper) {

core/src/main/java/com/marklogic/spring/batch/item/MarkLogicItemWriter.java

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package com.marklogic.spring.batch.item;
22

33
import com.marklogic.client.DatabaseClient;
4-
import com.marklogic.client.document.DocumentWriteOperation;
5-
import com.marklogic.client.document.DocumentWriteSet;
6-
import com.marklogic.client.document.GenericDocumentManager;
4+
import com.marklogic.client.document.*;
5+
import com.marklogic.client.io.Format;
76
import org.slf4j.Logger;
87
import org.slf4j.LoggerFactory;
98
import org.springframework.batch.item.ItemWriter;
109

1110
import java.util.List;
11+
import java.util.Map;
1212

1313
/*
1414
The MarkLogicItemWriter is an ItemWriter used to write any type of document to MarkLogic. It expects a
@@ -24,6 +24,9 @@ public class MarkLogicItemWriter implements ItemWriter<DocumentWriteOperation> {
2424
private String outputUriPrefix;
2525
private String outputUriReplace;
2626
private String outputUriSuffix;
27+
private ServerTransform serverTransform;
28+
private Format format;
29+
private boolean transformOn = false;
2730

2831
public MarkLogicItemWriter(DatabaseClient client) {
2932
this.client = client;
@@ -40,9 +43,13 @@ public void write(List<? extends DocumentWriteOperation> items) throws Exception
4043
uri = (outputUriSuffix != null) ? uri + outputUriSuffix : uri;
4144
batch.add(uri, item.getMetadata(), item.getContent());
4245
}
43-
docMgr.write(batch);
46+
if (!transformOn) {
47+
docMgr.write(batch);
48+
} else {
49+
docMgr.write(batch, serverTransform);
50+
}
4451
}
45-
52+
4653
private String applyOutputUriReplace(String uri, String outputUriReplace) {
4754
String[] regexReplace = outputUriReplace.split(",");
4855
for (int i = 0; i < regexReplace.length; i=i+2) {
@@ -74,6 +81,19 @@ public void setOutputUriReplace(String outputUriReplace) {
7481
public void setOutputUriSuffix(String outputUriSuffix) {
7582
this.outputUriSuffix = outputUriSuffix;
7683
}
77-
78-
84+
85+
/*
86+
Applies transform for every document
87+
*/
88+
public void setTransform(Format format, String transformName, Map<String, String> transformParameters) {
89+
this.format = format;
90+
docMgr.setContentFormat(format);
91+
this.serverTransform = new ServerTransform(transformName);
92+
if (transformParameters != null) {
93+
for (String key : transformParameters.keySet()) {
94+
serverTransform.put(key, transformParameters.get(key));
95+
}
96+
}
97+
transformOn = true;
98+
}
7999
}
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package com.marklogic.spring.batch.item.writer;
2+
3+
import com.marklogic.client.DatabaseClient;
4+
import com.marklogic.client.admin.TransformExtensionsManager;
5+
import com.marklogic.client.document.*;
6+
import com.marklogic.client.io.*;
7+
import com.marklogic.client.spring.BasicConfig;
8+
import com.marklogic.junit.Fragment;
9+
import com.marklogic.junit.spring.AbstractSpringTest;
10+
import com.marklogic.spring.batch.item.MarkLogicItemWriter;
11+
import org.junit.After;
12+
import org.junit.Before;
13+
import org.junit.Test;
14+
import org.springframework.core.io.Resource;
15+
import org.springframework.test.context.ContextConfiguration;
16+
17+
import java.io.IOException;
18+
import java.util.ArrayList;
19+
import java.util.HashMap;
20+
import java.util.List;
21+
import java.util.Map;
22+
23+
@ContextConfiguration(classes = {BasicConfig.class})
24+
public class MarkLogicItemWriterTest extends AbstractSpringTest {
25+
26+
public String xml;
27+
public String transformName = "simple";
28+
DatabaseClient client;
29+
TransformExtensionsManager transMgr;
30+
XMLDocumentManager docMgr;
31+
32+
@Before
33+
public void setup() throws IOException {
34+
Resource transform = getApplicationContext().getResource("classpath:/transforms/simple.xqy");
35+
client = getClientProvider().getDatabaseClient();
36+
TransformExtensionsManager transMgr = client.newServerConfigManager().newTransformExtensionsManager();
37+
FileHandle fileHandle = new FileHandle(transform.getFile());
38+
fileHandle.setFormat(Format.XML);
39+
transMgr.writeXQueryTransform(transformName, fileHandle);
40+
xml = "<hello>world</hello>";
41+
docMgr = client.newXMLDocumentManager();
42+
}
43+
44+
@Test
45+
public void writeDocumentWithTransformNoParametersTest() {
46+
MarkLogicItemWriter writer = new MarkLogicItemWriter(client);
47+
writer.setTransform(Format.XML, transformName, null);
48+
DocumentWriteOperation writeOp = new MarkLogicWriteHandle("hello.xml", new DocumentMetadataHandle(), new StringHandle(xml));
49+
List<DocumentWriteOperation> writeOps = new ArrayList<DocumentWriteOperation>();
50+
writeOps.add(writeOp);
51+
try {
52+
writer.write(writeOps);
53+
} catch (Exception e) {
54+
e.printStackTrace();
55+
}
56+
StringHandle handle = docMgr.read("hello.xml", new StringHandle());
57+
Fragment frag = new Fragment(handle.toString());
58+
frag.assertElementExists("//hello[text() = 'world']");
59+
frag.assertElementExists("//transform");
60+
}
61+
62+
@Test
63+
public void writeDocumentWithTransformWithParametersTest() {
64+
MarkLogicItemWriter writer = new MarkLogicItemWriter(client);
65+
Map<String, String> parameters = new HashMap<String, String>();
66+
parameters.put("monster", "grover");
67+
parameters.put("trash-can", "oscar");
68+
writer.setTransform(Format.XML, transformName, parameters);
69+
DocumentWriteOperation writeOp = new MarkLogicWriteHandle("hello.xml", new DocumentMetadataHandle(), new StringHandle(xml));
70+
List<DocumentWriteOperation> writeOps = new ArrayList<DocumentWriteOperation>();
71+
writeOps.add(writeOp);
72+
try {
73+
writer.write(writeOps);
74+
} catch (Exception e) {
75+
e.printStackTrace();
76+
}
77+
StringHandle handle = docMgr.read("hello.xml", new StringHandle());
78+
Fragment frag = new Fragment(handle.toString());
79+
frag.assertElementExists("//transform");
80+
frag.assertElementExists("//monster[text() = 'grover']");
81+
frag.assertElementExists("//trash-can[text() = 'oscar']");
82+
}
83+
84+
@Test
85+
public void writeBatchDocumentsWithTransformTest() {
86+
GenericDocumentManager docMgr = client.newDocumentManager();
87+
docMgr.setContentFormat(Format.XML);
88+
DocumentWriteSet batch = docMgr.newWriteSet();
89+
batch.add("/hello.xml", new DocumentMetadataHandle(), new StringHandle("<hello />"));
90+
batch.add("/hello2.xml", new DocumentMetadataHandle(), new StringHandle("<hello2 />"));
91+
ServerTransform serverTransform = new ServerTransform("simple");
92+
docMgr.write(batch, serverTransform);
93+
}
94+
95+
@After
96+
public void cleanup() {
97+
// transMgr.deleteTransform(transformName);
98+
}
99+
100+
101+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
xquery version "1.0-ml";
2+
3+
module namespace x = "http://marklogic.com/rest-api/transform/simple";
4+
5+
declare function x:transform(
6+
$context as map:map,
7+
$params as map:map,
8+
$content as document-node())
9+
as document-node() {
10+
document {
11+
element { fn:local-name($content/element()) } {
12+
$content/element(),
13+
element transform {},
14+
for $param in map:keys($params)
15+
return element { $param } { map:get($params, $param) }
16+
}
17+
}
18+
19+
};

0 commit comments

Comments
 (0)