/** * Copyright (c) 2012-2016 André Bargull * Alle Rechte vorbehalten / All Rights Reserved. Use is subject to license terms. * * <https://github.com/anba/es6draft> */ package com.github.anba.es6draft.repl.global; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.Objects; import com.github.anba.es6draft.Script; import com.github.anba.es6draft.compiler.CompilationException; import com.github.anba.es6draft.parser.ParserException; import com.github.anba.es6draft.runtime.ExecutionContext; import com.github.anba.es6draft.runtime.Realm; import com.github.anba.es6draft.runtime.internal.Errors; import com.github.anba.es6draft.runtime.internal.ScriptException; import com.github.anba.es6draft.runtime.internal.Source; /** * */ final class SharedFunctions { private SharedFunctions() { } /** * Resolves a file from the runtime base directory location. * * @param cx * the execution context * @param file * the file * @return the file resolved from the runtime base directory */ static Path absolutePath(ExecutionContext cx, Path file) { return cx.getRuntimeContext().getBaseDirectory().resolve(file); } /** * Resolves a file from the current script file location. * * @param cx * the execution context * @param caller * the caller execution context * @param file * the file * @return the path resolved from the current script */ static Path relativePathToScript(ExecutionContext cx, ExecutionContext caller, Path file) { Source source = Objects.requireNonNull(cx.getRealm().sourceInfo(caller)); Path sourceFile = Objects.requireNonNull(source.getFile()); Path relativeFile = Objects.requireNonNull(sourceFile.getParent()).resolve(file); return absolutePath(cx, relativeFile); } /** * Reads a file and returns its content. * * @param cx * the execution context * @param fileName * the file name * @param path * the file path * @return the file content */ static String readFile(ExecutionContext cx, Path fileName, Path path) { if (!Files.exists(path)) { throw new ScriptException(String.format("can't open '%s'", fileName.toString())); } try { byte[] bytes = Files.readAllBytes(path); return new String(bytes, StandardCharsets.UTF_8); } catch (IOException e) { throw Errors.newError(cx, Objects.toString(e.getMessage(), "")); } } /** * Reads a file and evalutes its content. * * @param cx * the execution context * @param fileName * the file name * @param path * the file path * @throws ParserException * if the source contains any syntax errors * @throws CompilationException * if the parsed source cannot be compiled */ static void loadScript(ExecutionContext cx, Path fileName, Path path) throws ParserException, CompilationException { if (!Files.exists(path)) { throw new ScriptException(String.format("can't open '%s'", fileName.toString())); } try { Realm realm = cx.getRealm(); Source source = new Source(path, fileName.toString(), 1); Script script = realm.getScriptLoader().script(source, path); script.evaluate(realm); } catch (IOException e) { throw Errors.newError(cx, Objects.toString(e.getMessage(), "")); } } }