IntrospectionException.java

package net.zer0bandwidth.android.lib.database.sqlitehouse.exceptions;

import net.zer0bandwidth.android.lib.database.sqlitehouse.SQLiteHouse;

/**
 * Thrown by {@link SQLiteHouse} and its descendant classes whenever the process
 * of reflexively constructing a database fails.
 * @since zer0bandwidth-net/android 0.1.4 (#26)
 */
public class IntrospectionException
extends RuntimeException
{
	protected static final String DEFAULT_MESSAGE =
			"Failed to reflexively discover database information." ;

	/**
	 * Used when an attempt to use {@link Class#newInstance()} fails with an
	 * {@link InstantiationException}.
	 * @param cls the class being instantiated
	 * @param xCause the cause of the failure
	 * @return a new exception with the appropriate message
	 * @since zer0bandwidth-net/android 0.1.7 (#50)
	 */
	public static IntrospectionException instanceFailed(
			Class<?> cls, Throwable xCause )
	{ return instanceFailed( cls.getCanonicalName(), xCause ) ; }

	/**
	 * Used when an attempt to create an instance of a schematic class fails.
	 * @param sClass the canonical name of the class being instantiated
	 * @param xCause the cause of the failure
	 * @return a new exception with the appropriate message
	 * @since zer0bandwidth-net/android 0.1.7 (#50)
	 */
	public static IntrospectionException instanceFailed(
			String sClass, Throwable xCause )
	{
		return new IntrospectionException( (new StringBuilder())
					.append( "Could not create instance of class [" )
					.append( sClass )
					.append( "]." )
					.toString()
				, xCause
			);
	}

	/**
	 * Used when an attempt to use {@link Class#newInstance()} fails with an
	 * {@link IllegalAccessException}.
	 * @param cls the class being instantiated
	 * @param xCause the cause of the failure
	 * @return a new exception with the appropriate message
	 * @since zer0bandwidth-net/android 0.1.7 (#50)
	 */
	public static IntrospectionException instanceForbidden(
			Class<?> cls, Throwable xCause )
	{
		return new IntrospectionException( (new StringBuilder())
					.append( "Instance constructor inaccessible for class [" )
					.append( cls.getCanonicalName() )
					.append( "]." )
					.toString()
				, xCause
			);
	}

	/**
	 * Used when something tries to process a class that does not implement the
	 * {@link net.zer0bandwidth.android.lib.database.sqlitehouse.SQLightable}
	 * interface.
	 * @param cls the unusable class
	 * @param xCause the root cause, if any
	 * @return a new exception with the appropriate message
	 * @since zer0bandwidth-net/android 0.1.7 (#50)
	 */
	public static IntrospectionException illegalClassSpecification(
			Class<?> cls, Throwable xCause )
	{ return illegalClassSpecification( cls.getCanonicalName(), xCause ) ; }

	/**
	 * Used when something tries to process a class that does not implement the
	 * {@link net.zer0bandwidth.android.lib.database.sqlitehouse.SQLightable}
	 * interface.
	 * @param sClass the canonical name of the unusable class
	 * @param xCause the root cause, if any
	 * @return a new exception with the appropriate message
	 * @since zer0bandwidth-net/android 0.1.7 (#50)
	 */
	public static IntrospectionException illegalClassSpecification(
			String sClass, Throwable xCause )
	{
		return new IntrospectionException( (new StringBuilder())
					.append( "Class [" ).append( sClass )
					.append( "] does not implement SQLightable." )
					.toString()
				, xCause
			);
	}

	@SuppressWarnings("unused")
	public IntrospectionException()
	{ super( DEFAULT_MESSAGE ) ; }

	public IntrospectionException( String sMessage )
	{ super( sMessage ) ; }

	@SuppressWarnings("unused")
	public IntrospectionException( Throwable xCause )
	{ super( DEFAULT_MESSAGE, xCause ) ; }

	public IntrospectionException( String sMessage, Throwable xCause )
	{ super( sMessage, xCause ) ; }
}