/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 flex.messaging.services.http;

import java.util.List;

import org.apache.commons.httpclient.cookie.CookiePolicy;

/**
 * Establishes the settings used to construct an Apache Commons HTTPClient
 * HttpConnectionManager for the Proxy Service.
 */
public class HTTPConnectionManagerSettings 
{    

    public static final String COOKIE_POLICY = "cookie-policy";


    public static final String CONNECTION_MANAGER = "connection-manager";
    

    public static final String CONNECTION_TIMEOUT = "connection-timeout";
    

    public static final String DEFAULT_MAX_CONNECTIONS_PER_HOST = "default-max-connections-per-host";
    

    public static final String LINGER = "linger";    
    

    public static final String MAX_PER_HOST = "max-per-host";    
    

    public static final String MAX_TOTAL_CONNECTIONS = "max-total-connections";
    

    public static final String RECEIVE_BUFFER_SIZE = "receive-buffer-size";
    

    public static final String SEND_BUFFER_SIZE = "send-buffer-size";
    

    public static final String SOCKET_TIMEOUT = "socket-timeout";
    

    public static final String STALE_CHECKING_ENABLED = "stale-checking-enabled";
    

    public static final String TCP_NO_DELAY = "tcp-no-delay";

    /** The default maximum number of connections allowed per host. */
    public static final int DEFAULT_MAX_CONNECTIONS_HOST = 2;   // Per RFC 2616 sec 8.1.4
 
    /** The default maximum number of connections allowed overall. */
    public static final int DEFAULT_MAX_TOTAL_CONNECTIONS = 20;

    private String cookiePolicy;
    private int connectionTimeout;
    private int defaultMaxConnectionsPerHost;
    private int linger;
    private int maxTotalConnections;
    private List maxConnectionsPerHost;
    private int receiveBufferSize;
    private int sendBufferSize;
    private int socketTimeout;
    private boolean staleCheckingEnabled;
    private boolean tcpNoDelay;

    /**
     * Creates a default <code>HTTPConnectionManagerSettings</code> instance.
     */
    public HTTPConnectionManagerSettings()
    {
        cookiePolicy = CookiePolicy.DEFAULT;
        defaultMaxConnectionsPerHost = DEFAULT_MAX_CONNECTIONS_HOST;
        maxTotalConnections = DEFAULT_MAX_TOTAL_CONNECTIONS;
        linger = -1;
        staleCheckingEnabled = true;
        tcpNoDelay = true;
    }

    /**
     * Returns the cookie policy.
     * 
     * @return The cookie policy.
     */
    public String getCookiePolicy()
    {
        return cookiePolicy;
    }

    /**
     * Sets the cookie policy.
     * 
     * @param cookiePolicy The cookie policy.
     */
    public void setCookiePolicy(String cookiePolicy)
    {
        this.cookiePolicy = cookiePolicy;
    }

    /**
     * Returns the number of milliseconds to wait before a connection will
     * timeout.
     *
     * @return The number of milliseconds to wait until a connection is
     * established. The default value is 0 which means a timeout is not used. 
     */
    public int getConnectionTimeout()
    {
        return connectionTimeout;
    }

    /**
     * Sets the number of milliseconds to wait before a connection will
     * timeout.
     * 
     * @param value - timeout in milliseconds
     */
    public void setConnectionTimeout(int value)
    {
        connectionTimeout = value;
    }

    /**
     * Returns the default maximum number of connections allowed per host.
     *
     * @return The default maximum number of connections allowed per host.
     * The default is 2 as per RFC 2616 section 8.1.4.
     */
    public int getDefaultMaxConnectionsPerHost()
    {
        return defaultMaxConnectionsPerHost;
    }

    /**
     * Sets the default maximum number of connections allowed per host.
     * @param value - the maximum number of connections
     */
    public void setDefaultMaxConnectionsPerHost(int value)
    {
        defaultMaxConnectionsPerHost = value;
    }

    /**
     * Returns linger-on-close timeout in seconds.
     * @return int - A value of <code>0</code> implies that the option is
     * disabled. A value of <code>-1</code> implies that the JRE default is
     * used.
     */
    public int getLinger()
    {
        return linger;
    }

    /**
     * Sets the linger-on-close timeout (in seconds).
     * @param linger An int. Use <code>0</code> to disable. Use <code>-1</code>
     * to rely on the JRE default. 
     */
    public void setLinger(int linger)
    {
        this.linger = linger;
    }

    /**
     * Returns a collection of HostConfigurationSettings which specify
     * connection options on a host-by-host basis.
     * 
     * @return A List of HostConfigurationSettings.
     * @see flex.messaging.services.http.HostConfigurationSettings
     */
    public List getMaxConnectionsPerHost()
    {
        return maxConnectionsPerHost;
    }

    /**
     * Sets the list of HostConfigurationSettings specifying connection
     * options on a host-by-host basis.
     * 
     * @param value The list of HostConfigurationSettings.
     * @see flex.messaging.services.http.HostConfigurationSettings
     */
    public void setMaxConnectionsPerHost(List value)
    {
        maxConnectionsPerHost = value;
    }

    /**
     * Returns the maximum number of connections allowed.
     *
     * @return The maximum number of connections allowed.
     */
    public int getMaxTotalConnections()
    {
        return maxTotalConnections;
    }

    /**
     * Sets the maximum number of connections allowed.
     * @param value - the maximum number of connections
     */
    public void setMaxTotalConnections(int value)
    {
        maxTotalConnections = value;
    }

    /**
     * Returns The size of the underlying receive buffers.
     *
     * @return The hint given to the kernel about the size of the underlying
     * buffers used by the platform for incoming network I/O.
     */
    public int getReceiveBufferSize()
    {
        return receiveBufferSize;
    }

    /**
     * Sets a suggestion for kernel from the application about the size of
     * buffers to use for the data to be received over the socket.
     * @param value - the suggested receive buffer size
     */
    public void setReceiveBufferSize(int value)
    {
        receiveBufferSize = value;
    }

    /**
     * Return the size of the underlying send buffers.
     *
     * @return The hint given to the kernel about the size of the underlying
     * buffers used by the platform for outgoing network I/O.
     */
    public int getSendBufferSize()
    {
        return sendBufferSize;
    }

    /**
     * Sets a suggestion for kernel from the application about the size of
     * buffers to use for the data to be sent over the socket.
     * @param sendBufferSize the suggested send buffer size
     */
    public void setSendBufferSize(int sendBufferSize)
    {
        this.sendBufferSize = sendBufferSize;
    }

    /**
     * Return the default socket timeout in milliseconds for waiting for data.
     *
     * @return The default socket timeout in milliseconds for waiting for data.
     * The default is 0 which is interpreted as an infinite timeout.
     */
    public int getSocketTimeout()
    {
        return socketTimeout;
    }

    /**
     * Sets the socket timeout in milliseconds for waiting for data.
     * @param value - the timeout in milliseconds
     */
    public void setSocketTimeout(int value)
    {
        socketTimeout = value;
    }

    /**
     * Returns whether a check for stale connections is to be performed.
     *
     * @return Whether a check for stale connections is to be performed.
     * The default is true.
     */
    public boolean isStaleCheckingEnabled()
    {
        return staleCheckingEnabled;
    }

    /**
     * Sets whether a check should be performed for stale connections.
     * Disabling the check may result in a slight performance improvement at
     * the risk of getting an I/O error when executing a request over a
     * connection that has been closed at the server side.

     * @param value - whether stale connection checking should be performed
     */
    public void setStaleCheckingEnabled(boolean value)
    {
        staleCheckingEnabled = value;
    }

    /**
     * Return whether Nagle's algorithm should be used for this connection.
     *
     * @return Determines whether Nagle's algorithm is to be used with this
     * connection. The default is true and Nagle's algorithm is NOT to be used
     * (i.e. TCP_NODELAY is enabled).  
     */
    public boolean isTcpNoDelay()
    {
        return tcpNoDelay;
    }

    /**
     * Sets whether Nagle's algorithm should be used for this connection. If 
     * set to true, Nagle's algorithm is to NOT be used (i.e. TCP_NODELAY
     * is enabled).
     * 
     * @param value - whether Nagle's algorithm should be used
     */
    public void setTcpNoDelay(boolean value)
    {
        tcpNoDelay = value;
    }
}
