View Javadoc

1   package org.cateproject.controller.taxon;
2   
3   import java.util.Comparator;
4   
5   import eu.etaxonomy.cdm.model.name.BotanicalName;
6   import eu.etaxonomy.cdm.model.name.TaxonNameBase;
7   import eu.etaxonomy.cdm.model.name.ZoologicalName;
8   import eu.etaxonomy.cdm.model.reference.INomenclaturalReference;
9   import eu.etaxonomy.cdm.model.reference.ReferenceBase;
10  import eu.etaxonomy.cdm.model.taxon.SynonymRelationship;
11  
12  public class BotanicalSynonymComparator implements
13  		Comparator<SynonymRelationship> {
14      /**
15       *  Comparator that sorts by (1) the age of the homotypical group, youngest first, followed by the age
16       *  of the name within that homotypical group, youngest first
17       */
18  	public int compare(SynonymRelationship o1, SynonymRelationship o2) {
19  		if(!o1.getSynonym().getName().getHomotypicalGroup().getUuid().equals(o2.getSynonym().getName().getHomotypicalGroup().getUuid())) {
20  			Integer homotypicalGroupAge1 = 10000;
21  		    for(TaxonNameBase n :  o1.getSynonym().getName().getHomotypicalGroup().getTypifiedNames()) {
22  			    n = TaxonNameBase.deproxy(n, TaxonNameBase.class);
23  			    if(n instanceof BotanicalName) {
24  			    	INomenclaturalReference nomenclaturalReference = n.getNomenclaturalReference();
25  			    	if(nomenclaturalReference != null && nomenclaturalReference.getDatePublished() != null && nomenclaturalReference.getDatePublished().getStartYear() != null) {
26  				      homotypicalGroupAge1 = n.getNomenclaturalReference().getDatePublished().getStartYear() < homotypicalGroupAge1 ? n.getNomenclaturalReference().getDatePublished().getStartYear() : homotypicalGroupAge1;
27  			    	}
28  			    } else {
29  			    	homotypicalGroupAge1 = ((ZoologicalName)n).getOriginalPublicationYear() < homotypicalGroupAge1 ? ((ZoologicalName)n).getOriginalPublicationYear() : homotypicalGroupAge1;
30  			    }
31  		    }
32  		    
33  		    Integer homotypicalGroupAge2 = 10000;
34  		    for(TaxonNameBase n :  o2.getSynonym().getName().getHomotypicalGroup().getTypifiedNames()) {
35  			    n = n.deproxy(n, TaxonNameBase.class);
36  			    
37  			      if(n instanceof BotanicalName) {
38  			    	  INomenclaturalReference nomenclaturalReference = n.getNomenclaturalReference();
39  			    	  if(nomenclaturalReference != null && nomenclaturalReference.getDatePublished() != null && nomenclaturalReference.getDatePublished().getStartYear() != null) {
40  				        homotypicalGroupAge2 = n.getNomenclaturalReference().getDatePublished().getStartYear() < homotypicalGroupAge2 ? n.getNomenclaturalReference().getDatePublished().getStartYear() : homotypicalGroupAge2;
41  			    	  }
42  			      } else {
43  			    	homotypicalGroupAge2 = ((ZoologicalName)n).getOriginalPublicationYear() < homotypicalGroupAge2 ? ((ZoologicalName)n).getOriginalPublicationYear() : homotypicalGroupAge2;
44  			      }
45  			    
46  		    }
47  		    return homotypicalGroupAge1.compareTo(homotypicalGroupAge2);
48  		} else {
49  			TaxonNameBase n1 = TaxonNameBase.deproxy(o1.getSynonym().getName(),TaxonNameBase.class);
50  			TaxonNameBase n2 = TaxonNameBase.deproxy(o2.getSynonym().getName(),TaxonNameBase.class);
51  			Integer nameAge1 = 0;
52  			Integer nameAge2 = 0;
53  			
54  			if(n1 instanceof BotanicalName) {
55  				INomenclaturalReference nomenclaturalReference = n1.getNomenclaturalReference();
56  				if(nomenclaturalReference != null && nomenclaturalReference.getDatePublished() != null && nomenclaturalReference.getDatePublished().getStartYear() != null) {
57  				  nameAge1 = n1.getNomenclaturalReference().getDatePublished().getStartYear();
58  				}
59  			} else {
60  				nameAge1 = ((ZoologicalName)n1).getOriginalPublicationYear();
61  			}
62  			
63  			if(n2 instanceof BotanicalName) {
64  				INomenclaturalReference nomenclaturalReference = n2.getNomenclaturalReference();
65  				if(nomenclaturalReference != null && nomenclaturalReference.getDatePublished() != null && nomenclaturalReference.getDatePublished().getStartYear() != null) {
66  				  nameAge2 = n2.getNomenclaturalReference().getDatePublished().getStartYear();
67  				}
68  			} else {
69  				nameAge2 = ((ZoologicalName)n2).getOriginalPublicationYear();
70  			}
71  			
72  		    return nameAge1.compareTo(nameAge2);
73  		}
74  	}
75  
76  }