Neil Griffin created PLUTO-793:
----------------------------------
Summary: TCK: Contesting assumptions of
PortletContext.getRealPath(String) in
V2EnvironmentTests_PortletContext_ApiRender_getRealPath3
Key: PLUTO-793
URL: https://issues.apache.org/jira/browse/PLUTO-793
Project: Pluto
Issue Type: Bug
Components: tck
Affects Versions: 3.0.2-TCK
Reporter: Neil Griffin
Assignee: Neil Griffin
Fix For: 3.0.3-TCK
Section 8.3.1 of the Portlet 3.0 Specification titled "Correspondence between
ServletContext and PortletContext methods" states:
{quote}
The following methods of the PortletContext should provide the same
functionality as the
methods of the ServletContext of similar name, but applied to the deployed
portlet 5 application: getAttribute, getAttributeNames, getInitParameter,
getInitParameterNames, getMimeType, getResourcePaths, getResourceAsStream,
getClassLoader, getContextPath, getEffectiveMinorVersion.
{quote}
In corresponding fashion, the Javadoc for
{{PortletContext.getRealPath(String)}} states:
{quote}
Returns a String containing the real path for a given virtual path. For
example, the path /index.html returns the absolute file path of the portlet
container file system.
The real path returned will be in a form appropriate to the computer and
operating system on which the portlet container is running, including the
proper path separators. This method returns null if the portlet container
cannot translate the virtual path to a real path for any reason (such as when
the content is being made available from a .war archive).
Parameters:
path - a String specifying a virtual path
Returns:
a String specifying the real path, or null if the transformation cannot be
performed.
{quote}
As such, the implementation for Apache Pluto simply delegates to the underlying
{{ServletContext.getRealPath(String)}}:
{code:java|title=PortletContextImpl.java}
public String getRealPath(String path) {
return servletContext.getRealPath(path);
}
{code}
And the [corresponding Java EE 7 Javadoc for
ServletContext.getRealPath(String)|https://docs.oracle.com/javaee/7/api/javax/servlet/ServletContext.html#getRealPath-java.lang.String-]
states:
{quote}
This method returns null if the servlet container is unable to translate the
given virtual path to a real path.
{quote}
Given that background, the TCK test for
V2EnvironmentTests_PortletContext_ApiRender_getRealPath3 looks like the
following
{code:java|title=EnvironmentTests_PortletContext_ApiRender.java}
try {
String realPath =
pc.getRealPath("&^*#\\/V2EnvironmentTests_PortletContext_ApiRender_getMimeType4.invalid");
if (realPath == null) {
tr18.setTcSuccess(true);
} else {
tr18.appendTcDetail("Failed because real path is not null but " +
realPath);
}
} catch (Exception e) {
tr18.appendTcDetail(e.toString());
}
{code}
The basic assumption of the test is that leading characters (such as those that
are invalid for a filename like {{*}} would cause the underlying
{{ServletContext.getRealPath(String)}} to return null. However, the Javadoc
does not explicitly say that -- in fact, the Javadoc doesn't even require the
"real path" of the file to physically exist.
This issue is contesting the validity of this test, because it assumes the
behavior of the underlying servlet container implementation. In the case of
Apache Pluto, that would be Apache Tomcat.
Case-in-point: When Pluto 3.1.1 was upgraded to Tomcat 8.5.69 via PLUTO-788,
this TCK test started to fail. The reason why is because of [Tomcat Bugzilla
Issue#56890|https://bz.apache.org/bugzilla/show_bug.cgi?id=56890] in which
Tomcat versions 8.5.61 (and above) to automatically prepend a forward slash (/)
character to the specified virtual path. It turns out that the lack of a
leading forward slash was the only reason for Tomcat's implementation of
{{{ServetlContext.getRealPath(String)}} to ever return {{null}}. And this was
done in response to [Servlet API
Issue#105|https://github.com/eclipse-ee4j/servlet-api/issues/105#issuecomment-734729939],
where the Tomcat developer states:
{quote}
[I will] update Tomcat to be less strict (Tomcat currently requires a "/")"
{quote}
In all my attempts running Pluto with Tomcat 8.5.69, I have not been able to
pass a non-null String value to the Pluto
{{PortletContext.getRealPath(String)}} method and get {{null}} as a return
value.
The only way I can get it to return {{null}} is by passing {{null}}. In order
to fix the problem, I will modify TCK test to pass {{null}}, but that might
also be an assumption of the behavior of the underlying servlet container
implementation.
--
This message was sent by Atlassian Jira
(v8.20.1#820001)