Uploaded image for project: 'MyFaces Core'
  1. MyFaces Core
  2. MYFACES-4002

Regression? - References to external entities not working with WebXmlParser

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Not A Problem
    • 2.2.4
    • None
    • None
    • None
    • Myfaces 2.2.4, Tomcat 8.0.23, JDK 1.8_20, Windows 7 64bit

    Description

      I've searched JIRA and there are a few issues related to WebXmlParser, but this seems almost like a recurrence of MYFACES-1754.

      My web.xml is split into multiple files, each declared as an XML entity relative to the web.xml file itself:

      <!ENTITY contextparams	SYSTEM	"webxml/context-params.xml">
      

      (As a side note I used to use jndi:/localhost/WEB-INF/webxml/context-params.xml, but for some reason Tomcat 8 claims that jndi is an invalid protocol).

      Using resource relative system identifiers Tomcat is now happy and the context starts correctly. However, during its initialization MyFaces re-parses the web.xml descriptor and resolves the entities incorrectly, leading to failure with the message:

      2015-06-17 15:48:13.853 [localhost-startStop-1] ERROR o.a.m.s.w.webxml.WebXmlParser - Unable to parse web.xml
      java.lang.IllegalArgumentException: The resource path [file:///WEB-INF/webxml/context-params.xml] is not valid
      

      The solution is to remove the file:// prefix before passing to the external context to resolve, as in this patch:

      Index: org/apache/myfaces/shared_impl/webapp/webxml/WebXmlParser.java
      ===================================================================
      --- WebXmlParser.java	(revision ???)
      +++ WebXmlParser.java	(working copy)
      @@ -138,6 +138,9 @@
       
           private InputSource createContextInputSource(String publicId, String systemId)
           {
      +        if(systemId.startsWith("file:")) {
      +            systemId = systemId.substring(7); // remove file://
      +        }
               InputStream inStream = _context.getResourceAsStream(systemId);
               if (inStream == null)
               {
      
      

      Those three lines of code are based on other work by the MyFaces team (org.apache.myfaces.config.impl.FacesConfigEntityResolver) and even if it weren't is made available free of charge and free from license restrictions.

      Attachments

        1. patch1.txt
          0.6 kB
          Thomas Timbul

        Issue Links

          Activity

            People

              Unassigned Unassigned
              ttimbul Thomas Timbul
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: