001    /**
002     *
003     * Copyright 2003-2004 The Apache Software Foundation
004     *
005     *  Licensed under the Apache License, Version 2.0 (the "License");
006     *  you may not use this file except in compliance with the License.
007     *  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     *  Unless required by applicable law or agreed to in writing, software
012     *  distributed under the License is distributed on an "AS IS" BASIS,
013     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     *  See the License for the specific language governing permissions and
015     *  limitations under the License.
016     */
017    
018    //
019    // This source code implements specifications defined by the Java
020    // Community Process. In order to remain compliant with the specification
021    // DO NOT add / change / or delete method signatures!
022    //
023    
024    package javax.servlet;
025    
026    /**
027     * Defines an exception that a servlet or filter throws to indicate
028     * that it is permanently or temporarily unavailable.
029     *
030     * <p>When a servlet or filter is permanently unavailable, something is wrong
031     * with it, and it cannot handle
032     * requests until some action is taken. For example, a servlet
033     * might be configured incorrectly, or a filter's state may be corrupted.
034     * The component should log both the error and the corrective action
035     * that is needed.
036     *
037     * <p>A servlet or filter is temporarily unavailable if it cannot handle
038     * requests momentarily due to some system-wide problem. For example,
039     * a third-tier server might not be accessible, or there may be
040     * insufficient memory or disk storage to handle requests. A system
041     * administrator may need to take corrective action.
042     *
043     * <p>Servlet containers can safely treat both types of unavailable
044     * exceptions in the same way. However, treating temporary unavailability
045     * effectively makes the servlet container more robust. Specifically,
046     * the servlet container might block requests to the servlet or filter for a period
047     * of time suggested by the exception, rather than rejecting them until
048     * the servlet container restarts.
049     *
050     * @version $Rev: 46019 $ $Date: 2004-09-14 02:56:06 -0700 (Tue, 14 Sep 2004) $
051     */
052    public class UnavailableException extends ServletException {
053        /**
054         * What is unavailable
055         */
056        private Servlet servlet;
057        /**
058         * Does this need an admin action?
059         */
060        private boolean permanent;
061        /**
062         * Estimate of how long the resource will be unavaile.
063         */
064        private int seconds;
065    
066        /**
067         * @deprecated As of Java Servlet API 2.2, use {@link
068         * #UnavailableException(String)} instead.
069         *
070         * @param servlet the <code>Servlet</code> instance that is unavailable
071         *
072         * @param msg a <code>String</code> specifying the descriptive message
073         */
074        public UnavailableException(Servlet servlet, String msg) {
075            super(msg);
076            this.servlet = servlet;
077            permanent = true;
078        }
079    
080        /**
081         * @deprecated As of Java Servlet API 2.2, use {@link
082         * #UnavailableException(String, int)} instead.
083         *
084         * @param seconds an integer specifying the number of seconds
085         * the servlet expects to be unavailable; if zero or negative,
086         * indicates that the servlet can't make an estimate
087         *
088         * @param servlet the <code>Servlet</code> that is unavailable
089         *
090         * @param msg a <code>String</code> specifying the descriptive
091         * message, which can be written to a log file or displayed for
092         * the user.
093         */
094        public UnavailableException(int seconds, Servlet servlet, String msg) {
095            super(msg);
096            this.servlet = servlet;
097            if (seconds <= 0) {
098                this.seconds = -1;
099            } else {
100                this.seconds = seconds;
101            }
102            permanent = false;
103        }
104    
105        /**
106         * Constructs a new exception with a descriptive
107         * message indicating that the servlet is permanently
108         * unavailable.
109         *
110         * @param msg a <code>String</code> specifying the descriptive message
111         */
112        public UnavailableException(String msg) {
113            super(msg);
114    
115            permanent = true;
116        }
117    
118        /**
119         * Constructs a new exception with a descriptive message
120         * indicating that the servlet is temporarily unavailable
121         * and giving an estimate of how long it will be unavailable.
122         *
123         * <p>In some cases, the servlet cannot make an estimate. For
124         * example, the servlet might know that a server it needs is
125         * not running, but not be able to report how long it will take
126         * to be restored to functionality. This can be indicated with
127         * a negative or zero value for the <code>seconds</code> argument.
128         *
129         * @param msg a <code>String</code> specifying the descriptive
130         * message, which can be written to a log file or displayed for
131         * the user.
132         *
133         * @param seconds an integer specifying the number of seconds
134         * the servlet expects to be unavailable; if zero or negative,
135         * indicates that the servlet can't make an estimate
136         */
137        public UnavailableException(String msg, int seconds) {
138            super(msg);
139    
140            if (seconds <= 0) {
141                this.seconds = -1;
142            } else {
143                this.seconds = seconds;
144            }
145            permanent = false;
146        }
147    
148        /**
149         * Returns a <code>boolean</code> indicating
150         * whether the servlet is permanently unavailable.
151         * If so, something is wrong with the servlet, and the
152         * system administrator must take some corrective action.
153         *
154         * @return <code>true</code> if the servlet is
155         * permanently unavailable; <code>false</code>
156         * if the servlet is available or temporarily unavailable
157         */
158        public boolean isPermanent() {
159            return permanent;
160        }
161    
162        /**
163         * @deprecated As of Java Servlet API 2.2, with no replacement.
164         *
165         * Returns the servlet that is reporting its unavailability.
166         *
167         * @return the <code>Servlet</code> object that is
168         * throwing the <code>UnavailableException</code>
169         */
170        public Servlet getServlet() {
171            return servlet;
172        }
173    
174        /**
175         * Returns the number of seconds the servlet expects to
176         * be temporarily unavailable.
177         *
178         * <p>If this method returns a negative number, the servlet
179         * is permanently unavailable or cannot provide an estimate of
180         * how long it will be unavailable. No effort is
181         * made to correct for the time elapsed since the exception was
182         * first reported.
183         *
184         * @return an integer specifying the number of seconds
185         * the servlet will be temporarily unavailable, or a negative
186         * number if the servlet is permanently unavailable or cannot
187         * make an estimate
188         */
189        public int getUnavailableSeconds() {
190            return permanent ? -1 : seconds;
191        }
192    }