Skip to content
Snippets Groups Projects
TAPException.java 14.7 KiB
Newer Older
  • Learn to ignore specific revisions
  • package tap;
    
    /*
     * This file is part of TAPLibrary.
     * 
     * TAPLibrary is free software: you can redistribute it and/or modify
     * it under the terms of the GNU Lesser General Public License as published by
     * the Free Software Foundation, either version 3 of the License, or
     * (at your option) any later version.
     * 
     * TAPLibrary is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * GNU Lesser General Public License for more details.
     * 
     * You should have received a copy of the GNU Lesser General Public License
     * along with TAPLibrary.  If not, see <http://www.gnu.org/licenses/>.
     * 
    
    gmantele's avatar
    gmantele committed
     * Copyright 2012,2015 - UDS/Centre de Données astronomiques de Strasbourg (CDS),
     *                       Astronomisches Rechen Institut (ARI)
    
    gmantele's avatar
    gmantele committed
     * <p>Any exception that occurred while a TAP service activity.</p>
     * 
     * <p>Most of the time this exception wraps another exception (e.g. {@link UWSException}).</p>
     * 
     * <p>It contains an HTTP status code, set by default to HTTP-500 (Internal Server Error).</p>
    
     * 
     * @author Gr&eacute;gory Mantelet (CDS;ARI)
    
    gmantele's avatar
    gmantele committed
     * @version 2.0 (04/2015)
    
    public class TAPException extends Exception {
    
    	private static final long serialVersionUID = 1L;
    
    
    gmantele's avatar
    gmantele committed
    	/** An ADQL query which were executed when the error occurred. */
    
    	private String adqlQuery = null;
    
    gmantele's avatar
    gmantele committed
    
    	/** The ADQL query execution status (e.g. uploading, parsing, executing) just when the error occurred.  */
    
    	private ExecutionProgression executionStatus = null;
    
    
    gmantele's avatar
    gmantele committed
    	/** The HTTP status code to set in the HTTP servlet response if the exception reaches the servlet. */
    
    	private int httpErrorCode = UWSException.INTERNAL_SERVER_ERROR;
    
    
    gmantele's avatar
    gmantele committed
    	/**
    	 * Standard TAP exception: no ADQL query or execution status specified.
    	 * The corresponding HTTP status code will be HTTP-500 (Internal Server Error).
    	 * 
    	 * @param message	Message explaining the error.
    	 */
    
    gmantele's avatar
    gmantele committed
    	/**
    	 * Standard TAP exception: no ADQL query or execution status specified.
    	 * The corresponding HTTP status code is set by the second parameter.
    	 * 
    	 * @param message		Message explaining the error.
    	 * @param httpErrorCode	HTTP response status code. <i>(if &le; 0, 500 will be set by default)</i>
    	 */
    
    	public TAPException(String message, int httpErrorCode){
    
    		super(message);
    		this.httpErrorCode = httpErrorCode;
    	}
    
    
    gmantele's avatar
    gmantele committed
    	/**
    	 * TAP exception with the ADQL query which were executed when the error occurred.
    	 * No execution status specified.
    	 * The corresponding HTTP status code will be HTTP-500 (Internal Server Error).
    	 * 
    	 * @param message	Message explaining the error.
    	 * @param query		The ADQL query which were executed when the error occurred.
    	 */
    
    	public TAPException(String message, String query){
    
    		super(message);
    		adqlQuery = query;
    	}
    
    
    gmantele's avatar
    gmantele committed
    	/**
    	 * TAP exception with the ADQL query which were executed when the error occurred.
    	 * No execution status specified.
    	 * The corresponding HTTP status code is set by the second parameter.
    	 * 
    	 * @param message		Message explaining the error.
    	 * @param httpErrorCode	HTTP response status code. <i>(if &le; 0, 500 will be set by default)</i>
    	 * @param query			The ADQL query which were executed when the error occurred.
    	 */
    
    	public TAPException(String message, int httpErrorCode, String query){
    
    		this(message, httpErrorCode);
    		adqlQuery = query;
    	}
    
    
    gmantele's avatar
    gmantele committed
    	/**
    	 * TAP exception with the ADQL query which were executed when the error occurred,
    	 * AND with its execution status (e.g. uploading, parsing, executing, ...).
    	 * The corresponding HTTP status code will be HTTP-500 (Internal Server Error).
    	 * 
    	 * @param message	Message explaining the error.
    	 * @param query		The ADQL query which were executed when the error occurred.
    	 * @param status	Execution status/phase of the given ADQL query when the error occurred. 
    	 */
    
    	public TAPException(String message, String query, ExecutionProgression status){
    
    		this(message, query);
    		executionStatus = status;
    	}
    
    
    gmantele's avatar
    gmantele committed
    	/**
    	 * TAP exception with the ADQL query which were executed when the error occurred,
    	 * AND with its execution status (e.g. uploading, parsing, executing, ...).
    	 * The corresponding HTTP status code is set by the second parameter.
    	 * 
    	 * @param message		Message explaining the error.
    	 * @param httpErrorCode	HTTP response status code. <i>(if &le; 0, 500 will be set by default)</i>
    	 * @param query			The ADQL query which were executed when the error occurred.
    	 * @param status		Execution status/phase of the given ADQL query when the error occurred. 
    	 */
    
    	public TAPException(String message, int httpErrorCode, String query, ExecutionProgression status){
    
    		this(message, httpErrorCode, query);
    		executionStatus = status;
    	}
    
    
    gmantele's avatar
    gmantele committed
    	/**
    	 * <p>TAP exception wrapping the given {@link UWSException}.</p>
    	 * 
    	 * <p>The message of this TAP exception will be exactly the same as the one of the given exception.</p>
    	 * 
    	 * <p>
    	 * 	Besides, the cause of this TAP exception will be the cause of the given exception ONLY if it has one ;
    	 * 	otherwise it will the given exception.
    	 * </p>
    	 * 
    	 * <p>The HTTP status code will be the same as the one of the given {@link UWSException}.</p>
    	 * 
    	 * @param ue	The exception to wrap.
    	 */
    
    	public TAPException(UWSException ue){
    
    		this(ue.getMessage(), (ue.getCause() == null ? ue : ue.getCause()), ue.getHttpErrorCode());
    
    gmantele's avatar
    gmantele committed
    	/**
    	 * <p>TAP exception wrapping the given {@link UWSException}.</p>
    	 * 
    	 * <p>The message of this TAP exception will be exactly the same as the one of the given exception.</p>
    	 * 
    	 * <p>
    	 * 	Besides, the cause of this TAP exception will be the cause of the given exception ONLY if it has one ;
    	 * 	otherwise it will the given exception.
    	 * </p>
    	 * 
    	 * <p>The HTTP status code will be the one given in second parameter.</p>
    	 * 
    	 * @param cause			The exception to wrap.
    	 * @param httpErrorCode	HTTP response status code. <i>(if &le; 0, 500 will be set by default)</i>
    	 */
    
    	public TAPException(UWSException cause, int httpErrorCode){
    
    		this(cause);
    		this.httpErrorCode = httpErrorCode;
    	}
    
    
    gmantele's avatar
    gmantele committed
    	/**
    	 * <p>TAP exception wrapping the given {@link UWSException} and storing the current ADQL query execution status.</p>
    	 * 
    	 * <p>The message of this TAP exception will be exactly the same as the one of the given exception.</p>
    	 * 
    	 * <p>
    	 * 	Besides, the cause of this TAP exception will be the cause of the given exception ONLY if it has one ;
    	 * 	otherwise it will the given exception.
    	 * </p>
    	 * 
    	 * <p>The HTTP status code will be the one given in second parameter.</p>
    	 * 
    	 * @param cause			The exception to wrap.
    	 * @param httpErrorCode	HTTP response status code. <i>(if &le; 0, 500 will be set by default)</i>
    	 * @param status		Execution status/phase of the given ADQL query when the error occurred. 
    	 */
    
    	public TAPException(UWSException cause, int httpErrorCode, ExecutionProgression status){
    
    		this(cause, httpErrorCode);
    		this.executionStatus = status;
    	}
    
    
    gmantele's avatar
    gmantele committed
    	/**
    	 * Build a {@link TAPException} with the given cause. The built exception will have NO MESSAGE.
    	 * No execution status specified.
    	 * The corresponding HTTP status code will be HTTP-500 (Internal Server Error).
    	 * 
    	 * @param cause	The cause of this exception.
    	 */
    
    gmantele's avatar
    gmantele committed
    	/**
    	 * Build a {@link TAPException} with the given cause. The built exception will have NO MESSAGE.
    	 * No execution status specified.
    	 * The corresponding HTTP status code is set by the second parameter.
    	 * 
    	 * @param cause			The cause of this exception.
    	 * @param httpErrorCode	HTTP response status code. <i>(if &le; 0, 500 will be set by default)</i>
    	 */
    
    	public TAPException(Throwable cause, int httpErrorCode){
    
    		super(cause);
    		this.httpErrorCode = httpErrorCode;
    	}
    
    
    gmantele's avatar
    gmantele committed
    	/**
    	 * Build a {@link TAPException} with the given cause AND with the ADQL query which were executed when the error occurred.
    	 * The built exception will have NO MESSAGE.
    	 * No execution status specified.
    	 * The corresponding HTTP status code will be HTTP-500 (Internal Server Error).
    	 * 
    	 * @param cause		The cause of this exception.
    	 * @param query		The ADQL query which were executed when the error occurred.
    	 */
    
    	public TAPException(Throwable cause, String query){
    
    gmantele's avatar
    gmantele committed
    	/**
    	 * Build a {@link TAPException} with the given cause AND with the ADQL query which were executed when the error occurred.
    	 * The built exception will have NO MESSAGE.
    	 * No execution status specified.
    	 * The corresponding HTTP status code is set by the second parameter.
    	 * 
    	 * @param cause			The cause of this exception.
    	 * @param httpErrorCode	HTTP response status code. <i>(if &le; 0, 500 will be set by default)</i>
    	 * @param query			The ADQL query which were executed when the error occurred.
    	 */
    
    	public TAPException(Throwable cause, int httpErrorCode, String query){
    
    		this(cause, httpErrorCode);
    		adqlQuery = query;
    	}
    
    
    gmantele's avatar
    gmantele committed
    	/**
    	 * Build a {@link TAPException} with the given cause AND with the ADQL query which were executed when the error occurred
    	 * AND with its execution status (e.g. uploading, parsing, executing, ...).
    	 * The built exception will have NO MESSAGE.
    	 * The corresponding HTTP status code will be HTTP-500 (Internal Server Error).
    	 * 
    	 * @param cause		The cause of this exception.
    	 * @param query		The ADQL query which were executed when the error occurred.
    	 * @param status	Execution status/phase of the given ADQL query when the error occurred. 
    	 */
    
    	public TAPException(Throwable cause, String query, ExecutionProgression status){
    
    		this(cause, query);
    		executionStatus = status;
    	}
    
    
    gmantele's avatar
    gmantele committed
    	/**
    	 * Build a {@link TAPException} with the given cause AND with the ADQL query which were executed when the error occurred
    	 * AND with its execution status (e.g. uploading, parsing, executing, ...).
    	 * The built exception will have NO MESSAGE.
    	 * The corresponding HTTP status code is set by the second parameter.
    	 * 
    	 * @param cause			The cause of this exception.
    	 * @param httpErrorCode	HTTP response status code. <i>(if &le; 0, 500 will be set by default)</i>
    	 * @param query			The ADQL query which were executed when the error occurred.
    	 * @param status		Execution status/phase of the given ADQL query when the error occurred. 
    	 */
    
    	public TAPException(Throwable cause, int httpErrorCode, String query, ExecutionProgression status){
    
    		this(cause, httpErrorCode, query);
    		executionStatus = status;
    	}
    
    
    gmantele's avatar
    gmantele committed
    	/**
    	 * Build a {@link TAPException} with the given message and cause.
    	 * No execution status specified.
    	 * The corresponding HTTP status code will be HTTP-500 (Internal Server Error).
    	 * 
    	 * @param message	Message of this exception.
    	 * @param cause		The cause of this exception.
    	 */
    
    	public TAPException(String message, Throwable cause){
    
    gmantele's avatar
    gmantele committed
    	/**
    	 * Build a {@link TAPException} with the given message and cause.
    	 * No execution status specified.
    	 * The corresponding HTTP status code is set by the third parameter.
    	 * 
    	 * @param message		Message of this exception.
    	 * @param cause			The cause of this exception.
    	 * @param httpErrorCode	HTTP response status code. <i>(if &le; 0, 500 will be set by default)</i>
    	 */
    
    	public TAPException(String message, Throwable cause, int httpErrorCode){
    
    		super(message, cause);
    		this.httpErrorCode = httpErrorCode;
    	}
    
    
    gmantele's avatar
    gmantele committed
    	/**
    	 * Build a {@link TAPException} with the given message and cause,
    	 * AND with the ADQL query which were executed when the error occurred.
    	 * No execution status specified.
    	 * The corresponding HTTP status code will be HTTP-500 (Internal Server Error).
    	 * 
    	 * @param message		Message of this exception.
    	 * @param cause			The cause of this exception.
    	 * @param query			The ADQL query which were executed when the error occurred.
    	 */
    
    	public TAPException(String message, Throwable cause, String query){
    
    		super(message, cause);
    		adqlQuery = query;
    	}
    
    
    gmantele's avatar
    gmantele committed
    	/**
    	 * Build a {@link TAPException} with the given message and cause,
    	 * AND with the ADQL query which were executed when the error occurred.
    	 * No execution status specified.
    	 * The corresponding HTTP status code is set by the third parameter.
    	 * 
    	 * @param message		Message of this exception.
    	 * @param cause			The cause of this exception.
    	 * @param httpErrorCode	HTTP response status code. <i>(if &le; 0, 500 will be set by default)</i>
    	 * @param query			The ADQL query which were executed when the error occurred.
    	 */
    
    	public TAPException(String message, Throwable cause, int httpErrorCode, String query){
    
    		this(message, cause, httpErrorCode);
    		adqlQuery = query;
    	}
    
    
    gmantele's avatar
    gmantele committed
    	/**
    	 * Build a {@link TAPException} with the given message and cause,
    	 * AND with the ADQL query which were executed when the error occurred
    	 * AND with its execution status (e.g. uploading, parsing, executing, ...).
    	 * No execution status specified.
    	 * The corresponding HTTP status code will be HTTP-500 (Internal Server Error).
    	 * 
    	 * @param message		Message of this exception.
    	 * @param cause			The cause of this exception.
    	 * @param query			The ADQL query which were executed when the error occurred.
    	 * @param status		Execution status/phase of the given ADQL query when the error occurred. 
    	 */
    
    	public TAPException(String message, Throwable cause, String query, ExecutionProgression status){
    
    		this(message, cause, query);
    		executionStatus = status;
    	}
    
    
    gmantele's avatar
    gmantele committed
    	/**
    	 * Build a {@link TAPException} with the given message and cause,
    	 * AND with the ADQL query which were executed when the error occurred
    	 * AND with its execution status (e.g. uploading, parsing, executing, ...).
    	 * No execution status specified.
    	 * The corresponding HTTP status code is set by the third parameter.
    	 * 
    	 * @param message		Message of this exception.
    	 * @param cause			The cause of this exception.
    	 * @param httpErrorCode	HTTP response status code. <i>(if &le; 0, 500 will be set by default)</i>
    	 * @param query			The ADQL query which were executed when the error occurred.
    	 * @param status		Execution status/phase of the given ADQL query when the error occurred. 
    	 */
    
    	public TAPException(String message, Throwable cause, int httpErrorCode, String query, ExecutionProgression status){
    
    		this(message, cause, httpErrorCode, query);
    		executionStatus = status;
    	}
    
    
    gmantele's avatar
    gmantele committed
    	/**
    	 * <p>Get the HTTP status code to set in the HTTP response.</p>
    	 * 
    	 * <p><i>If the set value is &le; 0, 500 will be returned instead.</i></p>
    	 * 
    	 * @return	The HTTP response status code.
    	 */
    
    	public int getHttpErrorCode(){
    
    gmantele's avatar
    gmantele committed
    		return (httpErrorCode <= 0) ? UWSException.INTERNAL_SERVER_ERROR : httpErrorCode;
    
    gmantele's avatar
    gmantele committed
    	/**
    	 * Get the ADQL query which were executed when the error occurred.
    	 * 
    	 * @return	Executed ADQL query.
    	 */
    
    	public String getQuery(){
    		return adqlQuery;
    	}
    
    
    gmantele's avatar
    gmantele committed
    	/**
    	 * Get the execution status/phase of an ADQL query when the error occurred.
    	 * 
    	 * @return	ADQL query execution status.
    	 */
    
    	public ExecutionProgression getExecutionStatus(){
    		return executionStatus;
    	}
    
    }