package org.molgenis.file.ingest;
import org.molgenis.data.*;
import org.molgenis.file.ingest.meta.FileIngestJobExecutionMetaData;
import org.molgenis.file.ingest.meta.FileIngestMetaData;
import java.util.stream.Stream;
import static org.molgenis.file.ingest.meta.FileIngestJobExecutionMetaData.FILE_INGEST_JOB_EXECUTION;
public class FileIngestRepositoryDecorator extends AbstractRepositoryDecorator<Entity>
{
private final Repository<Entity> decorated;
private final FileIngesterJobScheduler scheduler;
private final DataService dataService;
public FileIngestRepositoryDecorator(Repository<Entity> decorated, FileIngesterJobScheduler scheduler,
DataService dataService)
{
this.decorated = decorated;
this.scheduler = scheduler;
this.dataService = dataService;
}
@Override
protected Repository<Entity> delegate()
{
return decorated;
}
@Override
public void update(Entity entity)
{
decorated.update(entity);
scheduler.schedule(entity);
}
@Override
public void update(Stream<Entity> entities)
{
decorated.update(entities.filter(e ->
{
scheduler.schedule(e);
return true;
}));
}
@Override
public void delete(Entity entity)
{
String entityId = entity.getString(FileIngestMetaData.ID);
scheduler.unschedule(entityId);
removeJobExecutions(entityId);
decorated.delete(entity);
}
@Override
public void delete(Stream<Entity> entities)
{
decorated.delete(entities.filter(e ->
{
String entityId = e.getString(FileIngestMetaData.ID);
scheduler.unschedule(entityId);
removeJobExecutions(entityId);
return true;
}));
}
@Override
public void deleteById(Object id)
{
if (id instanceof String)
{
String entityId = (String) id;
scheduler.unschedule(entityId);
removeJobExecutions(entityId);
}
decorated.deleteById(id);
}
@Override
public void deleteAll(Stream<Object> ids)
{
decorated.deleteAll(ids.filter(id ->
{
if (id instanceof String)
{
String entityId = (String) id;
scheduler.unschedule(entityId);
removeJobExecutions(entityId);
}
return true;
}));
}
@Override
public void deleteAll()
{
for (Entity e : this)
{
String entityId = e.getString(FileIngestMetaData.ID);
scheduler.unschedule(entityId);
removeJobExecutions(entityId);
}
decorated.deleteAll();
}
@Override
public void add(Entity entity)
{
decorated.add(entity);
scheduler.schedule(entity);
}
@Override
public Integer add(Stream<Entity> entities)
{
return decorated.add(entities.filter(e ->
{
scheduler.schedule(e);
return true;
}));
}
private void removeJobExecutions(String entityId)
{
Query<Entity> query = dataService.query(FILE_INGEST_JOB_EXECUTION)
.eq(FileIngestJobExecutionMetaData.FILE_INGEST, entityId);
dataService.delete(FILE_INGEST_JOB_EXECUTION, dataService.findAll(FILE_INGEST_JOB_EXECUTION, query));
}
}