/*
* Copyright (c) 2010, 2019 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/
package jakarta.ws.rs.core;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import jakarta.ws.rs.ext.RuntimeDelegate;
import jakarta.ws.rs.ext.RuntimeDelegate.HeaderDelegate;
An abstraction for the value of a HTTP Cache-Control response header.
Author: Paul Sandoz, Marc Hadley See Also: Since: 1.0
/**
* An abstraction for the value of a HTTP Cache-Control response header.
*
* @author Paul Sandoz
* @author Marc Hadley
* @see <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9">HTTP/1.1 section 14.9</a>
* @since 1.0
*/
public class CacheControl {
Deprecated: This field will be removed in a future version. See https://github.com/eclipse-ee4j/jaxrs-api/issues/607
/**
* @deprecated This field will be removed in a future version. See https://github.com/eclipse-ee4j/jaxrs-api/issues/607
*/
@Deprecated
private static final HeaderDelegate<CacheControl> HEADER_DELEGATE = RuntimeDelegate.getInstance().createHeaderDelegate(CacheControl.class);
private List<String> privateFields;
private List<String> noCacheFields;
private Map<String, String> cacheExtension;
private boolean privateFlag;
private boolean noCache;
private boolean noStore;
private boolean noTransform;
private boolean mustRevalidate;
private boolean proxyRevalidate;
private int maxAge = -1;
private int sMaxAge = -1;
Create a new instance of CacheControl. The new instance will have the following default settings:
- private = false
- noCache = false
- noStore = false
- noTransform = true
- mustRevalidate = false
- proxyRevalidate = false
- An empty list of private fields
- An empty list of no-cache fields
- An empty map of cache extensions
/**
* Create a new instance of CacheControl. The new instance will have the following default settings:
*
* <ul>
* <li>private = false</li>
* <li>noCache = false</li>
* <li>noStore = false</li>
* <li>noTransform = true</li>
* <li>mustRevalidate = false</li>
* <li>proxyRevalidate = false</li>
* <li>An empty list of private fields</li>
* <li>An empty list of no-cache fields</li>
* <li>An empty map of cache extensions</li>
* </ul>
*/
public CacheControl() {
privateFlag = false;
noCache = false;
noStore = false;
noTransform = true;
mustRevalidate = false;
proxyRevalidate = false;
}
Creates a new instance of CacheControl by parsing the supplied string.
Params: - value – the cache control string
Throws: - IllegalArgumentException – if the supplied string cannot be parsed or is null
Returns: the newly created CacheControl Deprecated: This method will be removed in a future version. Please use
RuntimeDelegate.getInstance().createHeaderDelegate(CacheControl.class).fromString(value) instead.
/**
* Creates a new instance of CacheControl by parsing the supplied string.
*
* @param value the cache control string
* @return the newly created CacheControl
*
* @throws IllegalArgumentException if the supplied string cannot be parsed or is null
* @deprecated This method will be removed in a future version. Please use
* RuntimeDelegate.getInstance().createHeaderDelegate(CacheControl.class).fromString(value) instead.
*/
@Deprecated
public static CacheControl valueOf(final String value) {
return HEADER_DELEGATE.fromString(value);
}
Corresponds to the must-revalidate cache control directive.
See Also: Returns: true if the must-revalidate cache control directive will be included in the response, false otherwise.
/**
* Corresponds to the must-revalidate cache control directive.
*
* @return true if the must-revalidate cache control directive will be included in the response, false otherwise.
*
* @see <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4">HTTP/1.1 section 14.9.4</a>
*/
public boolean isMustRevalidate() {
return mustRevalidate;
}
Corresponds to the must-revalidate cache control directive.
Params: - mustRevalidate – true if the must-revalidate cache control directive should be included in the response, false
otherwise.
See Also:
/**
* Corresponds to the must-revalidate cache control directive.
*
* @param mustRevalidate true if the must-revalidate cache control directive should be included in the response, false
* otherwise.
* @see <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4">HTTP/1.1 section 14.9.4</a>
*/
public void setMustRevalidate(final boolean mustRevalidate) {
this.mustRevalidate = mustRevalidate;
}
Corresponds to the proxy-revalidate cache control directive.
See Also: Returns: true if the proxy-revalidate cache control directive will be included in the response, false otherwise.
/**
* Corresponds to the proxy-revalidate cache control directive.
*
* @return true if the proxy-revalidate cache control directive will be included in the response, false otherwise.
*
* @see <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4">HTTP/1.1 section 14.9.4</a>
*/
public boolean isProxyRevalidate() {
return proxyRevalidate;
}
Corresponds to the must-revalidate cache control directive.
Params: - proxyRevalidate – true if the proxy-revalidate cache control directive should be included in the response, false
otherwise.
See Also:
/**
* Corresponds to the must-revalidate cache control directive.
*
* @param proxyRevalidate true if the proxy-revalidate cache control directive should be included in the response, false
* otherwise.
* @see <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4">HTTP/1.1 section 14.9.4</a>
*/
public void setProxyRevalidate(final boolean proxyRevalidate) {
this.proxyRevalidate = proxyRevalidate;
}
Corresponds to the max-age cache control directive.
See Also: Returns: the value of the max-age cache control directive, -1 if the directive is disabled.
/**
* Corresponds to the max-age cache control directive.
*
* @return the value of the max-age cache control directive, -1 if the directive is disabled.
*
* @see <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3">HTTP/1.1 section 14.9.3</a>
*/
public int getMaxAge() {
return maxAge;
}
Corresponds to the max-age cache control directive.
Params: - maxAge – the value of the max-age cache control directive, a value of -1 will disable the directive.
See Also:
/**
* Corresponds to the max-age cache control directive.
*
* @param maxAge the value of the max-age cache control directive, a value of -1 will disable the directive.
* @see <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3">HTTP/1.1 section 14.9.3</a>
*/
public void setMaxAge(final int maxAge) {
this.maxAge = maxAge;
}
Corresponds to the s-maxage cache control directive.
See Also: Returns: the value of the s-maxage cache control directive, -1 if the directive is disabled.
/**
* Corresponds to the s-maxage cache control directive.
*
* @return the value of the s-maxage cache control directive, -1 if the directive is disabled.
*
* @see <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3">HTTP/1.1 section 14.9.3</a>
*/
public int getSMaxAge() {
return sMaxAge;
}
Corresponds to the s-maxage cache control directive.
Params: - sMaxAge – the value of the s-maxage cache control directive, a value of -1 will disable the directive.
See Also:
/**
* Corresponds to the s-maxage cache control directive.
*
* @param sMaxAge the value of the s-maxage cache control directive, a value of -1 will disable the directive.
* @see <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3">HTTP/1.1 section 14.9.3</a>
*/
public void setSMaxAge(final int sMaxAge) {
this.sMaxAge = sMaxAge;
}
Corresponds to the value of the no-cache cache control directive.
See Also: Returns: a mutable list of field-names that will form the value of the no-cache cache control directive. An empty list
results in a bare no-cache directive.
/**
* Corresponds to the value of the no-cache cache control directive.
*
* @return a mutable list of field-names that will form the value of the no-cache cache control directive. An empty list
* results in a bare no-cache directive.
*
* @see #isNoCache()
* @see #setNoCache(boolean)
* @see <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1">HTTP/1.1 section 14.9.1</a>
*/
public List<String> getNoCacheFields() {
if (noCacheFields == null) {
noCacheFields = new ArrayList<String>();
}
return noCacheFields;
}
Corresponds to the no-cache cache control directive.
Params: - noCache – true if the no-cache cache control directive should be included in the response, false otherwise.
See Also:
/**
* Corresponds to the no-cache cache control directive.
*
* @param noCache true if the no-cache cache control directive should be included in the response, false otherwise.
* @see #getNoCacheFields()
* @see <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1">HTTP/1.1 section 14.9.1</a>
*/
public void setNoCache(final boolean noCache) {
this.noCache = noCache;
}
Corresponds to the no-cache cache control directive.
See Also: Returns: true if the no-cache cache control directive will be included in the response, false otherwise.
/**
* Corresponds to the no-cache cache control directive.
*
* @return true if the no-cache cache control directive will be included in the response, false otherwise.
*
* @see #getNoCacheFields()
* @see <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1">HTTP/1.1 section 14.9.1</a>
*/
public boolean isNoCache() {
return noCache;
}
Corresponds to the private cache control directive.
See Also: Returns: true if the private cache control directive will be included in the response, false otherwise.
/**
* Corresponds to the private cache control directive.
*
* @return true if the private cache control directive will be included in the response, false otherwise.
*
* @see #getPrivateFields()
* @see <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1">HTTP/1.1 section 14.9.1</a>
*/
public boolean isPrivate() {
return privateFlag;
}
Corresponds to the value of the private cache control directive.
See Also: Returns: a mutable list of field-names that will form the value of the private cache control directive. An empty list
results in a bare no-cache directive.
/**
* Corresponds to the value of the private cache control directive.
*
* @return a mutable list of field-names that will form the value of the private cache control directive. An empty list
* results in a bare no-cache directive.
*
* @see #isPrivate()
* @see #setPrivate(boolean)
* @see <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1">HTTP/1.1 section 14.9.1</a>
*/
public List<String> getPrivateFields() {
if (privateFields == null) {
privateFields = new ArrayList<String>();
}
return privateFields;
}
Corresponds to the private cache control directive.
Params: - flag – true if the private cache control directive should be included in the response, false otherwise.
See Also:
/**
* Corresponds to the private cache control directive.
*
* @param flag true if the private cache control directive should be included in the response, false otherwise.
* @see #getPrivateFields()
* @see <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1">HTTP/1.1 section 14.9.1</a>
*/
public void setPrivate(final boolean flag) {
this.privateFlag = flag;
}
Corresponds to the no-transform cache control directive.
See Also: Returns: true if the no-transform cache control directive will be included in the response, false otherwise.
/**
* Corresponds to the no-transform cache control directive.
*
* @return true if the no-transform cache control directive will be included in the response, false otherwise.
*
* @see <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.5">HTTP/1.1 section 14.9.5</a>
*/
public boolean isNoTransform() {
return noTransform;
}
Corresponds to the no-transform cache control directive.
Params: - noTransform – true if the no-transform cache control directive should be included in the response, false
otherwise.
See Also:
/**
* Corresponds to the no-transform cache control directive.
*
* @param noTransform true if the no-transform cache control directive should be included in the response, false
* otherwise.
* @see <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.5">HTTP/1.1 section 14.9.5</a>
*/
public void setNoTransform(final boolean noTransform) {
this.noTransform = noTransform;
}
Corresponds to the no-store cache control directive.
See Also: Returns: true if the no-store cache control directive will be included in the response, false otherwise.
/**
* Corresponds to the no-store cache control directive.
*
* @return true if the no-store cache control directive will be included in the response, false otherwise.
*
* @see <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.2">HTTP/1.1 section 14.9.2</a>
*/
public boolean isNoStore() {
return noStore;
}
Corresponds to the no-store cache control directive.
Params: - noStore – true if the no-store cache control directive should be included in the response, false otherwise.
See Also:
/**
* Corresponds to the no-store cache control directive.
*
* @param noStore true if the no-store cache control directive should be included in the response, false otherwise.
* @see <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.2">HTTP/1.1 section 14.9.2</a>
*/
public void setNoStore(final boolean noStore) {
this.noStore = noStore;
}
Corresponds to a set of extension cache control directives.
See Also: Returns: a mutable map of cache control extension names and their values. If a key has a null value, it will appear as
a bare directive. If a key has a value that contains no whitespace then the directive will appear as a simple
name=value pair. If a key has a value that contains whitespace then the directive will appear as a quoted
name="value" pair.
/**
* Corresponds to a set of extension cache control directives.
*
* @return a mutable map of cache control extension names and their values. If a key has a null value, it will appear as
* a bare directive. If a key has a value that contains no whitespace then the directive will appear as a simple
* name=value pair. If a key has a value that contains whitespace then the directive will appear as a quoted
* name="value" pair.
*
* @see <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.6">HTTP/1.1 section 14.9.6</a>
*/
public Map<String, String> getCacheExtension() {
if (cacheExtension == null) {
cacheExtension = new HashMap<String, String>();
}
return cacheExtension;
}
Convert the cache control to a string suitable for use as the value of the corresponding HTTP header.
Returns: a stringified cache control Deprecated: The format of the toString() method is subject to change in a future version. Please use
RuntimeDelegate.getInstance().createHeaderDelegate(CacheControl.class).toString(value) instead if you rely on the
format of this method.
/**
* Convert the cache control to a string suitable for use as the value of the corresponding HTTP header.
*
* @return a stringified cache control
* @deprecated The format of the toString() method is subject to change in a future version. Please use
* RuntimeDelegate.getInstance().createHeaderDelegate(CacheControl.class).toString(value) instead if you rely on the
* format of this method.
*/
@Override
@Deprecated
public String toString() {
return HEADER_DELEGATE.toString(this);
}
Generate hash code from cache control properties.
Returns: the hashCode
/**
* Generate hash code from cache control properties.
*
* @return the hashCode
*/
@Override
public int hashCode() {
int hash = 7;
hash = 41 * hash + (this.privateFlag ? 1 : 0);
hash = 41 * hash + (this.noCache ? 1 : 0);
hash = 41 * hash + (this.noStore ? 1 : 0);
hash = 41 * hash + (this.noTransform ? 1 : 0);
hash = 41 * hash + (this.mustRevalidate ? 1 : 0);
hash = 41 * hash + (this.proxyRevalidate ? 1 : 0);
hash = 41 * hash + this.maxAge;
hash = 41 * hash + this.sMaxAge;
hash = 41 * hash + hashCodeOf(this.privateFields);
hash = 41 * hash + hashCodeOf(this.noCacheFields);
hash = 41 * hash + hashCodeOf(this.cacheExtension);
return hash;
}
Compares object argument to this cache control to see if they are the same considering all property values.
Params: - obj – the object to compare to
Returns: true if the two cache controls are the same, false otherwise.
/**
* Compares object argument to this cache control to see if they are the same considering all property values.
*
* @param obj the object to compare to
* @return true if the two cache controls are the same, false otherwise.
*/
@Override
public boolean equals(final Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final CacheControl other = (CacheControl) obj;
if (this.privateFlag != other.privateFlag) {
return false;
}
if (this.noCache != other.noCache) {
return false;
}
if (this.noStore != other.noStore) {
return false;
}
if (this.noTransform != other.noTransform) {
return false;
}
if (this.mustRevalidate != other.mustRevalidate) {
return false;
}
if (this.proxyRevalidate != other.proxyRevalidate) {
return false;
}
if (this.maxAge != other.maxAge) {
return false;
}
if (this.sMaxAge != other.sMaxAge) {
return false;
}
if (notEqual(this.privateFields, other.privateFields)) {
return false;
}
if (notEqual(this.noCacheFields, other.noCacheFields)) {
return false;
}
if (notEqual(this.cacheExtension, other.cacheExtension)) {
return false;
}
return true;
}
Check if two collections are not equal. If one of the collections is null
and the other is empty, consider the collections to be equal. Params: - first – first collection. May be
null
. - second – second collection. May be
null
.
Returns: true
if the two collections are not equal, false
if the two collections are equal (or one of them is null
and the other one is empty).
/**
* Check if two collections are not equal.
*
* If one of the collections is {@code null} and the other is empty, consider the collections to be equal.
*
* @param first first collection. May be {@code null}.
* @param second second collection. May be {@code null}.
* @return {@code true} if the two collections are not equal, {@code false} if the two collections are equal (or one of
* them is {@code null} and the other one is empty).
*/
private static boolean notEqual(final Collection<?> first, final Collection<?> second) {
if (first == second) {
return false;
}
if (first == null) {
// if first is 'null', consider equal to empty
return !second.isEmpty();
}
if (second == null) {
// if second is 'null', consider equal to empty
return !first.isEmpty();
}
return !first.equals(second);
}
Check if two maps are not equal. If one of the maps is null
and the other is empty, consider the maps to be equal. Params: - first – first collection. May be
null
. - second – second collection. May be
null
.
Returns: true
if the two maps are not equal, false
if the two maps are equal (or one of them is null
and the other one is empty).
/**
* Check if two maps are not equal.
*
* If one of the maps is {@code null} and the other is empty, consider the maps to be equal.
*
* @param first first collection. May be {@code null}.
* @param second second collection. May be {@code null}.
* @return {@code true} if the two maps are not equal, {@code false} if the two maps are equal (or one of them is
* {@code null} and the other one is empty).
*/
private static boolean notEqual(final Map<?, ?> first, final Map<?, ?> second) {
if (first == second) {
return false;
}
if (first == null) {
// if first is 'null', consider equal to empty
return !second.isEmpty();
}
if (second == null) {
// if second is 'null', consider equal to empty
return !first.isEmpty();
}
return !first.equals(second);
}
Compute a Object.hashCode
of a collection. If the collection is null
or empty, the returned hash code is 0
(zero). Otherwise, the collection's hashCode()
method is called to compute the hash code. Params: - instance – collection, may be
null
.
Returns: hash code for the collection, if null
or empty, the returned hash code is 0
(zero).
/**
* Compute a {@link Object#hashCode} of a collection.
*
* If the collection is {@code null} or empty, the returned hash code is {@code 0} (zero). Otherwise, the collection's
* {@code hashCode()} method is called to compute the hash code.
*
* @param instance collection, may be {@code null}.
* @return hash code for the collection, if {@code null} or empty, the returned hash code is {@code 0} (zero).
*/
private static int hashCodeOf(final Collection<?> instance) {
return (instance == null || instance.isEmpty()) ? 0 : instance.hashCode();
}
Compute a Object.hashCode
of a map. If the map is null
or empty, the returned hash code is 0
(zero). Otherwise, the map's hashCode()
method is called to compute the hash code. Params: - instance – map, may be
null
.
Returns: hash code for the map, if null
or empty, the returned hash code is 0
(zero).
/**
* Compute a {@link Object#hashCode} of a map.
*
* If the map is {@code null} or empty, the returned hash code is {@code 0} (zero). Otherwise, the map's
* {@code hashCode()} method is called to compute the hash code.
*
* @param instance map, may be {@code null}.
* @return hash code for the map, if {@code null} or empty, the returned hash code is {@code 0} (zero).
*/
private static int hashCodeOf(final Map<?, ?> instance) {
return (instance == null || instance.isEmpty()) ? 0 : instance.hashCode();
}
}