Some one reported an issue related to
oracle.adf.view.rich.component.ChildArrayList class in Trinidad.

Here is the code in the add(int index, Object element) method in
ChildArrayList class:

  if (child.getParent() != null)
  {
    index = __removeFromParent(child, index);
  }
  child.setParent(_parent);
  super.add(index, child);

What it is trying to do is to add a new child (the child variable in the
code) to this ChildArrayList, and automatically detach the new child from
its old parent, if exists, by calling __removeFromParent.

If you look into the __removeFromParent() method, you can find out that this
chunk of code assumes that the old parent is identical to the new parent it
is being added under, and __removeFromParent returns an adjusted index value
according to this assumption. This assumption is not always right and this
is causing problems.

One way of fixing this issue is:

   int adjustedIndex = index;
   Object oldParent = child.getParent();
   if (oldParent != null)
   {
     adjustedIndex = __removeFromParent(child, index);
     if(oldParent == _parent)
     {
         index = adjustedIndex; //Only make the index adjustment when the
child is re-added to the same parent
     }
   }
  child.setParent(_parent);
  super.add(index, child);

I'd like to get your comment. If every one agrees to make this change, I
will create a patch.

Thanks!

John Fan

Reply via email to