All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jp.vmi.script.JSMap Maven / Gradle / Ivy

package jp.vmi.script;

import java.util.AbstractMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import javax.script.ScriptEngine;

import static jp.vmi.script.JSWrapper.*;

/**
 * Wrapper for JavaScript map.
 *
 * @param  the type of key.
 * @param  the type of value.
 */
public class JSMap extends AbstractMap {

    private final JSWrapper wrapper;

    /**
     * Constructor.
     *
     * @param engine script engine.
     * @param object JavaScript object.
     */
    public JSMap(ScriptEngine engine, Object object) {
        wrapper = new JSWrapper(engine, object);
    }

    @Override
    public V get(Object key) {
        return wrapper.eval(OBJECT + "[" + ARGS + "[0]]", key);
    }

    // for internal use only, but ScriptEngine requires public scope.
    @SuppressWarnings("javadoc")
    public static interface EntrySetCallback {
        public void execute(K key, V value);
    }

    @Override
    public Set> entrySet() {
        final Set> result = new HashSet>();
        wrapper.eval("for (var k in " + OBJECT + ") {"
            + "  if (" + OBJECT + ".hasOwnProperty(k)) {"
            + "    " + ARGS + "[0].execute(k, " + OBJECT + "[k]);"
            + "  }"
            + "}",
            new EntrySetCallback() {
                @Override
                public void execute(K key, V value) {
                    result.add(new SimpleEntry(key, value));
                }
            });
        return result;
    }

    /**
     * Unwrap object.
     *
     * @return unwrapped object.
     */
    public Object unwrap() {
        return wrapper.unwrap();
    }

    /**
     * JavaScript object to Map.
     *
     * @param  the type of key.
     * @param  the type of value.
     * @param engine Script engine.
     * @param object JavaScript object.
     * @return Map object.
     */
    @SuppressWarnings("unchecked")
    public static  Map toMap(ScriptEngine engine, Object object) {
        if (object == null)
            return null;
        else if (object instanceof Map)
            return (Map) object; // for Rhino in Java7 and Nashorn.
        else
            return new JSMap(engine, object);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy