package org.molgenis.ontology.sorta.repo; import org.molgenis.data.Entity; import org.molgenis.data.RepositoryCapability; import org.molgenis.data.csv.CsvRepository; 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.processor.LowerCaseProcessor; import org.molgenis.data.processor.TrimProcessor; import org.molgenis.data.support.AbstractRepository; import org.molgenis.data.support.DynamicEntity; import org.molgenis.ontology.sorta.service.impl.SortaServiceImpl; import java.io.File; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import static org.apache.commons.lang3.StringUtils.isEmpty; import static org.molgenis.data.meta.model.EntityType.AttributeCopyMode.DEEP_COPY_ATTRS; import static org.molgenis.data.meta.model.EntityType.AttributeRole.ROLE_ID; import static org.molgenis.util.ApplicationContextProvider.getApplicationContext; public class SortaCsvRepository extends AbstractRepository { private EntityType entityType = null; private final CsvRepository csvRepository; private final String entityName; private final String entityLabel; public final static String ALLOWED_IDENTIFIER = "Identifier"; private final static List<CellProcessor> LOWERCASE_AND_TRIM = Arrays .asList(new LowerCaseProcessor(), new TrimProcessor()); public SortaCsvRepository(File file, EntityTypeFactory entityTypeFactory, AttributeFactory attrMetaFactory) { this.csvRepository = new CsvRepository(file, entityTypeFactory, attrMetaFactory, LOWERCASE_AND_TRIM, SortaServiceImpl.DEFAULT_SEPARATOR); this.entityName = file.getName(); this.entityLabel = file.getName(); } public SortaCsvRepository(String entityName, String entityLabel, File uploadedFile, EntityTypeFactory entityTypeFactory, AttributeFactory attrMetaFactory) { this.csvRepository = new CsvRepository(uploadedFile, entityTypeFactory, attrMetaFactory, LOWERCASE_AND_TRIM, SortaServiceImpl.DEFAULT_SEPARATOR); this.entityName = entityName; this.entityLabel = entityLabel; } public EntityType getEntityType() { if (entityType == null) { AttributeFactory attrMetaFactory = getApplicationContext() .getBean(AttributeFactory.class); // FIXME do not use application context entityType = EntityType.newInstance(csvRepository.getEntityType(), DEEP_COPY_ATTRS, attrMetaFactory); entityType.setName(entityName); entityType.setSimpleName(entityName); entityType.setLabel(entityLabel); entityType.setBackend("PostgreSQL"); // FIXME do not hardcode backend name entityType.addAttribute(attrMetaFactory.create().setName(ALLOWED_IDENTIFIER).setNillable(false), ROLE_ID); Attribute nameAttribute = entityType.getAttribute(SortaServiceImpl.DEFAULT_MATCHING_NAME_FIELD); if (nameAttribute != null) { nameAttribute.setLabelAttribute(true); } } return entityType; } @Override public Iterator<Entity> iterator() { final AtomicInteger count = new AtomicInteger(0); final Iterator<Entity> iterator = csvRepository.iterator(); return new Iterator<Entity>() { @Override public boolean hasNext() { return iterator.hasNext(); } @Override public Entity next() { Entity entity = iterator.next(); if (isEmpty(entity.getString(ALLOWED_IDENTIFIER))) { DynamicEntity dynamicEntity = new DynamicEntity(getEntityType()); dynamicEntity.set(entity); entity = dynamicEntity; entity.set(ALLOWED_IDENTIFIER, String.valueOf(count.incrementAndGet())); } return entity; } }; } @Override public Set<RepositoryCapability> getCapabilities() { return Collections.emptySet(); } @Override public long count() { return csvRepository.count(); } }