package org.molgenis.data.importer; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.molgenis.data.MolgenisDataException; import org.molgenis.data.RepositoryCollection; import org.molgenis.util.FileExtensionUtils; import org.springframework.core.OrderComparator; import org.springframework.stereotype.Component; import java.io.File; import java.util.Collections; import java.util.List; import java.util.Map; @Component public class ImportServiceFactory { private final List<ImportService> importServices = Lists.newArrayList(); void addImportService(ImportService importService) { importServices.add(importService); Collections.sort(importServices, OrderComparator.INSTANCE); } /** * Finds a suitable ImportService for a FileRepositoryCollection. * <p> * Import of mixed backend types in one FileRepositoryCollection isn't supported. * * @return ImportService * @throws MolgenisDataException if no suitable ImportService is found for the FileRepositoryCollection */ public ImportService getImportService(File file, RepositoryCollection source) { final Map<String, ImportService> importServicesMappedToExtensions = Maps.newHashMap(); importServices.stream().filter(importService -> importService.canImport(file, source)).forEach(importService -> { for (String extension : importService.getSupportedFileExtensions()) { importServicesMappedToExtensions.put(extension.toLowerCase(), importService); } }); String extension = FileExtensionUtils .findExtensionFromPossibilities(file.getName(), importServicesMappedToExtensions.keySet()); final ImportService importService = importServicesMappedToExtensions.get(extension); if (importService == null) throw new MolgenisDataException("Can not import file. No suitable importer found"); return importService; } public ImportService getImportService(String fileName) { final Map<String, ImportService> importServicesMappedToExtensions = Maps.newHashMap(); for (ImportService importService : importServices) { for (String extension : importService.getSupportedFileExtensions()) { importServicesMappedToExtensions.put(extension.toLowerCase(), importService); } } String extension = FileExtensionUtils .findExtensionFromPossibilities(fileName, importServicesMappedToExtensions.keySet()); final ImportService importService = importServicesMappedToExtensions.get(extension); if (importService == null) throw new MolgenisDataException("Can not import file. No suitable importer found"); return importService; } }