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    }