*/
package jalview.ws;
-import jalview.ext.ensembl.EnsemblCdna;
-import jalview.ext.ensembl.EnsemblCds;
-import jalview.ext.ensembl.EnsemblGenome;
-import jalview.ext.ensembl.EnsemblProtein;
-import jalview.ws.dbsources.EmblCdsSource;
-import jalview.ws.dbsources.EmblSource;
-import jalview.ws.dbsources.Pdb;
-import jalview.ws.dbsources.PfamFull;
-import jalview.ws.dbsources.PfamSeed;
-import jalview.ws.dbsources.RfamFull;
-import jalview.ws.dbsources.RfamSeed;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
+import jalview.datamodel.DBRefSource;
+import jalview.ext.ensembl.EnsemblGene;
import jalview.ws.dbsources.Uniprot;
-import jalview.ws.dbsources.UniprotName;
-import jalview.ws.dbsources.das.api.jalviewSourceI;
import jalview.ws.seqfetcher.ASequenceFetcher;
import jalview.ws.seqfetcher.DbSourceProxy;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
/**
- * This is the the concrete implementation of the sequence retrieval interface
- * and abstract class in jalview.ws.seqfetcher. This implements the run-time
- * discovery of sequence database clientss.
+ * Thread safe construction of database proxies. This implements the run-time
+ * discovery of sequence database clients.
*
+ * TODO: extend to a configurable database plugin mechanism where classes are
+ * instantiated by reflection and queried for their DbRefSource and version
+ * association.
*/
-public class SequenceFetcher extends ASequenceFetcher
+public class SequenceFetcher extends ASequenceFetcher implements ApplicationSingletonI
{
+ /*
+ * set a mock fetcher here for testing only - reset to null afterwards
+ */
+ private static SequenceFetcher mockFetcher;
+
/**
- * Thread safe construction of database proxies TODO: extend to a configurable
- * database plugin mechanism where classes are instantiated by reflection and
- * queried for their DbRefSource and version association.
+ * Returns a new SequenceFetcher singleton, or a mock object if one has been
+ * set.
*
+ * @return
*/
- public SequenceFetcher()
+ public static SequenceFetcher getInstance()
{
- this(true);
+ return mockFetcher != null ? mockFetcher
+ : (SequenceFetcher) ApplicationSingletonProvider
+ .getInstance(SequenceFetcher.class);
}
- public SequenceFetcher(boolean addDas)
+ /**
+ * Set the instance object to use (intended for unit testing with mock
+ * objects).
+ *
+ * Be sure to reset to null in the tearDown method of any tests!
+ *
+ * @param sf
+ */
+ public static void setSequenceFetcher(SequenceFetcher sf)
{
- addDBRefSourceImpl(EnsemblProtein.class);
- // EnsemblTranscript would just replace EnsemblProtein as the proxy for
- // { DbSource="ENSEMBL", DbName="ENSEMBL (Protein)" }
- // addDBRefSourceImpl(EnsemblTranscript.class);
- addDBRefSourceImpl(EnsemblCds.class);
- addDBRefSourceImpl(EnsemblGenome.class);
- addDBRefSourceImpl(EnsemblCdna.class);
-
- addDBRefSourceImpl(EmblSource.class);
- addDBRefSourceImpl(EmblCdsSource.class);
- addDBRefSourceImpl(Uniprot.class);
- addDBRefSourceImpl(UniprotName.class);
- addDBRefSourceImpl(Pdb.class);
- addDBRefSourceImpl(PfamFull.class);
- addDBRefSourceImpl(PfamSeed.class);
- // ensures Seed alignment is 'default' for PFAM
- addDBRefSourceImpl(RfamFull.class);
- addDBRefSourceImpl(RfamSeed.class);
- if (addDas)
- {
- registerDasSequenceSources();
- }
+ mockFetcher = sf;
}
/**
- * return an ordered list of database sources where non-das database classes
- * appear before das database classes
+ *
+ * This public constructor is only is for use by testng to anonymously
+ * subclass SequenceFetcher.
+ *
+ *
*/
- public String[] getOrderedSupportedSources()
+ public SequenceFetcher()
{
- String[] srcs = this.getSupportedDb();
- ArrayList<String> dassrc = new ArrayList<String>(), nondas = new ArrayList<String>();
- for (int i = 0; i < srcs.length; i++)
- {
- boolean das = false, skip = false;
- String nm;
- for (DbSourceProxy dbs : getSourceProxy(srcs[i]))
- {
- // Skip the alignment databases for the moment - they're not useful for
- // verifying a single sequence against its reference source
- if (dbs.isAlignmentSource())
- {
- skip = true;
- }
- else
- {
- nm = dbs.getDbName();
- if (getSourceProxy(srcs[i]) instanceof jalview.ws.dbsources.das.datamodel.DasSequenceSource)
- {
- if (nm.startsWith("das:"))
- {
- nm = nm.substring(4);
- das = true;
- }
- break;
- }
- }
- }
- if (skip)
- {
- continue;
- }
- if (das)
- {
- dassrc.add(srcs[i]);
- }
- else
- {
- nondas.add(srcs[i]);
- }
- }
- String[] tosort = nondas.toArray(new String[0]), sorted = nondas
- .toArray(new String[0]);
- for (int j = 0, jSize = sorted.length; j < jSize; j++)
- {
- tosort[j] = tosort[j].toLowerCase();
- }
- jalview.util.QuickSort.sort(tosort, sorted);
- // construct array with all sources listed
-
- srcs = new String[sorted.length + dassrc.size()];
- int i = 0;
- for (int j = sorted.length - 1; j >= 0; j--, i++)
- {
- srcs[i] = sorted[j];
- sorted[j] = null;
- }
+ addAllDatabases();
+ }
- sorted = dassrc.toArray(new String[0]);
- tosort = dassrc.toArray(new String[0]);
- for (int j = 0, jSize = sorted.length; j < jSize; j++)
- {
- tosort[j] = tosort[j].toLowerCase();
- }
- jalview.util.QuickSort.sort(tosort, sorted);
- for (int j = sorted.length - 1; j >= 0; j--, i++)
- {
- srcs[i] = sorted[j];
- }
- return srcs;
+ public void addAllDatabases()
+ {
+ addDBRefSourceImpl(EnsemblGene.class); // includes EnsemblGenomes.class
+ addDBRefSourceImpl(Uniprot.class); // includes UniprotName.class
+ // addDBRefSourceImpl(EmblSource.class);
+ // addDBRefSourceImpl(EmblCdsSource.class);
+ // addDBRefSourceImpl(Pdb.class);
+ // addDBRefSourceImpl(PfamFull.class);
+ // addDBRefSourceImpl(PfamSeed.class);
+ // addDBRefSourceImpl(RfamSeed.class);
+ addDBRefSourceImpl(DBRefSource.EMBL,
+ "jalview.ws.dbsources.EmblSource");
+ addDBRefSourceImpl(DBRefSource.EMBLCDS,
+ "jalview.ws.dbsources.EmblCdsSource");
+ addDBRefSourceImpl(DBRefSource.PDB, "jalview.ws.dbsources.Pdb");
+ addDBRefSourceImpl(DBRefSource.PFAM_FULL,
+ "jalview.ws.dbsources.PfamFull");
+ addDBRefSourceImpl(DBRefSource.PFAM_SEED,
+ "jalview.ws.dbsources.PfamSeed");
+ addDBRefSourceImpl(DBRefSource.RFAM_SEED,
+ "jalview.ws.dbsources.RfamSeed");
}
/**
- * query the currently defined DAS source registry for sequence sources and
- * add a DasSequenceSource instance for each source to the SequenceFetcher
- * source list.
+ * return an ordered list of database sources excluding alignment only
+ * databases
*/
- public void registerDasSequenceSources()
+ public String[] getNonAlignmentSources()
{
- // TODO: define a context as a registry provider (either desktop,
- // jalview.bin.cache, or something else).
- for (jalviewSourceI source : jalview.bin.Cache.getDasSourceRegistry()
- .getSources())
+ String[] srcs = this.getSupportedDb();
+ List<String> src = new ArrayList<>();
+ outer: for (int i = 0; i < srcs.length; i++)
{
- if (source.isSequenceSource())
+ for (DbSourceProxy dbs : getSourceProxy(srcs[i]))
{
- List<DbSourceProxy> dassources = source.getSequenceSourceProxies();
- for (DbSourceProxy seqsrc : dassources)
+ // Skip the alignment databases for the moment - they're not useful for
+ // verifying a single sequence against its reference source
+ if (dbs.isAlignmentSource())
{
- addDbRefSourceImpl(seqsrc);
+ continue outer;
}
}
+ src.add(srcs[i]);
}
+ Collections.sort(src, String.CASE_INSENSITIVE_ORDER);
+ return src.toArray(new String[src.size()]);
}
-
}