View Javadoc
1   /*
2    * ====================================================================
3    * Licensed to the Apache Software Foundation (ASF) under one
4    * or more contributor license agreements.  See the NOTICE file
5    * distributed with this work for additional information
6    * regarding copyright ownership.  The ASF licenses this file
7    * to you under the Apache License, Version 2.0 (the
8    * "License"); you may not use this file except in compliance
9    * with the License.  You may obtain a copy of the License at
10   *
11   *   http://www.apache.org/licenses/LICENSE-2.0
12   *
13   * Unless required by applicable law or agreed to in writing,
14   * software distributed under the License is distributed on an
15   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16   * KIND, either express or implied.  See the License for the
17   * specific language governing permissions and limitations
18   * under the License.
19   * ====================================================================
20   *
21   * This software consists of voluntary contributions made by many
22   * individuals on behalf of the Apache Software Foundation.  For more
23   * information on the Apache Software Foundation, please see
24   * <http://www.apache.org/>.
25   *
26   */
27  
28  package org.apache.http.impl.cookie;
29  
30  import java.io.Serializable;
31  import java.util.Date;
32  import java.util.HashMap;
33  import java.util.Locale;
34  import java.util.Map;
35  
36  import org.apache.http.cookie.ClientCookie;
37  import org.apache.http.cookie.SetCookie;
38  import org.apache.http.util.Args;
39  
40  /**
41   * Default implementation of {@link SetCookie}.
42   *
43   * @since 4.0
44   */
45  public class BasicClientCookie implements SetCookie, ClientCookie, Cloneable, Serializable {
46  
47      private static final long serialVersionUID = -3869795591041535538L;
48  
49      /**
50       * Default Constructor taking a name and a value. The value may be null.
51       *
52       * @param name The name.
53       * @param value The value.
54       */
55      public BasicClientCookie(final String name, final String value) {
56          super();
57          Args.notNull(name, "Name");
58          this.name = name;
59          this.attribs = new HashMap<String, String>();
60          this.value = value;
61      }
62  
63      /**
64       * Returns the name.
65       *
66       * @return String name The name
67       */
68      @Override
69      public String getName() {
70          return this.name;
71      }
72  
73      /**
74       * Returns the value.
75       *
76       * @return String value The current value.
77       */
78      @Override
79      public String getValue() {
80          return this.value;
81      }
82  
83      /**
84       * Sets the value
85       *
86       * @param value
87       */
88      @Override
89      public void setValue(final String value) {
90          this.value = value;
91      }
92  
93      /**
94       * Returns the comment describing the purpose of this cookie, or
95       * {@code null} if no such comment has been defined.
96       *
97       * @return comment
98       *
99       * @see #setComment(String)
100      */
101     @Override
102     public String getComment() {
103         return cookieComment;
104     }
105 
106     /**
107      * If a user agent (web browser) presents this cookie to a user, the
108      * cookie's purpose will be described using this comment.
109      *
110      * @param comment
111      *
112      * @see #getComment()
113      */
114     @Override
115     public void setComment(final String comment) {
116         cookieComment = comment;
117     }
118 
119 
120     /**
121      * Returns null. Cookies prior to RFC2965 do not set this attribute
122      */
123     @Override
124     public String getCommentURL() {
125         return null;
126     }
127 
128 
129     /**
130      * Returns the expiration {@link Date} of the cookie, or {@code null}
131      * if none exists.
132      * <p><strong>Note:</strong> the object returned by this method is
133      * considered immutable. Changing it (e.g. using setTime()) could result
134      * in undefined behaviour. Do so at your peril. </p>
135      * @return Expiration {@link Date}, or {@code null}.
136      *
137      * @see #setExpiryDate(java.util.Date)
138      *
139      */
140     @Override
141     public Date getExpiryDate() {
142         return cookieExpiryDate;
143     }
144 
145     /**
146      * Sets expiration date.
147      * <p><strong>Note:</strong> the object returned by this method is considered
148      * immutable. Changing it (e.g. using setTime()) could result in undefined
149      * behaviour. Do so at your peril.</p>
150      *
151      * @param expiryDate the {@link Date} after which this cookie is no longer valid.
152      *
153      * @see #getExpiryDate
154      *
155      */
156     @Override
157     public void setExpiryDate (final Date expiryDate) {
158         cookieExpiryDate = expiryDate;
159     }
160 
161 
162     /**
163      * Returns {@code false} if the cookie should be discarded at the end
164      * of the "session"; {@code true} otherwise.
165      *
166      * @return {@code false} if the cookie should be discarded at the end
167      *         of the "session"; {@code true} otherwise
168      */
169     @Override
170     public boolean isPersistent() {
171         return (null != cookieExpiryDate);
172     }
173 
174 
175     /**
176      * Returns domain attribute of the cookie.
177      *
178      * @return the value of the domain attribute
179      *
180      * @see #setDomain(java.lang.String)
181      */
182     @Override
183     public String getDomain() {
184         return cookieDomain;
185     }
186 
187     /**
188      * Sets the domain attribute.
189      *
190      * @param domain The value of the domain attribute
191      *
192      * @see #getDomain
193      */
194     @Override
195     public void setDomain(final String domain) {
196         if (domain != null) {
197             cookieDomain = domain.toLowerCase(Locale.ROOT);
198         } else {
199             cookieDomain = null;
200         }
201     }
202 
203 
204     /**
205      * Returns the path attribute of the cookie
206      *
207      * @return The value of the path attribute.
208      *
209      * @see #setPath(java.lang.String)
210      */
211     @Override
212     public String getPath() {
213         return cookiePath;
214     }
215 
216     /**
217      * Sets the path attribute.
218      *
219      * @param path The value of the path attribute
220      *
221      * @see #getPath
222      *
223      */
224     @Override
225     public void setPath(final String path) {
226         cookiePath = path;
227     }
228 
229     /**
230      * @return {@code true} if this cookie should only be sent over secure connections.
231      * @see #setSecure(boolean)
232      */
233     @Override
234     public boolean isSecure() {
235         return isSecure;
236     }
237 
238     /**
239      * Sets the secure attribute of the cookie.
240      * <p>
241      * When {@code true} the cookie should only be sent
242      * using a secure protocol (https).  This should only be set when
243      * the cookie's originating server used a secure protocol to set the
244      * cookie's value.
245      *
246      * @param secure The value of the secure attribute
247      *
248      * @see #isSecure()
249      */
250     @Override
251     public void setSecure (final boolean secure) {
252         isSecure = secure;
253     }
254 
255 
256     /**
257      * Returns null. Cookies prior to RFC2965 do not set this attribute
258      */
259     @Override
260     public int[] getPorts() {
261         return null;
262     }
263 
264 
265     /**
266      * Returns the version of the cookie specification to which this
267      * cookie conforms.
268      *
269      * @return the version of the cookie.
270      *
271      * @see #setVersion(int)
272      *
273      */
274     @Override
275     public int getVersion() {
276         return cookieVersion;
277     }
278 
279     /**
280      * Sets the version of the cookie specification to which this
281      * cookie conforms.
282      *
283      * @param version the version of the cookie.
284      *
285      * @see #getVersion
286      */
287     @Override
288     public void setVersion(final int version) {
289         cookieVersion = version;
290     }
291 
292     /**
293      * Returns true if this cookie has expired.
294      * @param date Current time
295      *
296      * @return {@code true} if the cookie has expired.
297      */
298     @Override
299     public boolean isExpired(final Date date) {
300         Args.notNull(date, "Date");
301         return (cookieExpiryDate != null
302             && cookieExpiryDate.getTime() <= date.getTime());
303     }
304 
305     /**
306      * @since 4.4
307      */
308     public Date getCreationDate() {
309         return creationDate;
310     }
311 
312     /**
313      * @since 4.4
314      */
315     public void setCreationDate(final Date creationDate) {
316         this.creationDate = creationDate;
317     }
318 
319     public void setAttribute(final String name, final String value) {
320         this.attribs.put(name, value);
321     }
322 
323     @Override
324     public String getAttribute(final String name) {
325         return this.attribs.get(name);
326     }
327 
328     @Override
329     public boolean containsAttribute(final String name) {
330         return this.attribs.containsKey(name);
331     }
332 
333     /**
334      * @since 4.4
335      */
336     public boolean removeAttribute(final String name) {
337         return this.attribs.remove(name) != null;
338     }
339 
340     @Override
341     public Object clone() throws CloneNotSupportedException {
342         final BasicClientCookie clone = (BasicClientCookie) super.clone();
343         clone.attribs = new HashMap<String, String>(this.attribs);
344         return clone;
345     }
346 
347     @Override
348     public String toString() {
349         final StringBuilder buffer = new StringBuilder();
350         buffer.append("[version: ");
351         buffer.append(Integer.toString(this.cookieVersion));
352         buffer.append("]");
353         buffer.append("[name: ");
354         buffer.append(this.name);
355         buffer.append("]");
356         buffer.append("[value: ");
357         buffer.append(this.value);
358         buffer.append("]");
359         buffer.append("[domain: ");
360         buffer.append(this.cookieDomain);
361         buffer.append("]");
362         buffer.append("[path: ");
363         buffer.append(this.cookiePath);
364         buffer.append("]");
365         buffer.append("[expiry: ");
366         buffer.append(this.cookieExpiryDate);
367         buffer.append("]");
368         return buffer.toString();
369     }
370 
371    // ----------------------------------------------------- Instance Variables
372 
373     /** Cookie name */
374     private final String name;
375 
376     /** Cookie attributes as specified by the origin server */
377     private Map<String, String> attribs;
378 
379     /** Cookie value */
380     private String value;
381 
382     /** Comment attribute. */
383     private String  cookieComment;
384 
385     /** Domain attribute. */
386     private String  cookieDomain;
387 
388     /** Expiration {@link Date}. */
389     private Date cookieExpiryDate;
390 
391     /** Path attribute. */
392     private String cookiePath;
393 
394     /** My secure flag. */
395     private boolean isSecure;
396 
397     /** The version of the cookie specification I was created from. */
398     private int cookieVersion;
399 
400     private Date creationDate;
401 
402 }
403