cvs commit: jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/loader WebappClassLoader.java WebappLoader.java
remm2004/07/26 08:52:17 Modified:catalina/src/share/org/apache/catalina/loader WebappClassLoader.java WebappLoader.java Log: - Update to use a flag for the anti JAR locking code. It isn't as foolproof as the other one, since you can't just delete a WAR or expanded folder to undeploy (on Windows, of course). - I think the two flags together will cover all the needs. Revision ChangesPath 1.40 +37 -12 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java Index: WebappClassLoader.java === RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java,v retrieving revision 1.39 retrieving revision 1.40 diff -u -r1.39 -r1.40 --- WebappClassLoader.java23 Jul 2004 22:40:11 - 1.39 +++ WebappClassLoader.java26 Jul 2004 15:52:17 - 1.40 @@ -160,6 +160,13 @@ protected static final StringManager sm = StringManager.getManager(Constants.Package); + +/** + * Use anti JAR locking code, which does URL rerouting when accessing + * resources. + */ +boolean antiJARLocking = false; + // --- Constructors @@ -405,6 +412,22 @@ /** + * @return Returns the antiJARLocking. + */ +public boolean getAntiJARLocking() { +return antiJARLocking; +} + + +/** + * @param antiJARLocking The antiJARLocking to set. + */ +public void setAntiJARLocking(boolean antiJARLocking) { +this.antiJARLocking = antiJARLocking; +} + + +/** * If there is a Java SecurityManager create a read FilePermission * or JndiPermission for the file directory path. * @@ -1027,17 +1050,19 @@ if (url != null) { // Locating the repository for special handling in the case // of a JAR -ResourceEntry entry = (ResourceEntry) resourceEntries.get(name); -try { -String repository = entry.codeBase.toString(); -if ((repository.endsWith(.jar)) - (!(name.endsWith(.class { -// Copy binary content to the work directory if not present -File resourceFile = new File(loaderDir, name); -url = resourceFile.toURL(); +if (antiJARLocking) { +ResourceEntry entry = (ResourceEntry) resourceEntries.get(name); +try { +String repository = entry.codeBase.toString(); +if ((repository.endsWith(.jar)) + (!(name.endsWith(.class { +// Copy binary content to the work directory if not present +File resourceFile = new File(loaderDir, name); +url = resourceFile.toURL(); +} +} catch (Exception e) { +// Ignore } -} catch (Exception e) { -// Ignore } if (log.isDebugEnabled()) log.debug( -- Returning ' + url.toString() + '); @@ -1766,7 +1791,7 @@ } // Extract resources contained in JAR to the workdir -if (!(path.endsWith(.class))) { +if (antiJARLocking !(path.endsWith(.class))) { byte[] buf = new byte[1024]; File resourceFile = new File (loaderDir, jarEntry.getName()); 1.31 +3 -1 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/loader/WebappLoader.java Index: WebappLoader.java === RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/loader/WebappLoader.java,v retrieving revision 1.30 retrieving revision 1.31 diff -u -r1.30 -r1.31 --- WebappLoader.java 23 Jul 2004 22:40:11 - 1.30 +++ WebappLoader.java 26 Jul 2004 15:52:17 - 1.31 @@ -645,6 +645,8 @@ classLoader = createClassLoader(); classLoader.setResources(container.getResources()); classLoader.setDelegate(this.delegate); +if (container instanceof StandardContext) +classLoader.setAntiJARLocking(((StandardContext) container).getAntiJARLocking()); for (int i = 0; i repositories.length; i++) { classLoader.addRepository(repositories[i]);
cvs commit: jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/loader WebappClassLoader.java WebappLoader.java
remm2004/07/23 15:40:11 Modified:catalina/src/share/org/apache/catalina/loader WebappClassLoader.java WebappLoader.java Log: - enum - enumeration (JDK 1.5 update). Revision ChangesPath 1.39 +7 -7 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java Index: WebappClassLoader.java === RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java,v retrieving revision 1.38 retrieving revision 1.39 diff -u -r1.38 -r1.39 --- WebappClassLoader.java3 Jul 2004 19:51:14 - 1.38 +++ WebappClassLoader.java23 Jul 2004 22:40:11 - 1.39 @@ -703,10 +703,10 @@ if (getJarPath() != null) { try { -NamingEnumeration enum = resources.listBindings(getJarPath()); +NamingEnumeration enumeration = resources.listBindings(getJarPath()); int i = 0; -while (enum.hasMoreElements() (i length)) { -NameClassPair ncPair = (NameClassPair) enum.nextElement(); +while (enumeration.hasMoreElements() (i length)) { +NameClassPair ncPair = (NameClassPair) enumeration.nextElement(); String name = ncPair.getName(); // Ignore non JARs present in the lib folder if (!name.endsWith(.jar)) @@ -719,10 +719,10 @@ } i++; } -if (enum.hasMoreElements()) { -while (enum.hasMoreElements()) { +if (enumeration.hasMoreElements()) { +while (enumeration.hasMoreElements()) { NameClassPair ncPair = -(NameClassPair) enum.nextElement(); +(NameClassPair) enumeration.nextElement(); String name = ncPair.getName(); // Additional non-JAR files are allowed if (name.endsWith(.jar)) { 1.30 +7 -7 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/loader/WebappLoader.java Index: WebappLoader.java === RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/loader/WebappLoader.java,v retrieving revision 1.29 retrieving revision 1.30 diff -u -r1.29 -r1.30 --- WebappLoader.java 23 Jun 2004 16:59:41 - 1.29 +++ WebappLoader.java 23 Jul 2004 22:40:11 - 1.30 @@ -985,10 +985,10 @@ // Looking up directory /WEB-INF/lib in the context try { -NamingEnumeration enum = resources.listBindings(libPath); -while (enum.hasMoreElements()) { +NamingEnumeration enumeration = resources.listBindings(libPath); +while (enumeration.hasMoreElements()) { -Binding binding = (Binding) enum.nextElement(); +Binding binding = (Binding) enumeration.nextElement(); String filename = libPath + / + binding.getName(); if (!filename.endsWith(.jar)) continue; @@ -1137,10 +1137,10 @@ try { -NamingEnumeration enum = srcDir.list(); -while (enum.hasMoreElements()) { +NamingEnumeration enumeration = srcDir.list(); +while (enumeration.hasMoreElements()) { NameClassPair ncPair = -(NameClassPair) enum.nextElement(); +(NameClassPair) enumeration.nextElement(); String name = ncPair.getName(); Object object = srcDir.lookup(name); File currentFile = new File(destDir, name); - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
cvs commit: jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/loader WebappClassLoader.java WebappLoader.java
remm2003/06/15 00:22:16 Modified:catalina/src/share/org/apache/catalina/loader WebappClassLoader.java WebappLoader.java Log: - Add a machanism to release JAR objects periodically. - This should decrease classloading performance because of a big sync block during JAR access, but lookup of previously loaded class will behave the same as before. - Add a workaround for JAR locking with XML processing and getResource. If the resource was loaded from a JAR, it will be extracted as needed to the work directory. Revision ChangesPath 1.17 +163 -59 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java Index: WebappClassLoader.java === RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- WebappClassLoader.java12 Jun 2003 22:02:12 - 1.16 +++ WebappClassLoader.java15 Jun 2003 07:22:16 - 1.17 @@ -61,6 +61,7 @@ package org.apache.catalina.loader; import java.io.File; +import java.io.FileOutputStream; import java.io.FilePermission; import java.io.InputStream; import java.io.ByteArrayInputStream; @@ -285,6 +286,12 @@ /** + * Last time a JAR was accessed. + */ +protected long lastJarAccessed = 0L; + + +/** * The list of local repositories, in the order they should be searched * for locally loaded classes or resources. */ @@ -348,6 +355,12 @@ /** + * Path where resources loaded from JARs will be extracted. + */ +private File loaderDir = null; + + +/** * The PermissionCollection for each CodeSource for a web * application context. */ @@ -534,6 +547,14 @@ } +/** + * Change the work directory. + */ +public void setWorkDir(File workDir) { +this.loaderDir = new File(workDir, loader); +} + + // --- Reloader Methods @@ -977,15 +998,18 @@ } // Looking at the JAR files -for (i = 0; i jarFilesLength; i++) { -JarEntry jarEntry = jarFiles[i].getJarEntry(name); -if (jarEntry != null) { -try { -String jarFakeUrl = getURI(jarRealFiles[i]).toString(); -jarFakeUrl = jar: + jarFakeUrl + !/ + name; -result.addElement(new URL(jarFakeUrl)); -} catch (MalformedURLException e) { -// Ignore +synchronized (jarFiles) { +openJARs(); +for (i = 0; i jarFilesLength; i++) { +JarEntry jarEntry = jarFiles[i].getJarEntry(name); +if (jarEntry != null) { +try { +String jarFakeUrl = getURI(jarRealFiles[i]).toString(); +jarFakeUrl = jar: + jarFakeUrl + !/ + name; +result.addElement(new URL(jarFakeUrl)); +} catch (MalformedURLException e) { +// Ignore +} } } } @@ -1052,6 +1076,33 @@ // (2) Search local repositories url = findResource(name); if (url != null) { +// Locating the repository for special handling in the case +// of a JAR +ResourceEntry entry = (ResourceEntry) resourceEntries.get(name); +FileOutputStream os = null; +try { +String repository = entry.codeBase.toString(); +if (repository.endsWith(.jar)) { +// Copy binary content to the work directory if not present +File resourceFile = new File(loaderDir, name); +if (entry.lastModified resourceFile.lastModified()) { +resourceFile.getParentFile().mkdirs(); +os = new FileOutputStream(resourceFile); +os.write(entry.binaryContent); +} +url = resourceFile.toURL(); +} +} catch (Exception e) { +// Ignore +e.printStackTrace(); +} finally { +if (os != null) { +try { +os.close(); +} catch (IOException ex) { +} +} +} if (log.isDebugEnabled()) log.debug( -- Returning ' + url.toString() + '); return (url);
cvs commit: jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/loader WebappClassLoader.java WebappLoader.java
glenn 2003/03/08 09:01:20 Modified:catalina/src/share/org/apache/catalina/loader WebappClassLoader.java WebappLoader.java Log: Port bug #17775 patch from Tomcat 4 Revision ChangesPath 1.15 +19 -4 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java Index: WebappClassLoader.java === RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- WebappClassLoader.java4 Feb 2003 07:24:22 - 1.14 +++ WebappClassLoader.java8 Mar 2003 17:01:20 - 1.15 @@ -464,14 +464,27 @@ * @param path file directory path */ public void addPermission(String path) { +if (path == null) { +return; +} + if (securityManager != null) { Permission permission = null; if( path.startsWith(jndi:) || path.startsWith(jar:jndi:) ) { +if (!path.endsWith(/)) { +path = path + /; +} permission = new JndiPermission(path + *); +addPermission(permission); } else { -permission = new FilePermission(path + -,read); +if (!path.endsWith(File.separator)) { +permission = new FilePermission(path, read); +addPermission(permission); +path = path + File.separator; +} +permission = new FilePermission(path + -, read); +addPermission(permission); } -addPermission(permission); } } @@ -483,7 +496,9 @@ * @param url URL for a file or directory on local system */ public void addPermission(URL url) { -addPermission(url.toString()); +if (url != null) { +addPermission(url.toString()); +} } 1.8 +15 -28 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/loader/WebappLoader.java Index: WebappLoader.java === RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/loader/WebappLoader.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- WebappLoader.java 26 Feb 2003 20:20:39 - 1.7 +++ WebappLoader.java 8 Mar 2003 17:01:20 - 1.8 @@ -898,37 +898,28 @@ String contextRoot = servletContext.getRealPath(/); if (contextRoot != null) { try { -contextRoot = -(new File(contextRoot)).getCanonicalPath() -+ File.separator; +contextRoot = (new File(contextRoot)).getCanonicalPath(); classLoader.addPermission(contextRoot); } catch (IOException e) { // Ignore } } -URL classesURL = -servletContext.getResource(/WEB-INF/classes/); -if (classesURL != null) -classLoader.addPermission(classesURL); - +URL classesURL = servletContext.getResource(/WEB-INF/classes/); +classLoader.addPermission(classesURL); URL libURL = servletContext.getResource(/WEB-INF/lib/); -if (libURL != null) { -classLoader.addPermission(libURL); -} +classLoader.addPermission(libURL); if (contextRoot != null) { if (libURL != null) { File rootDir = new File(contextRoot); File libDir = new File(rootDir, WEB-INF/lib/); -String path = null; try { -path = libDir.getCanonicalPath() + File.separator; +String path = libDir.getCanonicalPath(); +classLoader.addPermission(path); } catch (IOException e) { } -if (path != null) -classLoader.addPermission(path); } } else { @@ -936,23 +927,19 @@ if (workDir != null) { if (libURL != null) { File libDir = new File(workDir, WEB-INF/lib/); -String path = null; try { -path = libDir.getCanonicalPath() + File.separator; +String path =