/*
Name:
- LocaleLoader
Description:
-
Requires:
-
Provides:
-
Part of: ProcessPuzzle Framework, Domain and Business Model Ready Architecture. Provides content, workflow and social networking functionality.
http://www.processpuzzle.com
ProcessPuzzle - Content and Workflow Management Integration Business Platform
Author(s):
- Zsolt Zsuffa
Copyright: (C) 2011 This program is free software: you can redistribute it and/or modify it under the terms of the
GNU General Public License as published by the Free Software Foundation, either version 3 of the License,
or (at your option) any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.processpuzzle.internalization.domain;
import java.text.DateFormat;
import java.util.Iterator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import com.processpuzzle.application.configuration.domain.InternalizationContext;
import com.processpuzzle.application.configuration.domain.MeasurementContext;
import com.processpuzzle.application.resource.domain.XmlDataLoader;
import com.processpuzzle.application.resource.domain.XmlDataLoaderException;
import com.processpuzzle.fundamental_types.domain.ProcessPuzzleParseException;
import com.processpuzzle.fundamental_types.quantity.domain.Unit;
import com.processpuzzle.fundamental_types.quantity.money.domain.Currency;
public class LocaleLoader extends XmlDataLoader {
InternalizationContext i18Context;
MeasurementContext measurementContext;
public LocaleLoader( String path, InternalizationContext i18Context, MeasurementContext measurementContext ) {
super( path );
this.measurementContext = measurementContext;
this.i18Context = i18Context;
/*
* TODO We don't use the repository anymore, we use the InternalizationContext instead. This part has to be removed!
*/
// ProcessPuzzleContext config = ProcessPuzzleContext.getInstance();
// try {
// config.setUp( TestConfigurationConstants.CONFIGURATION_PROPERTY_FILE );
// } catch (ConfigurationSetUpException e) {
// e.printStackTrace();
// }
// repository = config.getMeasurementContext();
}
// @Deprecated
// public void loadData(){
// super.loadData();
// loadJavaLocales();
// loadLocales();
// }
// @Deprecated
// private void loadJavaLocales(){
// Locale defaultLocales[]=Locale.getAvailableLocales();
// //UnitOfWork work = new UnitOfWork(true);
// for (int i=0;i<defaultLocales.length;i++){
// ProcessPuzzleLocale tmpLocale=new ProcessPuzzleLocale(defaultLocales[i]);
// //System.out.println(tmpLocale.getLanguage()+"-"+tmpLocale.getCountry()+"-"+tmpLocale.getVariant());
// //repository.add(tmpLocale);
// }
// //work.finish();
// }
public void loadLocaleDefinition( ProcessPuzzleLocale locale ) {
super.loadData();
Document doc = getDocument();
Element root = doc.getRootElement();
for( Iterator<?> i = root.elementIterator( "locale" ); i.hasNext(); ){
Element localeElement = (Element) i.next();
try{
if( localeElement.attributeValue( "language" ).equals( locale.getLanguage() )
&& localeElement.attributeValue( "country" ).equals( locale.getCountry() ) ){
loadQuantityFormatElements( localeElement.element( "quantityFormatSpecifier" ), locale );
loadDateFormatElements( localeElement.element( "dateFormatSpecifier" ), locale );
loadCurrencyElements( localeElement.element( "currency" ), locale );
return;
}
}catch( NullPointerException e ){
e.printStackTrace();
}catch( Exception e ){
e.printStackTrace();
}
}
throw new LocaleDefinitionNotFoundException( locale.getLanguage(), locale.getCountry() );
}
private void loadCurrencyElements( Element root, ProcessPuzzleLocale locale ) {
if( root == null )
return;
Attribute nameAttr = root.attribute( "name" );
Attribute symbolAttr = root.attribute( "symbol" );
if( nameAttr != null && symbolAttr != null ){
Unit u = measurementContext.findUnitBySymbol( symbolAttr.getValue() );
if( u != null )
locale.setLegalTender( (Currency) u );
}else
return;
}
// @Deprecated
// private void loadLocales() throws XmlDataLoaderException{
// Document doc = getDocument();
// Element root=doc.getRootElement();
// // Iterating through the definied locales
// for ( Iterator i = root.elementIterator("locale"); i.hasNext(); ) {
// Element localeElement=(Element)i.next();
// ProcessPuzzleLocale newLocale;
//
// String localeCountry=localeElement.attributeValue("country");
// String localeLanguage=localeElement.attributeValue("language");
// String localeVariant=localeElement.attributeValue("variant");
// String localeDefault=localeElement.attributeValue("default");
//
// if (localeLanguage==null) {
// throw new XmlDataLoaderException(this,"Locale language not found!");
// }else{
// localeLanguage=localeLanguage.toLowerCase();
// }
// if (localeCountry!=null) localeCountry=localeCountry.toUpperCase();
//
// newLocale=new ProcessPuzzleLocale(localeLanguage,localeCountry,localeVariant);
// if ((localeDefault!=null) && (localeDefault.equals("true")) && (localeCountry!=null) && (localeVariant!=null)){
// if (!repository.defaultExists(localeLanguage,localeCountry)){
// newLocale.setDefault();
// }else{
// throw new XmlDataLoaderException(this,"Duplicate default value for locale: "+localeLanguage+"_"+localeCountry+"! Cannot insert:"+localeVariant);
// }
// }
//
// Element quantityFormatElement=localeElement.element("quantityFormatSpecifier");
// loadQuantityFormatElements(quantityFormatElement,newLocale);
//
// Element currencyElement=localeElement.element("currency");
// newLocale.setLegalTender(currencyElement.attributeValue("symbol"));
// loadDateFormatElements(localeElement.element("dateFormatSpecifier"),newLocale);
// //System.out.println(newLocale.getLanguage);
// //UnitOfWork work = new UnitOfWork(true);
// //repository.add( newLocale);
// //work.finish();
// }
// }
// private void loadCurrencyElements(Element root, ProcessPuzzleLocale locale){
// if (root==null) return;
// locale.setLegalTender(root.attributeValue("symbol"));
// }
private void loadQuantityFormatElements( Element root, ProcessPuzzleLocale locale ) {
if( root == null )
return;
Attribute decimalSeparatorAttribute = root.attribute( "decimalSeparator" );
if( decimalSeparatorAttribute != null )
locale.getQuantityFormat().setDecimalSeparator( decimalSeparatorAttribute.getText().charAt( 0 ) );
Attribute groupingSeparatorAttribute = root.attribute( "groupingSeparator" );
if( groupingSeparatorAttribute != null )
locale.getQuantityFormat().setGroupingSeparator( groupingSeparatorAttribute.getText().charAt( 0 ) );
if( groupingSeparatorAttribute != null && decimalSeparatorAttribute != null ){
if( groupingSeparatorAttribute.getText().charAt( 0 ) == decimalSeparatorAttribute.getText().charAt( 0 ) ){
throw new ProcessPuzzleParseException( Character.toString( groupingSeparatorAttribute.getText().charAt( 0 ) )
+ Character.toString( decimalSeparatorAttribute.getText().charAt( 0 ) ), "Same Separators!", null );
}
}
try{
Element maxIntElement = root.element( "maxIntDigits" );
if( maxIntElement != null )
locale.getQuantityFormat().setMaximumIntegerDigits( Integer.parseInt( maxIntElement.getText() ) );
Element minIntElement = root.element( "minIntDigits" );
if( minIntElement != null )
locale.getQuantityFormat().setMinimumIntegerDigits( Integer.parseInt( minIntElement.getText() ) );
Element maxFractElement = root.element( "maxFractDigits" );
if( maxFractElement != null )
locale.getQuantityFormat().setMaximumFractionDigits( Integer.parseInt( maxFractElement.getText() ) );
Element minFractElement = root.element( "minFractDigits" );
if( minFractElement != null )
locale.getQuantityFormat().setMinimumFractionDigits( Integer.parseInt( minFractElement.getText() ) );
}catch( NumberFormatException e ){
throw new XmlDataLoaderException( this, "Non-Integer values!", e );
}
}
private void loadDateFormatElements( Element root, ProcessPuzzleLocale locale ) {
if( root == null )
return;
Element dateElement = root.element( "dateFormat" );
Element timeElement = root.element( "timeFormat" );
if( (dateElement == null) || (timeElement == null) )
return;
Element mediumDateElement = dateElement.element( "mediumPattern" );
Element mediumTimeElement = timeElement.element( "mediumPattern" );
if( mediumDateElement == null || mediumTimeElement == null )
return;
locale.getDateFormat().setDatePattern( mediumDateElement.getText() );
locale.getDateFormat().setTimePattern( mediumTimeElement.getText() );
Element fullDateElement = dateElement.element( "fullPattern" );
Element longDateElement = dateElement.element( "longPattern" );
Element shortDateElement = dateElement.element( "shortPattern" );
if( fullDateElement != null ){
locale.getDateFormat().setDatePattern( fullDateElement.getText(), DateFormat.FULL );
}
if( longDateElement != null ){
locale.getDateFormat().setDatePattern( longDateElement.getText(), DateFormat.LONG );
}
if( shortDateElement != null ){
locale.getDateFormat().setDatePattern( shortDateElement.getText(), DateFormat.SHORT );
}
Element fullTimeElement = timeElement.element( "fullPattern" );
Element longTimeElement = timeElement.element( "longPattern" );
Element shortTimeElement = timeElement.element( "shortPattern" );
if( fullTimeElement != null ){
locale.getDateFormat().setTimePattern( fullTimeElement.getText(), DateFormat.FULL );
}
if( longTimeElement != null ){
locale.getDateFormat().setTimePattern( longTimeElement.getText(), DateFormat.LONG );
}
if( shortTimeElement != null ){
locale.getDateFormat().setTimePattern( shortTimeElement.getText(), DateFormat.SHORT );
}
}
}