001    package org.trails.record;
002    
003    import org.apache.commons.logging.Log;
004    import org.apache.commons.logging.LogFactory;
005    import org.apache.tapestry.record.PropertyChange;
006    import org.apache.tapestry.record.PropertyChangeImpl;
007    
008    import java.util.ArrayList;
009    import java.util.Collection;
010    
011    
012    /**
013     * This class is a Trails adaptation of Tapernate's ReattachPropertyPersistenceStrategy
014     * Credits to James Carman.
015     */
016    public abstract class ReattachPropertyPersistenceStrategy extends AbstractSessionPropertyPersistenceStrategy
017    {
018    
019            protected abstract Object reattach(Object entity);
020    
021            private static final Log LOG = LogFactory.getLog(ReattachPropertyPersistenceStrategy.class);
022    
023            public Collection getStoredChanges(String pageName)
024            {
025                    final Collection<PropertyChange> pageChanges = super.getStoredChanges(pageName);
026                    Collection<PropertyChange> result = new ArrayList<PropertyChange>();
027    
028                    for (PropertyChange propertyChange : pageChanges)
029                    {
030                            final Object entity = propertyChange.getNewValue();
031                            LOG.debug("Reattaching property " + propertyChange.getPropertyName() + " on component " + propertyChange.getComponentPath());
032    
033                            try
034                            {
035                                    result.add(new PropertyChangeImpl(propertyChange.getComponentPath(), propertyChange.getPropertyName(), reattach(entity)));
036                            } catch (Exception e)
037                            {
038                                    e.printStackTrace();  //@todo throw a proper Exception
039                            }
040                    }
041                    return result;
042            }
043    }