package com.marklogic.client.schemasloader.impl; import com.marklogic.client.DatabaseClient; import com.marklogic.client.batch.BatchWriter; import com.marklogic.client.batch.RestBatchWriter; import com.marklogic.client.document.JSONDocumentManager; import com.marklogic.client.document.TextDocumentManager; import com.marklogic.client.document.XMLDocumentManager; import com.marklogic.client.file.DefaultDocumentFileReader; import com.marklogic.client.file.DocumentFile; import com.marklogic.client.file.DocumentFileReader; import com.marklogic.client.helper.LoggingObject; import com.marklogic.client.io.DocumentMetadataHandle; import com.marklogic.client.io.FileHandle; import com.marklogic.client.io.Format; import com.marklogic.client.schemasloader.SchemasFinder; import com.marklogic.client.schemasloader.SchemasLoader; import java.io.File; import java.util.HashSet; import java.util.List; import java.util.Set; public class DefaultSchemasLoader extends LoggingObject implements SchemasLoader { private DocumentFileReader documentFileReader; private BatchWriter batchWriter; private boolean waitForCompletion = true; /** * @deprecated This constructor is only for the deprecated way of loading schemas */ public DefaultSchemasLoader() { } /** * Simplest constructor for using this class. Just provide a DatabaseClient, and this will use sensible defaults * for how documents are read and written. Note that the DatabaseClient will not be released after this class is * done with it, as this class wasn't the one that created it. * * @param databaseClient */ public DefaultSchemasLoader(DatabaseClient databaseClient) { RestBatchWriter restBatchWriter = new RestBatchWriter(databaseClient); restBatchWriter.setReleaseDatabaseClients(false); restBatchWriter.initialize(); this.batchWriter = restBatchWriter; DefaultDocumentFileReader reader = new DefaultDocumentFileReader(); reader.addDocumentFileProcessor(new TdeDocumentFileProcessor()); this.documentFileReader = reader; } /** * Assumes that the BatchWriter has already been initialized. * * @param documentFileReader * @param batchWriter */ public DefaultSchemasLoader(DocumentFileReader documentFileReader, BatchWriter batchWriter) { this.documentFileReader = documentFileReader; this.batchWriter = batchWriter; } /** * Run the given paths through the DocumentFileReader, and then send the result to the BatchWriter, and then * return the result. * * @param paths * @return */ @Override public List<DocumentFile> loadSchemas(String... paths) { List<DocumentFile> documentFiles = documentFileReader.readDocumentFiles(paths); if (documentFiles != null && !documentFiles.isEmpty()) { if (logger.isInfoEnabled()) { logger.info(format("Writing %d files into the schemas database", documentFiles.size())); } batchWriter.write(documentFiles); if (waitForCompletion) { batchWriter.waitForCompletion(); } } return documentFiles; } /** * @param baseDir * @param schemasDataFinder * @param client * @return * @deprecated */ @Override public Set<File> loadSchemas(File baseDir, SchemasFinder schemasDataFinder, DatabaseClient client) { XMLDocumentManager xmlDocMgr = client.newXMLDocumentManager(); TextDocumentManager textDocMgr = client.newTextDocumentManager(); JSONDocumentManager jsonDocMgr = client.newJSONDocumentManager(); List<File> schemasData = schemasDataFinder.findSchemas(baseDir); Set<File> loadedSchemas = new HashSet<>(); DocumentMetadataHandle tdeCollection = new DocumentMetadataHandle() .withCollections("http://marklogic.com/xdmp/tde"); for (File f : schemasData) { String extension = getExtensionNameFromFile(f); FileHandle handle = new FileHandle(f); if (extension.equals("tdej")) { jsonDocMgr.write(f.getName(), tdeCollection, handle.withFormat(Format.JSON)); } else if (extension.equals("tdex")) { xmlDocMgr.write(f.getName(), tdeCollection, handle.withFormat(Format.XML)); } else if (extension.equals("xsd")) { xmlDocMgr.write(f.getName(), handle.withFormat(Format.XML)); } else { textDocMgr.write(f.getName(), handle.withFormat(Format.TEXT)); } loadedSchemas.add(f); } return loadedSchemas; } protected String getExtensionNameFromFile(File file) { String name = file.getName(); int pos = name.lastIndexOf('.'); return pos < 0 ? name : name.substring(pos + 1); } public void setWaitForCompletion(boolean waitForCompletion) { this.waitForCompletion = waitForCompletion; } public DocumentFileReader getDocumentFileReader() { return documentFileReader; } public BatchWriter getBatchWriter() { return batchWriter; } }