| /******************************************************************************* |
| * Copyright (C) 2005, 2009 db4objects Inc. http://www.db4o.com |
| * |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * db4objects - Initial API and implementation |
| * Tom Schindl<tom.schindl@bestsolution.at> - bugfix for 217940 |
| * Matthew Hall - bug 121110 |
| ******************************************************************************/ |
| package org.eclipse.core.internal.databinding.conversion; |
| |
| import java.text.ParsePosition; |
| import java.util.Date; |
| |
| import org.eclipse.core.internal.databinding.BindingMessages; |
| |
| import com.ibm.icu.text.DateFormat; |
| import com.ibm.icu.text.SimpleDateFormat; |
| |
| /** |
| * Base support for date/string conversion handling according to the default |
| * locale or in plain long milliseconds. |
| * <p> |
| * NOTE: parse(format(date)) will generally *not* be equal to date, since the |
| * string representation may not cover the sub-second range, time-only string |
| * representations will be counted from the beginning of the era, etc. |
| * </p> |
| */ |
| public abstract class DateConversionSupport { |
| private final static int DATE_FORMAT=DateFormat.SHORT; |
| private final static int DEFAULT_FORMATTER_INDEX=0; |
| |
| private final static int NUM_VIRTUAL_FORMATTERS=1; |
| |
| /** |
| * Alternative formatters for date, time and date/time. |
| * Raw milliseconds are covered as a special case. |
| */ |
| // TODO: These could be shared, but would have to be synchronized. |
| private DateFormat[] formatters = { |
| new SimpleDateFormat(BindingMessages.getString(BindingMessages.DATE_FORMAT_DATE_TIME)), |
| new SimpleDateFormat(BindingMessages.getString(BindingMessages.DATEFORMAT_TIME)), |
| DateFormat.getDateTimeInstance(DATE_FORMAT, DateFormat.SHORT), |
| DateFormat.getDateInstance(DATE_FORMAT), |
| DateFormat.getTimeInstance(DateFormat.SHORT), |
| DateFormat.getDateTimeInstance(DATE_FORMAT,DateFormat.MEDIUM), |
| DateFormat.getTimeInstance(DateFormat.MEDIUM) |
| }; |
| |
| /** |
| * Tries all available formatters to parse the given string according to the |
| * default locale or as a raw millisecond value and returns the result of the |
| * first successful run. |
| * |
| * @param str A string specifying a date according to the default locale or in raw milliseconds |
| * @return The parsed date, or null, if no available formatter could interpret the input string |
| */ |
| protected Date parse(String str) { |
| for (int formatterIdx = 0; formatterIdx < formatters.length; formatterIdx++) { |
| Date parsed=parse(str,formatterIdx); |
| if(parsed!=null) { |
| return parsed; |
| } |
| } |
| return null; |
| } |
| |
| protected Date parse(String str,int formatterIdx) { |
| if(formatterIdx>=0) { |
| ParsePosition pos=new ParsePosition(0); |
| if (str == null) { |
| return null; |
| } |
| Date date=formatters[formatterIdx].parse(str,pos); |
| if(pos.getErrorIndex()!=-1||pos.getIndex()!=str.length()) { |
| return null; |
| } |
| return date; |
| } |
| try { |
| long millisecs=Long.parseLong(str); |
| return new Date(millisecs); |
| } |
| catch(NumberFormatException exc) { |
| } |
| return null; |
| } |
| |
| /** |
| * Formats the given date with the default formatter according to the default locale. |
| * @param date a date |
| * @return a string representation of the given date according to the default locale |
| */ |
| protected String format(Date date) { |
| return format(date,DEFAULT_FORMATTER_INDEX); |
| } |
| |
| protected String format(Date date,int formatterIdx) { |
| if (date == null) |
| return null; |
| if(formatterIdx>=0) { |
| return formatters[formatterIdx].format(date); |
| } |
| return String.valueOf(date.getTime()); |
| } |
| |
| protected int numFormatters() { |
| return formatters.length+NUM_VIRTUAL_FORMATTERS; |
| } |
| |
| /** |
| * Returns the date format for the provided <code>index</code>. |
| * <p> |
| * This is for testing purposes only and should not be a part of the API if |
| * this class was to be exposed. |
| * </p> |
| * |
| * @param index |
| * @return date format |
| */ |
| protected DateFormat getDateFormat(int index) { |
| if (index < 0 || index >= formatters.length) { |
| throw new IllegalArgumentException("'index' [" + index + "] is out of bounds."); //$NON-NLS-1$//$NON-NLS-2$ |
| } |
| |
| return formatters[index]; |
| } |
| } |