001 /**
002 * =========================================
003 * LibFormula : a free Java formula library
004 * =========================================
005 *
006 * Project Info: http://reporting.pentaho.org/libformula/
007 *
008 * (C) Copyright 2006-2007, by Pentaho Corporation and Contributors.
009 *
010 * This library is free software; you can redistribute it and/or modify it under the terms
011 * of the GNU Lesser General Public License as published by the Free Software Foundation;
012 * either version 2.1 of the License, or (at your option) any later version.
013 *
014 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
015 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
016 * See the GNU Lesser General Public License for more details.
017 *
018 * You should have received a copy of the GNU Lesser General Public License along with this
019 * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
020 * Boston, MA 02111-1307, USA.
021 *
022 * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
023 * in the United States and other countries.]
024 *
025 *
026 * ------------
027 * $Id: DefaultLocalizationContext.java 2797 2007-05-14 12:35:33Z taqua $
028 * ------------
029 * (C) Copyright 2006-2007, by Pentaho Corporation.
030 */
031 package org.jfree.formula;
032
033 import java.text.SimpleDateFormat;
034 import java.util.ArrayList;
035 import java.util.Iterator;
036 import java.util.List;
037 import java.util.Locale;
038 import java.util.ResourceBundle;
039 import java.util.TimeZone;
040 import java.util.StringTokenizer;
041
042 import org.jfree.formula.typing.Type;
043 import org.jfree.util.Configuration;
044
045 /**
046 * Creation-Date: 03.11.2006, 14:28:12
047 *
048 * @author Thomas Morgner
049 */
050 public class DefaultLocalizationContext implements LocalizationContext
051 {
052 private static final String CONFIG_TIMEZONE_KEY = "org.jfree.formula.timezone";
053
054 private static final String CONFIG_LOCALE_KEY = "org.jfree.formula.locale";
055
056 private static final String CONFIG_DATEFORMAT_KEY = "org.jfree.formula.dateformat.";
057
058 private List dateFormats;
059
060 private List datetimeFormats;
061
062 private List timeFormats;
063
064 private Locale locale;
065
066 private TimeZone timeZone;
067
068 public DefaultLocalizationContext()
069 {
070 dateFormats = new ArrayList();
071 datetimeFormats = new ArrayList();
072 timeFormats = new ArrayList();
073 }
074
075 public Locale getLocale()
076 {
077 return locale;
078 }
079
080 public ResourceBundle getBundle(final String id)
081 {
082 return ResourceBundle.getBundle(id, getLocale());
083 }
084
085 public TimeZone getTimeZone()
086 {
087 return timeZone;
088 }
089
090 public List getDateFormats(final Type type)
091 {
092 if (type.isFlagSet(Type.DATE_TYPE))
093 {
094 return dateFormats;
095 }
096 else if (type.isFlagSet(Type.DATETIME_TYPE))
097 {
098 return datetimeFormats;
099 }
100 else if (type.isFlagSet(Type.TIME_TYPE))
101 {
102 return timeFormats;
103 }
104 return null;
105 }
106
107 private String[] createLocale(final String locale)
108 {
109 final StringTokenizer strtok = new StringTokenizer(locale, "_");
110 final String[] retval = new String[3];
111 if (strtok.hasMoreElements())
112 {
113 retval[0] = strtok.nextToken();
114 }
115 if (strtok.hasMoreElements())
116 {
117 retval[1] = strtok.nextToken();
118 }
119 else
120 {
121 retval[1] = "";
122 }
123 if (strtok.hasMoreElements())
124 {
125 retval[2] = strtok.nextToken();
126 }
127 else
128 {
129 retval[2] = "";
130 }
131 return retval;
132 }
133
134 private String[] createFormatSpec(final String text)
135 {
136 final StringTokenizer strtok = new StringTokenizer(text, ".");
137 if (strtok.countTokens() == 2)
138 {
139 final String[] retval = new String[2];
140 retval[0] = strtok.nextToken();
141 retval[1] = strtok.nextToken();
142 return retval;
143 }
144 return null;
145 }
146
147
148 public void initialize(final Configuration config)
149 {
150 // setting locale
151 final String declaredLocale = config.getConfigProperty(CONFIG_LOCALE_KEY, Locale.getDefault().toString());
152 final String[] declaredLocaleParts = createLocale(declaredLocale);
153 this.locale = new Locale(declaredLocaleParts[0], declaredLocaleParts[1], declaredLocaleParts[2]);
154
155 //setting timezone
156 final String timeZoneId = config.getConfigProperty(CONFIG_TIMEZONE_KEY, TimeZone.getDefault().getID());
157 timeZone = TimeZone.getTimeZone(timeZoneId);
158
159 // adding custom dateformats
160 final Iterator formatKeys = config.findPropertyKeys(CONFIG_DATEFORMAT_KEY);
161 while (formatKeys.hasNext())
162 {
163 final String formatKey = (String) formatKeys.next();
164 // Lets grab the format string first ...
165 final String format = config.getConfigProperty(formatKey);
166
167 // The key itself holds information about the format-string type and the locale of that string.
168 final String keySpec = formatKey.substring(CONFIG_DATEFORMAT_KEY.length(), formatKey.length());
169 final String[] formatSpec = createFormatSpec(keySpec);
170 if (formatSpec != null)
171 {
172 final String type = "type."+formatSpec[0];
173 final String[] locale = createLocale(formatSpec[1]);
174
175 final SimpleDateFormat df = new SimpleDateFormat(format, new Locale(locale[0], locale[1], locale[2]));
176
177 if (Type.TIME_TYPE.equals(type))
178 {
179 timeFormats.add(df);
180 }
181 else if (Type.DATE_TYPE.equals(type))
182 {
183 dateFormats.add(df);
184 }
185 else if (Type.DATETIME_TYPE.equals(type))
186 {
187 datetimeFormats.add(df);
188 }
189 }
190 }
191
192 // adding default dateformats using current local
193 datetimeFormats.add(SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.SHORT,
194 SimpleDateFormat.SHORT, getLocale()));
195 dateFormats.add(SimpleDateFormat.getDateInstance(SimpleDateFormat.SHORT,
196 getLocale()));
197 timeFormats.add(SimpleDateFormat.getTimeInstance(SimpleDateFormat.SHORT,
198 getLocale()));
199
200 // adding default ISO8 dateformats
201 datetimeFormats.add(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.US));
202 dateFormats.add(new SimpleDateFormat("yyyy-MM-dd", Locale.US));
203 timeFormats.add(new SimpleDateFormat("hh:mm:ss", Locale.US));
204 }
205 }