/*******************************************************************************
 * Copyright (c) 2000, 2005 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.jst.ws.internal.axis.consumption.ui.plugin;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.wst.common.environment.EnvironmentService;
import org.eclipse.wst.common.environment.ILog;
import org.osgi.framework.BundleContext;


/**
* This is the plugin class for the Web Services plugin.
* <p>
* This plugin contains the graphic user interface to the
* Web Services runtime found in org.eclipse.jst.ws.
*/
public class WebServiceAxisConsumptionUIPlugin extends Plugin
{

	/**
	* The identifier of the descriptor of this plugin in plugin.xml.
	*/
	public static final String ID =
		"org.eclipse.jst.ws.axis.consumption.ui";

	/**
	* The reference to the singleton instance of this plugin.
	*/
	private static WebServiceAxisConsumptionUIPlugin instance_;
	private ILog log_;

	/**
	* Constructs a runtime plugin object for this plugin.
	* The "plugin" element in plugin.xml should include the attribute
	* class = "org.eclipse.jst.ws.internal.ui.plugin.WebServicePlugin".
	* @param descriptor The descriptor of this plugin.
	*/
	public WebServiceAxisConsumptionUIPlugin() {
		super();
		if (instance_ == null) {
			instance_ = this;
		}
		log_ = EnvironmentService.getEclipseLog();

	}

  // This method is needed to keep the logging from blowing up.
  public String toString()
  {
    return ID;  
  }
  
	/**
	* Returns the singleton instance of this plugin. Equivalent to calling
	* (WebServiceWasConsumptionPlugin)Platform.getPlugin("org.eclipse.jst.ws.was.v5.tp");
	* @return The WebServiceWasConsumptionPlugin singleton.
	*/
	static public WebServiceAxisConsumptionUIPlugin getInstance() {
		return instance_;
	}

	/**
	* Called once by the platform when this plugin is first loaded.
	* @throws CoreException If this plugin fails to start.
	*/
	public void start( BundleContext bundle ) throws CoreException {
		log_.log(ILog.INFO, 5066, this, "start", "Starting plugin org.eclipse.jst.ws.axis.consumption.ui");
    
    try
    {
		  super.start( bundle );
    }
    catch( Exception exc )
    {
      log_.log( ILog.ERROR, 5066, this, "start", exc );
    }
	}

	/**
	* Called once by the platform when this plugin is unloaded.
	* @throws CoreException If this plugin fails to shutdown.
	*/
	public void stop( BundleContext context ) throws CoreException {
		log_.log(ILog.INFO, 5067, this, "shutdown", "Shutting plugin org.eclipse.jst.ws.axis.consumption.ui");
    
    try
    {
		  super.stop( context );
    }
    catch( Exception exc )
    {
      log_.log( ILog.ERROR, 5066, this, "stop", exc );      
    }
	}
}
