package com.hwlcn.ldap.ldap.sdk.migrate.ldapjdk;
import com.hwlcn.ldap.asn1.ASN1OctetString;
import com.hwlcn.ldap.ldap.sdk.AddRequest;
import com.hwlcn.ldap.ldap.sdk.BindResult;
import com.hwlcn.ldap.ldap.sdk.CompareRequest;
import com.hwlcn.ldap.ldap.sdk.CompareResult;
import com.hwlcn.ldap.ldap.sdk.Control;
import com.hwlcn.ldap.ldap.sdk.DeleteRequest;
import com.hwlcn.ldap.ldap.sdk.DereferencePolicy;
import com.hwlcn.ldap.ldap.sdk.ExtendedRequest;
import com.hwlcn.ldap.ldap.sdk.ExtendedResult;
import com.hwlcn.ldap.ldap.sdk.Filter;
import com.hwlcn.ldap.ldap.sdk.InternalSDKHelper;
import com.hwlcn.ldap.ldap.sdk.LDAPConnectionOptions;
import com.hwlcn.ldap.ldap.sdk.LDAPResult;
import com.hwlcn.ldap.ldap.sdk.Modification;
import com.hwlcn.ldap.ldap.sdk.ModifyDNRequest;
import com.hwlcn.ldap.ldap.sdk.ModifyRequest;
import com.hwlcn.ldap.ldap.sdk.ResultCode;
import com.hwlcn.ldap.ldap.sdk.SearchRequest;
import com.hwlcn.ldap.ldap.sdk.SearchResult;
import com.hwlcn.ldap.ldap.sdk.SearchScope;
import com.hwlcn.ldap.ldap.sdk.SimpleBindRequest;
import com.hwlcn.ldap.ldap.sdk.UpdatableLDAPRequest;
import com.hwlcn.core.annotation.Mutable;
import com.hwlcn.core.annotation.NotExtensible;
import com.hwlcn.core.annotation.ThreadSafety;
import com.hwlcn.ldap.util.ThreadSafetyLevel;
import static com.hwlcn.ldap.util.Debug.*;
@Mutable()
@NotExtensible()
@ThreadSafety(level=ThreadSafetyLevel.NOT_THREADSAFE)
public class LDAPConnection
{
public static final int DEREF_NEVER = DereferencePolicy.NEVER.intValue();
public static final int DEREF_SEARCHING =
DereferencePolicy.SEARCHING.intValue();
public static final int DEREF_FINDING =
DereferencePolicy.FINDING.intValue();
public static final int DEREF_ALWAYS =
DereferencePolicy.ALWAYS.intValue();
public static final int SCOPE_BASE = SearchScope.BASE_INT_VALUE;
public static final int SCOPE_ONE = SearchScope.ONE_INT_VALUE;
public static final int SCOPE_SUB = SearchScope.SUB_INT_VALUE;
private final com.hwlcn.ldap.ldap.sdk.LDAPConnection conn;
private LDAPConstraints constraints;
private LDAPControl[] responseControls;
private LDAPSearchConstraints searchConstraints;
private LDAPSocketFactory socketFactory;
private String authDN;
private String authPW;
public LDAPConnection()
{
this(null);
}
public LDAPConnection(final LDAPSocketFactory socketFactory)
{
this.socketFactory = socketFactory;
if (socketFactory == null)
{
conn = new com.hwlcn.ldap.ldap.sdk.LDAPConnection();
}
else
{
conn = new com.hwlcn.ldap.ldap.sdk.LDAPConnection(
new LDAPToJavaSocketFactory(socketFactory));
}
authDN = null;
authPW = null;
constraints = new LDAPConstraints();
searchConstraints = new LDAPSearchConstraints();
}
@Override()
protected void finalize()
throws Throwable
{
conn.close();
super.finalize();
}
public com.hwlcn.ldap.ldap.sdk.LDAPConnection getSDKConnection()
{
return conn;
}
public String getHost()
{
return conn.getConnectedAddress();
}
public int getPort()
{
return conn.getConnectedPort();
}
public String getAuthenticationDN()
{
return authDN;
}
public String getAuthenticationPassword()
{
return authPW;
}
public int getConnectTimeout()
{
final int connectTimeoutMillis =
conn.getConnectionOptions().getConnectTimeoutMillis();
if (connectTimeoutMillis > 0)
{
return Math.max(1, (connectTimeoutMillis / 1000));
}
else
{
return 0;
}
}
public void setConnectTimeout(final int timeout)
{
final LDAPConnectionOptions options = conn.getConnectionOptions();
if (timeout > 0)
{
options.setConnectTimeoutMillis(1000 * timeout);
}
else
{
options.setConnectTimeoutMillis(0);
}
conn.setConnectionOptions(options);
}
public LDAPSocketFactory getSocketFactory()
{
return socketFactory;
}
public void setSocketFactory(final LDAPSocketFactory socketFactory)
{
this.socketFactory = socketFactory;
if (socketFactory == null)
{
conn.setSocketFactory(null);
}
else
{
conn.setSocketFactory(new LDAPToJavaSocketFactory(socketFactory));
}
}
public LDAPConstraints getConstraints()
{
return constraints;
}
public void setConstraints(final LDAPConstraints constraints)
{
if (constraints == null)
{
this.constraints = new LDAPConstraints();
}
else
{
this.constraints = constraints;
}
}
public LDAPSearchConstraints getSearchConstraints()
{
return searchConstraints;
}
public void setSearchConstraints(
final LDAPSearchConstraints searchConstraints)
{
if (searchConstraints == null)
{
this.searchConstraints = new LDAPSearchConstraints();
}
else
{
this.searchConstraints = searchConstraints;
}
}
public LDAPControl[] getResponseControls()
{
return responseControls;
}
public boolean isConnected()
{
return conn.isConnected();
}
public void connect(final String host, final int port)
throws LDAPException
{
authDN = null;
authPW = null;
responseControls = null;
try
{
conn.connect(host, port);
}
catch (com.hwlcn.ldap.ldap.sdk.LDAPException le)
{
debugException(le);
throw new LDAPException(le);
}
}
public void connect(final String host, final int port, final String dn,
final String password)
throws LDAPException
{
connect(3, host, port, dn, password, null);
}
public void connect(final String host, final int port, final String dn,
final String password, final LDAPConstraints constraints)
throws LDAPException
{
connect(3, host, port, dn, password, constraints);
}
public void connect(final int version, final String host, final int port,
final String dn, final String password)
throws LDAPException
{
connect(version, host, port, dn, password, null);
}
public void connect(final int version, final String host, final int port,
final String dn, final String password,
final LDAPConstraints constraints)
throws LDAPException
{
connect(host, port);
try
{
if ((dn != null) && (password != null))
{
bind(version, dn, password, constraints);
}
}
catch (LDAPException le)
{
conn.close();
throw le;
}
}
public void disconnect()
throws LDAPException
{
conn.close();
authDN = null;
authPW = null;
}
public void reconnect()
throws LDAPException
{
final String host = getHost();
final int port = getPort();
final String dn = authDN;
final String pw = authPW;
conn.close();
if ((dn == null) || (pw == null))
{
connect(host, port);
}
else
{
connect(host, port, dn, pw);
}
}
public void abandon(final int id)
throws LDAPException
{
try
{
conn.abandon(InternalSDKHelper.createAsyncRequestID(id, conn),
getControls(null));
}
catch (com.hwlcn.ldap.ldap.sdk.LDAPException le)
{
debugException(le);
throw new LDAPException(le);
}
}
public void add(final LDAPEntry entry)
throws LDAPException
{
add(entry, null);
}
public void add(final LDAPEntry entry, final LDAPConstraints constraints)
throws LDAPException
{
final AddRequest addRequest = new AddRequest(entry.toEntry());
update(addRequest, constraints);
try
{
final LDAPResult result = conn.add(addRequest);
setResponseControls(result);
}
catch (com.hwlcn.ldap.ldap.sdk.LDAPException le)
{
debugException(le);
setResponseControls(le);
throw new LDAPException(le);
}
}
public void authenticate(final String dn, final String password)
throws LDAPException
{
bind(3, dn, password, null);
}
public void authenticate(final String dn, final String password,
final LDAPConstraints constraints)
throws LDAPException
{
bind(3, dn, password, constraints);
}
public void authenticate(final int version, final String dn,
final String password)
throws LDAPException
{
bind(version, dn, password, null);
}
public void authenticate(final int version, final String dn,
final String password,
final LDAPConstraints constraints)
throws LDAPException
{
bind(version, dn, password, constraints);
}
public void bind(final String dn, final String password)
throws LDAPException
{
bind(3, dn, password, null);
}
public void bind(final String dn, final String password,
final LDAPConstraints constraints)
throws LDAPException
{
bind(3, dn, password, constraints);
}
public void bind(final int version, final String dn, final String password)
throws LDAPException
{
bind(version, dn, password, null);
}
public void bind(final int version, final String dn, final String password,
final LDAPConstraints constraints)
throws LDAPException
{
final SimpleBindRequest bindRequest =
new SimpleBindRequest(dn, password, getControls(constraints));
authDN = null;
authPW = null;
try
{
final BindResult bindResult = conn.bind(bindRequest);
setResponseControls(bindResult);
if (bindResult.getResultCode() == ResultCode.SUCCESS)
{
authDN = dn;
authPW = password;
}
}
catch (com.hwlcn.ldap.ldap.sdk.LDAPException le)
{
debugException(le);
setResponseControls(le);
throw new LDAPException(le);
}
}
public boolean compare(final String dn, final LDAPAttribute attribute)
throws LDAPException
{
return compare(dn, attribute, null);
}
public boolean compare(final String dn, final LDAPAttribute attribute,
final LDAPConstraints constraints)
throws LDAPException
{
final CompareRequest compareRequest = new CompareRequest(dn,
attribute.getName(), attribute.getByteValueArray()[0]);
update(compareRequest, constraints);
try
{
final CompareResult result = conn.compare(compareRequest);
setResponseControls(result);
return result.compareMatched();
}
catch (com.hwlcn.ldap.ldap.sdk.LDAPException le)
{
debugException(le);
setResponseControls(le);
throw new LDAPException(le);
}
}
public void delete(final String dn)
throws LDAPException
{
delete(dn, null);
}
public void delete(final String dn, final LDAPConstraints constraints)
throws LDAPException
{
final DeleteRequest deleteRequest = new DeleteRequest(dn);
update(deleteRequest, constraints);
try
{
final LDAPResult result = conn.delete(deleteRequest);
setResponseControls(result);
}
catch (com.hwlcn.ldap.ldap.sdk.LDAPException le)
{
debugException(le);
setResponseControls(le);
throw new LDAPException(le);
}
}
public LDAPExtendedOperation extendedOperation(
final LDAPExtendedOperation extendedOperation)
throws LDAPException
{
return extendedOperation(extendedOperation, null);
}
public LDAPExtendedOperation extendedOperation(
final LDAPExtendedOperation extendedOperation,
final LDAPConstraints constraints)
throws LDAPException
{
final ExtendedRequest extendedRequest = new ExtendedRequest(
extendedOperation.getID(),
new ASN1OctetString(extendedOperation.getValue()),
getControls(constraints));
try
{
final ExtendedResult result =
conn.processExtendedOperation(extendedRequest);
setResponseControls(result);
if (result.getResultCode() != ResultCode.SUCCESS)
{
throw new LDAPException(result.getDiagnosticMessage(),
result.getResultCode().intValue(), result.getDiagnosticMessage(),
result.getMatchedDN());
}
final byte[] valueBytes;
final ASN1OctetString value = result.getValue();
if (value == null)
{
valueBytes = null;
}
else
{
valueBytes = value.getValue();
}
return new LDAPExtendedOperation(result.getOID(), valueBytes);
}
catch (com.hwlcn.ldap.ldap.sdk.LDAPException le)
{
debugException(le);
setResponseControls(le);
throw new LDAPException(le);
}
}
public void modify(final String dn, final LDAPModification mod)
throws LDAPException
{
modify(dn, new LDAPModification[] { mod }, null);
}
public void modify(final String dn, final LDAPModification[] mods)
throws LDAPException
{
modify(dn, mods, null);
}
public void modify(final String dn, final LDAPModification mod,
final LDAPConstraints constraints)
throws LDAPException
{
modify(dn, new LDAPModification[] { mod }, constraints);
}
public void modify(final String dn, final LDAPModification[] mods,
final LDAPConstraints constraints)
throws LDAPException
{
final Modification[] m = new Modification[mods.length];
for (int i=0; i < mods.length; i++)
{
m[i] = mods[i].toModification();
}
final ModifyRequest modifyRequest = new ModifyRequest(dn, m);
update(modifyRequest, constraints);
try
{
final LDAPResult result = conn.modify(modifyRequest);
setResponseControls(result);
}
catch (com.hwlcn.ldap.ldap.sdk.LDAPException le)
{
debugException(le);
setResponseControls(le);
throw new LDAPException(le);
}
}
public void modify(final String dn, final LDAPModificationSet mods)
throws LDAPException
{
modify(dn, mods.toArray(), null);
}
public void modify(final String dn, final LDAPModificationSet mods,
final LDAPConstraints constraints)
throws LDAPException
{
modify(dn, mods.toArray(), constraints);
}
public LDAPEntry read(final String dn)
throws LDAPException
{
return read(dn, null, null);
}
public LDAPEntry read(final String dn,
final LDAPSearchConstraints constraints)
throws LDAPException
{
return read(dn, null, constraints);
}
public LDAPEntry read(final String dn, final String[] attrs)
throws LDAPException
{
return read(dn, attrs, null);
}
public LDAPEntry read(final String dn, final String[] attrs,
final LDAPSearchConstraints constraints)
throws LDAPException
{
final Filter filter = Filter.createORFilter(
Filter.createPresenceFilter("objectClass"),
Filter.createEqualityFilter("objectClass", "ldapSubentry"));
final SearchRequest searchRequest =
new SearchRequest(dn, SearchScope.BASE, filter, attrs);
update(searchRequest, constraints);
try
{
final SearchResult searchResult = conn.search(searchRequest);
setResponseControls(searchResult);
if (searchResult.getEntryCount() != 1)
{
throw new LDAPException(null, LDAPException.NO_RESULTS_RETURNED);
}
return new LDAPEntry(searchResult.getSearchEntries().get(0));
}
catch (com.hwlcn.ldap.ldap.sdk.LDAPException le)
{
debugException(le);
setResponseControls(le);
throw new LDAPException(le);
}
}
public void rename(final String dn, final String newRDN,
final boolean deleteOldRDN)
throws LDAPException
{
rename(dn, newRDN, null, deleteOldRDN, null);
}
public void rename(final String dn, final String newRDN,
final boolean deleteOldRDN,
final LDAPConstraints constraints)
throws LDAPException
{
rename(dn, newRDN, null, deleteOldRDN, constraints);
}
public void rename(final String dn, final String newRDN,
final String newParentDN, final boolean deleteOldRDN)
throws LDAPException
{
rename(dn, newRDN, newParentDN, deleteOldRDN, null);
}
public void rename(final String dn, final String newRDN,
final String newParentDN, final boolean deleteOldRDN,
final LDAPConstraints constraints)
throws LDAPException
{
final ModifyDNRequest modifyDNRequest =
new ModifyDNRequest(dn, newRDN, deleteOldRDN, newParentDN);
update(modifyDNRequest, constraints);
try
{
final LDAPResult result = conn.modifyDN(modifyDNRequest);
setResponseControls(result);
}
catch (com.hwlcn.ldap.ldap.sdk.LDAPException le)
{
debugException(le);
setResponseControls(le);
throw new LDAPException(le);
}
}
public LDAPSearchResults search(final String baseDN, final int scope,
final String filter, final String[] attributes,
final boolean typesOnly)
throws LDAPException
{
return search(baseDN, scope, filter, attributes, typesOnly, null);
}
public LDAPSearchResults search(final String baseDN, final int scope,
final String filter, final String[] attributes,
final boolean typesOnly, final LDAPSearchConstraints constraints)
throws LDAPException
{
final LDAPSearchResults results;
final LDAPSearchConstraints c =
(constraints == null) ? searchConstraints : constraints;
results = new LDAPSearchResults(c.getTimeLimit());
try
{
final SearchRequest searchRequest = new SearchRequest(results, baseDN,
SearchScope.valueOf(scope), filter, attributes);
searchRequest.setDerefPolicy(
DereferencePolicy.valueOf(c.getDereference()));
searchRequest.setSizeLimit(c.getMaxResults());
searchRequest.setTimeLimitSeconds(c.getServerTimeLimit());
searchRequest.setTypesOnly(typesOnly);
update(searchRequest, constraints);
conn.asyncSearch(searchRequest);
return results;
}
catch (com.hwlcn.ldap.ldap.sdk.LDAPException le)
{
debugException(le);
setResponseControls(le);
throw new LDAPException(le);
}
}
private Control[] getControls(final LDAPConstraints c)
{
Control[] controls = null;
if (c != null)
{
controls = LDAPControl.toControls(c.getServerControls());
}
else if (constraints != null)
{
controls = LDAPControl.toControls(constraints.getServerControls());
}
if (controls == null)
{
return new Control[0];
}
else
{
return controls;
}
}
private void update(final UpdatableLDAPRequest request,
final LDAPConstraints constraints)
{
final LDAPConstraints c =
(constraints == null) ? this.constraints : constraints;
request.setControls(LDAPControl.toControls(c.getServerControls()));
request.setResponseTimeoutMillis(c.getTimeLimit());
request.setFollowReferrals(c.getReferrals());
}
private void setResponseControls(final LDAPResult ldapResult)
{
if (ldapResult.hasResponseControl())
{
responseControls =
LDAPControl.toLDAPControls(ldapResult.getResponseControls());
}
else
{
responseControls = null;
}
}
private void setResponseControls(
final com.hwlcn.ldap.ldap.sdk.LDAPException ldapException)
{
if (ldapException.hasResponseControl())
{
responseControls =
LDAPControl.toLDAPControls(ldapException.getResponseControls());
}
else
{
responseControls = null;
}
}
}