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