package org.eclipse.update.internal.core;
/*
 * (c) Copyright IBM Corp. 2000, 2001.
 * All Rights Reserved.
 */

import java.net.MalformedURLException;
import java.net.URL;
/**
 */
import org.eclipse.core.runtime.*;
import org.eclipse.update.internal.ui.*;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.webdav.http.client.HttpClient;

public class UpdateManagerPlugin extends Plugin {
	private static UpdateManagerPlugin _pluginInstance = null;
	private	HttpClient client =null;
/**
 * UpdateManagerPlugin constructor comment.
 */
public UpdateManagerPlugin( IPluginDescriptor pluginDescriptor ) {
	super( pluginDescriptor );

	_pluginInstance = this;
}
/**
 * Returns the image descriptor of an image file relative to this plugin
 * @return org.eclipse.jface.resource.ImageDescriptor
 * @param strImage java.lang.String
 */
public static ImageDescriptor getImageDescriptor(String strImage) {

	UpdateManagerPlugin plugin = getPluginInstance();

	if (plugin != null) {

		// Obtain my plugin descriptor
		//----------------------------
		IPluginDescriptor pluginDescriptor = plugin.getDescriptor();

		// Determine where I am installed
		//-------------------------------
		URL path = pluginDescriptor.getInstallURL();

		// Add the relative file location to the install location
		// Create the image descriptor
		//-------------------------------------------------------
		URL urlFullPathString = null;

		try {
			urlFullPathString = new URL(path, strImage);
			return ImageDescriptor.createFromURL(urlFullPathString);
		}

		catch (MalformedURLException e) {
		}
	}
	return null;
}
/**
 * @return org.eclipse.update.internal.core.UpdateManagerPlugin
 */
public static UpdateManagerPlugin getPluginInstance() {
	return _pluginInstance;
}
/**
 * Shuts down this plug-in and discards all plug-in state.
 * <p>
 * This method should be re-implemented in subclasses that need to do something
 * when the plug-in is shut down.  Implementors should call the inherited method
 * to ensure that any system requirements can be met.
 * </p>
 * <p>
 * Plug-in shutdown code should be robust. In particular, this method
 * should always make an effort to shut down the plug-in. Furthermore,
 * the code should not assume that the plug-in was started successfully,
 * as this method will be invoked in the event of a failure during startup.
 * </p>
 * <p>
 * Note 1: If a plug-in has been started, this method will be automatically
 * invoked by the platform when the platform is shut down.
 * </p>
 * <p>
 * Note 2: This method is intended to perform simple termination
 * of the plug-in environment. The platform may terminate invocations
 * that do not complete in a timely fashion.
 * </p>
 * <b>Cliens must never explicitly call this method.</b>
 *
 * @exception CoreException if this method fails to shut down
 *   this plug-in 
 */
public void shutdown() throws CoreException {
	if(client!=null) client.close(); 
}
/**
 * Starts up this plug-in.
 * <p>
 * This method should be overridden in subclasses that need to do something
 * when this plug-in is started.  Implementors should call the inherited method
 * to ensure that any system requirements can be met.
 * </p>
 * <p>
 * If this method throws an exception, it is taken as an indication that
 * plug-in initialization has failed; as a result, the plug-in will not
 * be activated; moreover, the plug-in will be marked as disabled and 
 * ineligible for activation for the duration.
 * </p>
 * <p>
 * Plug-in startup code should be robust. In the event of a startup failure,
 * the plug-in's <code>shutdown</code> method will be invoked automatically,
 * in an attempt to close open files, etc.
 * </p>
 * <p>
 * Note 1: This method is automatically invoked by the platform 
 * the first time any code in the plug-in is executed.
 * </p>
 * <p>
 * Note 2: This method is intended to perform simple initialization 
 * of the plug-in environment. The platform may terminate initializers 
 * that do not complete in a timely fashion.
 * </p>
 * <b>Cliens must never explicitly call this method.</b>
 *
 * @exception CoreException if this plug-in did not start up properly
 */
public void startup() throws CoreException {
	// Setup HTTP client
	//------------------
	client = new HttpClient();
	client.setAuthenticator(new AuthorizationDatabase());
	URLHandler.setHttpClient(client);
}
}
