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
20
21
22
23
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
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
68
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
82 return loader.getResourceAsStream(resourceName);
83 }
84 });
85 }
86
87
88
89
90
91
92 public Charset getEncoding() {
93 return encoding;
94 }
95
96 }