package org.molgenis.data.csv; import com.google.common.collect.Iterables; import org.molgenis.data.Entity; import org.molgenis.data.RepositoryCapability; import org.molgenis.data.meta.model.Attribute; import org.molgenis.data.meta.model.AttributeFactory; import org.molgenis.data.meta.model.EntityType; import org.molgenis.data.meta.model.EntityTypeFactory; import org.molgenis.data.processor.CellProcessor; import org.molgenis.data.support.AbstractRepository; import org.springframework.util.StringUtils; import javax.annotation.Nullable; import java.io.File; import java.util.*; import static java.util.Objects.requireNonNull; import static org.molgenis.data.meta.AttributeType.STRING; /** * Repository implementation for csv files. * <p> * The filename without the extension is considered to be the entityname */ public class CsvRepository extends AbstractRepository { private final File file; private final EntityTypeFactory entityTypeFactory; private final AttributeFactory attrMetaFactory; private final String sheetName; private List<CellProcessor> cellProcessors; private EntityType entityType; private Character separator = null; public CsvRepository(String file, EntityTypeFactory entityTypeFactory, AttributeFactory attrMetaFactory) { this(new File(file), entityTypeFactory, attrMetaFactory, null); } public CsvRepository(File file, EntityTypeFactory entityTypeFactory, AttributeFactory attrMetaFactory, @Nullable List<CellProcessor> cellProcessors, Character separator) { this(file, entityTypeFactory, attrMetaFactory, StringUtils.stripFilenameExtension(file.getName()), null); this.separator = separator; } public CsvRepository(File file, EntityTypeFactory entityTypeFactory, AttributeFactory attrMetaFactory, @Nullable List<CellProcessor> cellProcessors) { this(file, entityTypeFactory, attrMetaFactory, StringUtils.stripFilenameExtension(file.getName()), null); } public CsvRepository(File file, EntityTypeFactory entityTypeFactory, AttributeFactory attrMetaFactory, String sheetName, @Nullable List<CellProcessor> cellProcessors) { this.file = file; this.entityTypeFactory = requireNonNull(entityTypeFactory); this.attrMetaFactory = requireNonNull(attrMetaFactory); this.sheetName = sheetName; this.cellProcessors = cellProcessors; } @Override public Iterator<Entity> iterator() { return new CsvIterator(file, sheetName, cellProcessors, separator, getEntityType()); } public EntityType getEntityType() { if (entityType == null) { entityType = entityTypeFactory.create().setSimpleName(sheetName); for (String attrName : new CsvIterator(file, sheetName, null, separator).getColNamesMap().keySet()) { Attribute attr = attrMetaFactory.create().setName(attrName).setDataType(STRING); entityType.addAttribute(attr); } } return entityType; } public void addCellProcessor(CellProcessor cellProcessor) { if (cellProcessors == null) cellProcessors = new ArrayList<>(); cellProcessors.add(cellProcessor); } @Override public Set<RepositoryCapability> getCapabilities() { return Collections.emptySet(); } @Override public long count() { return Iterables.size(this); } }