package org.molgenis.data.importer.wizard;
import org.molgenis.data.DatabaseAction;
import org.molgenis.data.FileRepositoryCollectionFactory;
import org.molgenis.data.RepositoryCollection;
import org.molgenis.data.importer.ImportService;
import org.molgenis.data.importer.ImportServiceFactory;
import org.molgenis.data.meta.MetaDataService;
import org.molgenis.ui.wizard.AbstractWizardPage;
import org.molgenis.ui.wizard.Wizard;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.validation.BindingResult;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.List;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.toList;
@Component
public class PackageWizardPage extends AbstractWizardPage
{
private static final Logger LOG = LoggerFactory.getLogger(PackageWizardPage.class);
/**
* Auto generated
*/
private static final long serialVersionUID = 1L;
private FileRepositoryCollectionFactory fileRepositoryCollectionFactory;
private ImportServiceFactory importServiceFactory;
private MetaDataService metaDataService;
@Autowired
public PackageWizardPage(FileRepositoryCollectionFactory fileRepositoryCollectionFactory,
ImportServiceFactory importServiceFactory, MetaDataService metaDataService)
{
this.fileRepositoryCollectionFactory = requireNonNull(fileRepositoryCollectionFactory);
this.importServiceFactory = requireNonNull(importServiceFactory);
this.metaDataService = requireNonNull(metaDataService);
}
@Override
public String getTitle()
{
return "Packages";
}
@Override
public String handleRequest(HttpServletRequest request, BindingResult result, Wizard wizard)
{
ImportWizardUtil.validateImportWizard(wizard);
ImportWizard importWizard = (ImportWizard) wizard;
String entityImportOption = importWizard.getEntityImportOption();
if (entityImportOption != null)
{
try
{
// convert input to database action
DatabaseAction entityDbAction = ImportWizardUtil.toDatabaseAction(entityImportOption);
if (entityDbAction == null) throw new IOException("unknown database action: " + entityImportOption);
RepositoryCollection repositoryCollection = fileRepositoryCollectionFactory
.createFileRepositoryCollection(importWizard.getFile());
ImportService importService = importServiceFactory
.getImportService(importWizard.getFile(), repositoryCollection);
// Do integration test only if there are no previous errors found
if (!importWizard.getEntitiesImportable().containsValue(false))
{
// The package name that is selected in the "package selection" page
String selectedPackage = request.getParameter("defaultEntity");
// The entities that can be imported
LinkedHashMap<String, Boolean> entitiesImportable = importService
.determineImportableEntities(metaDataService, repositoryCollection, selectedPackage);
// Set the entities that can be imported
importWizard.setEntitiesImportable(entitiesImportable);
// The entities that can not be imported. If even one entity can not be imported, everything fails
List<String> entitiesNotImportable = entitiesImportable.entrySet().stream()
.filter(entity -> entity.getValue() == false).map(entity -> entity.getKey())
.collect(toList());
if (!entitiesNotImportable.isEmpty()) throw new RuntimeException(
"You are trying to upload entities that are not compatible with the already existing entities: "
+ entitiesNotImportable.toString());
}
}
catch (RuntimeException e)
{
ImportWizardUtil.handleException(e, importWizard, result, LOG, entityImportOption);
}
catch (IOException e)
{
ImportWizardUtil.handleException(e, importWizard, result, LOG, entityImportOption);
}
}
return null;
}
}