package org.molgenis.data.annotation.core.resources.impl.emx; import com.google.common.collect.ImmutableMap; import org.molgenis.data.Repository; import org.molgenis.data.annotation.core.resources.impl.RepositoryFactory; import org.molgenis.data.excel.ExcelRepositoryCollection; import org.molgenis.data.importer.MetaDataParser; import org.molgenis.data.mem.InMemoryRepository; import org.molgenis.data.meta.DefaultPackage; import org.molgenis.data.meta.model.AttributeFactory; import org.molgenis.data.meta.model.EntityType; import org.molgenis.data.meta.model.EntityTypeFactory; import java.io.File; import java.io.IOException; import java.util.Spliterator; import java.util.Spliterators; import java.util.stream.StreamSupport; /** * Factory that can instantiate a InMemoryRepository. */ public class InMemoryRepositoryFactory implements RepositoryFactory { private final AttributeFactory attributeFactory; private final EntityTypeFactory entityTypeFactory; private final String name; private ExcelRepositoryCollection repositoryCollection = null; private final MetaDataParser parser; public InMemoryRepositoryFactory(String name, MetaDataParser parser, EntityTypeFactory entityTypeFactory, AttributeFactory attributeFactory) { this.name = name; this.parser = parser; this.attributeFactory = attributeFactory; this.entityTypeFactory = entityTypeFactory; } @Override public Repository createRepository(File file) throws IOException { try { repositoryCollection = new ExcelRepositoryCollection(file); repositoryCollection.setAttributeFactory(attributeFactory); repositoryCollection.setEntityTypeFactory(entityTypeFactory); } catch (Exception e) { throw new RuntimeException( "Unable to create ExcelRepositoryCollection for file:" + file.getName() + " exception: " + e); } ImmutableMap<String, EntityType> entityMap = parser.parse(repositoryCollection, DefaultPackage.PACKAGE_DEFAULT) .getEntityMap(); if (!entityMap.containsKey(name)) { throw new RuntimeException("Entity [" + name + "] is not found. Entities found: " + entityMap.keySet()); } EntityType metaData = entityMap.get(name); InMemoryRepository inMemoryRepository = new InMemoryRepository(metaData); inMemoryRepository.add(StreamSupport.stream(Spliterators .spliteratorUnknownSize(repositoryCollection.getRepository(name).iterator(), Spliterator.ORDERED), false)); return inMemoryRepository; } }