From fed1a7c75b40dd20d8519dd9743cc53fcc051ca2 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Mon, 24 Jul 2017 12:14:40 +0200
Subject: [PATCH] ChemicalView and ChemicalViewFactory removed

---
 .../mapviewer/annotation/data/Chemical.java   |  21 ++
 .../search/db/chemical/ChemicalService.java   |  40 ++-
 .../search/db/chemical/ChemicalView.java      | 319 ------------------
 .../db/chemical/ChemicalViewFactory.java      | 188 -----------
 .../search/SearchResultFactoryTest.java       |   6 +-
 .../lcsb/mapviewer/bean/WebTestFunctions.java |   4 -
 6 files changed, 54 insertions(+), 524 deletions(-)
 delete mode 100644 service/src/main/java/lcsb/mapviewer/services/search/db/chemical/ChemicalView.java
 delete mode 100644 service/src/main/java/lcsb/mapviewer/services/search/db/chemical/ChemicalViewFactory.java

diff --git a/annotation/src/main/java/lcsb/mapviewer/annotation/data/Chemical.java b/annotation/src/main/java/lcsb/mapviewer/annotation/data/Chemical.java
index e870f1d9ca..ca53af68c3 100644
--- a/annotation/src/main/java/lcsb/mapviewer/annotation/data/Chemical.java
+++ b/annotation/src/main/java/lcsb/mapviewer/annotation/data/Chemical.java
@@ -2,12 +2,14 @@ package lcsb.mapviewer.annotation.data;
 
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.List;
 
 import javax.xml.bind.annotation.XmlRootElement;
 
 import org.apache.commons.lang3.StringUtils;
 
+import lcsb.mapviewer.common.comparator.StringComparator;
 import lcsb.mapviewer.model.map.MiriamData;
 
 /**
@@ -269,4 +271,23 @@ public class Chemical implements Serializable {
 		return result.toString();
 	}
 
+	/**
+	 * Comparator of the objects by their name.
+	 * 
+	 * @author Piotr Gawron
+	 * 
+	 */
+	public static class NameComparator implements Comparator<Chemical> {
+		/**
+		 * Default string comparator.
+		 */
+		private StringComparator stringComparator = new StringComparator();
+
+		@Override
+		public int compare(Chemical arg0, Chemical arg1) {
+			return stringComparator.compare(arg0.getChemicalName(), arg1.getChemicalName());
+		}
+
+	}
+
 }
diff --git a/service/src/main/java/lcsb/mapviewer/services/search/db/chemical/ChemicalService.java b/service/src/main/java/lcsb/mapviewer/services/search/db/chemical/ChemicalService.java
index 2028155ab8..f753e549b6 100644
--- a/service/src/main/java/lcsb/mapviewer/services/search/db/chemical/ChemicalService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/search/db/chemical/ChemicalService.java
@@ -17,8 +17,11 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
 import lcsb.mapviewer.annotation.data.Chemical;
+import lcsb.mapviewer.annotation.data.Target;
 import lcsb.mapviewer.annotation.services.ChemicalParser;
 import lcsb.mapviewer.annotation.services.ChemicalSearchException;
+import lcsb.mapviewer.annotation.services.PubmedParser;
+import lcsb.mapviewer.annotation.services.PubmedSearchException;
 import lcsb.mapviewer.annotation.services.annotators.AnnotatorException;
 import lcsb.mapviewer.annotation.services.annotators.HgncAnnotator;
 import lcsb.mapviewer.common.IProgressUpdater;
@@ -61,16 +64,17 @@ public class ChemicalService implements IChemicalService {
 	private ChemicalParser													 chemicalParser;
 
 	/**
-	 * Factory object used for creation of {@link ChemicalView} elements.
+	 * Object used to perform operations on {@link MiriamType#HGNC} annotations.
 	 */
 	@Autowired
-	private ChemicalViewFactory											 chemicalViewFactory;
+	private HgncAnnotator														 hgncAnnotator;
 
 	/**
-	 * Object used to perform operations on {@link MiriamType#HGNC} annotations.
+	 * Service accessing
+	 * <a href="http://europepmc.org/RestfulWebService">pubmed</a>.
 	 */
 	@Autowired
-	private HgncAnnotator														 hgncAnnotator;
+	private PubmedParser														 pubmedParser;
 
 	/**
 	 * Service that manages search history.
@@ -215,7 +219,8 @@ public class ChemicalService implements IChemicalService {
 		if (result.size() == 0) {
 			return null;
 		} else {
-//			return chemicalViewFactory.create(result.get(0), searchCriteria.getModel(), searchCriteria.getColorSet());
+			// return chemicalViewFactory.create(result.get(0),
+			// searchCriteria.getModel(), searchCriteria.getColorSet());
 			return result.get(0);
 		}
 
@@ -256,8 +261,7 @@ public class ChemicalService implements IChemicalService {
 			logger.error("Problem with accessing chemical database", e);
 		}
 
-
-		Collections.sort(chemicalList, new ChemicalView.NameComparator());
+		Collections.sort(chemicalList, new Chemical.NameComparator());
 		return chemicalList;
 	}
 
@@ -300,13 +304,19 @@ public class ChemicalService implements IChemicalService {
 				}
 			}
 			double counter = 0.0;
+			Set<MiriamData> annotations = new HashSet<>();
 			for (MiriamData md : targetMiriams) {
 				try {
 					List<Chemical> chemicalList = chemicalParser.getChemicalListByTarget(md, disease);
 					for (Chemical chemical : chemicalList) {
-						chemicalViewFactory.create(chemical);
+						annotations.addAll(getAllMiriamDataForChemical(chemical));
 					}
-				} catch (ChemicalSearchException e) {
+					for (MiriamData miriamData : annotations) {
+						if (miriamData.getDataType().equals(MiriamType.PUBMED)) {
+							pubmedParser.getPubmedArticleById(Integer.valueOf(miriamData.getResource()));
+						}
+					}
+				} catch (ChemicalSearchException | NumberFormatException | PubmedSearchException e) {
 					logger.error("Problem with accessing info about chemical for target: " + md, e);
 				}
 				counter += 1;
@@ -318,4 +328,16 @@ public class ChemicalService implements IChemicalService {
 		}
 	}
 
+	private Set<MiriamData> getAllMiriamDataForChemical(Chemical chemical) {
+		Set<MiriamData> result = new HashSet<>();
+		result.add(chemical.getCasID());
+		result.add(chemical.getChemicalId());
+		for (Target target : chemical.getInferenceNetwork()) {
+			result.addAll(target.getGenes());
+			result.addAll(target.getReferences());
+
+		}
+		return result;
+	}
+
 }
diff --git a/service/src/main/java/lcsb/mapviewer/services/search/db/chemical/ChemicalView.java b/service/src/main/java/lcsb/mapviewer/services/search/db/chemical/ChemicalView.java
deleted file mode 100644
index 305af1f420..0000000000
--- a/service/src/main/java/lcsb/mapviewer/services/search/db/chemical/ChemicalView.java
+++ /dev/null
@@ -1,319 +0,0 @@
-package lcsb.mapviewer.services.search.db.chemical;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import lcsb.mapviewer.annotation.data.Article;
-import lcsb.mapviewer.annotation.data.Chemical;
-import lcsb.mapviewer.common.comparator.StringComparator;
-import lcsb.mapviewer.services.search.ISearchResultView;
-import lcsb.mapviewer.services.search.db.TargetView;
-import lcsb.mapviewer.services.view.AbstractView;
-import lcsb.mapviewer.services.view.AnnotationView;
-
-/**
- * Data of the chemical from external database to be visualized in the client
- * side.
- * 
- * @author Ayan Rota
- * 
- */
-public class ChemicalView extends AbstractView<Chemical> implements ISearchResultView, Serializable {
-
-	/**
-	 * 
-	 */
-	private static final long	serialVersionUID	 = 91486136745430139L;
-
-	/**
-	 * Default class logger.
-	 */
-	@SuppressWarnings("unused")
-	private static Logger			logger						 = Logger.getLogger(ChemicalView.class);
-
-	/**
-	 * Is the chemical selected by the client or not.
-	 */
-	private boolean						selected					 = false;
-
-	/**
-	 * Name of the chemical.
-	 */
-	private String						name;
-
-	/**
-	 * Detailed description of the MeSH object.
-	 */
-	private String						description;
-
-	/**
-	 * List of synonyms.
-	 */
-	private List<String>			synonyms					 = new ArrayList<>();
-
-	/**
-	 * Link for cas id.
-	 */
-	private AnnotationView		casLink;
-
-	/**
-	 * The direct Evedince if any.
-	 */
-	private String						directEvidence;
-
-	/**
-	 * List of links to extenral databases.
-	 */
-	private List<Article>			directEvidencePubs = new ArrayList<>();
-
-	/**
-	 * Link for source.
-	 */
-	private AnnotationView		sourceLink;
-
-	/**
-	 * List of targets for the chemical.
-	 */
-	private List<TargetView>	targetRows				 = new ArrayList<>();
-
-	/***
-	 * Constructor that initialize the data with information from the
-	 * parameter*object.
-	 ** 
-	 * @param chemical
-	 *          original Chemical from which the data will be initialized
-	 */
-
-	protected ChemicalView(Chemical chemical) {
-		// chemical is not db entity so don't pass it to super constructor
-		super(null);
-	}
-
-	/**
-	 * Default constructor. Should be used only for deserialization.
-	 */
-	protected ChemicalView() {
-	}
-
-	/**
-	 * Default constructor that creates a copy.
-	 * 
-	 * @param original
-	 *          origianl object that should be copied
-	 */
-	public ChemicalView(ChemicalView original) {
-		super(null);
-		selected = original.isSelected();
-		name = original.getName();
-		targetRows.addAll(original.getTargetRows());
-	}
-
-	/**
-	 * Comparator of the objects by their name.
-	 * 
-	 * @author Piotr Gawron
-	 * 
-	 */
-	public static class NameComparator implements Comparator<Chemical> {
-		/**
-		 * Default string comparator.
-		 */
-		private StringComparator stringComparator = new StringComparator();
-
-		@Override
-		public int compare(Chemical arg0, Chemical arg1) {
-			return stringComparator.compare(arg0.getChemicalName(), arg1.getChemicalName());
-		}
-
-	}
-
-	/**
-	 * @return the selected
-	 */
-	public boolean isSelected() {
-		return selected;
-	}
-
-	/**
-	 * @param selected
-	 *          the selected to set
-	 */
-	public void setSelected(boolean selected) {
-		this.selected = selected;
-	}
-
-	/**
-	 * @return the name
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * @param name
-	 *          the name to set
-	 */
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	/**
-	 * @return the directEvedince
-	 */
-	public String getDirectEvedince() {
-		return directEvidence;
-	}
-
-	/**
-	 * @param directEvedince
-	 *          the directEvedince to set
-	 */
-	public void setDirectEvedince(String directEvedince) {
-		this.directEvidence = directEvedince;
-	}
-
-	/**
-	 * @return the targetRows
-	 */
-	public List<TargetView> getTargetRows() {
-		return targetRows;
-	}
-
-	/**
-	 * @param targetRows
-	 *          the targetRows to set
-	 */
-	public void setTargetRows(List<TargetView> targetRows) {
-		this.targetRows = targetRows;
-	}
-
-	/**
-	 * Adds object to {@link #directEvidencePubs}.
-	 * 
-	 * @param article
-	 *          object to add
-	 */
-	public void addDirectEvidence(Article article) {
-		directEvidencePubs.add(article);
-	}
-
-	/**
-	 * @return casLink
-	 */
-	public AnnotationView getCasLink() {
-		return casLink;
-	}
-
-	/**
-	 * @param casLink
-	 *          a link to Cas
-	 */
-	public void setCasLink(AnnotationView casLink) {
-		this.casLink = casLink;
-	}
-
-	/**
-	 * @return direct evidence.
-	 */
-	public String getDirectEvidence() {
-		return directEvidence;
-	}
-
-	/**
-	 * @param directEvidence
-	 *          a text to indicate if there is direct evidence found.
-	 */
-	public void setDirectEvidence(String directEvidence) {
-		this.directEvidence = directEvidence;
-	}
-
-	/**
-	 * @return the link to the source database of chemicals.
-	 */
-	public AnnotationView getSourceLink() {
-		return sourceLink;
-	}
-
-	/**
-	 * @param sourceLink
-	 *          the link to database of chemicals.
-	 */
-	public void setSourceLink(AnnotationView sourceLink) {
-		this.sourceLink = sourceLink;
-	}
-
-	/**
-	 * Returns link to pubmed that enlist all references.
-	 * 
-	 * @return link to pubmed that enlist all references
-	 */
-	public String getAllDirectEvidenceLinks() {
-		String result = "http://www.ncbi.nlm.nih.gov/pubmed/?term=";
-		for (Article publication : directEvidencePubs) {
-			result += publication.getId() + " ";
-		}
-		return result;
-	}
-
-	/**
-	 * @return all articles/publications associated with the chemical direct
-	 *         evidence.
-	 */
-	public List<Article> getDirectEvidencePubs() {
-		return directEvidencePubs;
-	}
-
-	/**
-	 * @param directEvidencePubs
-	 *          all articles/publications associated with the chemical direct
-	 *          evidence.
-	 */
-	public void setDirectEvidencePubs(List<Article> directEvidencePubs) {
-		this.directEvidencePubs = directEvidencePubs;
-	}
-
-	/**
-	 * @param description
-	 *          description of the Chemicals.
-	 */
-	public void setDescription(String description) {
-		this.description = description;
-	}
-
-	/**
-	 * @return description of Chemical.
-	 */
-	public String getDescription() {
-		return description;
-	}
-
-	/**
-	 * @return list of Synonyms.
-	 */
-	public List<String> getSynonyms() {
-		return synonyms;
-	}
-
-	/**
-	 * @param synonyms
-	 *          list of Synonyms.
-	 */
-	public void setSynonyms(List<String> synonyms) {
-		this.synonyms = synonyms;
-	}
-
-	@Override
-	public String getUniqueId() {
-		return name;
-	}
-
-	@Override
-	public void setUniqueId(String uniqueId) {
-		this.name = uniqueId;
-	}
-
-}
diff --git a/service/src/main/java/lcsb/mapviewer/services/search/db/chemical/ChemicalViewFactory.java b/service/src/main/java/lcsb/mapviewer/services/search/db/chemical/ChemicalViewFactory.java
deleted file mode 100644
index dee6222cc6..0000000000
--- a/service/src/main/java/lcsb/mapviewer/services/search/db/chemical/ChemicalViewFactory.java
+++ /dev/null
@@ -1,188 +0,0 @@
-package lcsb.mapviewer.services.search.db.chemical;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import com.google.gson.Gson;
-
-import lcsb.mapviewer.annotation.data.Article;
-import lcsb.mapviewer.annotation.data.ArticleCitationComparator;
-import lcsb.mapviewer.annotation.data.Chemical;
-import lcsb.mapviewer.annotation.data.MeSH;
-import lcsb.mapviewer.annotation.data.Target;
-import lcsb.mapviewer.annotation.services.MeSHParser;
-import lcsb.mapviewer.annotation.services.PubmedParser;
-import lcsb.mapviewer.annotation.services.PubmedSearchException;
-import lcsb.mapviewer.annotation.services.annotators.AnnotatorException;
-import lcsb.mapviewer.model.map.MiriamData;
-import lcsb.mapviewer.model.map.MiriamType;
-import lcsb.mapviewer.model.map.model.Model;
-import lcsb.mapviewer.model.map.species.Element;
-import lcsb.mapviewer.services.overlay.IconManager;
-import lcsb.mapviewer.services.overlay.IconType;
-import lcsb.mapviewer.services.search.SearchResultFactory;
-import lcsb.mapviewer.services.search.data.ElementIdentifier;
-import lcsb.mapviewer.services.search.db.DrugTargetViewVisibilityComparator;
-import lcsb.mapviewer.services.search.db.TargetView;
-import lcsb.mapviewer.services.search.db.TargetViewFactory;
-import lcsb.mapviewer.services.view.AnnotationViewFactory;
-
-/**
- * Factory class for {@link ChemicalView} class.
- * 
- * @author Ayan Rota
- * 
- */
-public class ChemicalViewFactory extends SearchResultFactory<Chemical, ChemicalView> {
-
-	/**
-	 * Default class logger.
-	 */
-	private static Logger					logger = Logger.getLogger(ChemicalViewFactory.class);
-
-	/**
-	 * Factory object used for creation of
-	 * {@link lcsb.mapviewer.services.view.AnnotationView} elements.
-	 */
-	@Autowired
-	private AnnotationViewFactory	annotationViewFactory;
-
-	/**
-	 * Service accessing
-	 * <a href="http://europepmc.org/RestfulWebService">pubmed</a>.
-	 */
-	@Autowired
-	private PubmedParser					pubmedParser;
-
-	/**
-	 * Factory object used for creation of {@link TargetView} elements.
-	 */
-	@Autowired
-	private TargetViewFactory			drugTargetViewFactory;
-
-	/**
-	 * Service accessing <a href="http://europepmc.org/RestfulWebService">mesh</a>
-	 * .
-	 */
-	@Autowired
-	private MeSHParser						meSHParser;
-
-	@Override
-	public ChemicalView create(Chemical chemical) {
-		return create(chemical, null, 0);
-	}
-
-	/**
-	 * Creates {@link ChemicalView}.
-	 * 
-	 * @param chemical
-	 *          original Chemical from which the data will be initialized
-	 * @param model
-	 *          model where the view will be presented
-	 * @param set
-	 *          which set of icons should be used
-	 * 
-	 * @return {@link ChemicalView} object for given chemical. links are placed
-	 *         according to model given in the parameter.
-	 */
-	public ChemicalView create(Chemical chemical, Model model, int set) {
-		ChemicalView chemicalView = new ChemicalView(chemical);
-		if (chemical == null) {
-			return chemicalView;
-		}
-
-		chemicalView.setName(chemical.getChemicalName());
-		if (chemical.getDirectEvidence() != null) {
-			chemicalView.setDirectEvedince(chemical.getDirectEvidence().getValue());
-		}
-
-		if (chemical.getChemicalId() != null) {
-			chemicalView.setSourceLink(annotationViewFactory.create(chemical.getChemicalId()));
-			try {
-				MeSH mesh = meSHParser.getMeSH(chemical.getChemicalId());
-				if (mesh != null) {
-					chemicalView.setDescription(mesh.getDescription());
-					chemicalView.setSynonyms(mesh.getSynonyms());
-				} else {
-					chemicalView.setDescription("Mesh term not available");
-				}
-			} catch (AnnotatorException e) {
-				logger.error("Problem with accessing mesh database", e);
-				chemicalView.setDescription("Mesh term not available");
-			}
-		}
-
-		if (chemical.getCasID() != null) {
-			chemicalView.setCasLink(annotationViewFactory.create(chemical.getCasID()));
-		}
-
-		List<Article> articles = new ArrayList<Article>();
-		for (MiriamData publication : chemical.getDirectEvidencePublication()) {
-			if (publication.getDataType().equals(MiriamType.PUBMED)) {
-				Integer id = Integer.parseInt(publication.getResource());
-				try {
-					Article article = pubmedParser.getPubmedArticleById(id);
-					if (article != null) {
-						articles.add(article);
-					}
-				} catch (PubmedSearchException e) {
-					logger.error("Problem with accessing info about pubmed", e);
-				}
-			} else {
-				logger.warn("Unknown publication type: " + publication);
-			}
-		}
-		Collections.sort(articles, new ArticleCitationComparator());
-		chemicalView.setDirectEvidencePubs(articles);
-
-		List<TargetView> targetsRows = new ArrayList<>();
-
-		int differentNames = 0;
-		for (Target geneEntry : chemical.getInferenceNetwork()) {
-			targetsRows.add(drugTargetViewFactory.create(geneEntry, model));
-		}
-
-		Collections.sort(targetsRows, new DrugTargetViewVisibilityComparator());
-
-		for (TargetView geneTargetView : targetsRows) {
-			if (geneTargetView.getSelectable()) {
-				String icon = IconManager.getInstance().getIconForIndex(differentNames++, IconType.CHEMICAL, set);
-				geneTargetView.setIcon(icon);
-				geneTargetView.setSelected(true);
-			}
-		}
-		chemicalView.setTargetRows(targetsRows);
-		return chemicalView;
-
-	}
-
-	@Override
-	public String createGson(ChemicalView object) {
-		return new Gson().toJson(object);
-	}
-
-	@Override
-	public List<ElementIdentifier> searchResultToElementIdentifier(ChemicalView chemical, Model inputModel) {
-		List<ElementIdentifier> result = new ArrayList<>();
-
-		List<Model> models = new ArrayList<>();
-		models.addAll(inputModel.getSubmodels());
-		models.add(inputModel);
-		for (Model model : models) {
-			for (TargetView target : chemical.getTargetRows()) {
-				if (target.getSelected() && target.getIcon() != null) {
-					for (Element element : model.getElements()) {
-						if (elementMatch(target, element)) {
-							result.add(new ElementIdentifier(element, target.getIcon()));
-						}
-					}
-				}
-			}
-		}
-		return result;
-	}
-}
diff --git a/service/src/test/java/lcsb/mapviewer/services/search/SearchResultFactoryTest.java b/service/src/test/java/lcsb/mapviewer/services/search/SearchResultFactoryTest.java
index 423e18eaad..7a310be346 100644
--- a/service/src/test/java/lcsb/mapviewer/services/search/SearchResultFactoryTest.java
+++ b/service/src/test/java/lcsb/mapviewer/services/search/SearchResultFactoryTest.java
@@ -15,10 +15,8 @@ import lcsb.mapviewer.model.map.MiriamType;
 import lcsb.mapviewer.model.map.species.Element;
 import lcsb.mapviewer.model.map.species.Rna;
 import lcsb.mapviewer.services.ServiceTestFunctions;
+import lcsb.mapviewer.services.search.comment.FullCommentViewFactory;
 import lcsb.mapviewer.services.search.db.DbSearchCriteria;
-import lcsb.mapviewer.services.search.db.GeneRow;
-import lcsb.mapviewer.services.search.db.TargetView;
-import lcsb.mapviewer.services.search.db.chemical.ChemicalViewFactory;
 import lcsb.mapviewer.services.search.db.chemical.IChemicalService;
 
 public class SearchResultFactoryTest extends ServiceTestFunctions {
@@ -26,7 +24,7 @@ public class SearchResultFactoryTest extends ServiceTestFunctions {
 	Logger							logger = Logger.getLogger(SearchResultFactoryTest.class);
 
 	@Autowired
-	ChemicalViewFactory	factory;
+	FullCommentViewFactory	factory;
 
 	@Autowired
 	IChemicalService		chemicalService;
diff --git a/web/src/test/java/lcsb/mapviewer/bean/WebTestFunctions.java b/web/src/test/java/lcsb/mapviewer/bean/WebTestFunctions.java
index 4e4f8ba30d..1f91278fa0 100644
--- a/web/src/test/java/lcsb/mapviewer/bean/WebTestFunctions.java
+++ b/web/src/test/java/lcsb/mapviewer/bean/WebTestFunctions.java
@@ -79,7 +79,6 @@ import lcsb.mapviewer.services.interfaces.IProjectService;
 import lcsb.mapviewer.services.interfaces.IReferenceGenomeService;
 import lcsb.mapviewer.services.interfaces.ISearchService;
 import lcsb.mapviewer.services.interfaces.IUserService;
-import lcsb.mapviewer.services.search.db.chemical.ChemicalViewFactory;
 import lcsb.mapviewer.services.search.db.chemical.IChemicalService;
 import lcsb.mapviewer.services.search.db.drug.DrugViewFactory;
 import lcsb.mapviewer.services.search.db.drug.IDrugService;
@@ -194,9 +193,6 @@ public abstract class WebTestFunctions {
 	@Autowired
 	protected DrugViewFactory					 drugViewFactory;
 
-	@Autowired
-	protected ChemicalViewFactory			 chemicalViewFactory;
-
 	@Autowired
 	protected IReferenceGenomeService	 referenceGenomeService;
 
-- 
GitLab