diff -r 211a5e73d119 netx/net/sourceforge/jnlp/cache/CacheUtil.java --- a/netx/net/sourceforge/jnlp/cache/CacheUtil.java Mon Apr 18 17:38:31 2011 -0400 +++ b/netx/net/sourceforge/jnlp/cache/CacheUtil.java Mon Apr 18 22:58:38 2011 -0400 @@ -533,6 +533,15 @@ // First we want to figure out which stuff we need to delete. HashSet<String> keep = new HashSet<String>(); lruHandler.load(); + + long maxSize = -1; // Default + try { + maxSize = Long.parseLong(JNLPRuntime.getConfiguration().getProperty("deployment.cache.max.size")); + } catch (NumberFormatException nfe) { + } + + maxSize = maxSize << 20; // Convert to byte (Should not overflow..) + long curSize = 0; for (Entry<String, String> e : lruHandler.getLRUSortedEntries()) { // Check if the item is contained in cacheOrder. @@ -540,16 +549,19 @@ final String value = e.getValue(); if (value != null) { + File file = new File(value); PropertiesFile pf = new PropertiesFile(new File(value + ".info")); boolean delete = Boolean.parseBoolean(pf.getProperty("delete")); // This will get me the root directory specific to this cache item. - String rStr = value.substring(cacheDir.length()); + String rStr = file.getPath().substring(cacheDir.length()); rStr = cacheDir + rStr.substring(0, rStr.indexOf(File.separatorChar, 1)); + long len = file.length(); - if (delete || keep.contains(rStr)) { + if (delete || !file.isFile() || (maxSize >= 0 && curSize + len > maxSize) || keep.contains(rStr)) { lruHandler.removeEntry(key); } else { + curSize += len; keep.add(value.substring(rStr.length())); keep.add(rStr); // We can just use the same map, since these two things are disjoint with each other. }