package org.molgenis.ontology.initializer; import org.molgenis.data.DataService; import org.molgenis.data.Entity; import org.molgenis.data.UnknownEntityException; import org.molgenis.data.support.QueryImpl; import org.molgenis.script.*; import org.molgenis.security.core.runas.RunAsSystem; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.stereotype.Service; import org.springframework.util.FileCopyUtils; import java.io.IOException; import java.io.InputStreamReader; import java.io.UncheckedIOException; import java.util.Arrays; import static java.util.Objects.requireNonNull; import static org.molgenis.script.ScriptMetaData.SCRIPT; import static org.molgenis.script.ScriptParameterMetaData.SCRIPT_PARAMETER; @Service public class OntologyScriptInitializerImpl implements OntologyScriptInitializer { private static final String ROC_CURVE_SCRIPT_NAME = "roc"; private static final String ROC_CURVE_SCRIPT_PARAMETER = "filePath"; private static final Logger LOG = LoggerFactory.getLogger(OntologyScriptInitializerImpl.class); private final DataService dataService; private final ScriptFactory scriptFactory; private final ScriptParameterFactory scriptParameterFactory; @Autowired public OntologyScriptInitializerImpl(DataService dataService, ScriptFactory scriptFactory, ScriptParameterFactory scriptParameterFactory) { this.dataService = requireNonNull(dataService); this.scriptFactory = requireNonNull(scriptFactory); this.scriptParameterFactory = requireNonNull(scriptParameterFactory); } @Override @RunAsSystem public void initialize() { Resource resource = new ClassPathResource("roc-curve.R"); if (resource.exists()) { long count = dataService .count(SCRIPT, new QueryImpl<Entity>().eq(ScriptMetaData.NAME, ROC_CURVE_SCRIPT_NAME)); if (count == 0) { Entity scriptType = dataService.findOne(ScriptTypeMetaData.SCRIPT_TYPE, new QueryImpl<Entity>().eq(ScriptTypeMetaData.NAME, "R")); if (scriptType == null) throw new UnknownEntityException("ScriptType R does not exist!"); String scriptContent; try { scriptContent = FileCopyUtils .copyToString(new InputStreamReader(resource.getInputStream(), "UTF-8")); } catch (IOException e) { throw new UncheckedIOException(e); } if (dataService.count(SCRIPT_PARAMETER, new QueryImpl<Entity>().eq(ScriptParameterMetaData.NAME, ROC_CURVE_SCRIPT_PARAMETER)) == 0) { dataService .add(SCRIPT_PARAMETER, scriptParameterFactory.create().setName(ROC_CURVE_SCRIPT_PARAMETER)); } Entity scriptParameterEntity = dataService.findOne(SCRIPT_PARAMETER, new QueryImpl<Entity>().eq(ScriptParameterMetaData.NAME, ROC_CURVE_SCRIPT_PARAMETER)); Script script = scriptFactory.create(); script.setName(ROC_CURVE_SCRIPT_NAME); script.setGenerateToken(true); script.set(ScriptMetaData.TYPE, scriptType); script.setResultFileExtension("png"); script.setContent(scriptContent); script.set(ScriptMetaData.PARAMETERS, Arrays.asList(scriptParameterEntity)); dataService.add(SCRIPT, script); LOG.info("Script entity \"roc\" has been added to the database!"); } else { LOG.info("Script entity \"roc\" already exists in the database!"); } } else { LOG.info("R script \"roc-curve.R\" does not exist on classpath!"); } } }