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;
016    
017    import org.apache.hivemind.ApplicationRuntimeException;
018    
019    /**
020     * Exception thrown by an {@link org.apache.tapestry.engine.IEngineService} when
021     * it discovers that the an action link was for an out-of-date version of the
022     * page.
023     * <p>
024     * The application should redirect to the StaleLink page.
025     * 
026     * @author Howard Lewis Ship
027     */
028    
029    public class StaleLinkException extends ApplicationRuntimeException
030    {
031    
032        private static final long serialVersionUID = -1266992401198999606L;
033    
034        private final transient IPage _page;
035        private final String _pageName;
036        private final String _targetIdPath;
037        private final String _targetActionId;
038    
039        public StaleLinkException()
040        {
041            super(null, null, null, null);
042            
043            _targetIdPath = null;
044            _page = null;
045            _pageName = null;
046            _targetActionId = null;
047        }
048    
049        /**
050         * Constructor used when the action id is found, but the target id path did
051         * not match the actual id path.
052         */
053    
054        public StaleLinkException(IComponent component, String targetActionId,
055                String targetIdPath)
056        {
057            super(Tapestry.format("StaleLinkException.action-mismatch",
058                    new String[] { targetActionId, component.getIdPath(),
059                            targetIdPath }), component, null, null);
060    
061            _page = component.getPage();
062            _pageName = _page.getPageName();
063    
064            _targetActionId = targetActionId;
065            _targetIdPath = targetIdPath;
066        }
067    
068        /**
069         * Constructor used when the target action id is not found.
070         */
071    
072        public StaleLinkException(IPage page, String targetActionId,
073                String targetIdPath)
074        {
075            this(Tapestry.format("StaleLinkException.component-mismatch",
076                    targetActionId, targetIdPath), page);
077        }
078    
079        public StaleLinkException(String message, IComponent component)
080        {
081            super(message, component, null, null);
082            
083            _targetIdPath = null;
084            _page = null;
085            _pageName = null;
086            _targetActionId = null;
087        }
088    
089        public String getPageName()
090        {
091            return _pageName;
092        }
093    
094        /**
095         * Returns the page referenced by the service URL, if known, or null
096         * otherwise.
097         */
098    
099        public IPage getPage()
100        {
101            return _page;
102        }
103    
104        public String getTargetActionId()
105        {
106            return _targetActionId;
107        }
108    
109        public String getTargetIdPath()
110        {
111            return _targetIdPath;
112        }
113    
114    }