1/*
2 * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/module-client/src/main/java/org/apache/http/impl/cookie/BestMatchSpec.java $
3 * $Revision: 657334 $
4 * $Date: 2008-05-17 04:44:16 -0700 (Sat, 17 May 2008) $
5 *
6 * ====================================================================
7 * Licensed to the Apache Software Foundation (ASF) under one
8 * or more contributor license agreements.  See the NOTICE file
9 * distributed with this work for additional information
10 * regarding copyright ownership.  The ASF licenses this file
11 * to you under the Apache License, Version 2.0 (the
12 * "License"); you may not use this file except in compliance
13 * with the License.  You may obtain a copy of the License at
14 *
15 *   http://www.apache.org/licenses/LICENSE-2.0
16 *
17 * Unless required by applicable law or agreed to in writing,
18 * software distributed under the License is distributed on an
19 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
20 * KIND, either express or implied.  See the License for the
21 * specific language governing permissions and limitations
22 * under the License.
23 * ====================================================================
24 *
25 * This software consists of voluntary contributions made by many
26 * individuals on behalf of the Apache Software Foundation.  For more
27 * information on the Apache Software Foundation, please see
28 * <http://www.apache.org/>.
29 *
30 */
31
32package org.apache.http.impl.cookie;
33
34import java.util.List;
35
36import org.apache.http.Header;
37import org.apache.http.HeaderElement;
38import org.apache.http.cookie.Cookie;
39import org.apache.http.cookie.CookieOrigin;
40import org.apache.http.cookie.CookieSpec;
41import org.apache.http.cookie.MalformedCookieException;
42
43/**
44 * 'Meta' cookie specification that selects a cookie policy depending
45 * on the format of the cookie(s)
46 *
47 * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
48 *
49 * @since 4.0
50 *
51 * @deprecated Please use {@link java.net.URL#openConnection} instead.
52 *     Please visit <a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">this webpage</a>
53 *     for further details.
54 */
55@Deprecated
56public class BestMatchSpec implements CookieSpec {
57
58    private final String[] datepatterns;
59    private final boolean oneHeader;
60
61    private RFC2965Spec strict;
62    private BrowserCompatSpec compat;
63    private NetscapeDraftSpec netscape;
64
65    public BestMatchSpec(final String[] datepatterns, boolean oneHeader) {
66        super();
67        this.datepatterns = datepatterns;
68        this.oneHeader = oneHeader;
69    }
70
71    public BestMatchSpec() {
72        this(null, false);
73    }
74
75    private RFC2965Spec getStrict() {
76        if (this.strict == null) {
77             this.strict = new RFC2965Spec(this.datepatterns, this.oneHeader);
78        }
79        return strict;
80    }
81
82    private BrowserCompatSpec getCompat() {
83        if (this.compat == null) {
84            this.compat = new BrowserCompatSpec(this.datepatterns);
85        }
86        return compat;
87    }
88
89    private NetscapeDraftSpec getNetscape() {
90        if (this.netscape == null) {
91            String[] patterns = this.datepatterns;
92            if (patterns == null) {
93                patterns = BrowserCompatSpec.DATE_PATTERNS;
94            }
95            this.netscape = new NetscapeDraftSpec(patterns);
96        }
97        return netscape;
98    }
99
100    public List<Cookie> parse(
101            final Header header,
102            final CookieOrigin origin) throws MalformedCookieException {
103        if (header == null) {
104            throw new IllegalArgumentException("Header may not be null");
105        }
106        if (origin == null) {
107           throw new IllegalArgumentException("Cookie origin may not be null");
108        }
109        HeaderElement[] helems = header.getElements();
110        boolean versioned = false;
111        boolean netscape = false;
112        for (HeaderElement helem: helems) {
113            if (helem.getParameterByName("version") != null) {
114                versioned = true;
115            }
116            if (helem.getParameterByName("expires") != null) {
117               netscape = true;
118            }
119        }
120        if (netscape) {
121
122        }
123        // Do we have a cookie with a version attribute?
124        if (versioned) {
125            return getStrict().parse(helems, origin);
126        } else if (netscape) {
127            // Need to parse the header again,
128            // because Netscape draft cannot handle
129            // comma separators
130            return getNetscape().parse(header, origin);
131        } else {
132            return getCompat().parse(helems, origin);
133        }
134    }
135
136    public void validate(
137            final Cookie cookie,
138            final CookieOrigin origin) throws MalformedCookieException {
139        if (cookie == null) {
140            throw new IllegalArgumentException("Cookie may not be null");
141        }
142        if (origin == null) {
143            throw new IllegalArgumentException("Cookie origin may not be null");
144        }
145        if (cookie.getVersion() > 0) {
146            getStrict().validate(cookie, origin);
147        } else {
148            getCompat().validate(cookie, origin);
149        }
150    }
151
152    public boolean match(final Cookie cookie, final CookieOrigin origin) {
153        if (cookie == null) {
154            throw new IllegalArgumentException("Cookie may not be null");
155        }
156        if (origin == null) {
157            throw new IllegalArgumentException("Cookie origin may not be null");
158        }
159        if (cookie.getVersion() > 0) {
160            return getStrict().match(cookie, origin);
161        } else {
162            return getCompat().match(cookie, origin);
163        }
164    }
165
166    public List<Header> formatCookies(final List<Cookie> cookies) {
167        if (cookies == null) {
168            throw new IllegalArgumentException("List of cookie may not be null");
169        }
170        int version = Integer.MAX_VALUE;
171        for (Cookie cookie: cookies) {
172            if (cookie.getVersion() < version) {
173                version = cookie.getVersion();
174            }
175        }
176        if (version > 0) {
177            return getStrict().formatCookies(cookies);
178        } else {
179            return getCompat().formatCookies(cookies);
180        }
181    }
182
183    public int getVersion() {
184        return getStrict().getVersion();
185    }
186
187    public Header getVersionHeader() {
188        return getStrict().getVersionHeader();
189    }
190
191}