package org.osgi.service.application;

/**
 * This exception is used to indicate problems related to application 
 * lifecycle management.
 * 
 * <code>ApplicationException</code> object is created by the Application Admin to denote
 * an exception condition in the lifecycle of an application.
 * <code>ApplicationException</code>s should not be created by developers.
 * <br/>
 * <code>ApplicationException</code>s are associated with an error code. This code
 * describes the type of problem reported in this exception. The possible codes are:
 * <ul>
 * <li> {@link #APPLICATION_LOCKED} - The application couldn't be launched because it is locked.</li>
 * <li> {@link #APPLICAITON_NOT_LAUNCHABLE} - The application is not in launchable state.</li>
 * <li> {@link #APPLICATION_INTERNAL_ERROR} - An exception was thrown by the application or its
 *       container during launch.</li>
 * </ul>
 * 
 */
public class ApplicationException extends Exception {
	private static final long serialVersionUID = -7173190453622508207L;
	private final Throwable cause;
	private final int errorCode;
	
	/**
	 * The application couldn't be launched because it is locked.
	 */
	public static final int APPLICATION_LOCKED	= 0x01;
	
	/**
	 * The application is not in launchable state, it's 
	 * {@link ApplicationDescriptor#APPLICATION_LAUNCHABLE}
	 * attribute is false.
	 */
	public static final int APPLICATION_NOT_LAUNCHABLE = 0x02;
	
	/**
	 * An exception was thrown by the application or the corresponding
	 * container during launch. The exception is available in {@link #getCause()}.
	 */
	public static final int APPLICATION_INTERNAL_ERROR = 0x03;

	/**
	 * Creates an <code>ApplicationException</code> with the specified error code.
	 * @param errorCode The code of the error 
	 */
	public ApplicationException(int errorCode) {
		this(errorCode,(Throwable) null);
	}
	
	/**
	 * Creates a <code>ApplicationException</code> that wraps another exception.
	 * 
	 * @param errorCode The code of the error 
	 * @param cause The cause of this exception.
	 */
	public ApplicationException(int errorCode, Throwable cause) {
		super();
		this.cause = cause;
		this.errorCode = errorCode;
	}

	/**
	 * Creates an <code>ApplicationException</code> with the specified error code.
	 * @param errorCode The code of the error 
	 * @param message The associated message
	 */
	public ApplicationException(int errorCode, String message) {
		this(errorCode, message,null);
	}

	/**
	 * Creates a <code>ApplicationException</code> that wraps another exception.
	 * 
	 * @param errorCode The code of the error 
	 * @param message The associated message.
	 * @param cause The cause of this exception.
	 */
	public ApplicationException(int errorCode, String message, Throwable cause) {
		super(message);
		this.cause = cause;
		this.errorCode = errorCode;
	}

	/**
	 * Returns the cause of this exception or <code>null</code> if no cause
	 * was specified when this exception was created.
	 * 
	 * @return The cause of this exception or <code>null</code> if no cause
	 *         was specified.
	 */
	public Throwable getCause() {
		return cause;
	}

	/**
	 * Returns the error code associcated with this exception.
	 * @return The error code of this exception.
	 */
	public int getErrorCode() {
		return errorCode;
	}
}
