/*
 * Copyright (C) 2006 Sun Microsystems, Inc. All rights reserved. 
 * Use is subject to license terms.
 *
 * Redistribution and use in source and binary forms, with or without modification, are 
 * permitted provided that the following conditions are met: Redistributions of source code 
 * must retain the above copyright notice, this list of conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright notice, this list of 
 * conditions and the following disclaimer in the documentation and/or other materials 
 * provided with the distribution. Neither the name of the Sun Microsystems nor the names of 
 * is contributors may be used to endorse or promote products derived from this software 
 * without specific prior written permission. 

 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

package org.maachang.jsr.script.javascript;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Properties;

import javax.script.ScriptEngine;

import org.maachang.jsr.script.util.ScriptEngineFactoryBase;


/**
 * Factory to create EmbeddedRhinoScriptEngine
 *
 */
public class EmbeddedRhinoScriptEngineFactory extends ScriptEngineFactoryBase {

    private Properties properties;
    private boolean initialized;
        
    public EmbeddedRhinoScriptEngineFactory() {
    }
    
    public List<String> getExtensions() {
        return extensions;
    }
    
    public List<String> getMimeTypes() {
        return mimeTypes;
    }
    
    public List<String> getNames() {
        return names;
    }
    
    public Object getParameter(String key) {
        if (key.equals(ScriptEngine.NAME)) {
            return "embedded-javascript";
        } else if (key.equals(ScriptEngine.ENGINE)) {
            return "Mozilla Rhino(EmbeddedRhinoScript)";
        } else if (key.equals(ScriptEngine.ENGINE_VERSION)) {
            return "1.7RC1";
        } else if (key.equals(ScriptEngine.LANGUAGE)) {
            return "EmbeddedECMAScript";
        } else if (key.equals(ScriptEngine.LANGUAGE_VERSION)) {
            return "1.7";
        } else if (key.equals("THREADING")) {
            return "MULTITHREADED";
        } else {
            throw new IllegalArgumentException("Invalid key");
        }
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    public ScriptEngine getScriptEngine() {
        EmbeddedRhinoScriptEngine ret = new EmbeddedRhinoScriptEngine();
        ret.setEngineFactory(this);
        return ret;
    }
            
    public String getMethodCallSyntax(String obj, String method, String... args) {
        StringBuilder buf = new StringBuilder() ;
        buf.append( obj ).append( "." ).append( method ).append( "(" ) ;
        int len = args.length;
        if (len == 0) {
            buf.append( ")" ) ;
            return buf.toString() ;
        }
        
        for (int i = 0; i < len; i++) {
            buf.append( args[i] );
            if (i != len - 1) {
                buf.append( "," );
            } else {
                buf.append( ")" );
            }
        }
        return buf.toString() ;
    }
    
    public String getOutputStatement(String toDisplay) {
        return new StringBuilder().append( "print(" ).append( toDisplay ).append( ")" ).toString() ;
    }
    
    public String getProgram(String... statements) {
        int len = statements.length;
        if( len <= 0 ) {
            return "" ;
        }
        StringBuilder buf = new StringBuilder() ;
        for (int i = 0; i < len; i++) {
            buf.append( statements[i] ).append( ";" ) ;
        }
        return buf.toString() ;
    }
    
    private static List<String> names;
    private static List<String> mimeTypes;
    private static List<String> extensions;
    
    static {
        names = new ArrayList<String>(1);
        names.add("ejss");
        names = Collections.unmodifiableList(names);

        mimeTypes = new ArrayList<String>(2);
        mimeTypes.add("application/ejss");
        mimeTypes.add("text/ejss");
        mimeTypes = Collections.unmodifiableList(mimeTypes);

        extensions = new ArrayList<String>(1);
        extensions.add("ejss");
        extensions = Collections.unmodifiableList(extensions);
    }
    
    public static void main(String[] args) {
        EmbeddedRhinoScriptEngineFactory fact = new EmbeddedRhinoScriptEngineFactory();
        System.out.println(fact.getParameter(ScriptEngine.ENGINE_VERSION));
    }
}
