Package org.cipango.sipatra.ruby

Source Code of org.cipango.sipatra.ruby.JRubyRuntimeFactory

// ========================================================================
// Copyright 2003-2011 the original author or authors.
// ------------------------------------------------------------------------
// 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.cipango.sipatra.ruby;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.pool.PoolableObjectFactory;
import org.jruby.embed.LocalContextScope;
import org.jruby.embed.PathType;
import org.jruby.embed.ScriptingContainer;

/**
*
*
*/
public class JRubyRuntimeFactory implements PoolableObjectFactory
{
  private String _appPath;
  private String _scriptPath;

  public JRubyRuntimeFactory(String appPath, String scriptPath)
  {
    _appPath = appPath;
    _scriptPath = scriptPath;
  }

  public Object makeObject()
  {
    ScriptingContainer container = new ScriptingContainer(LocalContextScope.SINGLETHREAD);
    // TODO: handle RUBY LOAD PATH to allow non JRuby dev
    List<String> loadPaths = new ArrayList<String>();
    loadPaths.add(_appPath);
    container.getProvider().setLoadPaths(loadPaths);
    container.runScriptlet("ENV['SIPATRA_PATH'] = '" + _appPath.replaceAll("'", "\'") + "'");
    container.runScriptlet(PathType.CLASSPATH, "sipatra.rb");

    if(_scriptPath != null)
    {
      File file = new File(_scriptPath);
      if(file.isFile())
        container.runScriptlet(PathType.ABSOLUTE, file.getAbsolutePath());
      else if(file.isDirectory())
      {
        for(File f : file.listFiles())
        {
          if(f.getName().endsWith(".rb"))
            container.runScriptlet(PathType.ABSOLUTE, f.getAbsolutePath());
        }
      }
    }
    return container;
  }

  public void destroyObject(Object obj) {}

  public boolean validateObject(Object obj)
  {
    return true;
  }

  public void activateObject(Object obj) {}

  public void passivateObject(Object obj)
  {
    if (obj instanceof ScriptingContainer)
    {
      ((ScriptingContainer) obj).clear();
    }
  }
}
TOP

Related Classes of org.cipango.sipatra.ruby.JRubyRuntimeFactory

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.