package com.hwlcn.ldap.ldap.sdk;
import java.io.Serializable;
import com.hwlcn.core.annotation.NotMutable;
import com.hwlcn.core.annotation.ThreadSafety;
import com.hwlcn.ldap.util.ThreadSafetyLevel;
import static com.hwlcn.ldap.ldap.sdk.LDAPMessages.*;
import static com.hwlcn.ldap.util.Debug.*;
import static com.hwlcn.ldap.util.StaticUtils.*;
@NotMutable()
@ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE)
public final class GetEntryLDAPConnectionPoolHealthCheck
extends LDAPConnectionPoolHealthCheck
implements Serializable
{
private static final long DEFAULT_MAX_RESPONSE_TIME = 30000L;
private static final long serialVersionUID = -3400259782503254645L;
private final boolean invokeForBackgroundChecks;
private final boolean invokeOnCheckout;
private final boolean invokeOnCreate;
private final boolean invokeOnException;
private final boolean invokeOnRelease;
private final long maxResponseTime;
private final SearchRequest searchRequest;
private final String entryDN;
public GetEntryLDAPConnectionPoolHealthCheck(final String entryDN,
final long maxResponseTime, final boolean invokeOnCreate,
final boolean invokeOnCheckout, final boolean invokeOnRelease,
final boolean invokeForBackgroundChecks,
final boolean invokeOnException)
{
this.invokeOnCreate = invokeOnCreate;
this.invokeOnCheckout = invokeOnCheckout;
this.invokeOnRelease = invokeOnRelease;
this.invokeForBackgroundChecks = invokeForBackgroundChecks;
this.invokeOnException = invokeOnException;
if (entryDN == null)
{
this.entryDN = "";
}
else
{
this.entryDN = entryDN;
}
if (maxResponseTime > 0L)
{
this.maxResponseTime = maxResponseTime;
}
else
{
this.maxResponseTime = DEFAULT_MAX_RESPONSE_TIME;
}
searchRequest = new SearchRequest(this.entryDN, SearchScope.BASE,
Filter.createPresenceFilter("objectClass"), "1.1");
searchRequest.setResponseTimeoutMillis(this.maxResponseTime);
}
@Override()
public void ensureNewConnectionValid(final LDAPConnection connection)
throws LDAPException
{
if (invokeOnCreate)
{
getEntry(connection);
}
}
@Override()
public void ensureConnectionValidForCheckout(final LDAPConnection connection)
throws LDAPException
{
if (invokeOnCheckout)
{
getEntry(connection);
}
}
@Override()
public void ensureConnectionValidForRelease(final LDAPConnection connection)
throws LDAPException
{
if (invokeOnRelease)
{
getEntry(connection);
}
}
@Override()
public void ensureConnectionValidForContinuedUse(
final LDAPConnection connection)
throws LDAPException
{
if (invokeForBackgroundChecks)
{
getEntry(connection);
}
}
@Override()
public void ensureConnectionValidAfterException(
final LDAPConnection connection,
final LDAPException exception)
throws LDAPException
{
super.ensureConnectionValidAfterException(connection, exception);
if (invokeOnException)
{
getEntry(connection);
}
}
public String getEntryDN()
{
return entryDN;
}
public long getMaxResponseTimeMillis()
{
return maxResponseTime;
}
public boolean invokeOnCreate()
{
return invokeOnCreate;
}
public boolean invokeOnCheckout()
{
return invokeOnCheckout;
}
public boolean invokeOnRelease()
{
return invokeOnRelease;
}
public boolean invokeForBackgroundChecks()
{
return invokeForBackgroundChecks;
}
public boolean invokeOnException()
{
return invokeOnException;
}
private void getEntry(final LDAPConnection conn)
throws LDAPException
{
try
{
final SearchResult result = conn.search(searchRequest);
if (result.getEntryCount() != 1)
{
throw new LDAPException(ResultCode.NO_RESULTS_RETURNED,
ERR_GET_ENTRY_HEALTH_CHECK_NO_ENTRY_RETURNED.get());
}
}
catch (Exception e)
{
debugException(e);
final String msg = ERR_GET_ENTRY_HEALTH_CHECK_FAILURE.get(entryDN,
getExceptionMessage(e));
conn.setDisconnectInfo(DisconnectType.POOLED_CONNECTION_DEFUNCT, msg, e);
throw new LDAPException(ResultCode.SERVER_DOWN, msg, e);
}
}
@Override()
public void toString(final StringBuilder buffer)
{
buffer.append("GetEntryLDAPConnectionPoolHealthCheck(entryDN='");
buffer.append(entryDN);
buffer.append("', maxResponseTimeMillis=");
buffer.append(maxResponseTime);
buffer.append(", invokeOnCreate=");
buffer.append(invokeOnCreate);
buffer.append(", invokeOnCheckout=");
buffer.append(invokeOnCheckout);
buffer.append(", invokeOnRelease=");
buffer.append(invokeOnRelease);
buffer.append(", invokeForBackgroundChecks=");
buffer.append(invokeForBackgroundChecks);
buffer.append(", invokeOnException=");
buffer.append(invokeOnException);
buffer.append(')');
}
}