package com.hwlcn.ldap.ldap.sdk; import java.util.Arrays; import java.util.Collections; import java.util.List; import com.hwlcn.core.annotation.InternalUseOnly; import com.hwlcn.core.annotation.Extensible; import com.hwlcn.core.annotation.ThreadSafety; import com.hwlcn.ldap.util.ThreadSafetyLevel; import static com.hwlcn.ldap.util.Validator.*; @Extensible() @ThreadSafety(level=ThreadSafetyLevel.NOT_THREADSAFE) public abstract class LDAPRequest implements ReadOnlyLDAPRequest { static final Control[] NO_CONTROLS = new Control[0]; private static final long serialVersionUID = -2040756188243320117L; private Boolean followReferrals; private Control[] controls; private IntermediateResponseListener intermediateResponseListener; private long responseTimeout; protected LDAPRequest(final Control[] controls) { if (controls == null) { this.controls = NO_CONTROLS; } else { this.controls = controls; } followReferrals = null; responseTimeout = -1L; intermediateResponseListener = null; } public final Control[] getControls() { return controls; } public final List<Control> getControlList() { return Collections.unmodifiableList(Arrays.asList(controls)); } public final boolean hasControl() { return (controls.length > 0); } public final boolean hasControl(final String oid) { ensureNotNull(oid); for (final Control c : controls) { if (c.getOID().equals(oid)) { return true; } } return false; } public final Control getControl(final String oid) { ensureNotNull(oid); for (final Control c : controls) { if (c.getOID().equals(oid)) { return c; } } return null; } final void setControlsInternal(final Control[] controls) { this.controls = controls; } public final long getResponseTimeoutMillis(final LDAPConnection connection) { if ((responseTimeout < 0L) && (connection != null)) { return connection.getConnectionOptions().getResponseTimeoutMillis(); } else { return responseTimeout; } } public final void setResponseTimeoutMillis(final long responseTimeout) { if (responseTimeout < 0L) { this.responseTimeout = -1L; } else { this.responseTimeout = responseTimeout; } } public final boolean followReferrals(final LDAPConnection connection) { if (followReferrals == null) { return connection.getConnectionOptions().followReferrals(); } else { return followReferrals; } } final Boolean followReferralsInternal() { return followReferrals; } public final void setFollowReferrals(final Boolean followReferrals) { this.followReferrals = followReferrals; } public final IntermediateResponseListener getIntermediateResponseListener() { return intermediateResponseListener; } public final void setIntermediateResponseListener( final IntermediateResponseListener listener) { intermediateResponseListener = listener; } @InternalUseOnly() protected abstract LDAPResult process(final LDAPConnection connection, final int depth) throws LDAPException; public abstract int getLastMessageID(); public abstract OperationType getOperationType(); @Override() public String toString() { final StringBuilder buffer = new StringBuilder(); toString(buffer); return buffer.toString(); } public abstract void toString(final StringBuilder buffer); }