I want to implement resource SPI that change behavior of retreiving messages properties .
I want to not get messages from parent theme (base) . only take message from the currents message .
I am strugling with implementing this SPI , because i do not know How to get the classLoader to get message bundle .
I try this but it does not work . could you please have a example that implement ThemeResourceProviderFactory.
My example here :
public class CustomThemeResourceprovider implements ThemeResourceProvider{
protected static final Logger logger = Logger.getLogger(CustomClasspathThemeResourceProviderFactory.class);
public static final String THEME_RESOURCES_TEMPLATES = "theme-resources/templates/";
public static final String THEME_RESOURCES_RESOURCES = "theme-resources/resources/";
public static final String THEME_RESOURCES_MESSAGES = "theme-resources/messages/";
private final ClassLoader classLoader;
public CustomThemeResourceprovider(ClassLoader classLoader) {
this.classLoader = classLoader;
}
@Override
public void close() {
// TODO Auto-generated method stub
}
@Override
public URL getTemplate(String name) throws IOException {
return classLoader.getResource(THEME_RESOURCES_TEMPLATES + name);
}
@Override
public InputStream getResourceAsStream(String path) throws IOException {
logger.info("******* path " + path);
return classLoader.getResourceAsStream(THEME_RESOURCES_RESOURCES + path);
}
@Override
public Properties getMessages(String baseBundlename, Locale locale) throws IOException {
Properties m = new Properties();
Locale myLocale = locale ;
logger.info("************ input locale " + myLocale);
InputStream in = classLoader.getResourceAsStream(THEME_RESOURCES_MESSAGES + baseBundlename + "_" + myLocale.toString() + ".properties");
// logger.info("************ Inial InputStream " + in);
if(in == null) {
myLocale = Locale.ENGLISH ;
in = classLoader.getResourceAsStream(THEME_RESOURCES_MESSAGES + baseBundlename + "_" + myLocale.toString() + ".properties");
//logger.info("************ English InputStream " + in);
}
if(in != null){
logger.info("************ in " + in);
Charset encoding = PropertiesUtil.detectEncoding(in);
// detectEncoding closes the stream
try (Reader reader = new InputStreamReader(
classLoader.getResourceAsStream(THEME_RESOURCES_MESSAGES + baseBundlename + "_" + myLocale.toString() + ".properties"), encoding)) {
m.load(reader);
}
}
return m;
}
}