public GenesSearchResult getGenes(List<String> geneNames) {
        List<GeneInput> loadedGenes = new LinkedList<GeneInput>();
        List<String> notFoundGeneNames = new LinkedList<String>();
        for (String geneName : geneNames) {
            GeneInput gene = new GeneInput(geneName);
            GeneInput selectedGene = null;
            for (GeneInput preloadedGene : genes) {
                if(preloadedGene.equals(gene)) {
                    selectedGene = preloadedGene;
                    break;
                }
                else if (preloadedGene.isSynonym(gene)) {
                    selectedGene = preloadedGene;
                }
            }
            if(selectedGene != null) {
                if (!selectedGene.getName().equalsIgnoreCase(geneName)) {
                    if (loadedGenes.contains(selectedGene)) {
                        selectedGene = selectedGene.clone();
                    }
                    selectedGene.convertSynonymInName(geneName);
                }
                loadedGenes.add(selectedGene);
            } else {
                notFoundGeneNames.add(geneName);
            }
        }
        if (!isPreloaded && !notFoundGeneNames.isEmpty()) {
            GenesSearchResult genesSearchResult = GeneDAO.getGenes(this, notFoundGeneNames);
            loadedGenes.addAll(genesSearchResult.found);
            genes.addAll(genesSearchResult.found);
            return new GenesSearchResult(loadedGenes, genesSearchResult.unknown);
        }
        return new GenesSearchResult(loadedGenes, new LinkedList<String>());
    }