package org.molgenis.data.mapper.repository.impl;
import com.google.common.collect.Lists;
import org.molgenis.data.DataService;
import org.molgenis.data.Entity;
import org.molgenis.data.meta.model.EntityType;
import org.molgenis.data.populate.IdGenerator;
import org.molgenis.data.UnknownEntityException;
import org.molgenis.data.mapper.controller.MappingServiceController;
import org.molgenis.data.mapper.mapping.model.AttributeMapping;
import org.molgenis.data.mapper.mapping.model.EntityMapping;
import org.molgenis.data.mapper.meta.EntityMappingMetaData;
import org.molgenis.data.mapper.repository.AttributeMappingRepository;
import org.molgenis.data.mapper.repository.EntityMappingRepository;
import org.molgenis.data.support.DynamicEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
/**
* O/R mapping between EntityMapping Entity and EntityMapping POJO
*/
public class EntityMappingRepositoryImpl implements EntityMappingRepository
{
private static final Logger LOG = LoggerFactory.getLogger(MappingServiceController.class);
@Autowired
private DataService dataService;
@Autowired
private IdGenerator idGenerator;
@Autowired
private EntityMappingMetaData entityMappingMetaData;
private final AttributeMappingRepository attributeMappingRepository;
public EntityMappingRepositoryImpl(AttributeMappingRepository attributeMappingRepository)
{
this.attributeMappingRepository = attributeMappingRepository;
}
@Override
public List<EntityMapping> toEntityMappings(List<Entity> entityMappingEntities)
{
return Lists.transform(entityMappingEntities, this::toEntityMapping);
}
private EntityMapping toEntityMapping(Entity entityMappingEntity)
{
String identifier = entityMappingEntity.getString(EntityMappingMetaData.IDENTIFIER);
EntityType targetEntityType;
try
{
targetEntityType = dataService
.getEntityType(entityMappingEntity.getString(EntityMappingMetaData.TARGET_ENTITY_TYPE));
}
catch (UnknownEntityException uee)
{
LOG.error(uee.getMessage());
targetEntityType = null;
}
EntityType sourceEntityType;
try
{
sourceEntityType = dataService
.getEntityType(entityMappingEntity.getString(EntityMappingMetaData.SOURCE_ENTITY_TYPE));
}
catch (UnknownEntityException uee)
{
LOG.error(uee.getMessage());
sourceEntityType = null;
}
List<Entity> attributeMappingEntities = Lists.<Entity>newArrayList(
entityMappingEntity.getEntities(EntityMappingMetaData.ATTRIBUTE_MAPPINGS));
List<AttributeMapping> attributeMappings = attributeMappingRepository
.getAttributeMappings(attributeMappingEntities, sourceEntityType, targetEntityType);
return new EntityMapping(identifier, sourceEntityType, targetEntityType, attributeMappings);
}
@Override
public List<Entity> upsert(Collection<EntityMapping> entityMappings)
{
return entityMappings.stream().map(this::upsert).collect(Collectors.toList());
}
private Entity upsert(EntityMapping entityMapping)
{
List<Entity> attributeMappingEntities = attributeMappingRepository.upsert(entityMapping.getAttributeMappings());
Entity entityMappingEntity;
if (entityMapping.getIdentifier() == null)
{
entityMapping.setIdentifier(idGenerator.generateId());
entityMappingEntity = toEntityMappingEntity(entityMapping, attributeMappingEntities);
dataService.add(entityMappingMetaData.getName(), entityMappingEntity);
}
else
{
entityMappingEntity = toEntityMappingEntity(entityMapping, attributeMappingEntities);
dataService.update(entityMappingMetaData.getName(), entityMappingEntity);
}
return entityMappingEntity;
}
private Entity toEntityMappingEntity(EntityMapping entityMapping, List<Entity> attributeMappingEntities)
{
Entity entityMappingEntity = new DynamicEntity(entityMappingMetaData);
entityMappingEntity.set(EntityMappingMetaData.IDENTIFIER, entityMapping.getIdentifier());
entityMappingEntity.set(EntityMappingMetaData.SOURCE_ENTITY_TYPE, entityMapping.getName());
entityMappingEntity.set(EntityMappingMetaData.TARGET_ENTITY_TYPE,
entityMapping.getTargetEntityType() != null ? entityMapping.getTargetEntityType()
.getName() : null);
entityMappingEntity.set(EntityMappingMetaData.ATTRIBUTE_MAPPINGS, attributeMappingEntities);
return entityMappingEntity;
}
}