package org.jboss.seam.contexts;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Swizzles entities held in the conversation context at
* the end of each request.
*
* @see PassivatedEntity
*
* @author Gavin King
*
*/
class EntityBeanList extends AbstractEntityBeanCollection
{
private static final long serialVersionUID = -2884601453783925804L;
private List list;
private List<PassivatedEntity> passivatedEntityList;
public EntityBeanList(List instance)
{
this.list = instance;
}
@Override
protected Iterable<PassivatedEntity> getPassivatedEntities()
{
return passivatedEntityList;
}
@Override
protected Object getEntityCollection()
{
return list;
}
@Override
protected void clearPassivatedEntities()
{
passivatedEntityList = null;
}
@Override
protected boolean isPassivatedEntitiesInitialized()
{
return passivatedEntityList!=null;
}
@Override
protected void activateAll()
{
for (int i=0; i<passivatedEntityList.size(); i++)
{
PassivatedEntity passivatedEntity = passivatedEntityList.get(i);
if (passivatedEntity!=null)
{
list.set( i, passivatedEntity.toEntityReference(true) );
}
}
passivatedEntityList=null;
}
@Override
protected void passivateAll()
{
List<PassivatedEntity> newPassivatedList = new ArrayList<PassivatedEntity>(list.size());
boolean found = false;
Iterator<Object> it = list.iterator();
for (int i=0; it.hasNext(); i++) {
PassivatedEntity passivatedEntity = null;
Object value = it.next();
if (value != null) {
passivatedEntity = PassivatedEntity.passivateEntity(value);
if (passivatedEntity!=null) {
if (!found) {
list = new ArrayList(list);
found=true;
}
//this would be dangerous, except that we
//are doing it to a copy of the original
//list:
list.set(i, null);
}
}
newPassivatedList.add(passivatedEntity);
}
// if the original list was nulled out, we don't want to overwrite the passivatedEntity list
if (found) {
passivatedEntityList = newPassivatedList;
}
}
}