/* See LICENSE for licensing and NOTICE for copyright. */ package org.ldaptive; import java.util.Comparator; /** * Compares two ldap entries, ignoring the case of supplied attribute values. * * @author Middleware Services */ public class LdapEntryIgnoreCaseComparator implements Comparator<LdapEntry> { /** names of attributes to ignore the case of. */ private final String[] attributeNames; /** Creates a new ldap entry ignore case comparator that will ignore the case of all attribute values. */ public LdapEntryIgnoreCaseComparator() { this((String[]) null); } /** * Creates a new ldap entry ignore case comparator with the supplied names. If names is null all attributes will be * case ignored. * * @param names of attributes whose case should be ignored */ public LdapEntryIgnoreCaseComparator(final String... names) { attributeNames = names; } /** * Compares two ldap entries. * * @param a first entry for the comparison * @param b second entry for the comparison * * @return a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater * than the second. */ public int compare(final LdapEntry a, final LdapEntry b) { return lowerCaseEntry(a, attributeNames).hashCode() - lowerCaseEntry(b, attributeNames).hashCode(); } /** * Returns a new ldap entry whose attribute values have been lower cased as configured. * * @param le entry to copy values from * @param names of attributes whose case should be ignored * * @return ldap entry with lower cased attribute values * * @throws IllegalArgumentException if a binary attribute is lower cased */ public static LdapEntry lowerCaseEntry(final LdapEntry le, final String... names) { final LdapEntry lowerCase = new LdapEntry(le.getSortBehavior()); lowerCase.setDn(le.getDn()); for (LdapAttribute la : le.getAttributes()) { if (names != null) { boolean setAttr = false; for (String name : names) { if (name.equalsIgnoreCase(la.getName())) { lowerCase.addAttribute(LdapAttributeIgnoreCaseComparator.lowerCaseAttribute(la)); setAttr = true; break; } } if (!setAttr) { lowerCase.addAttribute(la); } } else { lowerCase.addAttribute(LdapAttributeIgnoreCaseComparator.lowerCaseAttribute(la)); } } return lowerCase; } }