From a6b97cd5accc0c748bbafe554c722509f1da868f Mon Sep 17 00:00:00 2001 From: John May Date: Sun, 9 Oct 2016 17:00:08 +0100 Subject: [PATCH] Cache dictionary databases - faster initialisation. --- .../org/openscience/cdk/dict/Dictionary.java | 2 +- .../cdk/dict/DictionaryDatabase.java | 39 ++++++++++++------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/base/dict/src/main/java/org/openscience/cdk/dict/Dictionary.java b/base/dict/src/main/java/org/openscience/cdk/dict/Dictionary.java index 905bfd0ea16..2d4da426c7f 100644 --- a/base/dict/src/main/java/org/openscience/cdk/dict/Dictionary.java +++ b/base/dict/src/main/java/org/openscience/cdk/dict/Dictionary.java @@ -95,7 +95,7 @@ public static Dictionary unmarshal(Reader reader) { return dict; } - public void addEntry(Entry entry) { + void addEntry(Entry entry) { entries.put(entry.getID().toLowerCase(), entry); } diff --git a/base/dict/src/main/java/org/openscience/cdk/dict/DictionaryDatabase.java b/base/dict/src/main/java/org/openscience/cdk/dict/DictionaryDatabase.java index e23f3188309..a62eecb7c29 100644 --- a/base/dict/src/main/java/org/openscience/cdk/dict/DictionaryDatabase.java +++ b/base/dict/src/main/java/org/openscience/cdk/dict/DictionaryDatabase.java @@ -25,6 +25,7 @@ import java.io.InputStreamReader; import java.io.Reader; +import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.Map; @@ -44,6 +45,8 @@ */ public class DictionaryDatabase { + private static final Map cache = new HashMap<>(); + public final static String DICTREFPROPERTYNAME = "org.openscience.cdk.dict"; private ILoggingTool logger = LoggingToolFactory @@ -76,23 +79,29 @@ private Dictionary readDictionary(String databaseLocator, String type) { databaseLocator += "." + type.substring(0, type.length() - 6); else databaseLocator += "." + type; - logger.info("Reading dictionary from ", databaseLocator); - try { - InputStreamReader reader = new InputStreamReader(this.getClass().getClassLoader() - .getResourceAsStream(databaseLocator)); - if (type.equals("owl")) { - dictionary = OWLFile.unmarshal(reader); - } else if (type.equals("owl_React")) { - dictionary = OWLReact.unmarshal(reader); - } else { // assume XML using Castor - dictionary = Dictionary.unmarshal(reader); + if (cache.containsKey(databaseLocator)) { + return cache.get(databaseLocator); + } + else { + logger.info("Reading dictionary from ", databaseLocator); + try { + InputStreamReader reader = new InputStreamReader(this.getClass().getClassLoader() + .getResourceAsStream(databaseLocator)); + if (type.equals("owl")) { + dictionary = OWLFile.unmarshal(reader); + } else if (type.equals("owl_React")) { + dictionary = OWLReact.unmarshal(reader); + } else { // assume XML using Castor + dictionary = Dictionary.unmarshal(reader); + } + } catch (Exception exception) { + dictionary = null; + logger.error("Could not read dictionary ", databaseLocator); + logger.debug(exception); } - } catch (Exception exception) { - dictionary = null; - logger.error("Could not read dictionary ", databaseLocator); - logger.debug(exception); + cache.put(databaseLocator, dictionary); + return dictionary; } - return dictionary; } /**