1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package org.apache.hc.client5.http.cookie;
28
29 import java.io.IOException;
30 import java.io.ObjectInputStream;
31 import java.io.Serializable;
32 import java.util.ArrayList;
33 import java.util.Date;
34 import java.util.Iterator;
35 import java.util.List;
36 import java.util.TreeSet;
37 import java.util.concurrent.locks.ReadWriteLock;
38 import java.util.concurrent.locks.ReentrantReadWriteLock;
39
40 import org.apache.hc.core5.annotation.Contract;
41 import org.apache.hc.core5.annotation.ThreadingBehavior;
42
43
44
45
46
47
48 @Contract(threading = ThreadingBehavior.SAFE)
49 public class BasicCookieStore implements CookieStore, Serializable {
50
51 private static final long serialVersionUID = -7581093305228232025L;
52
53 private final TreeSet<Cookie> cookies;
54 private transient ReadWriteLock lock;
55
56 public BasicCookieStore() {
57 super();
58 this.cookies = new TreeSet<>(new CookieIdentityComparator());
59 this.lock = new ReentrantReadWriteLock();
60 }
61
62 private void readObject(final ObjectInputStream stream) throws IOException, ClassNotFoundException {
63 stream.defaultReadObject();
64
65
66 this.lock = new ReentrantReadWriteLock();
67 }
68
69
70
71
72
73
74
75
76
77
78
79 @Override
80 public void addCookie(final Cookie cookie) {
81 if (cookie != null) {
82 lock.writeLock().lock();
83 try {
84
85 cookies.remove(cookie);
86 if (!cookie.isExpired(new Date())) {
87 cookies.add(cookie);
88 }
89 } finally {
90 lock.writeLock().unlock();
91 }
92 }
93 }
94
95
96
97
98
99
100
101
102
103
104
105 public void addCookies(final Cookie[] cookies) {
106 if (cookies != null) {
107 for (final Cookie cookie : cookies) {
108 this.addCookie(cookie);
109 }
110 }
111 }
112
113
114
115
116
117
118
119 @Override
120 public List<Cookie> getCookies() {
121 lock.readLock().lock();
122 try {
123
124 return new ArrayList<>(cookies);
125 } finally {
126 lock.readLock().unlock();
127 }
128 }
129
130
131
132
133
134
135
136
137
138 @Override
139 public boolean clearExpired(final Date date) {
140 if (date == null) {
141 return false;
142 }
143 lock.writeLock().lock();
144 try {
145 boolean removed = false;
146 for (final Iterator<Cookie> it = cookies.iterator(); it.hasNext(); ) {
147 if (it.next().isExpired(date)) {
148 it.remove();
149 removed = true;
150 }
151 }
152 return removed;
153 } finally {
154 lock.writeLock().unlock();
155 }
156 }
157
158
159
160
161 @Override
162 public void clear() {
163 lock.writeLock().lock();
164 try {
165 cookies.clear();
166 } finally {
167 lock.writeLock().unlock();
168 }
169 }
170
171 @Override
172 public String toString() {
173 lock.readLock().lock();
174 try {
175 return cookies.toString();
176 } finally {
177 lock.readLock().unlock();
178 }
179 }
180
181 }