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