001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
014    
015    package com.liferay.portal.util;
016    
017    import com.liferay.portal.kernel.util.FastDateFormatFactory;
018    import com.liferay.portal.kernel.util.LocaleUtil;
019    import com.liferay.portal.kernel.util.StringBundler;
020    import com.liferay.portal.kernel.util.StringPool;
021    
022    import java.text.Format;
023    
024    import java.util.Locale;
025    import java.util.Map;
026    import java.util.TimeZone;
027    import java.util.concurrent.ConcurrentHashMap;
028    
029    import org.apache.commons.lang.time.FastDateFormat;
030    
031    /**
032     * @author Brian Wing Shun Chan
033     */
034    public class FastDateFormatFactoryImpl implements FastDateFormatFactory {
035    
036            public Format getDate(Locale locale) {
037                    return getDate(locale, null);
038            }
039    
040            public Format getDate(Locale locale, TimeZone timeZone) {
041                    String key = getKey(locale, timeZone);
042    
043                    Format format = _dateFormats.get(key);
044    
045                    if (format == null) {
046                            format = FastDateFormat.getDateInstance(
047                                    FastDateFormat.SHORT, timeZone, locale);
048    
049                            _dateFormats.put(key, format);
050                    }
051    
052                    return format;
053            }
054    
055            public Format getDate(TimeZone timeZone) {
056                    return getDate(LocaleUtil.getDefault(), timeZone);
057            }
058    
059            public Format getDateTime(Locale locale) {
060                    return getDateTime(locale, null);
061            }
062    
063            public Format getDateTime(Locale locale, TimeZone timeZone) {
064                    String key = getKey(locale, timeZone);
065    
066                    Format format = _dateTimeFormats.get(key);
067    
068                    if (format == null) {
069                            format = FastDateFormat.getDateTimeInstance(
070                                    FastDateFormat.SHORT, FastDateFormat.SHORT, timeZone, locale);
071    
072                            _dateTimeFormats.put(key, format);
073                    }
074    
075                    return format;
076            }
077    
078            public Format getDateTime(TimeZone timeZone) {
079                    return getDateTime(LocaleUtil.getDefault(), timeZone);
080            }
081    
082            public Format getSimpleDateFormat(String pattern) {
083                    return getSimpleDateFormat(pattern, LocaleUtil.getDefault(), null);
084            }
085    
086            public Format getSimpleDateFormat(String pattern, Locale locale) {
087                    return getSimpleDateFormat(pattern, locale, null);
088            }
089    
090            public Format getSimpleDateFormat(
091                    String pattern, Locale locale, TimeZone timeZone) {
092    
093                    String key = getKey(pattern, locale, timeZone);
094    
095                    Format format = _simpleDateFormats.get(key);
096    
097                    if (format == null) {
098                            format = FastDateFormat.getInstance(pattern, timeZone, locale);
099    
100                            _simpleDateFormats.put(key, format);
101                    }
102    
103                    return format;
104            }
105    
106            public Format getSimpleDateFormat(String pattern, TimeZone timeZone) {
107                    return getSimpleDateFormat(pattern, LocaleUtil.getDefault(), timeZone);
108            }
109    
110            public Format getTime(Locale locale) {
111                    return getTime(locale, null);
112            }
113    
114            public Format getTime(Locale locale, TimeZone timeZone) {
115                    String key = getKey(locale, timeZone);
116    
117                    Format format = _timeFormats.get(key);
118    
119                    if (format == null) {
120                            format = FastDateFormat.getTimeInstance(
121                                    FastDateFormat.SHORT, timeZone, locale);
122    
123                            _timeFormats.put(key, format);
124                    }
125    
126                    return format;
127            }
128    
129            public Format getTime(TimeZone timeZone) {
130                    return getTime(LocaleUtil.getDefault(), timeZone);
131            }
132    
133            protected String getKey(Locale locale, TimeZone timeZone) {
134                    return String.valueOf(locale).concat(StringPool.UNDERLINE).concat(
135                            String.valueOf(timeZone));
136            }
137    
138            protected String getKey(String pattern, Locale locale, TimeZone timeZone) {
139                    StringBundler sb = new StringBundler(5);
140    
141                    sb.append(pattern);
142                    sb.append(StringPool.UNDERLINE);
143                    sb.append(String.valueOf(locale));
144                    sb.append(StringPool.UNDERLINE);
145                    sb.append(String.valueOf(timeZone));
146    
147                    return sb.toString();
148            }
149    
150            private Map<String, Format> _dateFormats =
151                    new ConcurrentHashMap<String, Format>();
152            private Map<String, Format> _dateTimeFormats =
153                    new ConcurrentHashMap<String, Format>();
154            private Map<String, Format> _simpleDateFormats =
155                    new ConcurrentHashMap<String, Format>();
156            private Map<String, Format> _timeFormats =
157                    new ConcurrentHashMap<String, Format>();
158    
159    }