com.sun.grizzly.util.http.FastHttpDateFormat Maven / Gradle / Ivy
/*
* The contents of this file are subject to the terms
* of the Common Development and Distribution License
* (the "License"). You may not use this file except
* in compliance with the License.
*
* You can obtain a copy of the license at
* glassfish/bootstrap/legal/CDDLv1.0.txt or
* https://glassfish.dev.java.net/public/CDDLv1.0.html.
* See the License for the specific language governing
* permissions and limitations under the License.
*
* When distributing Covered Code, include this CDDL
* HEADER in each file and include the License file at
* glassfish/bootstrap/legal/CDDLv1.0.txt. If applicable,
* add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your
* own identifying information: Portions Copyright [yyyy]
* [name of copyright owner]
*
* Copyright 2005 Sun Microsystems, Inc. All rights reserved.
*
* Portions Copyright Apache Software Foundation.
*/
package com.sun.grizzly.util.http;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;
import java.util.concurrent.ConcurrentHashMap;
/**
* Utility class to generate HTTP dates.
*
* @author Remy Maucherat
*/
public final class FastHttpDateFormat {
// -------------------------------------------------------------- Variables
protected static final int CACHE_SIZE =
Integer.parseInt(System.getProperty("com.sun.grizzly.util.http.FastHttpDateFormat.CACHE_SIZE", "1000"));
/**
* HTTP date format.
*/
protected static final SimpleDateFormat format =
new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
/**
* The set of SimpleDateFormat formats to use in getDateHeader().
*/
protected static final SimpleDateFormat formats[] = {
new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US),
new SimpleDateFormat("EEEEEE, dd-MMM-yy HH:mm:ss zzz", Locale.US),
new SimpleDateFormat("EEE MMMM d HH:mm:ss yyyy", Locale.US)
};
protected final static TimeZone gmtZone = TimeZone.getTimeZone("GMT");
/**
* GMT timezone - all HTTP dates are on GMT
*/
static {
format.setTimeZone(gmtZone);
formats[0].setTimeZone(gmtZone);
formats[1].setTimeZone(gmtZone);
formats[2].setTimeZone(gmtZone);
}
/**
* Instant on which the currentDate object was generated.
*/
protected static long currentDateGenerated = 0L;
/**
* Current formatted date.
*/
protected static String currentDate = null;
/**
* Formatter cache.
*/
protected static final ConcurrentHashMap formatCache =
new ConcurrentHashMap(CACHE_SIZE);
/**
* Parser cache.
*/
protected static final ConcurrentHashMap parseCache =
new ConcurrentHashMap(CACHE_SIZE);
// --------------------------------------------------------- Public Methods
/**
* Get the current date in HTTP format.
*/
public static final String getCurrentDate() {
long now = System.currentTimeMillis();
if ((now - currentDateGenerated) > 1000) {
synchronized (format) {
if ((now - currentDateGenerated) > 1000) {
currentDateGenerated = now;
currentDate = format.format(new Date(now));
}
}
}
return currentDate;
}
/**
* Get the HTTP format of the specified date.
*/
public static final String formatDate
(long value, DateFormat threadLocalformat) {
Long longValue = Long.valueOf(value);
String cachedDate = formatCache.get(longValue);
if (cachedDate != null)
return cachedDate;
String newDate = null;
Date dateValue = new Date(value);
if (threadLocalformat != null) {
newDate = threadLocalformat.format(dateValue);
updateFormatCache(longValue, newDate);
} else {
synchronized (formatCache) {
synchronized (format) {
newDate = format.format(dateValue);
}
updateFormatCache(longValue, newDate);
}
}
return newDate;
}
/**
* Try to parse the given date as a HTTP date.
*/
public static final long parseDate(String value,
DateFormat[] threadLocalformats) {
Long cachedDate = parseCache.get(value);
if (cachedDate != null)
return cachedDate.longValue();
Long date = null;
if (threadLocalformats != null) {
date = internalParseDate(value, threadLocalformats);
updateParseCache(value, date);
} else {
synchronized (parseCache) {
date = internalParseDate(value, formats);
updateParseCache(value, date);
}
}
if (date == null) {
return (-1L);
} else {
return date.longValue();
}
}
/**
* Parse date with given formatters.
*/
private static final Long internalParseDate
(String value, DateFormat[] formats) {
Date date = null;
for (int i = 0; (date == null) && (i < formats.length); i++) {
try {
date = formats[i].parse(value);
} catch (ParseException e) {
;
}
}
if (date == null) {
return null;
}
return Long.valueOf(date.getTime());
}
/**
* Update cache.
*/
private static void updateFormatCache(Long key, String value) {
if (value == null) {
return;
}
if (formatCache.size() > CACHE_SIZE) {
formatCache.clear();
}
formatCache.put(key, value);
}
/**
* Update cache.
*/
private static void updateParseCache(String key, Long value) {
if (value == null) {
return;
}
if (parseCache.size() > CACHE_SIZE) {
parseCache.clear();
}
parseCache.put(key, value);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy