001/**
002 * Copyright (C) 2010-2015 The Roslin Institute <contact andy.law@roslin.ed.ac.uk>
003 *
004 * This file is part of JEnsembl: a Java API to Ensembl data sources developed by the
005 * Bioinformatics Group at The Roslin Institute, The Royal (Dick) School of
006 * Veterinary Studies, University of Edinburgh.
007 *
008 * Project hosted at: http://jensembl.sourceforge.net
009 *
010 * This is free software: you can redistribute it and/or modify
011 * it under the terms of the GNU General Public License (version 3) as published by
012 * the Free Software Foundation.
013 *
014 * This software is distributed in the hope that it will be useful,
015 * but WITHOUT ANY WARRANTY; without even the implied warranty of
016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
017 * GNU General Public License for more details.
018 *
019 * You should have received a copy of the GNU General Public License
020 * in this software distribution. If not, see: http://opensource.org/licenses/gpl-3.0.html
021 */
022package uk.ac.roslin.ensembl.dao.database;
023
024import java.util.*;
025import java.util.Map.Entry;
026import org.apache.ibatis.session.SqlSession;
027import org.slf4j.Logger;
028import org.slf4j.LoggerFactory;
029import uk.ac.roslin.ensembl.config.EnsemblCoordSystemType;
030import uk.ac.roslin.ensembl.config.EnsemblDBType;
031import uk.ac.roslin.ensembl.config.FeatureType;
032import uk.ac.roslin.ensembl.dao.database.factory.DBDAOCollectionCoreFactory;
033import uk.ac.roslin.ensembl.dao.database.factory.DBDAOCollectionFactory;
034import uk.ac.roslin.ensembl.dao.factory.DAOCollectionCoreFactory;
035import uk.ac.roslin.ensembl.datasourceaware.DAAnalysis;
036import uk.ac.roslin.ensembl.datasourceaware.core.DAAssembledDNASequence;
037import uk.ac.roslin.ensembl.datasourceaware.core.DAChromosome;
038import uk.ac.roslin.ensembl.datasourceaware.core.DACoordinateSystem;
039import uk.ac.roslin.ensembl.exception.ConfigurationException;
040import uk.ac.roslin.ensembl.exception.DAOException;
041import uk.ac.roslin.ensembl.mapper.XRefMapper;
042import uk.ac.roslin.ensembl.model.ExternalDB;
043import uk.ac.roslin.ensembl.model.ObjectType;
044import uk.ac.roslin.ensembl.model.core.CollectionSpecies;
045import uk.ac.roslin.ensembl.model.core.CoordinateSystem;
046import uk.ac.roslin.ensembl.model.core.Species;
047import uk.ac.roslin.ensembl.model.database.CollectionCoreDatabase;
048import uk.ac.roslin.ensembl.model.database.Registry;
049
050/**
051 *
052 * @author paterson
053 */
054public class DBCollectionCoreDatabase extends DBCollectionDatabase implements CollectionCoreDatabase {
055
056    final static Logger LOGGER = LoggerFactory.getLogger(DBCollectionCoreDatabase.class);
057    
058    private TreeMap<DBCollectionSpecies, TreeMap<Integer, DACoordinateSystem>> CSHash = new TreeMap<DBCollectionSpecies, TreeMap<Integer, DACoordinateSystem>>();
059
060    private TreeMap<DBCollectionSpecies, DACoordinateSystem> seqLevelCSHash = new TreeMap<DBCollectionSpecies, DACoordinateSystem>();
061    private TreeMap<DBCollectionSpecies, DACoordinateSystem> chrLevelCSHash = new TreeMap<DBCollectionSpecies, DACoordinateSystem>();
062    private TreeMap<DBCollectionSpecies, DACoordinateSystem> topLevelCSHash = new TreeMap<DBCollectionSpecies, DACoordinateSystem>();
063    private TreeMap<CollectionSpecies, DAOCollectionCoreFactory> factoryHash = new TreeMap<CollectionSpecies, DAOCollectionCoreFactory>();
064    private TreeMap<DBCollectionSpecies, HashMap<FeatureType, HashMap<DACoordinateSystem, Integer>>>  featureCSHash
065                = new TreeMap<DBCollectionSpecies, HashMap<FeatureType, HashMap<DACoordinateSystem, Integer>>>();
066
067    private TreeMap<DBCollectionSpecies, HashMap<DACoordinateSystem, List<FeatureType>>>    CSFeatureHash
068            = new TreeMap<DBCollectionSpecies, HashMap<DACoordinateSystem, List<FeatureType>>>();
069
070
071//    private TreeMap<DBCollectionSpecies, String> speciesGeneBuildLevelHash = new TreeMap<DBCollectionSpecies, String>();
072//    private TreeMap<DBCollectionSpecies, String> speciesExonBuildLevelHash = new TreeMap<DBCollectionSpecies, String>();
073//    private TreeMap<DBCollectionSpecies, String> speciesTranscriptBuildLevelHash = new TreeMap<DBCollectionSpecies, String>();
074
075    private TreeMap<DBCollectionSpecies, HashMap<FeatureType, String>> speciesBuildLevels = new TreeMap<DBCollectionSpecies, HashMap<FeatureType,String>>();
076    private HashMap<Integer, DAAnalysis> analyses = null;;
077
078    /**
079     * A Map of ExternalDB objects on their id (previously used the db_name field in the database
080     * table 'external_db' - but this was not unique due to versioning)
081     */
082    HashMap<Integer, ExternalDB> externalDBsByID = new HashMap<Integer, ExternalDB>();
083    //unfortunately names may not be unique - e.g. multiple versions of PFAM
084    HashMap<String, Set<ExternalDB>> externalDBsByName = new HashMap<String, Set<ExternalDB>>();
085    boolean externalDBsInitialized = false; 
086    
087//    HashMap<CollectionSpecies, String> assemblyAccessionsMap = new HashMap<CollectionSpecies, String>();
088//    HashMap<CollectionSpecies, String> assemblyNamesMap = new HashMap<CollectionSpecies, String>();
089    
090    public DBCollectionCoreDatabase(String db_name, EnsemblDBType type, Registry registry) throws ConfigurationException {
091        super(db_name, type, registry);
092    }
093
094    @Override
095    public DBDAOCollectionCoreFactory getCoreFactory(Species sp) {
096
097        
098        
099        if (sp == null || collection == null || !this.collection.getSpecies().contains(sp)) {
100            return null;
101        }
102
103        CollectionSpecies species = (CollectionSpecies) sp;
104
105        if (this.factoryHash.containsKey(species)) {
106            return (DBDAOCollectionCoreFactory) this.factoryHash.get(species);
107        } else {
108            DBDAOCollectionCoreFactory f = null;
109
110            try {
111                f = (DBDAOCollectionCoreFactory) DBDAOCollectionFactory.makeFactory(this, species);
112                this.factoryHash.put(species, f);
113            } catch (Exception ex) {
114            }
115            return f;
116
117        }
118    }
119
120    @Override
121    public DACoordinateSystem getChromosomeLevelCS(Species species) throws DAOException {
122
123        if (species == null || this.collection == null || !this.getCollection().getSpecies().contains(species)) {
124            return null;
125        }
126
127        DBCollectionSpecies sp = (DBCollectionSpecies) species;
128
129        if (!this.chrLevelCSHash.containsKey(sp)) {
130            this.lazyLoadCoordinateSystems(sp);
131        }
132
133        return this.chrLevelCSHash.get(sp);
134
135    }
136
137    @Override
138    public DACoordinateSystem getSequenceLevelCS(Species species) throws DAOException {
139
140        if (species == null || this.collection == null || !this.getCollection().getSpecies().contains(species)) {
141            return null;
142        }
143        DBCollectionSpecies sp = (DBCollectionSpecies) species;
144        if (!this.seqLevelCSHash.containsKey(sp)) {
145            this.lazyLoadCoordinateSystems(sp);
146        }
147
148        return this.seqLevelCSHash.get(sp);
149    }
150
151    @Override
152    public DACoordinateSystem getTopLevelCS(Species species) throws DAOException {
153
154        if (species == null || this.collection == null || !this.getCollection().getSpecies().contains(species)) {
155            return null;
156        }
157        DBCollectionSpecies sp = (DBCollectionSpecies) species;
158        if (!this.topLevelCSHash.containsKey(sp)) {
159            this.lazyLoadCoordinateSystems(sp);
160        }
161
162        return this.topLevelCSHash.get(sp);
163    }
164
165    private List<DACoordinateSystem> fetchCS(DBCollectionSpecies species) throws DAOException {
166
167        List<DACoordinateSystem> coords = new ArrayList<DACoordinateSystem>();
168        if (species == null || collection == null || !this.collection.getSpecies().contains(species)) {
169            return coords;
170        }
171
172        //can throw DAOException
173        if (this.getCoreFactory(species) != null) {
174            coords =  (List<DACoordinateSystem>) this.getCoreFactory(species).getCoordinateSystemDAO().
175                    getCoordinateSystems();
176        } else {
177           return coords;
178        }
179        return coords;
180    }
181
182    private void lazyLoadCoordinateSystems(DBCollectionSpecies species) throws DAOException {
183
184        if (species == null || collection == null || !this.collection.getSpecies().contains(species)) {
185            return;
186        }
187
188        List<DACoordinateSystem> coords = this.fetchCS(species);
189
190        if (!coords.isEmpty()) {
191            this.setCoordinateSystems(species, coords);
192        }
193
194        //set null values to prevent repeating lazy load
195
196        if (!this.chrLevelCSHash.containsKey(species)) {
197            this.chrLevelCSHash.put(species, null);
198        }
199        if (!this.topLevelCSHash.containsKey(species)) {
200            this.topLevelCSHash.put(species, null);
201        }
202        if (!this.seqLevelCSHash.containsKey(species)) {
203            this.seqLevelCSHash.put(species, null);
204        }
205
206    }
207
208    private void setCoordinateSystems(DBCollectionSpecies species, List<DACoordinateSystem> coords) throws DAOException {
209
210        if (species == null || collection == null || !this.collection.getSpecies().contains(species)) {
211            return;
212        }
213
214        TreeMap<Integer, DACoordinateSystem> rankedCoordSystemsHash = new TreeMap<Integer, DACoordinateSystem>();
215        TreeMap<Integer, DACoordinateSystem> idCoordSystemsHash = new TreeMap<Integer, DACoordinateSystem>();
216
217        //set  the top, chromosome and sequence levels
218
219        for (DACoordinateSystem cs : coords) {
220            rankedCoordSystemsHash.put(cs.getRank(), cs);
221            idCoordSystemsHash.put(cs.getId(), cs);
222        }
223        
224        //note 'toplevel' default CS is actually that with 'lowestrank'
225        for (Entry<Integer, DACoordinateSystem> e :rankedCoordSystemsHash.entrySet()) {
226                if (e.getValue().isDefaultVersion()) {
227                    e.getValue().setTopLevel(true);
228                    this.topLevelCSHash.put(species, e.getValue());
229                    break;
230                }
231        }        
232        
233        //the lowest ranked default chromosome CS 
234        for (Entry<Integer, DACoordinateSystem> e : rankedCoordSystemsHash.entrySet()) {
235                if (e.getValue().getType() == EnsemblCoordSystemType.chromosome
236                        && e.getValue().isDefaultVersion()) {
237                    this.chrLevelCSHash.put(species, e.getValue());
238                    break;
239                }
240        }        
241        
242        //the (lowest ranked) default seq_level CS
243        for (Entry<Integer, DACoordinateSystem> e :rankedCoordSystemsHash.entrySet()) {
244                if (e.getValue().isSequenceLevel()
245                        && e.getValue().isDefaultVersion()) {
246                    this.seqLevelCSHash.put(species, e.getValue());
247                    break;
248                }
249        }
250     
251        this.CSHash.put(species, idCoordSystemsHash);
252    }
253
254    @Override
255    public void setBuildLevels(Species species, HashMap<String, String> keyedValues) {
256
257        if (species == null || collection == null || !this.collection.getSpecies().contains(species)
258                || keyedValues == null || keyedValues.isEmpty()) {
259            return;
260        }
261
262        HashMap<FeatureType, String> map = new HashMap<FeatureType, String>();
263
264        for (String key : keyedValues.keySet()) {
265
266            String temp = key.replace("build.level", "");
267
268            if (FeatureType.getFeatureType(temp) != null) {
269                map.put(FeatureType.getFeatureType(temp), keyedValues.get(key));
270            }
271
272        }
273
274        this.speciesBuildLevels.put((DBCollectionSpecies) species, map);
275    }
276
277    @Override
278    @SuppressWarnings("element-type-mismatch")
279    public String getBuildLevel(Species species, String featureKey) throws DAOException {
280
281        if (species == null || collection == null || !this.collection.getSpecies().contains(species)) {
282            return null;
283        }
284
285        String out = null;
286
287        if (this.speciesBuildLevels.get(species) != null) {
288            out = this.speciesBuildLevels.get(species).get(FeatureType.getFeatureType(featureKey));
289        }
290        return out;
291    }
292
293    //dont really want this public - just for testing
294    public HashMap<FeatureType, String> getBuildLevels(CollectionSpecies species) {
295        if (species == null || collection == null || !this.collection.getSpecies().contains(species)) {
296            return null;
297        }
298        return this.speciesBuildLevels.get(species);
299    }
300
301    private void setFeatureCSHash(DBCollectionSpecies sp) throws DAOException {
302
303        if (sp == null || collection == null || !this.collection.getSpecies().contains(sp)) {
304            return;
305        }
306
307        if (!this.CSHash.containsKey(sp)) {
308            this.lazyLoadCoordinateSystems(sp);
309        }
310
311
312        HashMap<DACoordinateSystem, List<FeatureType>> hash1 = new HashMap<DACoordinateSystem, List<FeatureType>>();
313
314        for (DACoordinateSystem c : this.CSHash.get(sp).values()) {
315            hash1.put(c, new ArrayList<FeatureType>());
316
317        }
318
319        this.CSFeatureHash.put(sp, hash1);
320
321        this.featureCSHash.put(sp, new HashMap<FeatureType, HashMap<DACoordinateSystem, Integer>>());
322
323        try {
324
325            this.getCoreFactory(sp).getCoordinateSystemDAO().setFeatureCS();
326
327        } catch (DAOException e) {
328            throw e;
329        }
330
331    }
332
333    @Override
334    public void addFeatureCS(String featureType, Integer csID, Integer maxLength, Species sp) {
335
336        if (sp == null || collection == null || !this.collection.getSpecies().contains(sp)) {
337            return;
338        }
339
340        FeatureType localType = null;
341        DACoordinateSystem cs = null;
342
343        localType = FeatureType.getFeatureType(featureType);
344        cs = this.CSHash.get(sp).get(csID);
345
346        if (localType == null || cs == null) {
347            return;
348        } else {
349            if (!this.featureCSHash.get(sp).containsKey(localType)) {
350                this.featureCSHash.get(sp).put(localType, new HashMap<DACoordinateSystem, Integer>());
351            }
352            this.featureCSHash.get(sp).get(localType).put(cs, maxLength);
353
354            this.CSFeatureHash.get(sp).get(cs).add(localType);
355
356        }
357
358
359    }
360
361
362    @Override
363    public Set<DACoordinateSystem> getCSForFeature(Species sp, ObjectType feature) throws DAOException {
364
365        if (sp == null || collection == null || !this.collection.getSpecies().contains(sp)) {
366            return null;
367        }
368
369        if (!this.featureCSHash.containsKey(sp)) {
370            this.setFeatureCSHash((DBCollectionSpecies) sp);
371        }
372
373
374        if (this.featureCSHash.containsKey(sp)
375                && this.featureCSHash.get(sp).containsKey(feature)) {
376            return this.featureCSHash.get(sp).get(feature).keySet();
377        } else {
378
379            return null;
380        }
381    }
382
383    @Override
384    public List<FeatureType> getFeaturesForCS(Species sp, CoordinateSystem coordSys) throws DAOException {
385
386        if (sp == null || collection == null || !this.collection.getSpecies().contains(sp)) {
387            return null;
388        }
389
390        if (!this.featureCSHash.containsKey(sp)) {
391            this.setFeatureCSHash((DBCollectionSpecies) sp);
392        }
393
394        if (this.CSFeatureHash.containsKey(sp)
395                && this.CSFeatureHash.get(sp).containsKey(coordSys)) {
396            return this.CSFeatureHash.get(sp).get(coordSys);
397        } else {
398            return null;
399        }
400    }
401
402    @Override
403    public Integer getMaxLengthForFeature(Species sp, ObjectType feature, CoordinateSystem cs) throws DAOException {
404
405        if (sp == null || collection == null || !this.collection.getSpecies().contains(sp)) {
406            return null;
407        }
408
409        if (feature == null || cs == null) {
410            return null;
411        }
412
413        if (!this.featureCSHash.containsKey(sp)) {
414            this.setFeatureCSHash((DBCollectionSpecies) sp);
415        }
416
417        if (this.featureCSHash.containsKey(sp)
418                && this.featureCSHash.get(sp).containsKey(feature)
419                && this.featureCSHash.get(sp).get(feature).containsKey(cs)) {
420            return this.featureCSHash.get(sp).get(feature).get(cs);
421        } else {
422            return null;
423        }
424
425    }
426
427    @Override
428    public DACoordinateSystem getBuildCoordSystem(Species species, String featureType) throws DAOException {
429
430        if (species == null || collection == null || !this.collection.getSpecies().contains(species)
431                || this.speciesBuildLevels.get(species) == null
432                || featureType == null || featureType.isEmpty()) {
433            return null;
434        }
435
436        if (FeatureType.getFeatureType(featureType) != null) {
437            String level = this.speciesBuildLevels.get(species).get(FeatureType.getFeatureType(featureType));
438            if (level.equalsIgnoreCase("toplevel")) {
439                return this.topLevelCSHash.get(species);
440            } else {
441                return null;
442            }
443
444//                //are there other values possible?
445//                else if (level.equalsIgnoreCase("chromosomelevel")) {
446//                    return this.getChromosomeLevelCoordSystem();
447//                } else if (level.equalsIgnoreCase("sequencelevel")) {
448//                    return this.getSequenceLevelCoordSystem();
449//                }
450        }
451
452        return null;
453    }
454
455    @Override
456    public DACoordinateSystem getCSByID(Species species, Integer id) throws DAOException {
457
458        if (species == null || collection == null || !this.collection.getSpecies().contains(species)
459                || id == null) {
460            return null;
461        }
462
463        DACoordinateSystem out = null;
464        if (!this.CSHash.containsKey(species)) {
465
466            //lazyload can throw DAOException
467            this.lazyLoadCoordinateSystems((DBCollectionSpecies) species);
468
469        }
470        
471        if (this.CSHash.containsKey(species) ) {
472           out = this.CSHash.get(species).get(id); 
473        }
474
475        return out;
476    }
477
478    @Override
479    public DAChromosome getChromosomeByName(Species species, String name) throws DAOException {
480
481       if (species == null || collection == null || !this.collection.getSpecies().contains((DBCollectionSpecies) species)) {
482            return null;
483        }
484
485        if (this.getCoreFactory(species)== null 
486                || this.getCoreFactory(species).getDatabase() ==null) {
487            return null;
488        }
489        return (DAChromosome) this.getCoreFactory(species).getChromosomeDAO().getChromosomeByName(name);
490
491    }
492
493    @Override
494    public List<DAChromosome> getChromosomes(Species species) throws DAOException {
495
496        if (species == null || collection == null || !this.collection.getSpecies().contains(species)) {
497            return null;
498        }
499
500        if (this.getCoreFactory(species)== null 
501                || this.getCoreFactory(species).getDatabase() ==null) {
502                return new ArrayList<DAChromosome>();
503        }
504        
505        return  this.getCoreFactory(species).getChromosomeDAO().getChromosomes();
506
507    }
508
509    @Override
510    public DAAssembledDNASequence getFragmentByName(Species species, String name) throws DAOException {
511
512        if (species == null || collection == null || !this.collection.getSpecies().contains(species)) {
513            return null;
514        }
515
516        if (this.getCoreFactory(species) == null
517                || this.getCoreFactory(species).getDatabase() ==null) {
518            return null;
519        }
520        return (DAAssembledDNASequence) this.getCoreFactory(species).getChromosomeDAO().getFragmentByName(name);
521
522    }
523
524    @Override
525    public List<DAAssembledDNASequence> getFragments(Species species) throws DAOException {
526
527        if (species == null || collection == null || !this.collection.getSpecies().contains(species)) {
528            return null;
529        }
530
531        if (this.getCoreFactory(species) == null
532                || this.getCoreFactory(species).getDatabase() ==null) {
533            return new ArrayList<DAAssembledDNASequence>();
534        }
535
536        return ((DBDAOCollectionCoreFactory) this.getCoreFactory(species)).getChromosomeDAO().getFragments();
537
538    }
539    
540    /**
541     * Analyses are cached at the Database level
542     * 
543     * @throws DAOException 
544     */
545    @Override
546    public HashMap<Integer, DAAnalysis> getAnalyses() throws DAOException {
547        if (analyses!= null) {
548            return analyses;
549        }
550        
551        //there is only one set of analyses - not one per species 
552        //so we dont need a species context for this query
553        DBCollectionSpecies sp = null;
554        try {
555            sp = collection.getSpecies().first();
556        } catch (Exception e) {
557            LOGGER.info("Something wrong with the Collection of Species for this Database: "+this.getdBName(), e);
558        }
559        if (sp != null && this.getCoreFactory(sp)!=null){
560            analyses = this.getCoreFactory(sp).getAnalysisDAO().getAnalyses();
561         } else {
562            LOGGER.info("Failed to get a populated list of Analyses for this Database: "+this.getdBName());
563            analyses = new HashMap<Integer, DAAnalysis>();
564        }
565        return analyses;
566    }
567
568    /**
569     * Validates a givenExternalDB object, to return a pre-existing version id present. 
570     * @param db
571     *  
572     */
573    @Override
574    public ExternalDB validateExternalDB(ExternalDB db) {
575        
576        if (db==null) {
577            return null;
578        }
579        
580        this.initializeExternalDBs();
581        
582        if (this.externalDBsByID.containsKey(db.getId())) {
583            return this.externalDBsByID.get(db.getId());
584        } else {
585            this.externalDBsByID.put(db.getId(), db);
586            return db;
587        }
588    }
589    
590    @Override
591    public void initializeExternalDBs()  {
592        if (this.externalDBsInitialized) {
593            return;
594        }
595        
596        List<ExternalDB> result = null;
597        SqlSession session = null;
598
599        try {
600            session = this.getNewSqlSession();
601            XRefMapper mapper = session.getMapper(XRefMapper.class);
602            result= mapper.getExternalDBs(); 
603        } catch (Exception e) {
604            LOGGER.debug("Failed to call getExternalDBs on DBDatabase", e);
605            return;
606            //throw new DAOException("Failed to call getExternalDBs on DBDatabase", e);
607        } finally {
608            if (session != null) {
609                session.close();
610            }
611        }
612
613        if (result!=null && !result.isEmpty()) {
614            for (ExternalDB d:result) {
615            this.externalDBsByID.put(d.getId(), d); 
616
617            if (!this.externalDBsByName.containsKey(d.getDBName())) {
618                this.externalDBsByName.put(d.getDBName(), new HashSet<ExternalDB>());
619            }
620            this.externalDBsByName.get(d.getDBName()).add(d); 
621            }
622        }       
623        
624        this.externalDBsInitialized = true;
625    }
626    
627    @Override
628    public ExternalDB getExternalDB(Integer id) {
629        this.initializeExternalDBs();
630        return this.externalDBsByID.get(id);
631    }
632    
633   /**
634    * Returns the AssemblyAccession value for this species. (This method is maintained purely for
635    * equivalence to the SingelSpecies Database, lazy loading is not performed by the CollectionDatabase
636    * as this property should be filled in on initialisation).
637    * @param species
638    * @return 
639    */
640    @Override
641    public String getAssemblyAccession(CollectionSpecies species) {
642        return species != null && this.collection != null 
643                && this.collection.getSpecies().contains(species) 
644                ? species.getAssemblyAccession(dbVersion) : null;
645       //return this.assemblyAccessionsMap.get(species);
646    }
647
648    
649    /**
650    * Returns the AssemblyName value for this species. (This method is maintained purely for
651    * equivalence to the SingelSpecies Database, lazy loading is not performed by the CollectionDatabase
652    * as this property should be filled in on initialisation).
653    * @param species
654    * @return 
655    */
656    @Override
657    public String getAssemblyName(CollectionSpecies species) {
658        return species != null && this.collection != null 
659                && this.collection.getSpecies().contains(species) 
660                ? species.getAssemblyName(dbVersion) : null;
661        //return this.assemblyNamesMap.get(species);
662    }
663
664//    @Override
665//    public void setAssemblyName(CollectionSpecies species, String value) {
666//        this.assemblyNamesMap.put(species, value);
667//    }
668//
669//    @Override
670//    public void setAssemblyAccession(CollectionSpecies species,String value) {
671//        this.assemblyAccessionsMap.put(species, value);
672//    }    
673}