You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@velocity.apache.org by "Atsushi Isobe (JIRA)" <de...@velocity.apache.org> on 2009/05/08 14:03:45 UTC
[jira] Updated: (VELOCITY-715) Leaked object in
FileResourceLoader#templatePaths
[ https://issues.apache.org/jira/browse/VELOCITY-715?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Atsushi Isobe updated VELOCITY-715:
-----------------------------------
Remaining Estimate: (was: 1h)
Original Estimate: (was: 1h)
> Leaked object in FileResourceLoader#templatePaths
> -------------------------------------------------
>
> Key: VELOCITY-715
> URL: https://issues.apache.org/jira/browse/VELOCITY-715
> Project: Velocity
> Issue Type: Bug
> Components: Engine
> Environment: Sun JRE 6 Update 13
> Reporter: Atsushi Isobe
> Priority: Minor
>
> org.apache.velocity.runtime.resource.loader.FileResourceLoader#templatePaths has stored templatename and real file path permanently.So if VelocityEngine#getTemplate(String) has called by too many files, #templatePaths have been enlarged.
> Below my patch and test class.
> ---------------------------------------------------------------------------
> --- ./src/java/org/apache/velocity/runtime/resource/loader/FileResourceLoader.java (revision 772904)
> +++ ./src/java/org/apache/velocity/runtime/resource/loader/FileResourceLoader.java (working copy)
> @@ -30,6 +30,7 @@
> import java.util.HashMap;
> import java.util.List;
> import java.util.Map;
> +import java.util.WeakHashMap;
>
> import org.apache.commons.collections.ExtendedProperties;
> import org.apache.velocity.exception.ResourceNotFoundException;
> @@ -61,7 +62,7 @@
> * times of the files. This is synchronizedMap
> * instance.
> */
> - private Map templatePaths = Collections.synchronizedMap(new HashMap());
> + private Map templatePaths = Collections.synchronizedMap(new WeakHashMap());
>
> /** Shall we inspect unicode files to see what encoding they contain?. */
> private boolean unicode = false;
> @@ -330,8 +331,8 @@
> currentFile = testFile;
> }
> }
> - File file = getFile(path, fileName);
> - if (currentFile == null || !file.exists())
> + File file = path != null ? getFile(path, fileName) : null;
> + if (currentFile == null || file == null || !file.exists())
> {
> /*
> * noop: if the file is missing now (either the cached
> @@ -365,6 +366,10 @@
> public long getLastModified(Resource resource)
> {
> String path = (String) templatePaths.get(resource.getName());
> + if (path == null)
> + {
> + return 0;
> + }
> File file = getFile(path, resource.getName());
>
> if (file.canRead())
> ---------------------------------------------------------------------------
> import java.io.File;
> import java.io.IOException;
> import java.io.StringWriter;
> import java.text.DecimalFormat;
> import java.util.Properties;
> import org.apache.commons.io.FileUtils;
> import org.apache.commons.logging.Log;
> import org.apache.commons.logging.LogFactory;
> import org.apache.velocity.Template;
> import org.apache.velocity.VelocityContext;
> import org.apache.velocity.app.Velocity;
> import org.apache.velocity.app.VelocityEngine;
> import org.apache.velocity.exception.MethodInvocationException;
> import org.apache.velocity.exception.ParseErrorException;
> import org.apache.velocity.exception.ResourceNotFoundException;
> public class FileResourceLoaderLeakedObjectTest {
> private static final String TEMPLATE_ENCODING = "UTF-8";
> private static final File TEMPLATE_DIRECTORY = new File("./");
> private static final String TEMPLATE_PREFIX = "testTemplate";
> private static final String TEMPLATE_SUFFIX = ".vm";
> private static final String TEMPLATE_STRING = "foobar";
> private static final Log log = LogFactory.getLog(FileResourceLoaderLeakedObjectTest.class);
> public static void main(String[] args) throws Exception {
> VelocityEngine ve = new VelocityEngine();
> Properties properties = new Properties();
> properties.put(Velocity.FILE_RESOURCE_LOADER_PATH, TEMPLATE_DIRECTORY.getPath());
> ve.init(properties);
> VelocityContext context = new VelocityContext();
> DecimalFormat countFormat = new DecimalFormat("000,000");
> DecimalFormat totalFormat = new DecimalFormat("000,000,000");
>
> StringWriter writer = new StringWriter();
> File tmp = null;
> for (int i = 0; i < 0x100000; i++) {
> try {
> tmp = File.createTempFile(TEMPLATE_PREFIX, TEMPLATE_SUFFIX, TEMPLATE_DIRECTORY);
> FileUtils.writeStringToFile(tmp, TEMPLATE_STRING, TEMPLATE_ENCODING);
> Template template = ve.getTemplate(tmp.getPath(), TEMPLATE_ENCODING);
> template.merge(context, writer);
> if ((i & 0xFFFF) == 0) {
> System.gc();
> Runtime runtime = Runtime.getRuntime();
> log.info(new StringBuilder("count: ").append(countFormat.format(i)).append(" total: ").append(totalFormat.format(runtime.totalMemory() - runtime.freeMemory())));
> }
> } catch (ResourceNotFoundException e) {
> log.warn("", e);
> } catch (ParseErrorException e) {
> log.warn("", e);
> } catch (MethodInvocationException e) {
> log.warn("", e);
> } catch (IOException e) {
> log.warn("", e);
> } catch (Exception e) {
> log.warn("", e);
> } finally {
> if (tmp != null && tmp.exists()) {
> tmp.delete();
> }
> }
> }
> }
> }
> ---------------------------------------------------------------------------
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@velocity.apache.org
For additional commands, e-mail: dev-help@velocity.apache.org