/*
 * 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;
    }
}
