2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
9 package eu
.etaxonomy
.cdm
.compare
.taxon
;
11 import java
.util
.ArrayList
;
12 import java
.util
.Comparator
;
13 import java
.util
.List
;
15 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonNode
;
18 * Comparator to compare {@link TaxonNode taxon nodes} by its user defined ordering
22 public class TaxonNodeNaturalComparator
implements Comparator
<TaxonNode
> {
24 @SuppressWarnings("null")
26 public int compare(TaxonNode node1
, TaxonNode node2
) {
27 // System.out.println("compare node 1: "+ node1.getTaxon().getTitleCache() + " - node 2: " + node2.getTaxon().getTitleCache());
28 if (node1
.equals(node2
)) {
31 if (node1
.treeIndex() == null){
32 if (node2
.treeIndex() == null){
37 }else if (node2
.treeIndex() == null){
41 if (node1
.isAncestor(node2
)) {
44 if (node2
.isAncestor(node1
)) {
48 String
[] splitNode1
= node1
.treeIndex().split("#");
49 String
[] splitNode2
= node2
.treeIndex().split("#");
51 if (node1
.getParent().equals(node2
.getParent())){
52 return node1
.getSortIndex().compareTo(node2
.getSortIndex());
54 String lastEqualAncestorTreeIndex
= "";
55 List
<TaxonNode
> ancestorAndNode1
= new ArrayList
<>();
56 ancestorAndNode1
.add(node1
);
57 ancestorAndNode1
.addAll(node1
.getAncestorList());
58 java
.util
.Collections
.sort(ancestorAndNode1
, new TreeIndexComparator());
61 List
<TaxonNode
> ancestorAndNode2
= new ArrayList
<>();
62 ancestorAndNode2
.add(node2
);
63 ancestorAndNode2
.addAll(node2
.getAncestorList());
64 java
.util
.Collections
.sort(ancestorAndNode2
, new TreeIndexComparator());
66 for (int i
= 0; i
< splitNode1
.length
; i
++){
67 if (!splitNode1
[i
].equals(splitNode2
[i
])){
68 // take the last equal ancestor and compare the sortindex
69 if (lastEqualAncestorTreeIndex
!= null){
70 TaxonNode lastEqualTreeIndexAncestorNode1
= null;
71 TaxonNode lastEqualTreeIndexAncestorNode2
= null;
72 for (TaxonNode next1
:ancestorAndNode1
){
73 if (next1
.treeIndex().equals(lastEqualAncestorTreeIndex
+"#"+splitNode1
[i
]+ "#") ){
74 lastEqualTreeIndexAncestorNode1
= next1
;
77 for (TaxonNode next2
:ancestorAndNode2
){
79 if (next2
.treeIndex().equals(lastEqualAncestorTreeIndex
+"#"+splitNode2
[i
]+ "#")){
80 lastEqualTreeIndexAncestorNode2
= next2
;
83 return lastEqualTreeIndexAncestorNode1
.getSortIndex().compareTo(lastEqualTreeIndexAncestorNode2
.getSortIndex());
86 if (!splitNode1
[i
].equals("")){
87 lastEqualAncestorTreeIndex
= lastEqualAncestorTreeIndex
+"#"+splitNode1
[i
];
93 private final class TreeIndexComparator
implements Comparator
<TaxonNode
> {
95 public int compare(TaxonNode node1
,TaxonNode node2
){
96 return node1
.treeIndex().compareTo(node2
.treeIndex());