Package org.cipango.sipatra

Source Code of org.cipango.sipatra.SipatraServlet

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

import javax.servlet.sip.SipServlet;
import javax.servlet.sip.SipServletMessage;
import javax.servlet.sip.SipServletRequest;
import javax.servlet.sip.SipServletResponse;

import org.apache.commons.pool.impl.GenericObjectPool;
import org.jruby.embed.ScriptingContainer;
import org.slf4j.Logger;

/**
* Sipatra Main Servlet
*
* @author Dominique Broeglin <dominique.broeglin@gmail.com>, Jean-Baptiste Morin
*/
public class SipatraServlet extends SipServlet
{
  private static final Logger _log = org.slf4j.LoggerFactory.getLogger(SipatraServlet.class);

  @Override
  public void doRequest(SipServletRequest request) throws IOException
  {
    invokeMethod(request, "do_request");
  }

  @Override
  public void doResponse(SipServletResponse response) throws IOException
  {
    invokeMethod(response, "do_response");
 

  private void invokeMethod(SipServletMessage message, String methodName)
  {
    ScriptingContainer container = null;
    try
    {
      GenericObjectPool pool = (GenericObjectPool) message.getSession().getServletContext().getAttribute(Attributes.POOL);
      container = (ScriptingContainer) pool.borrowObject();
            long beginTime = System.currentTimeMillis();
      try
      {
        Object app = container.runScriptlet("Sipatra::Application::new");

        container.callMethod(app, "set_bindings", new Object[] {
            message.getSession().getServletContext()
            message.getSession().getServletContext().getAttribute(SipServlet.SIP_FACTORY),
            message.getSession(),
            message, _log});
        container.callMethod(app, methodName);
      }
      catch(Exception e)
      {
        pool.invalidateObject(container);
        container = null;
      }
      finally
      {
        if(container != null)
        {
          pool.returnObject(container);
        }
                _log.trace("Processed '%s' (%s, %s) in %dms", new Object[] {
                           message.getMethod(), message.getSession().getId(),
                           message.getCallId(), System.currentTimeMillis() - beginTime });
      }
    }
    catch(Exception e)
    {
      _log.error("ERROR >> Failed to borrow a JRuby Runtime ", e);
      // TODO: failed to borrow a runtime... What should we do?
      //throw e?
    }
  }
}
TOP

Related Classes of org.cipango.sipatra.SipatraServlet

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.