package org.molgenis.script;
import org.molgenis.data.DataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Collection;
import java.util.List;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.toList;
import static org.molgenis.script.ScriptTypeMetaData.SCRIPT_TYPE;
/**
* Populates {@link ScriptType} repository with script type entities based on existing {@link ScriptRunner script runners.}
*/
@Component
public class ScriptTypePopulator
{
private final ScriptRunnerFactory scriptRunnerFactory;
private final DataService dataService;
private final ScriptTypeFactory scriptTypeFactory;
@Autowired
public ScriptTypePopulator(ScriptRunnerFactory scriptRunnerFactory, DataService dataService,
ScriptTypeFactory scriptTypeFactory)
{
this.scriptRunnerFactory = requireNonNull(scriptRunnerFactory);
this.dataService = requireNonNull(dataService);
this.scriptTypeFactory = requireNonNull(scriptTypeFactory);
}
public void populate()
{
Collection<ScriptRunner> scriptRunners = scriptRunnerFactory.getScriptRunners();
List<ScriptType> newScriptTypes = scriptRunners.stream().filter(this::notExists).map(this::createScriptType)
.collect(toList());
if (!newScriptTypes.isEmpty())
{
persist(newScriptTypes);
}
}
private boolean notExists(ScriptRunner scriptRunner)
{
return dataService.findOneById(SCRIPT_TYPE, scriptRunner.getName(), ScriptType.class) == null;
}
private ScriptType createScriptType(ScriptRunner scriptRunner)
{
return scriptTypeFactory.create(scriptRunner.getName());
}
private void persist(List<ScriptType> scriptTypes)
{
dataService.add(SCRIPT_TYPE, scriptTypes.stream());
}
}