/* $RCSfile$
* $Author$
* $Date$
* $Revision$
*
* Copyright (C) 2003-2007 The Chemistry Development Kit (CDK) project
*
* Contact: cdk-devel@lists.sourceforge.net
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
* All we ask is that proper credit is given for our work, which includes
* - but is not limited to - adding the above copyright notice to the beginning
* of your source code files, and to any copyright notice that you may distribute
* with programs based on this work.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
*/
package org.openscience.cdk.dict;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Enumeration;
import java.util.Hashtable;
import org.openscience.cdk.tools.ILoggingTool;
import org.openscience.cdk.tools.LoggingToolFactory;
/**
* Database of dictionaries listing entries with compounds, fragments
* and entities.
*
* @author Egon Willighagen
* @cdk.githash
* @cdk.created 2003-04-06
* @cdk.keyword dictionary
* @cdk.depends xom.jar
* @cdk.module dict
*/
public class DictionaryDatabase {
public final static String DICTREFPROPERTYNAME = "org.openscience.cdk.dict";
private ILoggingTool logger =
LoggingToolFactory.createLoggingTool(DictionaryDatabase.class);
private String[] dictionaryNames = {
"chemical", "elements", "descriptor-algorithms","reaction-processes"
};
private String[] dictionaryTypes = {
"xml", "owl", "owl", "owl_React"
};
private Hashtable<String, Dictionary> dictionaries;
public DictionaryDatabase() {
// read dictionaries distributed with CDK
dictionaries = new Hashtable<String, Dictionary>();
for (int i=0; i<dictionaryNames.length; i++) {
String name = dictionaryNames[i];
String type = dictionaryTypes[i];
Dictionary dictionary = readDictionary(
"org/openscience/cdk/dict/data/" + name, type
);
if (dictionary != null) {
dictionaries.put(name.toLowerCase(), dictionary);
logger.debug("Read dictionary: ", name);
}
}
}
private Dictionary readDictionary(String databaseLocator, String type) {
Dictionary dictionary;
// to distinguish between OWL: QSAR & REACT
if(type.contains("_React"))
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);
}
} catch (Exception exception) {
dictionary = null;
logger.error("Could not read dictionary ", databaseLocator);
logger.debug(exception);
}
return dictionary;
}
/**
* Reads a custom dictionary into the database.
* @param reader The reader from which the dictionary data will be read
* @param name The name of the dictionary
*/
public void readDictionary(Reader reader, String name) {
name = name.toLowerCase();
logger.debug("Reading dictionary: ", name);
if (!dictionaries.containsKey(name)) {
try {
Dictionary dictionary = Dictionary.unmarshal(reader);
dictionaries.put(name, dictionary);
logger.debug(" ... loaded and stored");
} catch (Exception exception) {
logger.error("Could not read dictionary: ", name);
logger.debug(exception);
}
} else {
logger.error("Dictionary already loaded: ", name);
}
}
/**
* Returns a String[] with the names of the known dictionaries.
* @return The names of the dictionaries
*/
public String[] getDictionaryNames() {
return dictionaryNames;
}
public Dictionary getDictionary(String dictionaryName) {
return dictionaries.get(dictionaryName);
}
/**
* Returns a String[] with the id's of all entries in the specified database.
* @return The entry names for the specified dictionary
* @param dictionaryName The name of the dictionary
*/
public String[] getDictionaryEntries(String dictionaryName) {
Dictionary dictionary = getDictionary(dictionaryName);
if (dictionary == null) {
logger.error("Cannot find requested dictionary");
return new String[0];
} else {
// FIXME: dummy method that needs an implementation
Entry[] entries = dictionary.getEntries();
String[] entryNames = new String[entries.length];
logger.info("Found ", "" + entryNames.length, " entries in dictionary ",
dictionaryName);
for (int i=0; i<entries.length; i++) {
entryNames[i] = entries[i].getLabel();
}
return entryNames;
}
}
public Entry[] getDictionaryEntry(String dictionaryName) {
Dictionary dictionary = (Dictionary)dictionaries.get(dictionaryName);
return dictionary.getEntries();
}
/**
* Returns true if the database contains the dictionary.
*/
public boolean hasDictionary(String name) {
return dictionaries.containsKey(name.toLowerCase());
}
/**
* Returns true if the database contains the dictionary.
*/
public Enumeration<String> listDictionaries() {
return dictionaries.keys();
}
/**
* Returns true if the given dictionary contains the given
* entry.
*/
public boolean hasEntry(String dictName, String entryID) {
if (hasDictionary(dictName)) {
Dictionary dictionary = (Dictionary)dictionaries.get(dictName);
return dictionary.hasEntry(entryID.toLowerCase());
} else {
return false;
}
}
}