diff --git a/src/main/java/com/syncleus/maven/plugins/mongodb/ImportDataConfig.java b/src/main/java/com/syncleus/maven/plugins/mongodb/ImportDataConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..b1adda9867bf024682c862891e2d94f69d013999 --- /dev/null +++ b/src/main/java/com/syncleus/maven/plugins/mongodb/ImportDataConfig.java @@ -0,0 +1,75 @@ +/** + * Copyright: (c) Syncleus, Inc. + * + * You may redistribute and modify this source code under the terms and + * conditions of the Open Source Community License - Type C version 1.0 + * or any later version as published by Syncleus, Inc. at www.syncleus.com. + * There should be a copy of the license included with this file. If a copy + * of the license is not included you are granted no right to distribute or + * otherwise use this file except through a legal and valid license. You + * should also contact Syncleus, Inc. at the information below if you cannot + * find a license: + * + * Syncleus, Inc. + * 2604 South 12th Street + * Philadelphia, PA 19148 + */ +package com.syncleus.maven.plugins.mongodb; + +public class ImportDataConfig { + private String database; + private String collection; + private String file; + private Boolean dropOnImport = true; + private Boolean upsertOnImport = true; + private long timeout = 200000; + + public ImportDataConfig() { + } + + public ImportDataConfig(String database, String collection, String file, Boolean dropOnImport, Boolean upsertOnImport, long timeout) { + this.database = database; + this.collection = collection; + this.file = file; + this.dropOnImport = dropOnImport; + this.upsertOnImport = upsertOnImport; + this.timeout = timeout; + } + + public String getDatabase() { + + return database; + } + + public String getCollection() { + return collection; + } + + public String getFile() { + return file; + } + + public Boolean getDropOnImport() { + return dropOnImport; + } + + public Boolean getUpsertOnImport() { + return upsertOnImport; + } + + public long getTimeout() { + return timeout; + } + + @Override + public String toString() { + return "ImportDataConfig{" + + "database='" + database + '\'' + + ", collection='" + collection + '\'' + + ", file='" + file + '\'' + + ", dropOnImport=" + dropOnImport + + ", upsertOnImport=" + upsertOnImport + + ", timeout=" + timeout + + '}'; + } +} diff --git a/src/main/java/com/syncleus/maven/plugins/mongodb/StartMongoMojo.java b/src/main/java/com/syncleus/maven/plugins/mongodb/StartMongoMojo.java index 1ac3af5e402beaa367a7c7182bd09fdfe9806fd3..5feeacddf302b596c917f036e4d56205af6796df 100644 --- a/src/main/java/com/syncleus/maven/plugins/mongodb/StartMongoMojo.java +++ b/src/main/java/com/syncleus/maven/plugins/mongodb/StartMongoMojo.java @@ -18,10 +18,7 @@ package com.syncleus.maven.plugins.mongodb; import com.syncleus.maven.plugins.mongodb.log.Loggers; import com.syncleus.maven.plugins.mongodb.log.Loggers.LoggingStyle; -import de.flapdoodle.embed.mongo.Command; -import de.flapdoodle.embed.mongo.MongodExecutable; -import de.flapdoodle.embed.mongo.MongodProcess; -import de.flapdoodle.embed.mongo.MongodStarter; +import de.flapdoodle.embed.mongo.*; import de.flapdoodle.embed.mongo.config.*; import de.flapdoodle.embed.mongo.distribution.Feature; import de.flapdoodle.embed.mongo.distribution.IFeatureAwareVersion; @@ -40,6 +37,8 @@ import de.flapdoodle.embed.process.io.directories.IDirectory; import de.flapdoodle.embed.process.runtime.ICommandLinePostProcessor; import de.flapdoodle.embed.process.runtime.Network; import de.flapdoodle.embed.process.store.IArtifactStore; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.LifecyclePhase; @@ -50,6 +49,7 @@ import org.apache.maven.project.MavenProject; import java.io.File; import java.io.IOException; import java.net.*; +import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.concurrent.TimeUnit; @@ -248,6 +248,17 @@ public class StartMongoMojo extends AbstractMongoMojo { @Parameter private String[] features; + @Parameter + private ImportDataConfig[] imports; + + @Parameter(property = "mongodb.defaultImportDatabase") + private String defaultImportDatabase; + + @Parameter(property = "mongodb.parallel", defaultValue = "false") + private Boolean parallelImport; + + private Integer setPort = null; + @Override @SuppressWarnings("unchecked") public void start() throws MojoExecutionException, MojoFailureException { @@ -260,9 +271,7 @@ public class StartMongoMojo extends AbstractMongoMojo { try { final IRuntimeConfig runtimeConfig = createRuntimeConfig(); - if (randomPort) - port = PortUtils.allocateRandomPort(); - savePortToProjectProperties(); + getPort(); final IMongodConfig config = createMongodConfig(); @@ -273,6 +282,9 @@ public class StartMongoMojo extends AbstractMongoMojo { throw new MojoExecutionException("Failed to download MongoDB distribution: " + e.withDistribution(), e); } + if(this.imports != null && imports.length > 0) + sendImportScript(); + try { final MongodProcess mongod = executable.start(); @@ -463,13 +475,16 @@ public class StartMongoMojo extends AbstractMongoMojo { return (Feature[]) featuresSet.toArray(); } - /** - * Saves port to the {@link MavenProject#getProperties()} (with the property - * name {@code mongodb.port}) to allow others (plugins, tests, etc) to - * find the randomly allocated port. - */ - private void savePortToProjectProperties() { - project.getProperties().put("mongodb.port", String.valueOf(port)); + private int getPort() { + if( setPort != null ) + return setPort; + + if (randomPort) + setPort = PortUtils.allocateRandomPort(); + else + setPort = Integer.valueOf(port); + project.getProperties().put("mongodb.port", setPort); + return setPort; } private String getDataDirectory() { @@ -480,4 +495,88 @@ public class StartMongoMojo extends AbstractMongoMojo { } } + private void sendImportScript() throws MojoExecutionException { + List<MongoImportProcess> pendingMongoProcess = new ArrayList<MongoImportProcess>(); + + if(imports == null || imports.length == 0) { + getLog().error("No imports found, check your configuration"); + + return; + } + + getLog().info("Default import database: " + defaultImportDatabase); + + for(ImportDataConfig importData: imports) { + + getLog().info("Import " + importData); + + verify(importData); + String database = importData.getDatabase(); + + if(StringUtils.isBlank(database)){ + database = defaultImportDatabase; + } + + try { + IMongoImportConfig mongoImportConfig = new MongoImportConfigBuilder() + .version(createVersion()) + .net(new Net(getPort(), Network.localhostIsIPv6())) + .db(database) + .collection(importData.getCollection()) + .upsert(importData.getUpsertOnImport()) + .dropCollection(importData.getDropOnImport()) + .importFile(importData.getFile()) + .jsonArray(true) + .timeout(new Timeout(importData.getTimeout())) + .build(); + + MongoImportExecutable mongoImport = MongoImportStarter.getDefaultInstance().prepare(mongoImportConfig); + + MongoImportProcess importProcess = mongoImport.start(); + + if(parallelImport) + pendingMongoProcess.add(importProcess); + else + waitFor(importProcess); + } + catch (IOException e) { + throw new MojoExecutionException("Unexpected IOException encountered", e); + } + + } + + for(MongoImportProcess importProcess: pendingMongoProcess) + waitFor(importProcess); + + } + + private void waitFor(MongoImportProcess importProcess) throws MojoExecutionException { + try { + int code = importProcess.waitFor(); + + if(code != 0) + throw new MojoExecutionException("Cannot import '" + importProcess.getConfig().getImportFile() + "'"); + + getLog().info("Import return code: " + code); + } + catch (InterruptedException e) { + throw new MojoExecutionException("Thread execution interrupted", e); + } + + } + + private void verify(ImportDataConfig config) { + Validate.notBlank(config.getFile(), "Import file is required\n\n" + + "<imports>\n" + + "\t<import>\n" + + "\t\t<file>[my file]</file>\n" + + "..."); + Validate.isTrue(StringUtils.isNotBlank(defaultImportDatabase) || StringUtils.isNotBlank(config.getDatabase()), "Database is required you can either define a defaultImportDatabase or a <database> on import tags"); + Validate.notBlank(config.getCollection(), "Collection is required\n\n" + + "<imports>\n" + + "\t<import>\n" + + "\t\t<collection>[my file]</collection>\n" + + "..."); + + } }