/** * Copyright (C) 2012-2014 Gist Labs, LLC. (http://gistlabs.com) * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package com.gistlabs.mechanize.cookie; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.WeakHashMap; import org.apache.http.client.CookieStore; import org.apache.http.impl.client.AbstractHttpClient; /** * Collection of the current available cookies. * * @author Martin Kersten<Martin.Kersten.mk@gmail.com> */ public class Cookies implements Iterable<Cookie> { private final AbstractHttpClient client; private final WeakHashMap<org.apache.http.cookie.Cookie, Cookie> cookieRepresentationCache = new WeakHashMap<org.apache.http.cookie.Cookie, Cookie>(); public Cookies(AbstractHttpClient client) { this.client = client; } private CookieStore getStore() { return client.getCookieStore(); } private Cookie getCookie(org.apache.http.cookie.Cookie cookie) { Cookie cookieRepresentation = cookieRepresentationCache.get(cookie); if(cookieRepresentation == null) { cookieRepresentation = new Cookie(cookie); cookieRepresentationCache.put(cookie, cookieRepresentation); } return cookieRepresentation; } /** Returns the cookie with the given name and for the given domain or null. */ public Cookie get(String name, String domain) { for(Cookie cookie : this) { if(cookie.getName().equals(name) && cookie.getDomain().equals(domain)) return cookie; } return null; } /** Returns a list of all cookies currently managed by the underlying http client. */ public List<Cookie> getAll() { List<Cookie> cookies = new ArrayList<Cookie>(); for(org.apache.http.cookie.Cookie cookie : getStore().getCookies()) cookies.add(getCookie(cookie)); return cookies; } /** Returns the number of currently existing cookies. */ public int getCount() { return getStore().getCookies().size(); } public Cookie addNewCookie(String name, String value, String domain) { Cookie cookie = new Cookie(name, value); cookie.getHttpCookie().setDomain(domain); cookieRepresentationCache.put(cookie.getHttpCookie(), cookie); getStore().addCookie(cookie.getHttpCookie()); return cookie; } /** Adds all cookies by actually cloning them. */ public void addAllCloned(List<Cookie> cookies) { for(Cookie cookie : cookies) { Cookie clone = new Cookie(cookie); getStore().addCookie(clone.getHttpCookie()); } } /** Removes all current managed cookies. */ public void removeAll() { getStore().clear(); } /** Removes the current cookie by changing the expired date and force the store to remove all expired for a given date. The date will be set to a time of 1970. */ public void remove(Cookie cookie) { cookie.getHttpCookie().setExpiryDate(new Date(0)); cookieRepresentationCache.remove(cookie.getHttpCookie()); getStore().clearExpired(new Date(1)); } public Iterator<Cookie> iterator() { return getAll().iterator(); } /** Writes all cookies to System.out including all the outer HTML. */ public void dumpAllToSystemOut() { dumpToSystemOut(getAll()); } public void dumpToSystemOut(List<Cookie> cookies) { for(Cookie cookie : cookies) System.out.println("cookie: " + cookie); } }