private static ScriptResult<Network> applyScript(Network network, String previousScriptOutput, ModificationScript script) { ScriptResult<Object> result = ScriptUtils.runScript(network, script.getScriptType(), script.readScript()); if (result.getError() == null) { return new ScriptResult<>(network, previousScriptOutput + result.getOutput(), null); } else { // return an empty network return new ScriptResult<>(null, result.getOutput(), result.getError()); } }
private static ScriptResult<Network> loadNetworkFromVirtualCase(VirtualCase virtualCase) { ProjectCase baseCase = (ProjectCase) virtualCase.getCase() .orElseThrow(() -> new AfsException("Case link is dead")); ScriptResult<Network> network = loadNetworkFromProjectCase(baseCase); if (network.getError() != null) { return network; } ModificationScript script = virtualCase.getScript() .orElseThrow(VirtualCase::createScriptLinkIsDeadException); LOGGER.info("Applying script to network of project case {}", virtualCase.getId()); return applyScript(network.getValue(), network.getOutput(), script); }
@Override public <T extends ProjectFile & ProjectCase> String queryNetwork(T projectCase, ScriptType scriptType, String scriptContent) { Objects.requireNonNull(projectCase); Objects.requireNonNull(scriptType); Objects.requireNonNull(scriptContent); Network network = getNetwork(projectCase); ScriptResult<Object> result = ScriptUtils.runScript(network, ScriptType.GROOVY, scriptContent); if (result.getError() != null) { throw new ScriptException(projectCase, result.getError()); } return JsonOutput.toJson(result.getValue()); }
public static <T> ScriptResult<T> of(T value) { return new ScriptResult<>(value); }
@Override public <T extends ProjectFile & ProjectCase> Network getNetwork(T projectCase) { return cache.get(projectCase).getValueOrThrowIfError(projectCase); }
private static ScriptResult<Network> loadNetworkFromImportedCase(ImportedCase importedCase) { LOGGER.info("Loading network of project case {}", importedCase.getId()); Importer importer = importedCase.getImporter(); ReadOnlyDataSource dataSource = importedCase.getDataSource(); Properties parameters = importedCase.getParameters(); Network network = importer.importData(dataSource, parameters); return ScriptResult.of(network); }
private static ScriptResult<Object> runGroovyScript(Network network, Reader reader) { String output = ""; ScriptError error = null; Object value = null; try (StringWriter outputWriter = new StringWriter()) { // put network in the binding so that it is accessible from the script Binding binding = new Binding(); binding.setProperty("network", network); binding.setProperty("out", outputWriter); CompilerConfiguration config = new CompilerConfiguration(); GroovyShell shell = new GroovyShell(binding, config); value = shell.evaluate(reader, SCRIPT_FILE_NAME); outputWriter.flush(); output = outputWriter.toString(); } catch (MultipleCompilationErrorsException e) { error = ScriptError.fromGroovyException(e); } catch (MissingPropertyException | MissingMethodException e) { error = ScriptError.fromGroovyException(e, SCRIPT_FILE_NAME); } catch (IOException e) { throw new UncheckedIOException(e); } return new ScriptResult<>(value, output, error); }