package org.mobicents.slee.runtime.sbbentity; import java.util.Comparator; import java.util.LinkedList; /** * Comparator used to sort a set of sbb entities. * * @author martins * */ public class SbbEntityComparator implements Comparator<String> { /* * (non-Javadoc) * * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ public int compare(String sbbeId1, String sbbeId2) { SbbEntity sbbe1 = null; try { sbbe1 = SbbEntityFactory.getSbbEntity(sbbeId1); } catch (Exception e) { // ignore } SbbEntity sbbe2 = null; try { sbbe2 = SbbEntityFactory.getSbbEntity(sbbeId2); } catch (Exception e) { // ignore } if (sbbe1 == null) { if (sbbe2 == null) { return 0; } else { return 1; } } else { if (sbbe2 == null) { return -1; } else { return higherPrioritySbb(sbbe1, sbbe2); } } } /** * * @param sbbe1 * @param sbbe2 * @return */ private int higherPrioritySbb(SbbEntity sbbe1, SbbEntity sbbe2) { final LinkedList<SbbEntity> stack1 = priorityOfSbb(sbbe1); final LinkedList<SbbEntity> stack2 = priorityOfSbb(sbbe2); while (true) { SbbEntity sbb1a = stack1.removeFirst(); SbbEntity sbb2a = stack2.removeFirst(); if (sbb1a == sbb2a) { // sbb entities have the same ancestor. if (stack1.isEmpty()) { return -1; } else if (stack2.isEmpty()) { return 1; } } else { if (sbb1a.getPriority() > sbb2a.getPriority()) { return -1; } else { return 1; } } } } /** * * @param sbbe * @return */ private LinkedList<SbbEntity> priorityOfSbb(SbbEntity sbbe) { final LinkedList<SbbEntity> list = new LinkedList<SbbEntity>(); // push all non root sbb entities while (!sbbe.isRootSbbEntity()) { list.addFirst(sbbe); sbbe = SbbEntityFactory.getSbbEntity(sbbe.getParentSbbEntityId()); } // push the root one list.addFirst(sbbe); return list; } }