Comprehensive Java LDAP SDK providing full LDAPv3 protocol support, connection pooling, schema handling, and persistence framework for LDAP directory operations.
—
Core LDAP data types for representing directory entries, attributes, distinguished names, and related manipulation utilities.
Core class representing an LDAP directory entry.
/**
* Represents an LDAP directory entry with DN and attributes
*/
public class Entry implements Serializable {
// Constructors
public Entry(String dn);
public Entry(String dn, Attribute... attributes);
public Entry(String dn, Collection<Attribute> attributes);
public Entry(DN dn);
public Entry(DN dn, Attribute... attributes);
public Entry(DN dn, Collection<Attribute> attributes);
// DN access
public String getDN();
public DN getParsedDN() throws LDAPException;
// Attribute access
public Attribute getAttribute(String attributeName);
public String getAttributeValue(String attributeName);
public byte[] getAttributeValueBytes(String attributeName);
public String[] getAttributeValues(String attributeName);
public byte[][] getAttributeValueByteArrays(String attributeName);
public Collection<Attribute> getAttributes();
public int getNumAttributes();
public boolean hasAttribute(String attributeName);
public boolean hasAttributeValue(String attributeName, String attributeValue);
// Entry modification
public void addAttribute(Attribute attribute);
public void addAttribute(String attributeName, String attributeValue);
public void addAttribute(String attributeName, byte[] attributeValue);
public boolean removeAttribute(String attributeName);
public boolean removeAttributeValue(String attributeName, String attributeValue);
public void setAttribute(Attribute attribute);
public void setAttribute(String attributeName, String attributeValue);
// Utility methods
public Entry duplicate();
public String toLDIFString();
public String toLDIFString(int wrapColumn);
}Class representing an LDAP attribute with one or more values.
/**
* Represents an LDAP attribute with one or more values
*/
public class Attribute implements Serializable {
// Constructors
public Attribute(String name);
public Attribute(String name, String value);
public Attribute(String name, byte[] value);
public Attribute(String name, String... values);
public Attribute(String name, byte[]... values);
public Attribute(String name, Collection<String> values);
// Name access
public String getName();
public String getBaseName();
public String[] getOptions();
public boolean hasOption(String option);
// Value access
public String getValue();
public byte[] getValueByteArray();
public String[] getValues();
public byte[][] getValueByteArrays();
public int size();
public boolean hasValue();
public boolean hasValue(String value);
public boolean hasValue(byte[] value);
// Value manipulation
public Attribute addValue(String value);
public Attribute addValue(byte[] value);
public Attribute removeValue(String value);
public Attribute removeValue(byte[] value);
// Utility methods
public Attribute duplicate();
public String toString();
public int hashCode();
public boolean equals(Object obj);
}Class for parsing, manipulating, and validating LDAP distinguished names.
/**
* Represents and manipulates LDAP distinguished names
*/
public class DN implements Comparable<DN>, Serializable {
// Constructors
public DN(String dnString) throws LDAPException;
public DN(RDN... rdns);
public DN(List<RDN> rdns);
// DN structure access
public RDN[] getRDNs();
public RDN getRDN();
public RDN getRDN(int index);
public int getRDNCount();
public DN getParent();
public DN getParent(int count);
// DN relationships
public boolean isAncestorOf(DN dn, boolean strict);
public boolean isDescendantOf(DN dn, boolean strict);
public boolean isWithinSubtree(DN baseDN, boolean strict);
// DN manipulation
public DN child(RDN rdn);
public DN child(String rdnString) throws LDAPException;
public DN parent();
public DN parent(int count);
// String representations
public String toString();
public String toNormalizedString();
public String toMinimallyEncodedString();
// Validation and normalization
public static boolean isValidDN(String dnString);
public static DN normalize(DN dn);
public byte[] getNormalizedByteArray();
// Comparison
public int compareTo(DN dn);
public boolean equals(Object obj);
public boolean equals(DN dn);
public int hashCode();
}Class representing individual components of a distinguished name.
/**
* Represents a relative distinguished name (single DN component)
*/
public class RDN implements Comparable<RDN>, Serializable {
// Constructors
public RDN(String rdnString) throws LDAPException;
public RDN(String attributeName, String attributeValue);
public RDN(String attributeName, byte[] attributeValue);
public RDN(String[] attributeNames, String[] attributeValues);
public RDN(String[] attributeNames, byte[][] attributeValues);
// Component access
public String[] getAttributeNames();
public String[] getAttributeValues();
public byte[][] getAttributeValueBytes();
public int getValueCount();
public boolean hasAttribute(String attributeName);
public String getAttributeValue(String attributeName);
public byte[] getAttributeValueBytes(String attributeName);
// String representations
public String toString();
public String toNormalizedString();
public String toMinimallyEncodedString();
// Validation and normalization
public static boolean isValidRDN(String rdnString);
public byte[] getNormalizedByteArray();
// Comparison
public int compareTo(RDN rdn);
public boolean equals(Object obj);
public int hashCode();
}Class for constructing and parsing LDAP search filters.
/**
* Represents and constructs LDAP search filters
*/
public class Filter implements Serializable {
// Filter creation from string
public static Filter create(String filterString) throws LDAPException;
// Basic filter types
public static Filter createEqualityFilter(String attributeName, String assertionValue);
public static Filter createEqualityFilter(String attributeName, byte[] assertionValue);
public static Filter createSubstringFilter(String attributeName, String subInitial, String[] subAny, String subFinal);
public static Filter createSubInitialFilter(String attributeName, String subInitial);
public static Filter createSubAnyFilter(String attributeName, String... subAnyValues);
public static Filter createSubFinalFilter(String attributeName, String subFinal);
public static Filter createGreaterOrEqualFilter(String attributeName, String assertionValue);
public static Filter createLessOrEqualFilter(String attributeName, String assertionValue);
public static Filter createPresenceFilter(String attributeName);
public static Filter createApproximateMatchFilter(String attributeName, String assertionValue);
// Logical combinations
public static Filter createANDFilter(Filter... filters);
public static Filter createANDFilter(Collection<Filter> filters);
public static Filter createORFilter(Filter... filters);
public static Filter createORFilter(Collection<Filter> filters);
public static Filter createNOTFilter(Filter filter);
// Extensible match filters
public static Filter createExtensibleMatchFilter(String attributeName, String matchingRuleID, boolean dnAttributes, String assertionValue);
public static Filter createExtensibleMatchFilter(String attributeName, String matchingRuleID, boolean dnAttributes, byte[] assertionValue);
// Filter properties
public FilterType getFilterType();
public String getAttributeName();
public String getAssertionValue();
public byte[] getAssertionValueBytes();
public Filter[] getComponents();
public Filter getNOTComponent();
// String representation
public String toString();
public String toNormalizedString();
// Validation
public static boolean isValidFilter(String filterString);
// Comparison
public boolean equals(Object obj);
public int hashCode();
}
/**
* Enumeration of filter types
*/
public enum FilterType {
AND((byte) 0xA0),
OR((byte) 0xA1),
NOT((byte) 0xA2),
EQUALITY((byte) 0xA3),
SUBSTRING((byte) 0xA4),
GREATER_OR_EQUAL((byte) 0xA5),
LESS_OR_EQUAL((byte) 0xA6),
PRESENT((byte) 0x87),
APPROXIMATE_MATCH((byte) 0xA8),
EXTENSIBLE_MATCH((byte) 0xA9);
}Class representing modifications to LDAP entries.
/**
* Represents a modification to be applied to an LDAP entry
*/
public class Modification implements Serializable {
// Constructors
public Modification(ModificationType modificationType, String attributeName);
public Modification(ModificationType modificationType, String attributeName, String attributeValue);
public Modification(ModificationType modificationType, String attributeName, byte[] attributeValue);
public Modification(ModificationType modificationType, String attributeName, String... attributeValues);
public Modification(ModificationType modificationType, String attributeName, byte[]... attributeValues);
public Modification(ModificationType modificationType, Attribute attribute);
// Access methods
public ModificationType getModificationType();
public String getAttributeName();
public String[] getValues();
public byte[][] getValueByteArrays();
public Attribute getAttribute();
// Utility methods
public String toString();
public boolean equals(Object obj);
public int hashCode();
}
/**
* Types of modifications that can be applied to entries
*/
public enum ModificationType {
ADD(0),
DELETE(1),
REPLACE(2),
INCREMENT(3);
public int intValue();
public static ModificationType valueOf(int intValue);
}Base class for LDAP controls.
/**
* Base class for LDAP controls
*/
public class Control implements Serializable {
// Constructors
public Control(String oid);
public Control(String oid, boolean isCritical);
public Control(String oid, boolean isCritical, ASN1OctetString value);
// Access methods
public String getOID();
public boolean isCritical();
public ASN1OctetString getValue();
// Utility methods
public String toString();
public boolean equals(Object obj);
public int hashCode();
}Basic ASN.1 BER encoding support for LDAP protocol elements.
/**
* Base class for ASN.1 BER elements
*/
public class ASN1Element implements Serializable {
public byte getType();
public int getValueLength();
public byte[] getValue();
public byte[] encode();
public static ASN1Element decode(byte[] elementBytes) throws ASN1Exception;
public static ASN1Element decode(InputStream inputStream) throws ASN1Exception;
}
/**
* ASN.1 BER octet string element
*/
public class ASN1OctetString extends ASN1Element {
public ASN1OctetString(String stringValue);
public ASN1OctetString(byte[] value);
public String stringValue();
public byte[] getValue();
}
/**
* ASN.1 BER sequence element
*/
public class ASN1Sequence extends ASN1Element {
public ASN1Sequence(ASN1Element... elements);
public ASN1Sequence(List<ASN1Element> elements);
public ASN1Element[] getElements();
public int size();
}import com.unboundid.ldap.sdk.*;
// Create a new entry
Entry entry = new Entry(
"cn=John Doe,ou=people,dc=example,dc=com",
new Attribute("objectClass", "inetOrgPerson"),
new Attribute("cn", "John Doe"),
new Attribute("sn", "Doe"),
new Attribute("givenName", "John"),
new Attribute("mail", "john.doe@example.com"),
new Attribute("telephoneNumber", "+1-555-0123", "+1-555-0124")
);
// Access entry properties
System.out.println("DN: " + entry.getDN());
System.out.println("CN: " + entry.getAttributeValue("cn"));
System.out.println("Mail: " + entry.getAttributeValue("mail"));
// Check for attributes
if (entry.hasAttribute("telephoneNumber")) {
String[] phones = entry.getAttributeValues("telephoneNumber");
System.out.println("Phone numbers: " + Arrays.toString(phones));
}
// Modify entry
entry.addAttribute("description", "Software Engineer");
entry.setAttribute("mail", "j.doe@example.com"); // Replace existing value
entry.removeAttributeValue("telephoneNumber", "+1-555-0124");
// Convert to LDIF
System.out.println(entry.toLDIFString());import com.unboundid.ldap.sdk.*;
try {
// Parse DN
DN userDN = new DN("cn=John Doe,ou=people,dc=example,dc=com");
// Access DN components
System.out.println("Full DN: " + userDN.toString());
System.out.println("RDN: " + userDN.getRDN().toString());
System.out.println("Parent: " + userDN.getParent().toString());
// Work with RDNs
RDN[] rdns = userDN.getRDNs();
for (RDN rdn : rdns) {
System.out.println("RDN: " + rdn.toString());
String[] attrNames = rdn.getAttributeNames();
for (String name : attrNames) {
System.out.println(" " + name + "=" + rdn.getAttributeValue(name));
}
}
// DN relationships
DN baseDN = new DN("dc=example,dc=com");
DN peopleDN = new DN("ou=people,dc=example,dc=com");
System.out.println("User is descendant of base: " + userDN.isDescendantOf(baseDN, false));
System.out.println("People is ancestor of user: " + peopleDN.isAncestorOf(userDN, false));
// Construct new DNs
DN newUserDN = peopleDN.child("cn=Jane Smith");
System.out.println("New user DN: " + newUserDN.toString());
} catch (LDAPException e) {
System.err.println("Invalid DN: " + e.getMessage());
}import com.unboundid.ldap.sdk.*;
// Simple filters
Filter equalityFilter = Filter.createEqualityFilter("cn", "John Doe");
Filter presenceFilter = Filter.createPresenceFilter("mail");
Filter substringFilter = Filter.createSubstringFilter("cn", "John", null, null);
// Complex filters with logical operators
Filter userFilter = Filter.createANDFilter(
Filter.createEqualityFilter("objectClass", "inetOrgPerson"),
Filter.createPresenceFilter("mail"),
Filter.createORFilter(
Filter.createSubstringFilter("cn", "John", null, null),
Filter.createSubstringFilter("cn", "Jane", null, null)
)
);
System.out.println("Filter: " + userFilter.toString());
// Output: (&(objectClass=inetOrgPerson)(mail=*)(|(cn=John*)(cn=Jane*)))
// Parse filter from string
try {
Filter parsedFilter = Filter.create("(&(objectClass=person)(|(cn=John*)(mail=*@example.com)))");
System.out.println("Parsed filter type: " + parsedFilter.getFilterType());
// Access filter components
if (parsedFilter.getFilterType() == FilterType.AND) {
Filter[] components = parsedFilter.getComponents();
for (Filter component : components) {
System.out.println("Component: " + component.toString());
}
}
} catch (LDAPException e) {
System.err.println("Invalid filter: " + e.getMessage());
}import com.unboundid.ldap.sdk.*;
// Create attributes
Attribute singleValueAttr = new Attribute("cn", "John Doe");
Attribute multiValueAttr = new Attribute("telephoneNumber", "+1-555-0123", "+1-555-0124", "+1-555-0125");
Attribute binaryAttr = new Attribute("userCertificate", certificateBytes);
// Access attribute properties
System.out.println("Attribute name: " + singleValueAttr.getName());
System.out.println("Single value: " + singleValueAttr.getValue());
System.out.println("All values: " + Arrays.toString(multiValueAttr.getValues()));
// Check for values
if (multiValueAttr.hasValue("+1-555-0123")) {
System.out.println("Found phone number");
}
// Modify attributes
Attribute modifiedAttr = multiValueAttr.addValue("+1-555-0126");
modifiedAttr = modifiedAttr.removeValue("+1-555-0125");
System.out.println("Modified values: " + Arrays.toString(modifiedAttr.getValues()));
// Work with attribute options
Attribute langAttr = new Attribute("description;lang-en", "English description");
System.out.println("Base name: " + langAttr.getBaseName()); // "description"
System.out.println("Options: " + Arrays.toString(langAttr.getOptions())); // ["lang-en"]import com.unboundid.ldap.sdk.*;
// Create modifications
Modification addMod = new Modification(
ModificationType.ADD,
"description",
"Software Engineer"
);
Modification replaceMod = new Modification(
ModificationType.REPLACE,
"mail",
"j.doe@example.com"
);
Modification deleteMod = new Modification(
ModificationType.DELETE,
"telephoneNumber",
"+1-555-0124"
);
Modification deleteAllMod = new Modification(
ModificationType.DELETE,
"faxNumber" // Delete all values
);
// Apply modifications to connection
LDAPConnection connection = new LDAPConnection("ldap.example.com", 389);
try {
connection.bind("cn=admin,dc=example,dc=com", "password");
LDAPResult result = connection.modify(
"cn=John Doe,ou=people,dc=example,dc=com",
addMod, replaceMod, deleteMod, deleteAllMod
);
if (result.getResultCode() == ResultCode.SUCCESS) {
System.out.println("Modifications applied successfully");
}
} finally {
connection.close();
}import com.unboundid.ldap.sdk.*;
// Create entry with validation
try {
Entry entry = new Entry("cn=Test User,ou=people,dc=example,dc=com");
// Add required attributes
entry.addAttribute("objectClass", "inetOrgPerson");
entry.addAttribute("cn", "Test User");
entry.addAttribute("sn", "User");
// Validate DN parsing
DN entryDN = entry.getParsedDN();
System.out.println("Valid DN: " + entryDN.toString());
// Clone entry for modifications
Entry modifiedEntry = entry.duplicate();
modifiedEntry.addAttribute("mail", "test.user@example.com");
// Compare entries
if (!entry.equals(modifiedEntry)) {
System.out.println("Entries are different");
}
// Generate LDIF representation
System.out.println("Entry LDIF:");
System.out.println(entry.toLDIFString(80)); // Wrap at 80 characters
} catch (LDAPException e) {
System.err.println("Invalid entry: " + e.getMessage());
}LDAP URL parsing and construction utilities.
/**
* LDAP URL representation and manipulation
*/
public class LDAPURL {
// Constructors
public LDAPURL(String url) throws LDAPException;
public LDAPURL(String scheme, String host, int port, DN baseDN, String[] attributes, SearchScope scope, Filter filter);
// URL components
public String getScheme();
public String getHost();
public int getPort();
public DN getBaseDN();
public String[] getAttributes();
public SearchScope getScope();
public Filter getFilter();
// URL manipulation
public String toString();
public static boolean isValidLDAPURL(String url);
public static LDAPURL[] parseURLList(String urlList) throws LDAPException;
}LDAP result codes and status information.
/**
* LDAP operation result codes
*/
public class ResultCode {
// Standard result codes
public static final ResultCode SUCCESS;
public static final ResultCode OPERATIONS_ERROR;
public static final ResultCode PROTOCOL_ERROR;
public static final ResultCode TIME_LIMIT_EXCEEDED;
public static final ResultCode SIZE_LIMIT_EXCEEDED;
public static final ResultCode COMPARE_FALSE;
public static final ResultCode COMPARE_TRUE;
public static final ResultCode AUTH_METHOD_NOT_SUPPORTED;
public static final ResultCode STRONG_AUTH_REQUIRED;
public static final ResultCode REFERRAL;
public static final ResultCode ADMIN_LIMIT_EXCEEDED;
public static final ResultCode UNAVAILABLE_CRITICAL_EXTENSION;
public static final ResultCode CONFIDENTIALITY_REQUIRED;
public static final ResultCode SASL_BIND_IN_PROGRESS;
public static final ResultCode NO_SUCH_ATTRIBUTE;
public static final ResultCode UNDEFINED_ATTRIBUTE_TYPE;
public static final ResultCode INAPPROPRIATE_MATCHING;
public static final ResultCode CONSTRAINT_VIOLATION;
public static final ResultCode ATTRIBUTE_OR_VALUE_EXISTS;
public static final ResultCode INVALID_ATTRIBUTE_SYNTAX;
public static final ResultCode NO_SUCH_OBJECT;
public static final ResultCode ALIAS_PROBLEM;
public static final ResultCode INVALID_DN_SYNTAX;
public static final ResultCode ALIAS_DEREFERENCING_PROBLEM;
public static final ResultCode INAPPROPRIATE_AUTHENTICATION;
public static final ResultCode INVALID_CREDENTIALS;
public static final ResultCode INSUFFICIENT_ACCESS_RIGHTS;
public static final ResultCode BUSY;
public static final ResultCode UNAVAILABLE;
public static final ResultCode UNWILLING_TO_PERFORM;
public static final ResultCode LOOP_DETECT;
public static final ResultCode NAMING_VIOLATION;
public static final ResultCode OBJECT_CLASS_VIOLATION;
public static final ResultCode NOT_ALLOWED_ON_NONLEAF;
public static final ResultCode NOT_ALLOWED_ON_RDN;
public static final ResultCode ENTRY_ALREADY_EXISTS;
public static final ResultCode OBJECT_CLASS_MODS_PROHIBITED;
public static final ResultCode AFFECTS_MULTIPLE_DSAS;
public static final ResultCode OTHER;
// Methods
public int intValue();
public String getName();
public String toString();
public boolean isConnectionUsable();
public static ResultCode valueOf(int intValue);
}Connection usage statistics and monitoring.
/**
* Statistics for LDAP connection usage
*/
public class LDAPConnectionStatistics {
public long getNumConnects();
public long getNumDisconnects();
public long getNumAbandonRequests();
public long getNumAddRequests();
public long getNumAddResponses();
public long getNumBindRequests();
public long getNumBindResponses();
public long getNumCompareRequests();
public long getNumCompareResponses();
public long getNumDeleteRequests();
public long getNumDeleteResponses();
public long getNumExtendedRequests();
public long getNumExtendedResponses();
public long getNumModifyRequests();
public long getNumModifyResponses();
public long getNumModifyDNRequests();
public long getNumModifyDNResponses();
public long getNumSearchRequests();
public long getNumSearchEntryResponses();
public long getNumSearchReferenceResponses();
public long getNumSearchDoneResponses();
public long getNumUnbindRequests();
}Connection pool usage statistics and health monitoring.
/**
* Statistics for LDAP connection pool usage
*/
public class LDAPConnectionPoolStatistics {
public int getNumSuccessfulConnectionAttempts();
public int getNumFailedConnectionAttempts();
public int getNumConnectionsClosedDefunct();
public int getNumConnectionsClosedExpired();
public int getNumConnectionsClosedUnneeded();
public int getNumSuccessfulCheckouts();
public int getNumSuccessfulCheckoutsWithoutWaiting();
public int getNumSuccessfulCheckoutsAfterWaiting();
public int getNumFailedCheckouts();
public int getNumReleasedValid();
public long getMaximumWaitTimeMillis();
public long getAverageWaitTimeMillis();
public void reset();
public String toString();
}Install with Tessl CLI
npx tessl i tessl/maven-com-unboundid--unboundid-ldapsdk