package org.jboss.seam.contexts; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * Swizzles entities held in the conversation context at * the end of each request. * * @see PassivatedEntity * * @author Gavin King * */ class EntityBeanMap extends AbstractEntityBeanCollection { private static final long serialVersionUID = -2884601453783925804L; private Map map; private Map<Object, PassivatedEntity> passivatedEntityMap; public EntityBeanMap(Map instance) { this.map = instance; } @Override protected Iterable<PassivatedEntity> getPassivatedEntities() { return passivatedEntityMap.values(); } @Override protected Object getEntityCollection() { return map; } @Override protected void clearPassivatedEntities() { passivatedEntityMap = null; } @Override protected boolean isPassivatedEntitiesInitialized() { return passivatedEntityMap!=null; } @Override protected void activateAll() { for ( Map.Entry<Object, PassivatedEntity> me: passivatedEntityMap.entrySet() ) { map.put( me.getKey(), me.getValue().toEntityReference(true) ); } clearPassivatedEntities(); } @Override protected void passivateAll() { HashMap<Object, PassivatedEntity> newPassivatedMap = new HashMap<Object, PassivatedEntity>(map.size()); boolean found = false; for (Map.Entry me: (Set<Map.Entry>) map.entrySet()) { Object value = me.getValue(); if (value!=null) { PassivatedEntity passivatedEntity = PassivatedEntity.passivateEntity(value); if (passivatedEntity!=null) { if (!found) { map = new HashMap(map); found=true; } //this would be dangerous, except that we //are doing it to a copy of the original //list: map.remove(me.getKey()); newPassivatedMap.put(me.getKey(), passivatedEntity); } } } if (found) { passivatedEntityMap = newPassivatedMap; } } }