[ 
https://issues.apache.org/jira/browse/PLUTO-793?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Neil Griffin closed PLUTO-793.
------------------------------
    Resolution: Fixed

> 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
>            Priority: Major
>             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)

Reply via email to