001 // Copyright 2004, 2005 The Apache Software Foundation
002 //
003 // Licensed under the Apache License, Version 2.0 (the "License");
004 // you may not use this file except in compliance with the License.
005 // You may obtain a copy of the License at
006 //
007 // http://www.apache.org/licenses/LICENSE-2.0
008 //
009 // Unless required by applicable law or agreed to in writing, software
010 // distributed under the License is distributed on an "AS IS" BASIS,
011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 // See the License for the specific language governing permissions and
013 // limitations under the License.
014
015 package org.apache.tapestry.record;
016
017 import org.apache.hivemind.util.Defense;
018 import org.apache.hivemind.util.ToStringBuilder;
019
020 /**
021 * Represents a change to a component on a page.
022 *
023 * @author Howard Lewis Ship
024 */
025
026 public class PropertyChangeImpl implements PropertyChange
027 {
028 private String _componentPath;
029
030 private String _propertyName;
031
032 private Object _newValue;
033
034 public PropertyChangeImpl(String componentPath, String propertyName, Object newValue)
035 {
036 Defense.notNull(propertyName, "propertyName");
037
038 // TODO: This breaks some tests, but those tests are wrong.
039 // Defense.notNull(newValue, "newValue");
040
041 _componentPath = componentPath;
042 _propertyName = propertyName;
043 _newValue = newValue;
044 }
045
046 /**
047 * The path to the component on the page, or null if the property is a property of the page.
048 */
049
050 public String getComponentPath()
051 {
052 return _componentPath;
053 }
054
055 /**
056 * The new value for the property, which may be null.
057 */
058
059 public Object getNewValue()
060 {
061 return _newValue;
062 }
063
064 /**
065 * The name of the property that changed.
066 */
067
068 public String getPropertyName()
069 {
070 return _propertyName;
071 }
072
073 public String toString()
074 {
075 ToStringBuilder builder = new ToStringBuilder(this);
076
077 builder.append("componentPath", _componentPath);
078 builder.append("propertyName", _propertyName);
079 builder.append("newValue", _newValue);
080
081 return builder.toString();
082 }
083
084 public boolean equals(Object object)
085 {
086 if (this == object)
087 return true;
088
089 if (object == null || object.getClass() != this.getClass())
090 return false;
091
092 PropertyChangeImpl other = (PropertyChangeImpl) object;
093
094 return same(_componentPath, other._componentPath)
095 && same(_propertyName, other._propertyName) && same(_newValue, other._newValue);
096 }
097
098 private boolean same(Object o1, Object o2)
099 {
100 return o1 == o2 || (o1 != null && o1.equals(o2));
101 }
102 }