Martin Kočí created MYFACES-3545:
------------------------------------

             Summary: FACELETS_REFRESH_PERIOD > 0 + .xhtml in .jar = Too many 
open files 
                 Key: MYFACES-3545
                 URL: https://issues.apache.org/jira/browse/MYFACES-3545
             Project: MyFaces Core
          Issue Type: Bug
          Components: General
    Affects Versions: 2.1.7
         Environment: myfaces trunk
            Reporter: Martin Kočí
            Assignee: Martin Kočí


this is a classic one:
https://issues.apache.org/jira/browse/TRINIDAD-73
https://issues.apache.org/jira/browse/MYFACES-1982

>From 
>http://www.mail-archive.com/[email protected]/msg20937.html:

" .... It's a bug in Sun's JarURLConnection. The workaround should solve the 
problems even in 
development mode.


When you open an URL connection to an entry in a jar, you get a
JarURLConnection. The JarURLConnection in the package
sun.net.www.protocol.jar has an internal field

    /* the url connection for the JAR file */
    private URLConnection jarFileURLConnection;

which you cannot access in any way. When you ask for the last modified
time, the JarURLConnection will ask for the header field
"last-modified", which in turn will ask the jarFileURLConnection for the
that header field, which in turn will cause the initializeHeaders() call
in FileURLConnection, which in turn calls connect() and opens the file
(even though for the last modified header that is quite unnecessary).
The way to close the file is to call getInputStream().close() on the
jarFileURLConnection field, but unfortunately you can't since it is hidden.

There is a very simple workaround though. In code:

            URL url = new URL("jar:file:jarfile.jar!Entry.class");
            URLConnection connection = url.openConnection();
            if (connection instanceof JarURLConnection) {
                JarURLConnection jarUrlConnection = (JarURLConnection)
connection;
                URL jarFileUrl = jarUrlConnection.getJarFileURL();
                URLConnection jarFileConnection =
jarFileUrl.openConnection();
                long lastModified = jarFileConnection.getLastModified();
                jarFileConnection.getInputStream().close();
                System.out.println("last modified=" + new
Date(lastModified));
            }
... "

This little hack is not done in myfaces DefaultFaceletFactory and 
FaceletCacheImpl.

Simple workaround is:  javax.faces.FACELETS_REFRESH_PERIOD=0 in Development 
stage

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira


Reply via email to