View Javadoc
1   package com.github.mygreen.supercsv.localization;
2   
3   import java.io.BufferedReader;
4   import java.io.IOException;
5   import java.io.InputStream;
6   import java.io.InputStreamReader;
7   import java.nio.charset.Charset;
8   import java.security.AccessController;
9   import java.security.PrivilegedActionException;
10  import java.security.PrivilegedExceptionAction;
11  import java.util.Locale;
12  import java.util.PropertyResourceBundle;
13  import java.util.ResourceBundle;
14  
15  import org.slf4j.Logger;
16  import org.slf4j.LoggerFactory;
17  
18  /**
19   * {@link ResourceBundle}を任意の文字コードで読み込むためのコントローラ。
20   * プロパティファイル形式のみサポートします。
21   *
22   * @since 2.2
23   * @author T.TSUCHIE
24   *
25   */
26  public class EncodingControl extends ResourceBundle.Control {
27      
28      private static final Logger logger = LoggerFactory.getLogger(EncodingControl.class);
29      
30      private static final String SUPPORT_FORMAT = "java.properties";
31      
32      private final Charset encoding;
33      
34      /**
35       * 文字コードUTF-8で設定する
36       */
37      public EncodingControl() {
38          this("UTF-8");
39      }
40      
41      public EncodingControl(final String encoding) {
42          this(Charset.forName(encoding));
43      }
44      
45      public EncodingControl(final Charset encoding) {
46          this.encoding = encoding;
47      }
48      
49      @Override
50      public ResourceBundle newBundle(final String baseName, final Locale locale, final String format,
51              final ClassLoader loader, final boolean reload)
52              throws IllegalAccessException, InstantiationException, IOException {
53  
54          if(format.equals(SUPPORT_FORMAT)) {
55              final String bundleName = toBundleName(baseName, locale);
56              final String resourceName = toResourceName(bundleName, "properties");
57              
58              try (InputStream stream = getResourceStream(loader, resourceName);
59                      InputStreamReader isr = new InputStreamReader(stream, encoding);
60                      BufferedReader reader = new BufferedReader(isr)) {
61                  return new PropertyResourceBundle(reader);
62              } catch (PrivilegedActionException e) {
63                  throw(IOException) e.getException();
64              }
65  
66          } else {
67              // 「java.class」はサポートしない。
68              // プロパティファイル(java.properties)のみサポートする。
69              logger.trace("Not support format. baseName={}, format={}, reload={}.", baseName, format, reload);
70              return null;
71          }
72  
73      }
74      
75      private InputStream getResourceStream(final ClassLoader loader, final String resourceName) throws PrivilegedActionException {
76         
77          return AccessController.doPrivileged(new PrivilegedExceptionAction<InputStream>() {
78              
79              @Override
80              public InputStream run() throws IOException {
81                  // realod=trueのときもキャッシュを使用せずに新しく読み込む。
82                  return loader.getResourceAsStream(resourceName);
83              }
84          });
85      }
86      
87      
88      /**
89       * 設定されている文字コードを取得します。
90       * @return リソースファイルの文字コード。
91       */
92      public Charset getEncoding() {
93          return encoding;
94      }
95  
96  }