/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jooby;
import com.google.common.io.Closeables;
import javaslang.control.Try;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.io.File;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.StandardCharsets;
import java.util.function.Consumer;
import java.util.function.Supplier;
public class JoobyJs {
private ScriptEngine engine;
public JoobyJs() throws Exception {
ScriptEngineManager sem = new ScriptEngineManager();
engine = sem.getEngineByName("nashorn");
eval(Jooby.class.getResourceAsStream("/org/jooby/jooby.js"));
}
public Supplier<Jooby> run(final File file) throws Exception {
return run(new FileReader(file));
}
public Supplier<Jooby> run(final Reader reader) throws Exception {
eval(reader);
return () -> Try.of(() -> (Jooby) engine.eval("this.__jooby_ && this.__jooby_()")).get();
}
void eval(final InputStream stream) throws Exception {
eval(new InputStreamReader(stream, StandardCharsets.UTF_8));
}
@SuppressWarnings({"rawtypes", "unchecked"})
void eval(final Reader reader) throws Exception {
Consumer closer = x -> Closeables.closeQuietly(reader);
Try.run(() -> engine.eval(reader))
.onFailure(closer)
.onSuccess(closer);
}
public static void main(String[] mainargs) throws Throwable {
String[] args = mainargs;
String filename = "app.js";
if (args.length > 0 && args[0].endsWith(".js")) {
filename = args[0];
args = new String[Math.max(0, mainargs.length - 1)];
System.arraycopy(mainargs, 1, args, 0, args.length);
}
Jooby.run(new JoobyJs().run(new File(filename)), args);
}
}