blob: bb573b243b7ea66639807e446fe56df10f5b027f [file] [log] [blame]
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 2010 Oracle and/or its affiliates. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in compliance with the License. You can
* obtain a copy of the License at
* https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
* or packager/legal/LICENSE.txt. See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at packager/legal/LICENSE.txt.
*
* GPL Classpath Exception:
* Oracle designates this particular file as subject to the "Classpath"
* exception as provided by Oracle in the GPL Version 2 section of the License
* file that accompanied this code.
*
* Modifications:
* If applicable, add the following below the License Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyright [year] [name of copyright owner]"
*
* Contributor(s):
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/
/*
* CacheControl.java
*
* Created on March 5, 2007, 3:36 PM
*/
package javax.ws.rs.core;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ws.rs.ext.RuntimeDelegate;
import javax.ws.rs.ext.RuntimeDelegate.HeaderDelegate;
/**
* An abstraction for the value of a HTTP Cache-Control response header.
* @see <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9">HTTP/1.1 section 14.9</a>
*/
public class CacheControl {
private boolean _private;
private List<String> privateFields;
private boolean noCache;
private List<String> noCacheFields;
private boolean noStore;
private boolean noTransform;
private boolean mustRevalidate;
private boolean proxyRevalidate;
private int maxAge = -1;
private int sMaxAge = -1;
private Map<String, String> cacheExtension;
private static final HeaderDelegate<CacheControl> delegate =
RuntimeDelegate.getInstance().createHeaderDelegate(CacheControl.class);
/**
* 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() {
_private = false;
noCache = false;
noStore = false;
noTransform = true;
mustRevalidate = false;
proxyRevalidate = false;
}
/**
* 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
*/
public static CacheControl valueOf(String value) throws IllegalArgumentException {
return delegate.fromString(value);
}
/**
* 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.
* @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(boolean mustRevalidate) {
this.mustRevalidate = mustRevalidate;
}
/**
* 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.
* @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(boolean proxyRevalidate) {
this.proxyRevalidate = proxyRevalidate;
}
/**
* 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.
* @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(int maxAge) {
this.maxAge = maxAge;
}
/**
* 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.
* @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(int sMaxAge) {
this.sMaxAge = sMaxAge;
}
/**
* 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
* @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.
* @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(boolean noCache) {
this.noCache = noCache;
}
/**
* 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.
* @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 _private;
}
/**
* 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
* @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.
* @param _private 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(boolean _private) {
this._private = _private;
}
/**
* 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.
* @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(boolean noTransform) {
this.noTransform = noTransform;
}
/**
* 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.
* @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(boolean noStore) {
this.noStore = noStore;
}
/**
* 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.
* @return a stringified cache control
*/
@Override
public String toString() {
return delegate.toString(this);
}
/**
* Generate hash code from cache control properties.
* @return the hashCode
*/
@Override
public int hashCode() {
int hash = 7;
hash = 41 * hash + (this._private ? 1 : 0);
hash = 41 * hash + (this.privateFields != null ? this.privateFields.hashCode() : 0);
hash = 41 * hash + (this.noCache ? 1 : 0);
hash = 41 * hash + (this.noCacheFields != null ? this.noCacheFields.hashCode() : 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 + (this.cacheExtension != null ? this.cacheExtension.hashCode() : 0);
return hash;
}
/**
* Compares obj 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(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final CacheControl other = (CacheControl) obj;
if (this._private != other._private) {
return false;
}
if (this.privateFields != other.privateFields && (this.privateFields == null || !this.privateFields.equals(other.privateFields))) {
return false;
}
if (this.noCache != other.noCache) {
return false;
}
if (this.noCacheFields != other.noCacheFields && (this.noCacheFields == null || !this.noCacheFields.equals(other.noCacheFields))) {
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 (this.cacheExtension != other.cacheExtension && (this.cacheExtension == null || !this.cacheExtension.equals(other.cacheExtension))) {
return false;
}
return true;
}
}