001: /****************************************************************
002: * Licensed to the Apache Software Foundation (ASF) under one *
003: * or more contributor license agreements. See the NOTICE file *
004: * distributed with this work for additional information *
005: * regarding copyright ownership. The ASF licenses this file *
006: * to you under the Apache License, Version 2.0 (the *
007: * "License"); you may not use this file except in compliance *
008: * with the License. You may obtain a copy of the License at *
009: * *
010: * http://www.apache.org/licenses/LICENSE-2.0 *
011: * *
012: * Unless required by applicable law or agreed to in writing, *
013: * software distributed under the License is distributed on an *
014: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
015: * KIND, either express or implied. See the License for the *
016: * specific language governing permissions and limitations *
017: * under the License. *
018: ****************************************************************/package org.apache.mailet.dates;
019:
020: import java.text.ParseException;
021: import java.util.Date;
022: import java.util.Locale;
023: import java.util.TimeZone;
024:
025: /**
026: * A thread-safe date formatting class to produce dates formatted in accord with the
027: * specifications of RFC 977.
028: *
029: */
030: public class RFC977DateFormat implements SimplifiedDateFormat {
031:
032: /**
033: * Internal date formatter for long date formats
034: */
035: private final SynchronizedDateFormat internalLongDateFormat;
036:
037: /**
038: * Internal date formatter for short date formats
039: */
040: private final SynchronizedDateFormat internalShortDateFormat;
041:
042: /**
043: * Constructor for RFC977DateFormat
044: */
045: public RFC977DateFormat() {
046: internalLongDateFormat = new SynchronizedDateFormat(
047: "yyyyMMdd HHmmss", Locale.ENGLISH);
048: internalShortDateFormat = new SynchronizedDateFormat(
049: "yyMMdd HHmmss", Locale.ENGLISH);
050: }
051:
052: /**
053: * This method returns the long form of the RFC977 Date
054: *
055: * @return java.lang.String
056: * @param d Date
057: */
058: public String format(Date d) {
059: return internalLongDateFormat.format(d);
060: }
061:
062: /**
063: * Parses text from the beginning of the given string to produce a date.
064: * The method may not use the entire text of the given string.
065: * <p>
066: * This method is designed to be thread safe, so we wrap our delegated
067: * parse method in an appropriate synchronized block.
068: *
069: * @param source A <code>String</code> whose beginning should be parsed.
070: * @return A <code>Date</code> parsed from the string.
071: * @throws ParseException if the beginning of the specified string
072: * cannot be parsed.
073: */
074: public Date parse(String source) throws ParseException {
075: source = source.trim();
076: if (source.indexOf(' ') == 6) {
077: return internalShortDateFormat.parse(source);
078: } else {
079: return internalLongDateFormat.parse(source);
080: }
081: }
082:
083: /**
084: * Sets the time zone of this SynchronizedDateFormat object.
085: * @param zone the given new time zone.
086: */
087: public void setTimeZone(TimeZone zone) {
088: synchronized (this ) {
089: internalShortDateFormat.setTimeZone(zone);
090: internalLongDateFormat.setTimeZone(zone);
091: }
092: }
093:
094: /**
095: * Gets the time zone.
096: * @return the time zone associated with this SynchronizedDateFormat.
097: */
098: public TimeZone getTimeZone() {
099: synchronized (this ) {
100: return internalShortDateFormat.getTimeZone();
101: }
102: }
103:
104: /**
105: * Specify whether or not date/time parsing is to be lenient. With
106: * lenient parsing, the parser may use heuristics to interpret inputs that
107: * do not precisely match this object's format. With strict parsing,
108: * inputs must match this object's format.
109: * @param lenient when true, parsing is lenient
110: * @see java.util.Calendar#setLenient
111: */
112: public void setLenient(boolean lenient) {
113: synchronized (this ) {
114: internalShortDateFormat.setLenient(lenient);
115: internalLongDateFormat.setLenient(lenient);
116: }
117: }
118:
119: /**
120: * Tell whether date/time parsing is to be lenient.
121: * @return whether this SynchronizedDateFormat is lenient.
122: */
123: public boolean isLenient() {
124: synchronized (this ) {
125: return internalShortDateFormat.isLenient();
126: }
127: }
128:
129: /**
130: * Overrides equals
131: */
132: public boolean equals(Object obj) {
133: if (this == obj) {
134: return true;
135: }
136: if (!(obj instanceof RFC977DateFormat)) {
137: return false;
138: }
139: RFC977DateFormat theOtherRFC977DateFormat = (RFC977DateFormat) obj;
140: synchronized (this ) {
141: return ((internalShortDateFormat
142: .equals(theOtherRFC977DateFormat.internalShortDateFormat)) && (internalLongDateFormat
143: .equals(theOtherRFC977DateFormat.internalLongDateFormat)));
144: }
145: }
146:
147: /**
148: * Overrides hashCode
149: */
150: public int hashCode() {
151: return (int) (internalLongDateFormat.hashCode() & internalShortDateFormat
152: .hashCode());
153: }
154:
155: }
|