libreccm-legacy/ccm-core/src/com/arsdigita/globalization/LegacyInitializer.java.nolo...

163 lines
5.9 KiB
Plaintext
Executable File

/*
* Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
*
* This library 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 2.1 of
* the License, or (at your option) any later version.
*
* 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.globalization;
import com.arsdigita.initializer.Configuration;
import com.arsdigita.initializer.InitializationException;
import com.arsdigita.persistence.DataCollection;
import com.arsdigita.persistence.SessionManager;
import com.arsdigita.persistence.TransactionContext;
import java.io.ByteArrayOutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
/**
* Initialize the Globalization package
*
* Old initializer system. Needs LegacyInitializer as glue to invoke.
*
* @version $Revision: #15 $ $Date: 2004/08/16 $
*/
public class LegacyInitializer implements com.arsdigita.initializer.Initializer {
private static final String DEFAULT_CHARSET = "defaultCharset";
private static final String CHARSETS = "charsets";
private static final String LOCALES = "locales";
private static final Logger s_log = Logger.getLogger(LegacyInitializer.class);
private Configuration m_conf = new Configuration();
public LegacyInitializer() throws InitializationException {
m_conf.initParameter
(CHARSETS,
"Recognized character sets",
List.class);
m_conf.initParameter
(LOCALES,
"Recognized locales",
List.class);
m_conf.initParameter
(DEFAULT_CHARSET,
"Default character set for locales not listed",
String.class);
}
public Configuration getConfiguration() {
return m_conf;
}
public void startup() throws InitializationException {
TransactionContext txn = SessionManager.getSession().
getTransactionContext();
txn.beginTxn();
// if ( ! isLoaded() ) {
// s_log.info("Globalization Initializer is loading.");
// load();
// }
LocaleNegotiator.setApplicationLocaleProvider
(new ApplicationLocaleProvider());
LocaleNegotiator.setClientLocaleProvider(new ClientLocaleProvider());
LocaleNegotiator.setSystemLocaleProvider(new SystemLocaleProvider());
String defaultCharset = (String)m_conf.getParameter(DEFAULT_CHARSET);
Globalization.setDefaultCharset(defaultCharset);
txn.commitTxn();
}
public void shutdown() {}
private static boolean isLoaded() {
DataCollection charsets = SessionManager.getSession().
retrieve(Charset.BASE_DATA_OBJECT_TYPE);
boolean result = (charsets.size() > 0);
charsets.close();
return result;
}
private void load() throws InitializationException {
List charsets = (List) m_conf.getParameter(CHARSETS);
if ( charsets == null ) {
throw new InitializationException
("You must specify at least one charset in the \"" + CHARSETS +
"\" parameter of the globalization initaliazer in the init " +
" file. ISO-8859-1 would be a good first choice.");
}
Map charsetMap = new HashMap();
for (Iterator i=charsets.iterator(); i.hasNext(); ) {
String charsetName = (String) i.next();
// Check if this is a valid charset. Is there a better way to do
// this? - vadimn@redhat.com, Mon 2002-07-29 14:47:41 -0400
try {
new OutputStreamWriter(new ByteArrayOutputStream(), charsetName);
} catch (UnsupportedEncodingException ex) {
throw new InitializationException
(charsetName + " is not a supported charset", ex);
}
Charset charset = new Charset();
charset.setCharset(charsetName);
charset.save();
charsetMap.put(charsetName, charset);
}
List locales = (List) m_conf.getParameter(LOCALES);
if ( locales == null ) {
throw new InitializationException
("You must specify at least one locale in the \"" + LOCALES +
"\" parameter of the globalization initializer section of " +
"the init file. The \"en\" locale is probably required.");
}
for (Iterator i=locales.iterator(); i.hasNext(); ) {
List localeData = (List) i.next();
String language = (String) localeData.get(0);
String country = (String) localeData.get(1);
String variant = (String) localeData.get(2);
String charsetName = (String) localeData.get(3);
Locale locale = new Locale(language, country, variant);
Charset defaultCharset = (Charset) charsetMap.get(charsetName);
if ( defaultCharset == null ) {
throw new InitializationException
("You must list " + charsetName + " in the \"" + CHARSETS +
"\" parameter before using it in the \"" + LOCALES +
"\" parameter.");
}
locale.setDefaultCharset(defaultCharset);
locale.save();
}
}
}