/* * BioJava development code * * This code may be freely distributed and modified under the * terms of the GNU Lesser General Public Licence. This should * be distributed with the code. If you do not have a copy, * see: * * http://www.gnu.org/copyleft/lesser.html * * Copyright for this code is held jointly by the individual * authors. These should be listed in @author doc comments. * * For more information on the BioJava project and its aims, * or to join the biojava-l mailing list, visit the home page * at: * * http://www.biojava.org/ * */ package org.biojava.directory; import java.util.Collections; import java.util.Map; import org.biojava.utils.OverlayMap; /** *
The BioDirectory Registry is a simple system for specifying * where to find services which provide sequence databases. A client * should look at the following places in order to find this file:
* ** $HOME/.bioinformatics/seqdatabase.ini * /etc/bioinformatics/seqdatabase.ini * http://www.open-bio.org/registry/seqdatabase.ini ** *
The file is a simple stanza format
* ** [database-name] * tag=value * tag=value * * [database-name] * tag=value * tag=value ** *
where each stanza starts with the declaration of the database * being in square brackets and following that one line tag=value tag * value formats.
* *Database-name stanzas can be repeated, in which case the client * should try each service in turn (starting at the first one).
* *The options under each stanza must have two non-optional * tag=value lines being
* ** protocol=<protocol-type> * location=<location-string> ** *
'protocol' currently can be one of
* *'location' is a string specific to the protocol. Any number of * additional tag values are allowed in the stanza which should be * passed to the appropiate constructor of the protocol to * interpret. Some protocols might insist on other mandatory tags.
* * @author Brian Gilman * @author Keith James * @author Matthew Pocock * @version $Revision: 2703 $ */ public interface RegistryConfiguration { /** *getConfiguration
returns a mapping of registry
* database names to collections of tag-value pairs.
*
* @return a Map
.
*
* @exception RegistryException if an error occurs.
*/
public Map getConfiguration() throws RegistryException;
/**
* getConfigLocator
returns a locator for the
* configuration.
*
* @return a String
.
*/
public String getConfigLocator();
/**
* A simple implementation of RegistryConfiguration backed by a Map.
*
* @author Brian Gilman
* @author Matthew Pocock
*/
public static class Impl implements RegistryConfiguration {
private String configFileLocation = null;
private Map config = null;
public Impl(String configFileLocation, Map config){
this.configFileLocation = configFileLocation;
this.config = config;
}
public Map getConfiguration() {
return config;
}
public String getConfigLocator() {
return configFileLocation;
}
}
/**
* A RegistryConfiguration that allows you to treat other
* configurations as providing important or default configuration
* information.
*
* @author Matthew Pocock
*/
public static class Composite
implements RegistryConfiguration {
private String configLocator;
private Map config;
public Composite() {
}
public Map getConfiguration() {
if(config == null) {
return Collections.EMPTY_MAP;
} else {
return config;
}
}
public String getConfigLocator() {
return configLocator;
}
/**
* Add a configuration as the most authoritative place to look.
* During future lookups with this context, values in newConfig
* will take precedence over values in the previously existing
* configuration.
*
* @param newConfig the RegistryConfiguration to add as most
* important
*/
public void addTopConfig(RegistryConfiguration newConfig)
throws RegistryException {
Map cfg = newConfig.getConfiguration();
if(config == null) {
config = cfg;
configLocator = newConfig.getConfigLocator();
} else {
config = new OverlayMap(config, cfg);
configLocator = newConfig.getConfigLocator() + "::" + configLocator;
}
}
/**
* Add a configuration as the most default place to look. During
* future lookups with this context, values in newConfig will be
* used as default values only if the lookup would return nothing
* in the previously existing configuration.
*
* @param newConfig the RegistryConfiguration to add as the
* default
*/
public void addBottomConfig(RegistryConfiguration newConfig)
throws RegistryException {
Map cfg = newConfig.getConfiguration();
if(config == null) {
config = cfg;
configLocator = newConfig.getConfigLocator();
} else {
config = new OverlayMap(cfg, config);
configLocator = configLocator + "::" + newConfig.getConfigLocator();
}
}
}
}