1 15 package org.apache.tapestry.record; 16 17 import java.util.Collection ; 18 import java.util.Iterator ; 19 20 import org.apache.hivemind.ApplicationRuntimeException; 21 import org.apache.hivemind.ErrorLog; 22 import org.apache.hivemind.util.Defense; 23 import org.apache.hivemind.util.PropertyUtils; 24 import org.apache.tapestry.IComponent; 25 import org.apache.tapestry.IPage; 26 import org.apache.tapestry.IRequestCycle; 27 import org.apache.tapestry.engine.IPageRecorder; 28 import org.apache.tapestry.event.ObservedChangeEvent; 29 import org.apache.tapestry.spec.IPropertySpecification; 30 31 35 public class PageRecorderImpl implements IPageRecorder 36 { 37 private String _pageName; 38 39 private IRequestCycle _requestCycle; 40 41 private PropertyPersistenceStrategySource _strategySource; 42 43 private boolean _locked = false; 44 45 private ErrorLog _log; 46 47 public PageRecorderImpl(String pageName, IRequestCycle requestCycle, 48 PropertyPersistenceStrategySource strategySource, ErrorLog log) 49 { 50 Defense.notNull(pageName, "pageName"); 51 Defense.notNull(requestCycle, "requestCycle"); 52 Defense.notNull(strategySource, "strategySource"); 53 Defense.notNull(log, "log"); 54 55 _pageName = pageName; 56 _requestCycle = requestCycle; 57 _strategySource = strategySource; 58 _log = log; 59 } 60 61 public void commit() 62 { 63 _locked = true; 64 } 65 66 public Collection getChanges() 67 { 68 return _strategySource.getAllStoredChanges(_pageName, _requestCycle); 69 } 70 71 public void rollback(IPage page) 72 { 73 Collection changes = getChanges(); 74 75 Iterator i = changes.iterator(); 76 77 while (i.hasNext()) 78 { 79 PropertyChange change = (PropertyChange) i.next(); 80 81 applyChange(page, change); 82 } 83 } 84 85 private void applyChange(IPage page, PropertyChange change) 86 { 87 String idPath = change.getComponentPath(); 88 89 IComponent component = (idPath == null) ? page : page.getNestedComponent(idPath); 90 91 PropertyUtils.write(component, change.getPropertyName(), change.getNewValue()); 92 } 93 94 public void observeChange(ObservedChangeEvent event) 95 { 96 IComponent component = event.getComponent(); 97 String propertyName = event.getPropertyName(); 98 99 if (_locked) 100 { 101 _log.error(RecordMessages.recorderLocked(propertyName, component), null, null); 102 return; 103 } 104 105 PropertyPersistenceStrategy strategy = findStrategy(component, propertyName); 106 107 if (strategy != null) 108 strategy.store(_pageName, component.getIdPath(), propertyName, event.getNewValue()); 109 } 110 111 113 PropertyPersistenceStrategy findStrategy(IComponent component, String propertyName) 114 { 115 117 IPropertySpecification propertySpecification = component.getSpecification() 118 .getPropertySpecification(propertyName); 119 120 if (propertySpecification == null) 121 { 122 _log.error( 123 RecordMessages.missingPropertySpecification(propertyName, component), 124 null, 125 null); 126 return null; 127 } 128 129 String name = propertySpecification.getPersistence(); 130 131 135 try 136 { 137 return _strategySource.getStrategy(name); 138 } 139 catch (ApplicationRuntimeException ex) 140 { 141 _log.error(ex.getMessage(), propertySpecification.getLocation(), ex); 142 143 return null; 144 } 145 } 146 147 } | Popular Tags |