/* See LICENSE for licensing and NOTICE for copyright. */
package org.ldaptive.handler;
import java.util.Set;
import java.util.stream.Collectors;
import org.ldaptive.Connection;
import org.ldaptive.LdapAttribute;
import org.ldaptive.LdapException;
import org.ldaptive.SearchEntry;
import org.ldaptive.SearchRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Base class for entry handlers which simply returns values unaltered.
*
* @author Middleware Services
*/
public abstract class AbstractSearchEntryHandler implements SearchEntryHandler
{
/** Log for this class. */
protected final Logger logger = LoggerFactory.getLogger(getClass());
@Override
public HandlerResult<SearchEntry> handle(final Connection conn, final SearchRequest request, final SearchEntry entry)
throws LdapException
{
if (entry != null) {
entry.setDn(handleDn(conn, request, entry));
handleAttributes(conn, request, entry);
}
return new HandlerResult<>(entry);
}
/**
* Handle the dn of a search entry.
*
* @param conn the search was performed on
* @param request used to find the search entry
* @param entry search entry to extract the dn from
*
* @return handled dn
*/
protected String handleDn(final Connection conn, final SearchRequest request, final SearchEntry entry)
{
return entry.getDn();
}
/**
* Handle the attributes of a search entry.
*
* @param conn the search was performed on
* @param request used to find the search entry
* @param entry search entry to extract the attributes from
*
* @throws LdapException if the LDAP returns an error
*/
protected void handleAttributes(final Connection conn, final SearchRequest request, final SearchEntry entry)
throws LdapException
{
for (LdapAttribute la : entry.getAttributes()) {
handleAttribute(conn, request, la);
}
}
/**
* Handle a single attribute.
*
* @param conn the search was performed on
* @param request used to find the search entry
* @param attr to handle
*
* @throws LdapException if the LDAP returns an error
*/
protected void handleAttribute(final Connection conn, final SearchRequest request, final LdapAttribute attr)
throws LdapException
{
if (attr != null) {
attr.setName(handleAttributeName(conn, request, attr.getName()));
if (attr.isBinary()) {
final Set<byte[]> newValues = attr.getBinaryValues().stream().map(
b -> handleAttributeValue(conn, request, b)).collect(Collectors.toSet());
attr.clear();
attr.addBinaryValues(newValues);
} else {
final Set<String> newValues = attr.getStringValues().stream().map(
s -> handleAttributeValue(conn, request, s)).collect(Collectors.toSet());
attr.clear();
attr.addStringValues(newValues);
}
}
}
/**
* Returns the supplied attribute name unaltered.
*
* @param conn the search was performed on
* @param request used to find the search entry
* @param name to handle
*
* @return handled name
*/
protected String handleAttributeName(final Connection conn, final SearchRequest request, final String name)
{
return name;
}
/**
* Returns the supplied attribute value unaltered.
*
* @param conn the search was performed on
* @param request used to find the search entry
* @param value to handle
*
* @return handled value
*/
protected String handleAttributeValue(final Connection conn, final SearchRequest request, final String value)
{
return value;
}
/**
* Returns the supplied attribute value unaltered.
*
* @param conn the search was performed on
* @param request used to find the search entry
* @param value to handle
*
* @return handled value
*/
protected byte[] handleAttributeValue(final Connection conn, final SearchRequest request, final byte[] value)
{
return value;
}
@Override
public void initializeRequest(final SearchRequest request) {}
@Override
public boolean equals(final Object o)
{
return super.equals(o);
}
@Override
public abstract int hashCode();
}