org.cipango.sipatra.SipatraServlet.java Source code

Java tutorial

Introduction

Here is the source code for org.cipango.sipatra.SipatraServlet.java

Source

// ========================================================================
// 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?
        }
    }
}