/*
* JasperReports - Free Java Reporting Library.
* Copyright (C) 2001 - 2009 Jaspersoft Corporation. All rights reserved.
* http://www.jaspersoft.com
*
* Unless you have purchased a commercial license agreement from Jaspersoft,
* the following license terms apply:
*
* This program is part of JasperReports.
*
* JasperReports is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* JasperReports is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with JasperReports. If not, see <http://www.gnu.org/licenses/>.
*/
package net.sf.jasperreports.engine.util;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.TimeZone;
import net.sf.jasperreports.engine.JRRuntimeException;
/**
* @author Teodor Danciu (teodord@users.sourceforge.net)
* @version $Id: DefaultFormatFactory.java 3034 2009-08-27 11:58:04Z teodord $
*/
public class DefaultFormatFactory implements FormatFactory
{
/**
* Used in the date pattern to specify the default style.
* @see java.text.DateFormat#DEFAULT
*/
public static final String STANDARD_DATE_FORMAT_DEFAULT = "default";
/**
* Used in the date pattern to specify the short style.
* @see java.text.DateFormat#SHORT
*/
public static final String STANDARD_DATE_FORMAT_SHORT = "short";
/**
* Used in the date pattern to specify the medium style.
* @see java.text.DateFormat#MEDIUM
*/
public static final String STANDARD_DATE_FORMAT_MEDIUM = "medium";
/**
* Used in the date pattern to specify the long style.
* @see java.text.DateFormat#LONG
*/
public static final String STANDARD_DATE_FORMAT_LONG = "long";
/**
* Used in the date pattern to specify the full style.
* @see java.text.DateFormat#FULL
*/
public static final String STANDARD_DATE_FORMAT_FULL = "full";
/**
* Used in the date pattern to specify that the date or time should not be included.
*/
public static final String STANDARD_DATE_FORMAT_HIDE = "hide";
/**
* Used in the date format pattern to separate the date and time styles.
*/
public static final String STANDARD_DATE_FORMAT_SEPARATOR = ",";
public DateFormat createDateFormat(String pattern, Locale locale, TimeZone tz)
{
int[] dateStyle = null;
int[] timeStyle = null;
if (pattern != null && pattern.trim().length() > 0)
{
int sepIdx = pattern.indexOf(STANDARD_DATE_FORMAT_SEPARATOR);
String dateTok = sepIdx < 0 ? pattern : pattern.substring(0, sepIdx);
dateStyle = getDateStyle(dateTok);
if (dateStyle != null)
{
if (sepIdx >= 0)
{
String timeTok = pattern.substring(sepIdx + STANDARD_DATE_FORMAT_SEPARATOR.length());
timeStyle = getDateStyle(timeTok);
}
else
{
timeStyle = dateStyle;
}
}
}
DateFormat format;
if (dateStyle != null && timeStyle != null)
{
format = getDateFormat(dateStyle, timeStyle, locale);
}
else
{
if (locale == null)
{
format = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
}
else
{
format = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, locale);
}
if (
pattern != null && pattern.trim().length() > 0
&& format instanceof SimpleDateFormat
)
{
((SimpleDateFormat) format).applyPattern(pattern);
}
}
if (tz != null)
{
format.setTimeZone(tz);
}
return format;
}
protected static int[] getDateStyle(String pattern)
{
if (pattern.equalsIgnoreCase(STANDARD_DATE_FORMAT_DEFAULT))
{
return new int[]{DateFormat.DEFAULT};
}
else if (pattern.equalsIgnoreCase(STANDARD_DATE_FORMAT_SHORT))
{
return new int[]{DateFormat.SHORT};
}
else if (pattern.equalsIgnoreCase(STANDARD_DATE_FORMAT_MEDIUM))
{
return new int[]{DateFormat.MEDIUM};
}
else if (pattern.equalsIgnoreCase(STANDARD_DATE_FORMAT_LONG))
{
return new int[]{DateFormat.LONG};
}
else if (pattern.equalsIgnoreCase(STANDARD_DATE_FORMAT_FULL))
{
return new int[]{DateFormat.FULL};
}
else if (pattern.equalsIgnoreCase(STANDARD_DATE_FORMAT_HIDE))
{
return new int[0];
}
else
{
return null;
}
}
protected static DateFormat getDateFormat(int[] dateStyle, int[] timeStyle, Locale locale)
{
if (dateStyle.length == 0)
{
if (timeStyle.length == 0)
{
return new SimpleDateFormat("");
}
return locale == null ?
DateFormat.getTimeInstance(timeStyle[0]) :
DateFormat.getTimeInstance(timeStyle[0], locale);
}
if (timeStyle.length == 0)
{
return locale == null ?
DateFormat.getDateInstance(dateStyle[0]) :
DateFormat.getDateInstance(dateStyle[0], locale);
}
return locale == null ?
DateFormat.getDateTimeInstance(dateStyle[0], timeStyle[0]) :
DateFormat.getDateTimeInstance(dateStyle[0], timeStyle[0], locale);
}
public NumberFormat createNumberFormat(String pattern, Locale locale)
{
NumberFormat format = null;
if (pattern != null && pattern.trim().length() > 0)
{
if (locale == null)
{
format = NumberFormat.getNumberInstance();
}
else
{
format = NumberFormat.getNumberInstance(locale);
}
if (format instanceof DecimalFormat)
{
((DecimalFormat) format).applyPattern(pattern);
}
}
return format;
}
public static FormatFactory createFormatFactory(String formatFactoryClassName)
{
FormatFactory formatFactory = null;
if (formatFactoryClassName != null)
{
try
{
Class formatFactoryClass = JRClassLoader.loadClassForName(formatFactoryClassName);
formatFactory = (FormatFactory) formatFactoryClass.newInstance();
}
catch (ClassNotFoundException e)
{
throw new JRRuntimeException("Error loading format factory class : " + formatFactoryClassName, e);
}
catch (Exception e)
{
throw new JRRuntimeException("Error creating format factory instance : " + formatFactoryClassName, e);
}
}
else
{
formatFactory = new DefaultFormatFactory();
}
return formatFactory;
}
}