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 88ccd73cd37de4d14ceca63fdd863c0733a80345..1ac3af5e402beaa367a7c7182bd09fdfe9806fd3 100644 --- a/src/main/java/com/syncleus/maven/plugins/mongodb/StartMongoMojo.java +++ b/src/main/java/com/syncleus/maven/plugins/mongodb/StartMongoMojo.java @@ -40,7 +40,6 @@ 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.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.LifecyclePhase; @@ -259,74 +258,25 @@ public class StartMongoMojo extends AbstractMongoMojo { final MongodExecutable executable; try { + final IRuntimeConfig runtimeConfig = createRuntimeConfig(); - final ICommandLinePostProcessor commandLinePostProcessor; - if (authEnabled) { - commandLinePostProcessor = new ICommandLinePostProcessor() { - @Override - public List<String> process(final Distribution distribution, final List<String> args) { - args.remove("--noauth"); - args.add("--auth"); - return args; - } - }; - } else { - commandLinePostProcessor = new ICommandLinePostProcessor.Noop(); - } - - final IRuntimeConfig runtimeConfig = new RuntimeConfigBuilder() - .defaults(Command.MongoD) - .processOutput(getOutputConfig()) - .artifactStore(getArtifactStore()) - .commandLinePostProcessor(commandLinePostProcessor) - .build(); - - if (randomPort) { + if (randomPort) port = PortUtils.allocateRandomPort(); - } savePortToProjectProperties(); - MongodConfigBuilder configBuilder = new MongodConfigBuilder() - .version(getVersion()) - .net(new Net(bindIp, port, Network.localhostIsIPv6())) - .replication(new Storage(getDataDirectory(), replSet, oplogSize)); - - if(this.syncDelay == null) { - configBuilder = configBuilder - .cmdOptions(new MongoCmdOptionsBuilder() - .defaultSyncDelay() - .build()); - } - else if(this.syncDelay > 0) { - configBuilder = configBuilder - .cmdOptions(new MongoCmdOptionsBuilder() - .syncDelay(this.syncDelay) - .build()); - } - final IMongodConfig config = configBuilder.build(); + final IMongodConfig config = createMongodConfig(); executable = MongodStarter.getInstance(runtimeConfig).prepare(config); - } catch (final UnknownHostException e) { - throw new MojoExecutionException("Unable to determine if localhost is ipv6", e); - } catch (final DistributionException e) { + } + catch (final DistributionException e) { throw new MojoExecutionException("Failed to download MongoDB distribution: " + e.withDistribution(), e); - } catch (final IOException e) { - throw new MojoExecutionException("Unable to Config MongoDB: ", e); } try { final MongodProcess mongod = executable.start(); - if (wait) { - while (true) { - try { - TimeUnit.MINUTES.sleep(5); - } catch (final InterruptedException e) { - break; - } - } - } + this.executeWait(); getPluginContext().put(MONGOD_CONTEXT_PROPERTY_NAME, mongod); } catch (final IOException e) { @@ -334,13 +284,50 @@ public class StartMongoMojo extends AbstractMongoMojo { } } - /** - * 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 void executeWait() { + if (wait) { + while (true) { + try { + TimeUnit.MINUTES.sleep(5); + } catch (final InterruptedException e) { + break; + } + } + } + } + + private IMongodConfig createMongodConfig() throws MojoExecutionException { + try { + MongodConfigBuilder configBuilder = new MongodConfigBuilder() + .version(createVersion()) + .net(new Net(bindIp, port, Network.localhostIsIPv6())) + .replication(new Storage(getDataDirectory(), replSet, oplogSize)); + + configBuilder = this.configureSyncDelay(configBuilder); + + return configBuilder.build(); + } + catch (UnknownHostException e) { + throw new MojoExecutionException("Unable to determine if localhost is ipv6", e); + } + catch (IOException e) { + throw new MojoExecutionException("Unable to Config MongoDB: ", e); + } + } + + private MongodConfigBuilder configureSyncDelay(final MongodConfigBuilder config) { + if(this.syncDelay == null) { + return config.cmdOptions(new MongoCmdOptionsBuilder() + .defaultSyncDelay() + .build()); + } + else if(this.syncDelay > 0) { + return config.cmdOptions(new MongoCmdOptionsBuilder() + .syncDelay(this.syncDelay) + .build()); + } + else + return config; } private ProcessOutput getOutputConfig() throws MojoFailureException { @@ -361,7 +348,30 @@ public class StartMongoMojo extends AbstractMongoMojo { } - private IArtifactStore getArtifactStore() throws MojoFailureException { + private IRuntimeConfig createRuntimeConfig() throws MojoFailureException { + final ICommandLinePostProcessor commandLinePostProcessor; + if (authEnabled) { + commandLinePostProcessor = new ICommandLinePostProcessor() { + @Override + public List<String> process(final Distribution distribution, final List<String> args) { + args.remove("--noauth"); + args.add("--auth"); + return args; + } + }; + } else { + commandLinePostProcessor = new ICommandLinePostProcessor.Noop(); + } + + return new RuntimeConfigBuilder() + .defaults(Command.MongoD) + .processOutput(getOutputConfig()) + .artifactStore(createArtifactStore()) + .commandLinePostProcessor(commandLinePostProcessor) + .build(); + } + + private IArtifactStore createArtifactStore() throws MojoFailureException { final ITempNaming naming; if(executableNaming == null) throw new IllegalStateException("executableNaming should never be null!"); @@ -380,6 +390,41 @@ public class StartMongoMojo extends AbstractMongoMojo { return new ArtifactStoreBuilder().defaults(Command.MongoD).download(downloadConfig.build()).executableNaming(naming).build(); } + private IFeatureAwareVersion createVersion() { + + final Feature[] features = getFeatures(); + + if(this.version == null || this.version.equals("")) { + if(features.length == 0) + return Version.Main.PRODUCTION; + this.version = Version.Main.PRODUCTION.asInDownloadPath(); + } + + String versionEnumName = this.version.toUpperCase().replaceAll("\\.", "_"); + + if (versionEnumName.charAt(0) != 'V') { + versionEnumName = "V" + versionEnumName; + } + + IVersion determinedVersion; + try { + determinedVersion = Version.valueOf(versionEnumName); + } catch (final IllegalArgumentException e) { + getLog().warn("Unrecognised MongoDB version '" + this.version + "', this might be a new version that we don't yet know about. Attemping download anyway..."); + determinedVersion = new IVersion() { + @Override + public String asInDownloadPath() { + return version; + } + }; + } + + if(features.length == 0) + return Versions.withFeatures(determinedVersion); + else + return Versions.withFeatures(determinedVersion, features); + } + private void addProxySelector() { // Add authenticator with proxyUser and proxyPassword @@ -409,43 +454,22 @@ public class StartMongoMojo extends AbstractMongoMojo { }); } - private IFeatureAwareVersion getVersion() { - + private Feature[] getFeatures() { final HashSet<Feature> featuresSet = new HashSet<Feature>(); if(this.features != null && this.features.length > 0) { for(final String featureString : this.features) featuresSet.add(Feature.valueOf(featureString.toUpperCase())); } + return (Feature[]) featuresSet.toArray(); + } - if(this.version == null || this.version.equals("")) { - if(featuresSet.isEmpty()) - return Version.Main.PRODUCTION; - this.version = Version.Main.PRODUCTION.asInDownloadPath(); - } - - String versionEnumName = this.version.toUpperCase().replaceAll("\\.", "_"); - - if (versionEnumName.charAt(0) != 'V') { - versionEnumName = "V" + versionEnumName; - } - - IVersion determinedVersion; - try { - determinedVersion = Version.valueOf(versionEnumName); - } catch (final IllegalArgumentException e) { - getLog().warn("Unrecognised MongoDB version '" + this.version + "', this might be a new version that we don't yet know about. Attemping download anyway..."); - determinedVersion = new IVersion() { - @Override - public String asInDownloadPath() { - return version; - } - }; - } - - if(featuresSet.isEmpty()) - return Versions.withFeatures(determinedVersion); - else - return Versions.withFeatures(determinedVersion, (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 String getDataDirectory() {