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

Ludovic Poitou
24.47.2010 ebf96a30d0122d35e271bad15f1f31a0a9100842
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);
  }