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 */
019
020 package org.apache.myfaces.tobago.util;
021
022 import javax.faces.convert.ConverterException;
023 import javax.faces.convert.DateTimeConverter;
024 import java.text.DateFormat;
025 import java.text.SimpleDateFormat;
026 import java.util.Locale;
027
028 /**
029 * This code is taken from myfaces core.
030 * TODO: Should be sharable (e.g. myfaces-commons).
031 * <p/>
032 * User: lofwyr
033 * Date: 06.11.2006 17:20:29
034 */
035 public class DateFormatUtils {
036
037 private static final String TYPE_DATE = "date";
038 private static final String TYPE_TIME = "time";
039 private static final String TYPE_BOTH = "both";
040 private static final String STYLE_DEFAULT = "default";
041 private static final String STYLE_MEDIUM = "medium";
042 private static final String STYLE_SHORT = "short";
043 private static final String STYLE_LONG = "long";
044 private static final String STYLE_FULL = "full";
045
046 private DateFormatUtils() {
047 }
048
049 /**
050 * Find a pattern for the converter.
051 * Returns the pattern inside the converter, if any.
052 * Otherwise compute the pattern.
053 *
054 * @return the patter or null, if DateFormat.getDateInstance() returns no SimpleDateFormat.
055 */
056 public static String findPattern(DateTimeConverter converter) {
057 String pattern = converter.getPattern();
058
059 if (pattern == null) {
060 DateFormat dateFormat = getDateFormat(
061 converter.getType(), converter.getDateStyle(),
062 converter.getTimeStyle(), converter.getLocale());
063 if (dateFormat instanceof SimpleDateFormat) {
064 SimpleDateFormat format = (SimpleDateFormat) dateFormat;
065 pattern = format.toPattern();
066 }
067 }
068
069 return pattern;
070 }
071
072 public static DateFormat getDateFormat(String type, String dateStyle, String timeStyle, Locale locale) {
073 DateFormat format;
074 if (type.equals(TYPE_DATE)) {
075 format = DateFormat.getDateInstance(calcStyle(dateStyle), locale);
076 } else if (type.equals(TYPE_TIME)) {
077 format = DateFormat.getTimeInstance(calcStyle(timeStyle), locale);
078 } else if (type.equals(TYPE_BOTH)) {
079 format = DateFormat.getDateTimeInstance(calcStyle(dateStyle),
080 calcStyle(timeStyle),
081 locale);
082 } else {
083 throw new ConverterException("invalid type '" + type + "'");
084 }
085
086 // format cannot be lenient (JSR-127)
087 format.setLenient(false);
088 return format;
089 }
090
091 private static int calcStyle(String name) {
092 if (name.equals(STYLE_DEFAULT)) {
093 return DateFormat.DEFAULT;
094 }
095 if (name.equals(STYLE_MEDIUM)) {
096 return DateFormat.MEDIUM;
097 }
098 if (name.equals(STYLE_SHORT)) {
099 return DateFormat.SHORT;
100 }
101 if (name.equals(STYLE_LONG)) {
102 return DateFormat.LONG;
103 }
104 if (name.equals(STYLE_FULL)) {
105 return DateFormat.FULL;
106 }
107
108 throw new ConverterException("invalid style '" + name + "'");
109 }
110
111 }