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}