//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 IBM Corporation and others.
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// which accompanies this distribution, and is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// Contributors:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.search;

/**
 * Signals that a Generate Search Index operation has failed.
 * 
 * @author Kelvin Low
 * @since 1.0
 */
public class GenerateSearchIndexException extends SearchServiceException {

	private static final long serialVersionUID = 6537405211451177110L;

	/**
	 * Creates a new instance.
	 */
	public GenerateSearchIndexException() {
		super();
	}

	/**
	 * Creates a new instance given the root cause of the exception.
	 * 
	 * @param rootCause
	 *            The root cause of the exception.
	 */
	public GenerateSearchIndexException(Throwable rootCause) {
		super(rootCause);
	}

	/**
	 * Creates a new instance given the error message.
	 * 
	 * @param errorMsg
	 *            The error message.
	 */
	public GenerateSearchIndexException(String errorMsg) {
		super(errorMsg);
	}

	/**
	 * Creates a new instance given the root cause of the exception and the
	 * error message.
	 * 
	 * @param rootCause
	 *            The root cause of the exception.
	 * @param errorMsg
	 *            The error message.
	 */
	public GenerateSearchIndexException(Throwable rootCause, String errorMsg) {
		super(rootCause, errorMsg);
	}

}