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

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

package jp.vmi.script;

import java.util.AbstractList;
import java.util.List;
import java.util.Map;

import javax.script.ScriptEngine;

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

/**
 * Wrapper for JavaScript array object.
 *
 * @param  the type of array element.
 */
public abstract class JSList extends AbstractList {

    /**
     * Unwrap object.
     *
     * @return unwrapped object.
     */
    public abstract Object unwrap();

    // for Nashorn.
    static class JSMapList extends JSList {

        private final Map map;

        @SuppressWarnings("unchecked")
        JSMapList(Object object) {
            this.map = (Map) object;
        }

        @Override
        public E get(int index) {
            return map.get(index);
        }

        @Override
        public int size() {
            return map.size();
        }

        @Override
        public Object unwrap() {
            return map;
        }
    }

    // for Rhino in Java6.
    static class JSNativeList extends JSList {

        private final JSWrapper wrapper;

        JSNativeList(ScriptEngine engine, Object object) {
            wrapper = new JSWrapper(engine, object);
        }

        @Override
        public E get(int index) {
            return wrapper.eval(OBJECT + "[" + ARGS + "[0]]", index);
        }

        @Override
        public int size() {
            Number result = wrapper.eval(OBJECT + ".length");
            return result.intValue();
        }

        @Override
        public Object unwrap() {
            return wrapper.unwrap();
        }
    }

    /**
     * JavaScript object to List.
     *
     * @param  the type of list element.
     * @param engine script engine.
     * @param object JavaScript object.
     * @return List object.
     */
    @SuppressWarnings("unchecked")
    public static  List toList(ScriptEngine engine, Object object) {
        if (object == null)
            return null;
        else if (object instanceof List)
            return (List) object; // for Rhino in Java7.
        else if (object instanceof Map)
            return new JSMapList(object);
        else
            return new JSNativeList(engine, object);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy