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 }