package org.openswing.swing.internationalization.java; import java.io.*; import java.util.*; import javax.xml.parsers.*; import org.w3c.dom.*; /** * <p>Title: OpenSwing Framework</p> * <p>Description: Class for retrieving the collection of all internationalization properties: * translations, data/numeric/currency formats. * Based on XML files.</p> * <p>Copyright: Copyright (C) 2006 Mauro Carniel</p> * * <p> This file is part of OpenSwing Framework. * This library is free software; you can redistribute it and/or * modify it under the terms of the (LGPL) Lesser General Public * License as published by the Free Software Foundation; * * GNU LESSER GENERAL PUBLIC LICENSE * Version 2.1, February 1999 * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * The author may be contacted at: * maurocarniel@tin.it</p> * * @author Mauro Carniel * @version 1.0 */ public class XMLResourcesFactory extends ResourcesFactory { /** internationalization settings */ private Resources resources = null; /** collection of pairs: language identifier, Resources object */ private Hashtable allResources = new Hashtable(); /** collection of pairs: language identifier (e.g. "en","it") or language+country (e.g. "en_UK","it_IT"), xml file path (relative to classpath or absolute) */ private Hashtable xmlFiles = null; /** warn when no resource key not found */ private boolean showResourceNotFoundWarning = true; /** * Costructor. * @param xmlFiles collection of pairs: language identifier, xml file path (relative to classpath or absolute) */ public XMLResourcesFactory(Hashtable xmlFiles,boolean showResourceNotFoundWarning) { this.xmlFiles = xmlFiles; this.showResourceNotFoundWarning = showResourceNotFoundWarning; } /** * @return internationalization settings, according with the current language */ public final Resources getResources() { return resources; } /** * Load dictionary, according to the specified language identifier. * @param langId language identifier */ public final void setLanguage(String langId) throws UnsupportedOperationException { resources = getResources(langId); } /** * @param langId language id identifier * @return internationalization settings, according with the language specified */ public final Resources getResources(String langId) throws UnsupportedOperationException { Resources resources = (Resources)allResources.get(langId); if (resources!=null) return resources; String xmlFile = (String)xmlFiles.get(langId); if (xmlFile==null) { throw new UnsupportedOperationException("Language unknown '"+langId+"'"); } else { try { InputStream in = null; try { in = this.getClass().getClassLoader().getResourceAsStream(xmlFile.replaceAll("%20"," ")); if (in==null) in = new FileInputStream(xmlFile.replaceAll("%20"," ")); } catch (Exception ex1) { in = new FileInputStream(xmlFile.replaceAll("%20"," ")); } DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(in); NodeList nodes = doc.getElementsByTagName("object"); Properties p = new Properties(); for(int i=0;i<nodes.getLength();i++) { p.setProperty( ((Element)nodes.item(i)).getAttribute("key"), ((Element)nodes.item(i)).getAttribute("value") ); } nodes = doc.getElementsByTagName("currencySymbol"); String currencySymbol = nodes.item(0).getChildNodes().item(0).getNodeValue(); nodes = doc.getElementsByTagName("decimalSymbol"); char decimalSymbol = nodes.item(0).getChildNodes().item(0).getNodeValue().charAt(0); nodes = doc.getElementsByTagName("groupingSymbol"); char groupingSymbol = nodes.item(0).getChildNodes().item(0).getNodeValue().charAt(0); nodes = doc.getElementsByTagName("dateFormat"); String dateFormatStr = nodes.item(0).getChildNodes().item(0).getNodeValue(); int dateFormat = -1; if (dateFormatStr.equals("DMY")) dateFormat = Resources.DMY; else if (dateFormatStr.equals("MDY")) dateFormat = Resources.MDY; else if (dateFormatStr.equals("YDM")) dateFormat = Resources.YDM; else if (dateFormatStr.equals("YMD")) dateFormat = Resources.YMD; nodes = doc.getElementsByTagName("showCenturyInDateFormat"); boolean showCenturyInDateFormat = nodes.item(0).getChildNodes().item(0).getNodeValue().toLowerCase().equals("true"); nodes = doc.getElementsByTagName("dateFormatSeparator"); char dateFormatSeparator = nodes.item(0).getChildNodes().item(0).getNodeValue().charAt(0); nodes = doc.getElementsByTagName("timeFormat"); String timeFormat = nodes.item(0).getChildNodes().item(0).getNodeValue(); in.close(); resources = new Resources( p, currencySymbol, decimalSymbol, groupingSymbol, dateFormat, showCenturyInDateFormat, dateFormatSeparator, timeFormat, langId, showResourceNotFoundWarning ); allResources.put(langId,resources); return resources; } catch (Throwable ex) { String msg = "Error while loading internationalization settings for language '"+langId+"'"+ "\nin file: "+new File(xmlFile).getAbsolutePath(); System.err.println(msg); ex.printStackTrace(); return this.resources; } } } }