--- /dev/null
+\r
+package eu.etaxonomy.taxeditor.view;\r
+\r
+import java.util.Iterator;\r
+import java.util.List;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import eu.etaxonomy.cdm.model.name.HomotypicalGroup;\r
+import eu.etaxonomy.cdm.model.taxon.Synonym;\r
+import eu.etaxonomy.cdm.model.taxon.Taxon;\r
+\r
+/**\r
+ * Provides a way to retrieve the elements of a taxon's synonymy list\r
+ * using an iterator. Note: does not return the taxon itself.\r
+ * \r
+ * @author p.ciardelli\r
+ * @created 09.05.2008\r
+ * @version 1.0\r
+ */\r
+public class IterableSynonymyList implements Iterable {\r
+ private static final Logger logger = Logger\r
+ .getLogger(IterableSynonymyList.class);\r
+ \r
+ private Taxon taxon;\r
+\r
+ public IterableSynonymyList(Taxon taxon) {\r
+ this.taxon = taxon;\r
+ }\r
+\r
+ @Override\r
+ public Iterator iterator() {\r
+ Iterator<?> iterator = new Iterator() {\r
+ \r
+ boolean returnedHomotypicSynonyms = false;\r
+ boolean returnedHeterotypicSynonyms = false;\r
+ boolean returnedMisappliedNames = false;\r
+\r
+ int indexHomotypicSynonyms = 0;\r
+ int indexHeterotypicSynonymyGroups = 0;\r
+ int indexCurrentHeterotypicGroup = 0;\r
+ int indexHeterotypicSynonyms = 0;\r
+ int indexMisappliedNames = 0;\r
+ \r
+ List<Synonym> homotypicSynonyms = null;\r
+ List<HomotypicalGroup> heterotypicGroups = null;\r
+ List<Synonym> currentHeterotypicGroup = null;\r
+ \r
+ @Override\r
+ public boolean hasNext() {\r
+ boolean returnedAll = returnedHomotypicSynonyms \r
+ && returnedHeterotypicSynonyms \r
+ && returnedMisappliedNames; \r
+ return !returnedAll;\r
+ }\r
+\r
+ @Override\r
+ public Object next() {\r
+ if (!returnedHomotypicSynonyms) {\r
+ if (homotypicSynonyms == null) {\r
+ HomotypicalGroup homotypicGroup = taxon.getHomotypicGroup();\r
+ List<Synonym> homotypicSynonyms = homotypicGroup.getSynonymsInGroup(taxon.getSec());\r
+ }\r
+ if (homotypicSynonyms.size() == indexHomotypicSynonyms) {\r
+ returnedHomotypicSynonyms = true;\r
+ } else {\r
+ Synonym synonym = homotypicSynonyms.get(indexHomotypicSynonyms);\r
+ indexHomotypicSynonyms++;\r
+ return synonym;\r
+ }\r
+ \r
+ }\r
+ \r
+ if (!returnedHeterotypicSynonyms) {\r
+ if (heterotypicGroups == null) {\r
+ heterotypicGroups = taxon.getHeterotypicSynonymyGroups();\r
+ }\r
+ // Check if current heterotypic group has next\r
+ boolean getNewGroup = false;\r
+ if (currentHeterotypicGroup != null && currentHeterotypicGroup.size() == indexCurrentHeterotypicGroup) {\r
+ indexHeterotypicSynonymyGroups++;\r
+ getNewGroup = true;\r
+ }\r
+ if (heterotypicGroups.size() == indexHeterotypicSynonymyGroups) {\r
+ returnedHeterotypicSynonyms = true;\r
+ } else {\r
+ \r
+ if (currentHeterotypicGroup == null || getNewGroup) {\r
+ indexCurrentHeterotypicGroup = 0;\r
+ currentHeterotypicGroup = (List<Synonym>) heterotypicGroups.get(indexCurrentHeterotypicGroup);\r
+ }\r
+ \r
+ indexCurrentHeterotypicGroup++;\r
+ }\r
+ }\r
+ return null;\r
+ }\r
+\r
+ @Override\r
+ public void remove() {\r
+ // TODO Auto-generated method stub\r
+ \r
+ }\r
+ \r
+ };\r
+ return iterator;\r
+ }\r
+}\r