/*******************************************************************************
 *  Copyright (c) 2000, 2010 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 API and implementation
 *******************************************************************************/
package org.eclipse.update.core;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;

/**
 * Custom install handler.
 * Custom install handlers can optionally be associated with a feature.
 * The actual install handler implementation can be physically delivered
 * as part of the feature package, or can already be installed on the client
 * machine and registered via the <code>org.eclipse.update.core.installHandlers</code>
 * extension point. The install handler methods are called at predetermined
 * point during update actions.
 * <p>
 * Clients may implement this interface. However, in most cases clients should 
 * directly subclass the provided implementation of this interface.
 * </p>
 * <p>
 * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
 * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
 * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
 * (repeatedly) as the API evolves.
 * </p>
 * @see org.eclipse.update.core.BaseInstallHandler
 * @since 2.0
 * @deprecated The org.eclipse.update component has been replaced by Equinox p2.
 * This API will be deleted in a future release. See bug 311590 for details.
 */
public interface IInstallHandler {

	/**
	 * Indicates the handler is being initialized for feature install.
	 * @since 2.0
	 */
	public static final int HANDLER_ACTION_INSTALL = 1;

	/**
	 * Indicates the handler is being initialized for feature configure.
	 * @since 2.0
	 */
	public static final int HANDLER_ACTION_CONFIGURE = 2;

	/**
	 * Indicates the handler is being initialized for feature unconfigure.
	 * @since 2.0
	 */
	public static final int HANDLER_ACTION_UNCONFIGURE = 3;

	/**
	 * Indicates the handler is being initialized for feature uninstall.
	 * @since 2.0
	 */
	public static final int HANDLER_ACTION_UNINSTALL = 4;

	/**
	 * Initialize the install handler.
	 * Install handlers are always constructed using the default constructor.
	 * The are initialized immediately following construction.
	 * 
	 * @param type update action type
	 * @param feature the target of the action
	 * @param entry model entry that defines this handler
	 * @param monitor optional progress monitor, can be <code>null</code>
	 * @exception CoreException
	 * @since 2.0
	 */
	public void initialize(
		int type,
		IFeature feature,
		IInstallHandlerEntry entry,
		InstallMonitor monitor)
		throws CoreException;

	/**
	 * Called at the start of the install action. At this point, no install
	 * processing has taken place.
	 * 
	 * @see #HANDLER_ACTION_INSTALL
	 * @exception CoreException terminates the action
	 * @since 2.0
	 */
	public void installInitiated() throws CoreException;

	/**
	 * Called after files corresponding to plug-in entries have been downloaded,
	 * but before they are actully unpacked and installed.
	 * 
	 * @see #HANDLER_ACTION_INSTALL
	 * @param plugins downloaded plug-in entries. Note this may be a subset
	 * of the plug-ins actually references by the feature.
	 * @exception CoreException terminates the action
	 * @since 2.0
	 */
	public void pluginsDownloaded(IPluginEntry[] plugins) throws CoreException;

	/**
	 * Called after files corresponding to non-plug-in entries have been 
	 * downloaded. The custom install handler can perform any custom
	 * verification of the non-plug-in entries (these are not interpreted
	 * in any way by the platform (beyond downloading)).
	 * 
	 * @see #HANDLER_ACTION_INSTALL
	 * @param nonPluginData downloaded non-plug-in entries.
	 * @param listener verification listener, may be <code>null</code>.
	 * @exception CoreException terminates the action
	 * @since 2.0
	 */
	public void nonPluginDataDownloaded(
		INonPluginEntry[] nonPluginData,
		IVerificationListener listener)
		throws CoreException;

	/**
	 * Called after the feature files and any downloaded plug-ins have
	 * been installed. Typically this is the point where the custom
	 * install handler can install any non-plug-in entries (these are not 
	 * interpreted in any way by the platform (beyond downloading)).
	 * 
	 * @see #HANDLER_ACTION_INSTALL
	 * @param consumer content consumer for the feature. The install handler
	 * can choose to use this consumer to install the non-plug-in data,
	 * or can handle the data in any other way. If using the consumer,
	 * the install handler should only call 
	 * @see IFeatureContentConsumer#store(ContentReference, IProgressMonitor)
	 * and @see IFeatureContentConsumer#open(INonPluginEntry)
	 * methods of the consumer. 
	 * @exception CoreException terminates the action
	 * @since 2.0
	 */
	public void completeInstall(IFeatureContentConsumer consumer)
		throws CoreException;

	/**
	 * Called at the end of the install action.
	 * 
	 * @see #HANDLER_ACTION_INSTALL
	 * @param success indicates action success. 
	 * @exception CoreException terminates the action
	 * @since 2.0
	 */
	public void installCompleted(boolean success) throws CoreException;

	/**
	 * Called at the start of the configure action
	 * 
	 * @see #HANDLER_ACTION_CONFIGURE
	 * @exception CoreException terminates the action
	 * @since 2.0
	 */
	public void configureInitiated() throws CoreException;

	/**
	 * Called after the feature has been configured. The install handler
	 * should perform any completion tasks. No arguments are passed
	 * to the method. If needed, the install handler can use arguments
	 * passed on the initialization call.
	 * 
	 * @see #HANDLER_ACTION_CONFIGURE
	 * @exception CoreException terminates the action
	 * @since 2.0
	 */
	public void completeConfigure() throws CoreException;

	/**
	 * Called at the end of the configure action.
	 * 
	 * @see #HANDLER_ACTION_CONFIGURE
	 * @param success indicates action success. 
	 * @exception CoreException terminates the action
	 * @since 2.0
	 */
	public void configureCompleted(boolean success) throws CoreException;

	/**
	 * Called at the start of the unconfigure action
	 * 
	 * @see #HANDLER_ACTION_UNCONFIGURE
	 * @exception CoreException terminates the action
	 * @since 2.0
	 */
	public void unconfigureInitiated() throws CoreException;

	/**
	 * Called after the feature has been unconfigured. The install handler
	 * should perform any completion tasks. No arguments are passed
	 * to the method. If needed, the install handler can use arguments
	 * passed on the initialization call.
	 * 
	 * @see #HANDLER_ACTION_UNCONFIGURE
	 * @exception CoreException terminates the action
	 * @since 2.0
	 */
	public void completeUnconfigure() throws CoreException;

	/**
	 * Called at the end of the unconfigure action.
	 * 
	 * @see #HANDLER_ACTION_UNCONFIGURE
	 * @param success indicates action success. 
	 * @exception CoreException terminates the action
	 * @since 2.0
	 */
	public void unconfigureCompleted(boolean success) throws CoreException;

	/**
	 * Called at the start of the uninstall action
	 * 
	 * @see #HANDLER_ACTION_UNINSTALL
	 * @exception CoreException terminates the action
	 * @since 2.0
	 */
	public void uninstallInitiated() throws CoreException;

	/**
	 * Called after the feature has been uninstalled. The install handler
	 * should perform any completion tasks. No arguments are passed
	 * to the method. If needed, the install handler can use arguments
	 * passed on the initialization call. Note, that at this point
	 * the feature files and any unreferenced plug-ins have been
	 * removed.
	 * 
	 * @see #HANDLER_ACTION_UNINSTALL
	 * @exception CoreException terminates the action
	 * @since 2.0
	 */
	public void completeUninstall() throws CoreException;

	/**
	 * Called at the end of the uninstall action.
	 * 
	 * @see #HANDLER_ACTION_UNINSTALL
	 * @param success indicates action success. 
	 * @exception CoreException terminates the action
	 * @since 2.0
	 */
	public void uninstallCompleted(boolean success) throws CoreException;
}
