/*
 * $Header: /cvsroot/httpc-cookie2/httpc-cookie2/httpcookie2SVN-patch.082805-2100.diff,v 1.1 2005/08/29 05:01:58 sjain700 Exp $
 * $Revision:400312 $
 * $Date:2006-05-06 14:49:41 +0200 (Sat, 06 May 2006) $
 *
 * ====================================================================
 *
 *  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.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 *
 */

package org.apache.commons.httpclient.cookie;

import java.util.Date;

import org.apache.commons.httpclient.Cookie;

/**
 * <p>
 * Cookie class for {@link org.apache.commons.httpclient.cookie.RFC2965Spec}
 * cookie specification. It extends {@link Cookie} class and adds newer cookie
 * attributes and functions required for this specification.
 * </p>
 *
 * @author Samit Jain (jain.samit@gmail.com)
 * 
 * @since 3.1
 */
public class Cookie2 extends Cookie {

    // string constants for cookie attributes
    public static final String DOMAIN = "domain";
    public static final String PATH = "path";
    public static final String PORT = "port";
    public static final String VERSION = "version";
    public static final String SECURE = "secure";
    public static final String MAXAGE = "max-age";
    public static final String COMMENT = "comment";
    public static final String COMMENTURL = "commenturl";
    public static final String DISCARD = "discard";

    /**
     * Default constructor. Creates a blank cookie
     */
    public Cookie2() {
        super(null, "noname", null, null, null, false);
    }

    /**
     * Creates a cookie with the given name, value and domain attribute.
     *
     * @param name    the cookie name
     * @param value   the cookie value
     * @param domain  the domain this cookie can be sent to
     */
    public Cookie2(String domain, String name, String value) {
        super(domain, name, value);
    }

    /**
     * Creates a cookie with the given name, value, domain attribute,
     * path attribute, expiration attribute, and secure attribute
     *
     * @param name    the cookie name
     * @param value   the cookie value
     * @param domain  the domain this cookie can be sent to
     * @param path    the path prefix for which this cookie can be sent
     * @param expires the {@link Date} at which this cookie expires,
     *                or <tt>null</tt> if the cookie expires at the end
     *                of the session
     * @param secure if true this cookie can only be sent over secure
     * connections
     * @throws IllegalArgumentException If cookie name is null or blank,
     *   cookie name contains a blank, or cookie name starts with character $
     *
     */
    public Cookie2(String domain, String name, String value,
                   String path, Date expires, boolean secure) {
        super(domain, name, value, path, expires, secure);
    }

    /**
     * Creates a cookie with the given name, value, domain attribute,
     * path attribute, expiration attribute, secure attribute, and ports
     * attribute.
     *
     * @param name    the cookie name
     * @param value   the cookie value
     * @param domain  the domain this cookie can be sent to
     * @param path    the path prefix for which this cookie can be sent
     * @param expires the {@link Date} at which this cookie expires,
     *                or <tt>null</tt> if the cookie expires at the end
     *                of the session
     * @param secure if true this cookie can only be sent over secure
     * connections
     * @param ports   the ports for which this cookie can be sent
     * @throws IllegalArgumentException If cookie name is null or blank,
     *   cookie name contains a blank, or cookie name starts with character $
     *
     */
    public Cookie2(String domain, String name, String value,
                   String path, Date expires, boolean secure, int[] ports) {
        super(domain, name, value, path, expires, secure);
        setPorts(ports);
    }

   /**
     * If a user agent (web browser) presents this cookie to a user, the
     * cookie's purpose will be described by the information at this URL.
     *
     * @see #setCommentURL(String)
     */
    public String getCommentURL() {
        return cookieCommentURL;
    }

   /**
     * If a user agent (web browser) presents this cookie to a user, the
     * cookie's purpose will be described by the information at this URL.
     *
     * @param commentURL
     *
     * @see #getCommentURL()
     */
    public void setCommentURL(String commentURL) {
        this.cookieCommentURL = commentURL;
    }

    /**
     * Get the Port attribute. It restricts the ports to which a cookie
     * may be returned in a Cookie request header.
     *
     * @see #setPorts(int[])
     */
    public int[] getPorts() {
        return cookiePorts;
    }

   /**
     * Set the Port attribute. It restricts the ports to which a cookie
     * may be returned in a Cookie request header.
     *
     * @param ports
     *
     * @see #getPorts()
     */
    public void setPorts(int[] ports) {
        this.cookiePorts = ports;
    }

    /**
     * Set the Discard attribute.
     *
     * Note: <tt>Discard</tt> attribute overrides <tt>Max-age</tt>.
     *
     * @see #isPersistent()
     */
    public void setDiscard(boolean toDiscard) {
        discard = toDiscard;
    }

    /**
     * Returns <tt>false</tt> if the cookie should be discarded at the end
     * of the "session"; <tt>true</tt> otherwise.
     *
     * @return <tt>false</tt> if the cookie should be discarded at the end
     *         of the "session"; <tt>true</tt> otherwise
     */
    public boolean isPersistent() {
        return (null != getExpiryDate()) && !discard;
    }

    /**
     * Indicates whether the cookie had a port attribute specified in the
     * <tt>Set-Cookie2</tt> response header. 
     *
     * @param value <tt>true</tt> if port attribute is specified in response
     * header.
     *
     * @see #isPortAttributeSpecified
     */
    public void setPortAttributeSpecified(boolean value) {
        hasPortAttribute = value;
    }

    /**
     * @return <tt>true</tt> if cookie port attribute was specified in the
     * <tt>Set-Cookie2</tt> header.
     *
     * @see #setPortAttributeSpecified
     */
    public boolean isPortAttributeSpecified() {
        return hasPortAttribute;
    }

    /**
     * Indicates whether the Port attribute in <tt>Set-Cookie2</tt> header
     * contains no value (is of the form Port="").
     * <p>
     * This value is required for generating
     * the <tt>Cookie</tt> request header because the specification requires that if
     * <tt>Set-Cookie2</tt> header contains a blank value for port attribute,
     * the <tt>Cookie</tt> header should also contain a port attribute with no value.
     *
     * @param value <tt>true</tt> if port attribute is specified as blank in response
     * header.
     *
     * @see #isPortAttributeBlank
     */
    public void setPortAttributeBlank(boolean value) {
        isPortAttributeBlank = value;
    }

    /**
     * @return <tt>true</tt> if the port attribute in <tt>Set-Cookie2</tt> header
     * had no value (was of the form Port="").
     *
     * @see #setPortAttributeBlank
     */
    public boolean isPortAttributeBlank() {
        return isPortAttributeBlank;
    }

    /**
     * Indicates whether the cookie had a version attribute specified in the
     * <tt>Set-Cookie2</tt> response header. 
     *
     * @param value <tt>true</tt> if version attribute is specified in response
     * header.
     * @see #isVersionAttributeSpecified()
     */
    public void setVersionAttributeSpecified(boolean value) {
        hasVersionAttribute = value;
    }

    /**
     * @return <tt>true</tt> if cookie version attribute was specified in the
     * <tt>Set-Cookie2</tt> header.
     *
     * @see #setVersionAttributeSpecified
     */
    public boolean isVersionAttributeSpecified() {
        return hasVersionAttribute;
    }

    /**
     * Return a textual representation of the cookie.
     *
     * @return string.
     */
    public String toExternalForm() {
        CookieSpec spec =
                CookiePolicy.getCookieSpec(CookiePolicy.RFC_2965);
        return spec.formatCookie(this);
    }

    /**
     * Comment URL attribute
     */
    private String cookieCommentURL;

    /**
     * Port attribute.
     */
    private int[] cookiePorts;

    /**
     * Discard attribute.
     */
    private boolean discard = false;

    /**
     * Indicates if the set-cookie2 header included a Port attribute for this
     * cookie
     */
    private boolean hasPortAttribute = false;

    /**
     * Indicates if the set-cookie2 header's Port attribute did not have
     * any value.
     */
    private boolean isPortAttributeBlank = false;

    /**
     * Indicates if the set-cookie2 header included a Version attribute
     */
    private boolean hasVersionAttribute = false;


}

