[jira] [Created] (PLUTO-765) The wrong ClassLoader is used to load the portlet ResourceBundle in portlet-skin.jsp
"Neil Griffin (JIRA)" <[email protected]> Wed, 3 Apr 2019 19:04:00 +0000 (UTC)
| Newsgroups | gmane.comp.jakarta.pluto.devel |
|---|---|
| Message-ID | <[email protected]> |
Neil Griffin created PLUTO-765:
----------------------------------
Summary: The wrong ClassLoader is used to load the portlet ResourceBundle in portlet-skin.jsp
Key: PLUTO-765
URL: https://issues.apache.org/jira/browse/PLUTO-765
Project: Pluto
Issue Type: Bug
Components: portlet container
Affects Versions: 3.0.1, 3.0.0
Reporter: Neil Griffin
Assignee: Neil Griffin
Fix For: 3.0.2
As shown in the following code fragment, portlet-skin.jsp uses the <pluto:title/> JSP tag in order to render the title of each portlet on the portal page:
{code:xml|title=portlet-skin.jsp}
<!-- Use pluto portlet tag to render the portlet -->
<pluto:portlet portletId="${portlet}">
<!-- Assemble the rendering result -->
<div class="portlet">
<table class="header" width="100%">
<tr>
<td class="header" align="left">
<!-- Portlet Title -->
<h2 class="title"><pluto:title/></h2>
</td>
...
</tr>
...
<table>
...
</pluto:portlet>
{code}
This in turn invokes {{PortletTitleTag.doStartTag()}} which does the following:
{code:java|tile=PortletTitleTag.java}
...
PortletConfig config = driverConfig.getPortletConfig(portletId);
...
Locale defaultLocale = request.getLocale();
ResourceBundle bundle = config.getResourceBundle(defaultLocale);
title = bundle.getString("javax.portlet.title");
{code}
The call to {{config.getResourceBundle(defaultLocale)}} eventually calls {{DriverPortletConfigImpl.getResourceBundle(Locale)}} which in turn calls {{ResourceBundleFactory.getResourceBundle(Locale)}}.
The {{ResourceBundleFactory.getResourceBundle(Locale)}} method uses the [TCCL|https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#getContextClassLoader()] in order to load the resource bundle resource:
{code:java|title=ResourceBundleFactory.java}
ClassLoader loader = Thread.currentThread().getContextClassLoader();
bundle = ResourceBundle.getBundle(bundleName, locale, loader);
{code}
The problem is that the {{ClassLoader}} associated with portlet-skin is the one for the "/pluto" webapp context, not the one for the portlet. This causes the resource bundle lookup to fail, which in turn causes the resource bundle cache to contain a bundle that has no property values.
One possible fix for this problem would be to ensure that the portlet itself obtains the resource bundle before pluto-skin.jsp tries to do it.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)