mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Ludovic Poitou
24.47.2010 a3d5c5661dd11285ebafd742c1da6d10b91639f7
opendj-sdk/sdk/src/org/opends/sdk/requests/AbstractUnmodifiableRequest.java
@@ -36,6 +36,12 @@
import org.opends.sdk.DecodeOptions;
import org.opends.sdk.controls.Control;
import org.opends.sdk.controls.ControlDecoder;
import org.opends.sdk.controls.GenericControl;
import com.sun.opends.sdk.util.Collections2;
import com.sun.opends.sdk.util.Function;
import com.sun.opends.sdk.util.Functions;
import com.sun.opends.sdk.util.Validator;
@@ -69,6 +75,7 @@
  /**
   * {@inheritDoc}
   */
  @Override
  public final R addControl(final Control control)
      throws UnsupportedOperationException, NullPointerException
  {
@@ -80,12 +87,49 @@
  /**
   * {@inheritDoc}
   */
  @Override
  public final <C extends Control> C getControl(
      final ControlDecoder<C> decoder, final DecodeOptions options)
      throws NullPointerException, DecodeException
  {
    // FIXME: ensure that controls are immutable.
    return impl.getControl(decoder, options);
    Validator.ensureNotNull(decoder, options);
    final List<Control> controls = impl.getControls();
    // Avoid creating an iterator if possible.
    if (controls.isEmpty())
    {
      return null;
    }
    for (final Control control : controls)
    {
      if (control.getOID().equals(decoder.getOID()))
      {
        // Got a match. Return a defensive copy only if necessary.
        final C decodedControl = decoder.decodeControl(control, options);
        if (decodedControl != control)
        {
          // This was not the original control so return it immediately.
          return decodedControl;
        }
        else if (decodedControl instanceof GenericControl)
        {
          // Generic controls are immutable, so return it immediately.
          return decodedControl;
        }
        else
        {
          // Re-decode to get defensive copy.
          final GenericControl genericControl = GenericControl
              .newControl(control);
          return decoder.decodeControl(genericControl, options);
        }
      }
    }
    return null;
  }
@@ -93,10 +137,26 @@
  /**
   * {@inheritDoc}
   */
  @Override
  public final List<Control> getControls()
  {
    // FIXME: ensure that controls are immutable.
    return Collections.unmodifiableList(impl.getControls());
    // We need to make all controls unmodifiable as well, which implies making
    // defensive copies where necessary.
    final Function<Control, Control, Void> function = new Function<Control, Control, Void>()
    {
      @Override
      public Control apply(final Control value, final Void p)
      {
        // Return defensive copy.
        return GenericControl.newControl(value);
      }
    };
    final List<Control> unmodifiableControls = Collections2.transformedList(
        impl.getControls(), function, Functions.<Control> identityFunction());
    return Collections.unmodifiableList(unmodifiableControls);
  }