EncodingControl.java
- package com.gh.mygreen.xlsmapper.localization;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.nio.charset.Charset;
- import java.security.AccessController;
- import java.security.PrivilegedActionException;
- import java.security.PrivilegedExceptionAction;
- import java.util.Locale;
- import java.util.PropertyResourceBundle;
- import java.util.ResourceBundle;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- /**
- * {@link ResourceBundle}を任意の文字コードで読み込むためのコントローラ。
- *
- * @since 2.0
- * @author T.TSUCHIE
- *
- */
- public class EncodingControl extends ResourceBundle.Control {
-
- private static final Logger logger = LoggerFactory.getLogger(EncodingControl.class);
-
- private static final String SUPPORT_FORMAT = "java.properties";
-
- private final Charset encoding;
-
- /**
- * 文字コードUTF-8で設定する
- */
- public EncodingControl() {
- this("UTF-8");
- }
-
- public EncodingControl(final String encoding) {
- this(Charset.forName(encoding));
- }
-
- public EncodingControl(final Charset encoding) {
- this.encoding = encoding;
- }
-
- @Override
- public ResourceBundle newBundle(final String baseName, final Locale locale, final String format,
- final ClassLoader loader, final boolean reload)
- throws IllegalAccessException, InstantiationException, IOException {
- if(format.equals(SUPPORT_FORMAT)) {
- final String bundleName = toBundleName(baseName, locale);
- final String resourceName = toResourceName(bundleName, "properties");
-
- try (InputStream stream = getResourceStream(loader, resourceName)) {
- try (InputStreamReader isr = new InputStreamReader(stream, encoding)) {
- return new PropertyResourceBundle(isr);
- }
- } catch (PrivilegedActionException e) {
- throw(IOException) e.getException();
- }
- } else {
- // 「java.class」はサポートしない。
- // プロパティファイル(java.properties)のみサポートする。
- logger.trace("Not support format. baseName={}, format={}, reload={}.", baseName, format, reload);
- return null;
- }
- }
-
- private InputStream getResourceStream(final ClassLoader loader, final String resourceName) throws PrivilegedActionException {
-
- return AccessController.doPrivileged(new PrivilegedExceptionAction<InputStream>() {
-
- @Override
- public InputStream run() throws IOException {
- // realod=trueのときもキャッシュを使用せずに新しく読み込む。
- return loader.getResourceAsStream(resourceName);
- }
- });
- }
-
- /**
- * 設定されている文字コードを取得します。
- * @return リソースファイルの文字コード。
- */
- public Charset getEncoding() {
- return encoding;
- }
- }