package org.molgenis.data.support;
import org.molgenis.data.*;
import org.molgenis.data.aggregation.AggregateQuery;
import org.molgenis.data.aggregation.AggregateResult;
import org.molgenis.data.meta.MetaDataService;
import org.molgenis.data.meta.model.EntityType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.Iterator;
import java.util.Set;
import java.util.stream.Stream;
import static java.util.Objects.requireNonNull;
import static org.molgenis.security.core.utils.SecurityUtils.getCurrentUsername;
/**
* Implementation of the DataService interface
*/
@Component
public class DataServiceImpl implements DataService
{
private static final Logger LOG = LoggerFactory.getLogger(DataServiceImpl.class);
private MetaDataService metaDataService;
public void setMetaDataService(MetaDataService metaDataService)
{
this.metaDataService = requireNonNull(metaDataService);
}
@Override
public EntityType getEntityType(String entityName)
{
return metaDataService.getEntityType(entityName);
}
@Override
public synchronized Stream<String> getEntityNames()
{
return metaDataService.getEntityTypes().map(EntityType::getName);
}
@Override
public boolean hasRepository(String entityName)
{
return metaDataService.hasRepository(entityName);
}
@Override
public long count(String entityName)
{
return getRepository(entityName).count();
}
@Override
public long count(String entityName, Query<Entity> q)
{
return getRepository(entityName).count(q);
}
@Override
public Stream<Entity> findAll(String entityName)
{
return findAll(entityName, query(entityName));
}
@Override
public Stream<Entity> findAll(String entityName, Query<Entity> q)
{
return getRepository(entityName).findAll(q);
}
@Override
public Entity findOneById(String entityName, Object id)
{
return getRepository(entityName).findOneById(id);
}
@Override
public Entity findOne(String entityName, Query<Entity> q)
{
return getRepository(entityName).findOne(q);
}
@Override
@Transactional
public void add(String entityName, Entity entity)
{
getRepository(entityName).add(entity);
}
@Override
@Transactional
@SuppressWarnings("unchecked")
public <E extends Entity> void add(String entityName, Stream<E> entities)
{
getRepository(entityName).add((Stream<Entity>) entities);
}
@Override
@Transactional
public void update(String entityName, Entity entity)
{
getRepository(entityName).update(entity);
}
@Override
@Transactional
@SuppressWarnings("unchecked")
public <E extends Entity> void update(String entityName, Stream<E> entities)
{
getRepository(entityName).update((Stream<Entity>) entities);
}
@Override
@Transactional
public void delete(String entityName, Entity entity)
{
getRepository(entityName).delete(entity);
}
@Override
@Transactional
@SuppressWarnings("unchecked")
public <E extends Entity> void delete(String entityName, Stream<E> entities)
{
getRepository(entityName).delete((Stream<Entity>) entities);
}
@Override
@Transactional
public void deleteById(String entityName, Object id)
{
getRepository(entityName).deleteById(id);
}
@Override
@Transactional
public void deleteAll(String entityName, Stream<Object> ids)
{
getRepository(entityName).deleteAll(ids);
}
@Override
@Transactional
public void deleteAll(String entityName)
{
getRepository(entityName).deleteAll();
LOG.info("All entities of repository [{}] deleted by user [{}]", entityName, getCurrentUsername());
}
@Override
public Repository<Entity> getRepository(String entityName)
{
return metaDataService.getRepository(entityName);
}
@SuppressWarnings("unchecked")
public <E extends Entity> Repository<E> getRepository(String entityName, Class<E> entityClass)
{
return (Repository<E>) getRepository(entityName);
}
@Override
public Query<Entity> query(String entityName)
{
return new QueryImpl<>(getRepository(entityName));
}
@Override
public <E extends Entity> Query<E> query(String entityName, Class<E> entityClass)
{
return new QueryImpl<>(getRepository(entityName, entityClass));
}
@Override
public <E extends Entity> Stream<E> findAll(String entityName, Query<E> q, Class<E> clazz)
{
return getRepository(entityName, clazz).findAll(q);
}
@Override
public <E extends Entity> E findOneById(String entityName, Object id, Class<E> clazz)
{
return getRepository(entityName, clazz).findOneById(id);
}
@Override
public <E extends Entity> E findOne(String entityName, Query<E> q, Class<E> clazz)
{
return getRepository(entityName, clazz).findOne(q);
}
@Override
public <E extends Entity> Stream<E> findAll(String entityName, Class<E> clazz)
{
return findAll(entityName, query(entityName, clazz), clazz);
}
@Override
public AggregateResult aggregate(String entityName, AggregateQuery aggregateQuery)
{
return getRepository(entityName).aggregate(aggregateQuery);
}
@Override
public MetaDataService getMeta()
{
return metaDataService;
}
@Override
public synchronized Iterator<Repository<Entity>> iterator()
{
return metaDataService.getRepositories().iterator();
}
@Override
public Set<RepositoryCapability> getCapabilities(String repositoryName)
{
return getRepository(repositoryName).getCapabilities();
}
@Override
public Entity findOneById(String entityName, Object id, Fetch fetch)
{
return getRepository(entityName).findOneById(id, fetch);
}
@Override
public <E extends Entity> E findOneById(String entityName, Object id, Fetch fetch, Class<E> clazz)
{
return getRepository(entityName, clazz).findOneById(id, fetch);
}
@Override
public Stream<Entity> findAll(String entityName, Stream<Object> ids)
{
return getRepository(entityName).findAll(ids);
}
@Override
public <E extends Entity> Stream<E> findAll(String entityName, Stream<Object> ids, Class<E> clazz)
{
return getRepository(entityName, clazz).findAll(ids);
}
@Override
public Stream<Entity> findAll(String entityName, Stream<Object> ids, Fetch fetch)
{
return getRepository(entityName).findAll(ids, fetch);
}
@Override
public <E extends Entity> Stream<E> findAll(String entityName, Stream<Object> ids, Fetch fetch, Class<E> clazz)
{
return getRepository(entityName, clazz).findAll(ids, fetch);
}
}