Package org.apache.felix.mishell

Source Code of org.apache.felix.mishell.JMXEngineContext

/*
*   Copyright 2005 The Apache Software Foundation
*
*   Licensed 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.apache.felix.mishell;

import java.util.logging.Level;
import java.util.logging.Logger;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;

/**
* This class is in charge of most of the interesting stuff. Basically, it keeps the current engine instance being used
* and creates the OSGiScriptEngineManager 'decorator' that handles the fact that engines can be installed in
* separate bundles and then the mechanism for finding engines used by the javax.script API does not work.
*
*/
public class JMXEngineContext {
  private ScriptEngine engine;
  private OSGiScriptEngineManager engineManager;
  private String language;

  Logger log=Logger.getLogger(JMXEngineContext.class.getName());
  Level l=Level.INFO;
  public JMXEngineContext(String language) throws EngineNotFoundException{
    this(language, null);
  }
  public JMXEngineContext(String lang, OSGiScriptEngineManager engineManager)throws EngineNotFoundException{
    this.engineManager=engineManager;
    if (log.isLoggable(l)){
    StringBuffer msg=new StringBuffer("Available script engines are:");
    log.log(l, "Available script engines are: \n");
    for (ScriptEngineFactory sef : engineManager.getEngineFactories()) {
      msg.append(sef.getEngineName()+"\n");
    }
    log.log(l, msg.toString());
    }
    JMoodProxyManager manager=new JMoodProxyManager();
    engine=engineManager.getEngineByName(lang);
    this.language=engine.getFactory().getLanguageName();
    String managerName=getVarName("manager");
    engineManager.put(managerName, manager);
    for(String key: engineManager.getBindings().keySet()){
      engine.put(getVarName(key), engineManager.get(key));
      }
   
    if (engine==null) throw new EngineNotFoundException(language);
  }
  /**
   * This method is used because prior versions of jrbuy binding needed global variables
   * to be called '$'+name. Last version already do that automatically, so this is not needed anymore
   * @param name
   * @return
   */
  //TODO: remove this method when we update to latest version of jruby-engine
  private String getVarName(String name){
    if (engine.getFactory().getEngineName().equals("jruby")) name="$"+name;
    return name;
   
  }
  public ScriptEngine getEngine() {
    return engine;
  }
  public void setEngine(ScriptEngine engine) {
    this.engine = engine;
  }
  public OSGiScriptEngineManager getEngineManager() {
    return engineManager;
  }
  public void setEngineManager(OSGiScriptEngineManager engineManager) {
    this.engineManager = engineManager;
  }
  /**
   * This methods changes the engine language. It reloads the ScriptEngineManagers to ensure
   * that any new engines (for example new bundles or updated ones) are discovered. 
   * @param name
   * @throws EngineNotFoundException
   */
  public void setLanguage(String name) throws EngineNotFoundException{
    OSGiScriptEngineManager manager=(OSGiScriptEngineManager)engineManager;
    manager.reloadManagers();
    ScriptEngine newEngine=manager.getEngineByName(name);
    if(newEngine!=null) {
      engine=newEngine;
      language=engine.getFactory().getLanguageName();
      for(String key: engineManager.getBindings().keySet()){
        System.out.println(key);
        engine.put(getVarName(key), engineManager.get(key));
        }

    }
    else throw new EngineNotFoundException("name");
  }
  public String getLanguage(){
    return language;
  }
 
 


TOP

Related Classes of org.apache.felix.mishell.JMXEngineContext

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.