Package org.cipango.sipatra

Source Code of org.cipango.sipatra.DefaultContextLoader

// ========================================================================
// 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;

import java.io.File;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.commons.pool.impl.GenericObjectPool;
import org.apache.commons.pool.impl.GenericObjectPool.Config;
import org.cipango.sipatra.properties.Properties;
import org.cipango.sipatra.properties.PropertyUtils;
import org.cipango.sipatra.ruby.JRubyRuntimeFactory;
import org.slf4j.Logger;

public class DefaultContextLoader implements ServletContextListener
{
  private static final Logger _log = org.slf4j.LoggerFactory.getLogger(DefaultContextLoader.class);

  public void contextInitialized(ServletContextEvent sce)
  {
    ServletContext servletContext = sce.getServletContext();

    String appPath = servletContext.getRealPath("/WEB-INF/sipatra");
    String scriptPath = PropertyUtils.getStringProperty(Properties.SIPATRA_PATH_PROPERTY, null, servletContext);

    if (scriptPath == null)
    {
      scriptPath = appPath + "/application.rb";
    }
    else
    {
      File file = new File(scriptPath);
      if(!file.exists())
      {
        _log.error(file.getAbsolutePath()+" does not exist!");
        scriptPath = null;
      }

      if(file.isFile())
      {
        if(!file.getName().endsWith(".rb"))
          _log.warn(file.getAbsolutePath()+" is not a ruby file!");

        if(file.getParentFile() != null)
          appPath = file.getParentFile().getAbsolutePath();
        else
          _log.error(file.getAbsolutePath()+" got no parent directory!");
      }
      else if(file.isDirectory())
      {
        appPath = new File(scriptPath).getAbsolutePath();
      }
    }

    Config conf = new Config();

    conf.maxActive = PropertyUtils.getIntegerProperty(Properties.SIPATRA_POOL_MAX_ACTIVE_PROPERTY, -1, servletContext);
    conf.maxIdle = PropertyUtils.getIntegerProperty(Properties.SIPATRA_POOL_MAX_IDLE_PROPERTY, -1, servletContext);
    conf.maxWait = PropertyUtils.getIntegerProperty(Properties.SIPATRA_POOL_MAX_WAIT_PROPERTY, -1, servletContext);
    conf.minIdle = PropertyUtils.getIntegerProperty(Properties.SIPATRA_POOL_MIN_IDLE_PROPERTY, -1, servletContext);
    conf.minEvictableIdleTimeMillis = PropertyUtils.getLongProperty(Properties.SIPATRA_POOL_MIN_EVICTABLE_PROPERTY, 1000L*60L*30L, servletContext);
    conf.lifo = PropertyUtils.getBooleanProperty(Properties.SIPATRA_POOL_LIFO, false, servletContext);
    conf.numTestsPerEvictionRun = PropertyUtils.getIntegerProperty(Properties.SIPATRA_POOL_TEST_EVICTION_RUN, 3, servletContext);
    conf.softMinEvictableIdleTimeMillis = PropertyUtils.getLongProperty(Properties.SIPATRA_POOL_SOFT_MIN_EVICTABLE, -1L, servletContext);
    conf.testOnBorrow = PropertyUtils.getBooleanProperty(Properties.SIPATRA_POOL_TEST_BORROW, false, servletContext);
    conf.testOnReturn = PropertyUtils.getBooleanProperty(Properties.SIPATRA_POOL_TEST_RETURN, false, servletContext);
    conf.testWhileIdle = PropertyUtils.getBooleanProperty(Properties.SIPATRA_POOL_TEST_IDLE, false, servletContext);
    conf.timeBetweenEvictionRunsMillis = PropertyUtils.getLongProperty(Properties.SIPATRA_POOL_TIME_EVICTION, -1L, servletContext);
   
    GenericObjectPool pool = new GenericObjectPool(new JRubyRuntimeFactory(appPath, scriptPath), conf);
    startPool(pool, PropertyUtils.getIntegerProperty(Properties.SIPATRA_POOL_INIT_POOL_SIZE, 1, servletContext));
    servletContext.setAttribute(Attributes.POOL, pool);
  }
 
  public void contextDestroyed(ServletContextEvent sce)
  {
    GenericObjectPool pool = (GenericObjectPool) sce.getServletContext().getAttribute(Attributes.POOL);
    stopPool(pool);
  }
 
  protected void startPool(GenericObjectPool pool, int init_pool_size)
  {
    for(int i = 0; i< init_pool_size; i++)
    {
      try
      {
        pool.addObject();
      }
      catch (Exception e)
      {
        _log.error("<<ERROR>>", e);
      }
    }
    _log.info("Pool started with "+init_pool_size+" JRuby Runtimes!");
  }

  protected void stopPool(GenericObjectPool pool)
  {
    pool.clear();
    try
    {
      pool.close();
    }
    catch (Exception e)
    {
      _log.error("ERROR >> Failed to close pool ", e);
    }
  }
}
TOP

Related Classes of org.cipango.sipatra.DefaultContextLoader

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.