FileDocCategorySizeDatePackage
DefaultRouter.javaAPI DocphoneME MR2 API (J2ME)6002Wed May 02 18:00:42 BST 2007gov.nist.siplite.stack

DefaultRouter.java

/*
 * Portions Copyright  2000-2007 Sun Microsystems, Inc. All Rights
 * Reserved.  Use is subject to license terms.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version
 * 2 only, as published by the Free Software Foundation.
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License version 2 for more details (a copy is
 * included at /legal/license.txt).
 * 
 * You should have received a copy of the GNU General Public License
 * version 2 along with this work; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 * 
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
 * Clara, CA 95054 or visit www.sun.com if you need additional
 * information or have any questions.
 */
package gov.nist.siplite.stack;

import gov.nist.siplite.header.*;
import gov.nist.siplite.address.*;
import gov.nist.siplite.header.ViaHeader;

import gov.nist.siplite.message.*;
import gov.nist.siplite.*;
import java.util.*;

/**
 * This is the default router. When the implementation wants to forward
 * a request and had run out of othe options, then it calls this method
 * to figure out where to send the request. The default router implements
 * a simple "default routing algorithm" which just forwards to the configured
 * proxy address.
 */

public class DefaultRouter implements Router {
    /** Default route. */
    protected Hop defaultRoute;
    /** Current SIP stack context. */
    protected SipStack sipStack;
    
    /** Default constructor. */
    public DefaultRouter() {
    }
    
    /**
     * Sets the next hop address.
     * @param hopString is a string which is interpreted
     * by us in the following fashion :
     * host:port/TRANSPORT determines the next hop.
     */
    public void setNextHop(String hopString)
    throws IllegalArgumentException {
        defaultRoute = new Hop(hopString);
        defaultRoute.setDefaultRouteFlag();
    }
    
    /**
     * Return a linked list of addresses corresponding to a requestURI.
     * This is called for sending out outbound messages for which we do
     * not directly have the request URI. The implementaion function
     * is expected to return a linked list of addresses to which the
     * request is forwarded. The implementation may use this method
     * to perform location searches etc.
     *
     * @param sipRequest is the message to route.
     * @param isDialog target URI is taken from route list inside of dialog,
     * else it is taken from request URI
     * @return enumeration of next hops
     */
    public Enumeration getNextHops(Request sipRequest, boolean isDialog)
    throws IllegalArgumentException {
        Vector hopList = new Vector();

        if (defaultRoute != null) {
            hopList.addElement(defaultRoute);
        } else {
            URI requestUri = null;
            String transport = null;
            RouteList rl = sipRequest.getRouteHeaders();

            // When request has no route list,
            // it's destination URI is same as out of dialog
            if (rl == null || rl.isEmpty()) {
                isDialog = false;
            }

            Hop hop;

            // out of dialog - get destination URI from request URI
            if (!isDialog) {
                requestUri = sipRequest.getRequestURI();
                SipURI requestLineUri =
                    (SipURI)sipRequest.getRequestLine().getUri();
                if (requestLineUri.hasTransport()) {
                    transport = requestLineUri.getTransportParam();
                } else {
                    transport = sipStack.getDefaultTransport();
                }

                hop = createHop(requestUri, transport);
                hopList.addElement(hop);
            } else { // inside dialog - get destination URI from first route
                Enumeration el = rl.getElements();
                RouteHeader route; 
                while (el.hasMoreElements()) {
                    route = (RouteHeader) el.nextElement();
                    requestUri = route.getAddress().getURI();
                    transport = route.getAddress().
                        getParameter(SIPConstants.GENERAL_TRANSPORT);
                    hop = createHop(requestUri, transport);
                    hopList.addElement(hop);
                }
            }
        }
        return hopList.elements();
    }

    /**
     * Creates new Hop for given uri and transport
     * 
     * @param requestUri next hop address
     * @param transport next hop connection transport type
     * @return new Hop if requestUri is SipURI
     *         otherwise null
     */
    private Hop createHop(URI requestUri, String transport) {
        Hop hop = null;
        if (requestUri.isSipURI()) {
            SipURI sipUri = (SipURI)requestUri;
            int port = sipUri.getPort();
            if (port == -1) { // default port
                port = SIPConstants.DEFAULT_NONTLS_PORT;
            }
            hop = new Hop(sipUri.getHost(), port, 
                              transport);
        }
        return hop;
    }

    /**
     * Gets the default hop.
     * @return defaultRoute is the default route.
     */
    public Hop getOutboundProxy() { return this.defaultRoute; }
    
    /**
     * Sets the outbound proxy.
     * @param outboundProxy the new proxy location
     */
    public void setOutboundProxy(String outboundProxy) {
        this.defaultRoute = new Hop(outboundProxy);
    }
    
    /**
     * Sets the SIP stack context.
     * @param sipStack the new SIP stack
     */
    public void setSipStack(SipStack sipStack) {
        this.sipStack = sipStack;
    }
}