package com.hwlcn.ldap.ldap.sdk; import java.util.List; import com.hwlcn.core.annotation.NotExtensible; import com.hwlcn.core.annotation.ThreadSafety; import com.hwlcn.ldap.util.ThreadSafetyLevel; import static com.hwlcn.ldap.util.Validator.*; @NotExtensible() @ThreadSafety(level=ThreadSafetyLevel.NOT_THREADSAFE) public abstract class UpdatableLDAPRequest extends LDAPRequest { private static final long serialVersionUID = 2487230102594573848L; protected UpdatableLDAPRequest(final Control[] controls) { super(controls); } public final void setControls(final Control... controls) { if (controls == null) { setControlsInternal(NO_CONTROLS); } else { setControlsInternal(controls); } } public final void setControls(final List<Control> controls) { if ((controls == null) || controls.isEmpty()) { setControlsInternal(NO_CONTROLS); } else { final Control[] controlArray = new Control[controls.size()]; setControlsInternal(controls.toArray(controlArray)); } } public final void clearControls() { setControlsInternal(NO_CONTROLS); } public final void addControl(final Control control) { ensureNotNull(control); final Control[] controls = getControls(); final Control[] newControls = new Control[controls.length+1]; System.arraycopy(controls, 0, newControls, 0, controls.length); newControls[controls.length] = control; setControlsInternal(newControls); } public final void addControls(final Control... controls) { if ((controls == null) || (controls.length == 0)) { return; } final Control[] currentControls = getControls(); final Control[] newControls = new Control[currentControls.length + controls.length]; System.arraycopy(currentControls, 0, newControls, 0, currentControls.length); System.arraycopy(controls, 0, newControls, currentControls.length, controls.length); setControlsInternal(newControls); } public final Control removeControl(final String oid) { ensureNotNull(oid); final Control[] controls = getControls(); int pos = -1; Control c = null; for (int i=0; i < controls.length; i++) { if (controls[i].getOID().equals(oid)) { c = controls[i]; pos = i; break; } } if (pos < 0) { return null; } if (controls.length == 1) { setControlsInternal(NO_CONTROLS); } else { final Control[] newControls = new Control[controls.length - 1]; for (int i=0,j=0; i < controls.length; i++) { if (i != pos) { newControls[j++] = controls[i]; } } setControlsInternal(newControls); } return c; } public final boolean removeControl(final Control control) { ensureNotNull(control); final Control[] controls = getControls(); int pos = -1; for (int i=0; i < controls.length; i++) { if (controls[i].equals(control)) { pos = i; break; } } if (pos < 0) { return false; } if (controls.length == 1) { setControlsInternal(NO_CONTROLS); } else { final Control[] newControls = new Control[controls.length - 1]; for (int i=0,j=0; i < controls.length; i++) { if (i != pos) { newControls[j++] = controls[i]; } } setControlsInternal(newControls); } return true; } public final Control replaceControl(final Control control) { ensureNotNull(control); return replaceControl(control.getOID(), control); } public final Control replaceControl(final String oid, final Control control) { ensureNotNull(oid); if (control == null) { return removeControl(oid); } final Control[] controls = getControls(); for (int i=0; i < controls.length; i++) { if (controls[i].getOID().equals(oid)) { final Control c = controls[i]; controls[i] = control; setControlsInternal(controls); return c; } } final Control[] newControls = new Control[controls.length+1]; System.arraycopy(controls, 0, newControls, 0, controls.length); newControls[controls.length] = control; setControlsInternal(newControls); return null; } }