/**
* Copyright © 2015 Pablo Diaz
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.github.joelittlejohn.embedmongo;
import de.flapdoodle.embed.mongo.MongoImportExecutable;
import de.flapdoodle.embed.mongo.MongoImportProcess;
import de.flapdoodle.embed.mongo.MongoImportStarter;
import de.flapdoodle.embed.mongo.config.IMongoImportConfig;
import de.flapdoodle.embed.mongo.config.MongoImportConfigBuilder;
import de.flapdoodle.embed.mongo.config.Net;
import de.flapdoodle.embed.mongo.config.Timeout;
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;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@Mojo(name="mongo-import", defaultPhase = LifecyclePhase.PRE_INTEGRATION_TEST)
public class MongoImportMojo extends AbstractEmbeddedMongoMojo {
@Parameter
private ImportDataConfig[] imports;
@Parameter(property = "embedmongo.defaultImportDatabase")
private String defaultImportDatabase;
@Parameter(property = "embedmongo.parallel", defaultValue = "false")
private Boolean parallel;
@Override
public void executeStart() throws MojoExecutionException, MojoFailureException {
try {
sendImportScript();
} catch (Exception e) {
throw new MojoExecutionException(e.getMessage(), e);
}
}
private void sendImportScript() throws IOException, InterruptedException, 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;
}
IMongoImportConfig mongoImportConfig = new MongoImportConfigBuilder()
.version(getVersion())
.net(new Net(getPort(), NetworkUtils.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(parallel){
pendingMongoProcess.add(importProcess);
}else{
waitFor(importProcess);
}
}
for(MongoImportProcess importProcess: pendingMongoProcess){
waitFor(importProcess);
}
}
private void waitFor(MongoImportProcess importProcess) throws InterruptedException, MojoExecutionException {
int code = importProcess.waitFor();
if(code != 0){
throw new MojoExecutionException("Cannot import '" + importProcess.getConfig().getImportFile() + "'");
}
getLog().info("Import return code: " + code);
}
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");
}
}