diff options
author | Thomas Meyer <[email protected]> | 2012-05-11 21:33:54 +0200 |
---|---|---|
committer | Thomas Meyer <[email protected]> | 2012-05-11 21:33:54 +0200 |
commit | c2accc0a5995cbcc6587db76faa9043326b864ec (patch) | |
tree | 69880115b3a617f3d2345c42badaf41ad39569f4 /netx/net/sourceforge/jnlp | |
parent | e4c39211e39e630a47d0394a69529f9dbcd4d37c (diff) |
Reduce no. of loads of the cache index file
Diffstat (limited to 'netx/net/sourceforge/jnlp')
-rw-r--r-- | netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java | 6 | ||||
-rw-r--r-- | netx/net/sourceforge/jnlp/services/XPersistenceService.java | 3 | ||||
-rw-r--r-- | netx/net/sourceforge/jnlp/util/PropertiesFile.java | 65 |
3 files changed, 49 insertions, 25 deletions
diff --git a/netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java b/netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java index a1eef67..4a23520 100644 --- a/netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java +++ b/netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java @@ -108,11 +108,11 @@ enum CacheLRUWrapper { * Update map for keeping track of recently used items. */ public synchronized void load() { - cacheOrder.load(); + boolean loaded = cacheOrder.load(); /* * clean up possibly corrupted entries */ - if (checkData()) { + if (loaded && checkData()) { if (JNLPRuntime.isDebug()) { new LruCacheException().printStackTrace(); } @@ -125,7 +125,7 @@ enum CacheLRUWrapper { /** * check content of cacheOrder and remove invalid/corrupt entries * - * @return true, if cache was coruupted and affected entry removed + * @return true, if cache was corrupted and affected entry removed */ private boolean checkData () { boolean modified = false; diff --git a/netx/net/sourceforge/jnlp/services/XPersistenceService.java b/netx/net/sourceforge/jnlp/services/XPersistenceService.java index 3e847c9..f3a638f 100644 --- a/netx/net/sourceforge/jnlp/services/XPersistenceService.java +++ b/netx/net/sourceforge/jnlp/services/XPersistenceService.java @@ -127,9 +127,10 @@ class XPersistenceService implements PersistenceService { checkLocation(location); File file = toCacheFile(location); - if (!file.exists()) + if (!file.exists()) { throw new FileNotFoundException("Persistence store for " + location.toString() + " is not found."); + } FileUtils.createParentDir(file, "Persistence store for " + location.toString()); diff --git a/netx/net/sourceforge/jnlp/util/PropertiesFile.java b/netx/net/sourceforge/jnlp/util/PropertiesFile.java index 69dbf53..b9dd176 100644 --- a/netx/net/sourceforge/jnlp/util/PropertiesFile.java +++ b/netx/net/sourceforge/jnlp/util/PropertiesFile.java @@ -35,9 +35,9 @@ public class PropertiesFile extends Properties { /** the header string */ String header = "netx file"; - - /** lazy loaded on getProperty */ - boolean loaded = false; + + /** time of last modification, lazy loaded on getProperty */ + long lastStore; /** * Create a properties object backed by the specified file. @@ -64,7 +64,7 @@ public class PropertiesFile extends Properties { * does not exist. */ public String getProperty(String key) { - if (!loaded) + if (lastStore == 0) load(); return super.getProperty(key); @@ -75,7 +75,7 @@ public class PropertiesFile extends Properties { * if the key does not exist. */ public String getProperty(String key, String defaultValue) { - if (!loaded) + if (lastStore == 0) load(); return super.getProperty(key, defaultValue); @@ -87,7 +87,7 @@ public class PropertiesFile extends Properties { * @return the previous value */ public Object setProperty(String key, String value) { - if (!loaded) + if (lastStore == 0) load(); return super.setProperty(key, value); @@ -104,39 +104,62 @@ public class PropertiesFile extends Properties { * Ensures that the file backing these properties has been * loaded; call this method before calling any method defined by * a superclass. + * + * @return true, if file was (re-)loaded + * false, if file was still current */ - public void load() { - loaded = true; + public boolean load() { - InputStream s = null; - try { - if (!file.exists()) - return; + if (!file.exists()) { + return false; + } + long currentStore = file.lastModified(); + long currentTime = System.currentTimeMillis(); + + /* (re)load file, if + * - it wasn't loaded/stored, yet (lastStore == 0) + * - current file modification timestamp has changed since last store (currentStore != lastStore) OR + * - current file modification timestamp has not changed since last store AND current system time equals current file modification timestamp + * This is necessary because some filesystems seems only to provide accuracy of the timestamp on the level of seconds! + */ + if(lastStore == 0 || currentStore != lastStore || (currentStore == lastStore && currentStore / 1000 == currentTime / 1000)) { + InputStream s = null; try { - s = new FileInputStream(file); - load(s); - } finally { - if (s != null) s.close(); + + try { + s = new FileInputStream(file); + load(s); + } finally { + if (s != null) { + s.close(); + lastStore=currentStore; + return true; + } + } + } catch (IOException ex) { + ex.printStackTrace(); } - } catch (IOException ex) { - ex.printStackTrace(); } + + return false; } /** * Saves the properties to the file. */ public void store() { - if (!loaded) - return; // nothing could have changed so save unnecessary load/save - OutputStream s = null; + FileOutputStream s = null; try { try { file.getParentFile().mkdirs(); s = new FileOutputStream(file); store(s, header); + + // fsync() + s.getChannel().force(true); + lastStore = file.lastModified(); } finally { if (s != null) s.close(); } |