package com.marklogic.client.batch;
import com.marklogic.client.DatabaseClient;
import com.marklogic.client.document.DocumentManager;
import com.marklogic.client.document.DocumentWriteOperation;
import com.marklogic.client.document.DocumentWriteSet;
import com.marklogic.client.document.ServerTransform;
import java.util.Arrays;
import java.util.List;
/**
* REST API-based implementation, using the Java Client API. By default, this will call release() on each of the
* DatabaseClient objects that are passed in. Be sure to disable this if you want to keep using those DatabaseClient
* objects.
*/
public class RestBatchWriter extends BatchWriterSupport {
private List<DatabaseClient> databaseClients;
private int clientIndex = 0;
private boolean releaseDatabaseClients = true;
private ServerTransform serverTransform;
public RestBatchWriter(DatabaseClient databaseClient) {
this(Arrays.asList(databaseClient));
}
public RestBatchWriter(List<DatabaseClient> databaseClients) {
this.databaseClients = databaseClients;
}
@Override
public void write(List<? extends DocumentWriteOperation> items) {
DatabaseClient client = determineDatabaseClientToUse();
Runnable runnable = buildRunnable(client, items);
executeRunnable(runnable, items);
}
protected DatabaseClient determineDatabaseClientToUse() {
if (clientIndex >= databaseClients.size()) {
clientIndex = 0;
}
DatabaseClient client = databaseClients.get(clientIndex);
clientIndex++;
return client;
}
protected Runnable buildRunnable(final DatabaseClient client, final List<? extends DocumentWriteOperation> items) {
return new Runnable() {
@Override
public void run() {
DocumentManager<?, ?> mgr = buildDocumentManager(client);
DocumentWriteSet set = mgr.newWriteSet();
for (DocumentWriteOperation item : items) {
set.add(item);
}
int count = set.size();
if (logger.isDebugEnabled()) {
logger.debug("Writing " + count + " documents to MarkLogic");
}
if (serverTransform != null) {
mgr.write(set, serverTransform);
} else {
mgr.write(set);
}
if (logger.isInfoEnabled()) {
logger.info("Wrote " + count + " documents to MarkLogic");
}
}
};
}
/**
* Factored out so it can be overridden for e.g. those already using MarkLogic 9, who may need to set the content
* format on the manager.
*
* @param client
* @return
*/
protected DocumentManager<?, ?> buildDocumentManager(DatabaseClient client) {
return client.newDocumentManager();
}
@Override
public void waitForCompletion() {
super.waitForCompletion();
if (databaseClients != null && releaseDatabaseClients) {
logger.info("Releasing DatabaseClient instances...");
for (DatabaseClient client : databaseClients) {
client.release();
}
logger.info("Finished releasing DatabaseClient instances");
}
}
public void setReleaseDatabaseClients(boolean releaseDatabaseClients) {
this.releaseDatabaseClients = releaseDatabaseClients;
}
public void setServerTransform(ServerTransform serverTransform) {
this.serverTransform = serverTransform;
}
protected List<DatabaseClient> getDatabaseClients() {
return databaseClients;
}
protected int getClientIndex() {
return clientIndex;
}
protected boolean isReleaseDatabaseClients() {
return releaseDatabaseClients;
}
protected ServerTransform getServerTransform() {
return serverTransform;
}
}