package org.molgenis.script; import com.google.common.collect.Lists; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import org.apache.commons.io.IOUtils; import org.apache.commons.io.output.FileWriterWithEncoding; import org.apache.commons.lang3.RandomStringUtils; import org.molgenis.data.Entity; import org.molgenis.data.meta.model.EntityType; import org.molgenis.data.support.StaticEntity; import org.molgenis.file.FileStore; import java.io.*; import java.util.Collections; import java.util.List; import java.util.Map; import static java.nio.charset.StandardCharsets.UTF_8; import static org.molgenis.script.ScriptMetaData.*; public class Script extends StaticEntity { public Script(Entity entity) { super(entity); } public Script(EntityType entityType) { super(entityType); } public Script(String name, EntityType entityType) { super(entityType); setName(name); } public String getName() { return getString(NAME); } public void setName(String name) { set(NAME, name); } public ScriptType getScriptType() { return getEntity(TYPE, ScriptType.class); } public void setScriptType(ScriptType scriptType) { set(TYPE, scriptType); } public String getContent() { return getString(CONTENT); } public void setContent(String content) { set(CONTENT, content); } public String getResultFileExtension() { return getString(RESULT_FILE_EXTENSION); } public void setResultFileExtension(String resultFileExtension) { set(RESULT_FILE_EXTENSION, resultFileExtension); } public List<ScriptParameter> getParameters() { Iterable<ScriptParameter> params = getEntities(PARAMETERS, ScriptParameter.class); if (params == null) return Collections.emptyList(); return Lists.newArrayList(params); } public boolean isGenerateToken() { Boolean generateToken = getBoolean(GENERATE_TOKEN); return generateToken != null && generateToken.booleanValue(); } public void setGenerateToken(Boolean generateToken) { set(GENERATE_TOKEN, generateToken); } public String generateScript(Map<String, Object> parameterValues) { StringWriter stringWriter = new StringWriter(); String script; try { generateScript(parameterValues, stringWriter); script = stringWriter.toString(); } finally { try { stringWriter.close(); } catch (IOException e) { throw new RuntimeException(e); } } return script; } public File generateScript(FileStore fileStore, String fileExtension, Map<String, Object> parameterValues) { String name = RandomStringUtils.randomAlphanumeric(10) + "." + fileExtension; File rScriptFile = fileStore.getFile(name); Writer w = null; try { w = new FileWriterWithEncoding(rScriptFile, UTF_8); generateScript(parameterValues, w); } catch (IOException e) { throw new RuntimeException(e); } finally { IOUtils.closeQuietly(w); } return rScriptFile; } private void generateScript(Map<String, Object> parameterValues, Writer writer) { try { Template template = new Template(null, new StringReader(getContent()), new Configuration(Configuration.VERSION_2_3_21)); template.process(parameterValues, writer); } catch (TemplateException | IOException e) { throw new GenerateScriptException( "Error processing parameters for script [" + getName() + "]. " + e.getMessage()); } } }