package com.marklogic.client.batch; import com.marklogic.client.document.DocumentWriteOperation; import com.marklogic.client.xcc.DefaultDocumentWriteOperationAdapter; import com.marklogic.client.xcc.DocumentWriteOperationAdapter; import com.marklogic.xcc.Content; import com.marklogic.xcc.ContentSource; import com.marklogic.xcc.Session; import com.marklogic.xcc.exceptions.RequestException; import java.util.List; /** * XCC implementation for batched writes. Most important thing here is we depend on an instance of * DocumentWriteOperationAdapter to adapt a DocumentWriteOperation instance into a Content instance. */ public class XccBatchWriter extends BatchWriterSupport { private List<ContentSource> contentSources; private int contentSourceIndex = 0; private DocumentWriteOperationAdapter documentWriteOperationAdapter; public XccBatchWriter(List<ContentSource> contentSources) { this.contentSources = contentSources; this.documentWriteOperationAdapter = new DefaultDocumentWriteOperationAdapter(); } @Override public void write(final List<? extends DocumentWriteOperation> items) { ContentSource contentSource = determineContentSourceToUse(); Runnable runnable = buildRunnable(contentSource, items); executeRunnable(runnable, items); } protected ContentSource determineContentSourceToUse() { if (contentSourceIndex >= contentSources.size()) { contentSourceIndex = 0; } ContentSource contentSource = contentSources.get(contentSourceIndex); contentSourceIndex++; return contentSource; } protected Runnable buildRunnable(final ContentSource contentSource, final List<? extends DocumentWriteOperation> items) { return new Runnable() { @Override public void run() { Session session = contentSource.newSession(); int count = items.size(); Content[] array = new Content[count]; for (int i = 0; i < count; i++) { array[i] = documentWriteOperationAdapter.adapt(items.get(i)); } if (logger.isDebugEnabled()) { logger.debug("Writing " + count + " documents to MarkLogic"); } try { session.insertContent(array); if (logger.isInfoEnabled()) { logger.info("Wrote " + count + " documents to MarkLogic"); } } catch (RequestException e) { throw new RuntimeException("Unable to insert content: " + e.getMessage(), e); } finally { session.close(); } } }; } public void setDocumentWriteOperationAdapter(DocumentWriteOperationAdapter documentWriteOperationAdapter) { this.documentWriteOperationAdapter = documentWriteOperationAdapter; } }