private void sortByPriority(Vector<Rule> rules) {
    RulePriority priority = new RulePriority(rules);
    Integer startPriority = priority.getStartPriority();
    Hashtable<Integer, HashSet<Rule>> invertedRulePriority = priority.invertPriority();

    OrderedSet<Integer> rulePrioritySet = new OrderedSet<Integer>(new IntComparator<Integer>());
    for (Enumeration<Integer> en = invertedRulePriority.keys(); en.hasMoreElements(); ) {
      rulePrioritySet.add(en.nextElement());
    }
    int i = 0;

    Integer maxPriorityInt = null;
    HashSet<Rule> priority0Set = null;
    Integer currentPriority = startPriority;
    boolean nextPriorityExists = true;
    while (nextPriorityExists && (currentPriority != null)) {
      HashSet<Rule> rulesForPriority = invertedRulePriority.get(currentPriority);
      Pair<Integer, HashSet<Rule>> p =
          new Pair<Integer, HashSet<Rule>>(currentPriority, rulesForPriority);
      if (currentPriority.intValue() > 0) this.sortedRules.add(p);
      else {
        priority0Set = rulesForPriority;
      }
      maxPriorityInt = currentPriority;

      // set next Layer
      i++;
      if (i < rulePrioritySet.size()) {
        currentPriority = rulePrioritySet.get(i);
      } else {
        nextPriorityExists = false;
      }
    }
    if (priority0Set != null && maxPriorityInt != null) {
      int maxPriority = maxPriorityInt.intValue() + 1;
      Pair<Integer, HashSet<Rule>> p0 =
          new Pair<Integer, HashSet<Rule>>(new Integer(maxPriority), priority0Set);
      this.sortedRules.add(p0);
    }
  }