diff --git a/pom.xml b/pom.xml index d9696e96d12505a0f2a22e306b8fd533b89b0218..d4d72b0ba04e1831831b64550610bc2737dd3500 100644 --- a/pom.xml +++ b/pom.xml @@ -240,6 +240,11 @@ <version>4.12</version> <scope>test</scope> </dependency> + <dependency> + <groupId>org.mongodb</groupId> + <artifactId>mongo-java-driver</artifactId> + <version>2.13.0</version> + </dependency> </dependencies> <reporting> diff --git a/src/main/java/com/syncleus/maven/plugins/mongodb/InitDataConfig.java b/src/main/java/com/syncleus/maven/plugins/mongodb/InitDataConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..c95969ce85f184df94b22f24e8824023cecdd6d7 --- /dev/null +++ b/src/main/java/com/syncleus/maven/plugins/mongodb/InitDataConfig.java @@ -0,0 +1,38 @@ +/** + * 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; + +import java.io.File; + +public class InitDataConfig { + private File[] scripts; + + private String databaseName; + + public InitDataConfig(File[] scripts, String databaseName) { + this.scripts = scripts; + this.databaseName = databaseName; + } + + public File[] getScripts() { + return scripts; + } + + public String getDatabaseName() { + return databaseName; + } +} 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 5feeacddf302b596c917f036e4d56205af6796df..98242b506b918b78b15ba4c88f0304c118a87bb3 100644 --- a/src/main/java/com/syncleus/maven/plugins/mongodb/StartMongoMojo.java +++ b/src/main/java/com/syncleus/maven/plugins/mongodb/StartMongoMojo.java @@ -16,6 +16,9 @@ */ package com.syncleus.maven.plugins.mongodb; +import com.mongodb.CommandResult; +import com.mongodb.MongoClient; +import com.mongodb.MongoException; import com.syncleus.maven.plugins.mongodb.log.Loggers; import com.syncleus.maven.plugins.mongodb.log.Loggers.LoggingStyle; import de.flapdoodle.embed.mongo.*; @@ -45,13 +48,16 @@ import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProject; +import com.mongodb.DB; import java.io.File; +import java.io.FileNotFoundException; import java.io.IOException; import java.net.*; import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.Scanner; import java.util.concurrent.TimeUnit; import static java.util.Collections.singletonList; @@ -259,6 +265,8 @@ public class StartMongoMojo extends AbstractMongoMojo { private Integer setPort = null; + private InitDataConfig[] initalizations; + @Override @SuppressWarnings("unchecked") public void start() throws MojoExecutionException, MojoFailureException { @@ -282,8 +290,8 @@ public class StartMongoMojo extends AbstractMongoMojo { throw new MojoExecutionException("Failed to download MongoDB distribution: " + e.withDistribution(), e); } - if(this.imports != null && imports.length > 0) - sendImportScript(); + startImport(); + startInitialization(); try { final MongodProcess mongod = executable.start(); @@ -312,7 +320,7 @@ public class StartMongoMojo extends AbstractMongoMojo { try { MongodConfigBuilder configBuilder = new MongodConfigBuilder() .version(createVersion()) - .net(new Net(bindIp, port, Network.localhostIsIPv6())) + .net(new Net(bindIp, getPort(), Network.localhostIsIPv6())) .replication(new Storage(getDataDirectory(), replSet, oplogSize)); configBuilder = this.configureSyncDelay(configBuilder); @@ -472,7 +480,8 @@ public class StartMongoMojo extends AbstractMongoMojo { for(final String featureString : this.features) featuresSet.add(Feature.valueOf(featureString.toUpperCase())); } - return (Feature[]) featuresSet.toArray(); + final Feature[] retVal = new Feature[featuresSet.size()]; + return featuresSet.toArray(retVal); } private int getPort() { @@ -483,7 +492,7 @@ public class StartMongoMojo extends AbstractMongoMojo { setPort = PortUtils.allocateRandomPort(); else setPort = Integer.valueOf(port); - project.getProperties().put("mongodb.port", setPort); + project.getProperties().put("mongodb.port", String.valueOf(setPort)); return setPort; } @@ -495,14 +504,11 @@ 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"); - + private void startImport() throws MojoExecutionException { + if(imports == null || imports.length == 0) return; - } + + List<MongoImportProcess> pendingMongoProcess = new ArrayList<MongoImportProcess>(); getLog().info("Default import database: " + defaultImportDatabase); @@ -579,4 +585,72 @@ public class StartMongoMojo extends AbstractMongoMojo { "..."); } + + private void startInitialization() throws MojoExecutionException, MojoFailureException { + if(initalizations == null || initalizations.length == 0) + return; + + for(final InitDataConfig initConfig : this.initalizations ) { + DB db = connectToMongoAndGetDatabase(initConfig.getDatabaseName()); + + for(final File scriptFile : initConfig.getScripts()) { + if(scriptFile.isDirectory()) + this.processScriptDirectory(db, scriptFile); + else + this.processScriptFile(db, scriptFile); + } + } + } + + private DB connectToMongoAndGetDatabase(final String databaseName) throws MojoExecutionException { + if (databaseName == null || databaseName.trim().length() == 0) { + throw new MojoExecutionException("Database name is missing"); + } + + MongoClient mongoClient; + try { + mongoClient = new MongoClient("localhost", getPort()); + } catch (UnknownHostException e) { + throw new MojoExecutionException("Unable to connect to mongo instance", e); + } + getLog().info("Connected to MongoDB"); + return mongoClient.getDB(databaseName); + } + + private void processScriptDirectory(final DB db, final File scriptDirectory) throws MojoExecutionException { + File[] files = scriptDirectory.listFiles(); + getLog().info("Folder " + scriptDirectory.getAbsolutePath() + " contains " + files.length + " file(s):"); + for (File file : files) { + this.processScriptFile(db, file); + } + getLog().info("Data initialized with success"); + } + + private void processScriptFile(final DB db, final File scriptFile) throws MojoExecutionException { + Scanner scanner = null; + StringBuilder instructions = new StringBuilder(); + try { + scanner = new Scanner(scriptFile); + while (scanner.hasNextLine()) { + instructions.append(scanner.nextLine()).append("\n"); + } + } catch (FileNotFoundException e) { + throw new MojoExecutionException("Unable to find file with name '" + scriptFile.getName() + "'", e); + } finally { + if (scanner != null) { + scanner.close(); + } + } + CommandResult result; + try { + result = db.doEval("(function() {" + instructions.toString() + "})();", new Object[0]); + } catch (MongoException e) { + throw new MojoExecutionException("Unable to execute file with name '" + scriptFile.getName() + "'", e); + } + if (!result.ok()) { + getLog().error("- file " + scriptFile.getName() + " parsed with error: " + result.getErrorMessage()); + throw new MojoExecutionException("Error while executing instructions from file '" + scriptFile.getName() + "': " + result.getErrorMessage(), result.getException()); + } + getLog().info("- file " + scriptFile.getName() + " parsed successfully"); + } } diff --git a/src/test/resources/randomport/pom.xml b/src/test/resources/randomport/pom.xml index e9af858dbf1eb08c04edec7e7419baacc1871aeb..b9d687fc4b035ce8f2c3079ea782a4e15b69d3aa 100644 --- a/src/test/resources/randomport/pom.xml +++ b/src/test/resources/randomport/pom.xml @@ -80,7 +80,7 @@ </goals> <configuration> <systemPropertyVariables> - <mongo.port>${mongodb.port}</mongo.port> + <mongodb.port>${mongodb.port}</mongodb.port> </systemPropertyVariables> </configuration> </execution> diff --git a/src/test/resources/randomport/src/test/java/com/syncleus/maven/plugins/mongodb/MongoIT.java b/src/test/resources/randomport/src/test/java/com/syncleus/maven/plugins/mongodb/MongoIT.java index 827ba5a7aa395591c700f0d51fed14ceab5383cb..c2d21717b015009fd3dc1b4201096d9d88795b14 100644 --- a/src/test/resources/randomport/src/test/java/com/syncleus/maven/plugins/mongodb/MongoIT.java +++ b/src/test/resources/randomport/src/test/java/com/syncleus/maven/plugins/mongodb/MongoIT.java @@ -27,7 +27,7 @@ public class MongoIT { @Test public void testConnectMongo() throws Exception { - mongoSocket = new Socket("127.0.0.1", Integer.valueOf(System.getProperty("mongo.port"))); + mongoSocket = new Socket("127.0.0.1", Integer.valueOf(System.getProperty("mongodb.port"))); } @After