/**************************************************************************
OmegaT - Computer Assisted Translation (CAT) tool
with fuzzy matching, translation memory, keyword search,
glossaries, and translation leveraging into updated projects.
Copyright (C) 2017 Aaron Madlon-Kay
Home page: http://www.omegat.org/
Support center: http://groups.yahoo.com/group/OmegaT/
This file is part of OmegaT.
OmegaT is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OmegaT is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
**************************************************************************/
package org.omegat.util;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
/**
* A thin wrapper around the built-in Nashorn JavaScript engine, providing a convenience method for
* <code>Java.asJSONCompatible(JSON.parse(json))</code>. Use this instead of merely <code>eval</code>-ing
* untrusted input.
* <p>
* <b>Note:</b> Java.asJSONCompatible is only available in Java 1.8.0_60 or later.
*
* @see <a href="http://www.oracle.com/technetwork/java/javase/8u60-relnotes-2620227.html">Java 8u60 release
* notes</a>
* @author Aaron Madlon-Kay
*/
public class JsonParser {
private static final Invocable INVOCABLE;
static {
Invocable invocable = null;
try {
ScriptEngine jsEngine = new ScriptEngineManager().getEngineByName("javascript");
jsEngine.eval("function parse(json) { return Java.asJSONCompatible(JSON.parse(json)) }");
invocable = (Invocable) jsEngine;
} catch (ScriptException e) {
Logger.getLogger(JsonParser.class.getName()).log(Level.SEVERE, "Unable to initialize JSON parser",
e);
}
INVOCABLE = invocable;
}
public static Object parse(String json) throws Exception {
return INVOCABLE.invokeFunction("parse", json);
}
}