/*******************************************************************************
 * Copyright (c) 2004, 2007 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.ui.tests.dynamicplugins;

import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.ui.internal.statushandlers.StatusHandlerDescriptor;
import org.eclipse.ui.internal.statushandlers.StatusHandlerRegistry;
import org.eclipse.ui.statushandlers.AbstractStatusHandler;
import org.eclipse.ui.statushandlers.StatusAdapter;
import org.eclipse.ui.statushandlers.StatusManager;
import org.eclipse.ui.tests.leaks.LeakTests;

/**
 * Tests to ensure the addition and removal of new status handlers with dynamic
 * plug-ins.
 */
public class StatusHandlerTests extends DynamicTestCase {

	private static final String STATUS_HANDLER_ID1 = "org.eclipse.newStatusHandler1.newStatusHandler1";

	private static final String STATUS_HANDLER_ID2 = "org.eclipse.newStatusHandler1.newStatusHandler2";

	private static final String PLUGIN_PREFIX = "";

	private static final String PLUGIN_PREFIX2 = "plugin";

	/**
	 * @param testName
	 */
	public StatusHandlerTests(String testName) {
		super(testName);
	}

	/**
	 * Tests to ensure that the status handlers are removed when the plugin is
	 * unloaded.
	 */
	public void testStatusHandlerRemoval() throws CoreException {
		getBundle();

		StatusHandlerDescriptor statusHandlerDescriptor1 = StatusHandlerRegistry
				.getDefault().getHandlerDescriptor(STATUS_HANDLER_ID1);
		assertNotNull(statusHandlerDescriptor1);
		AbstractStatusHandler statusHandler1 = statusHandlerDescriptor1
				.getStatusHandler();
		assertNotNull(statusHandler1);

		statusHandler1.handle(new StatusAdapter(new Status(IStatus.ERROR,
				PLUGIN_PREFIX2, "")), StatusManager.NONE);

		ReferenceQueue queue = new ReferenceQueue();
		ReferenceQueue queue2 = new ReferenceQueue();

		WeakReference ref = new WeakReference(statusHandlerDescriptor1, queue);
		WeakReference ref2 = new WeakReference(statusHandler1, queue2);

		statusHandlerDescriptor1 = null; // null the reference
		statusHandler1 = null; // null the reference

		removeBundle();

		try {
			LeakTests.checkRef(queue, ref);
			LeakTests.checkRef(queue2, ref2);
		} catch (Exception e) {
			fail(e.getMessage());
		}

		assertNull(StatusHandlerRegistry.getDefault().getHandlerDescriptor(
				STATUS_HANDLER_ID1));
	}

	/**
	 * Tests to ensure that the status handlers are removed when the plugin is
	 * unloaded.
	 */
	public void testStatusHandlerRemoval2() throws CoreException {
		getBundle();

		ReferenceQueue queue = new ReferenceQueue();
		ReferenceQueue queue2 = new ReferenceQueue();

		List statusHandlerDescriptors = StatusHandlerRegistry.getDefault()
				.getHandlerDescriptors(PLUGIN_PREFIX);

		assertNotNull(statusHandlerDescriptors);

		StatusHandlerDescriptor statusHandlerDescriptor1 = null;
		for (Iterator it = statusHandlerDescriptors.iterator(); it.hasNext();) {
			statusHandlerDescriptor1 = (StatusHandlerDescriptor) it.next();
			if (statusHandlerDescriptor1.getId().equals(STATUS_HANDLER_ID2)) {
				break;
			}
			statusHandlerDescriptor1 = null;
		}

		assertNotNull(statusHandlerDescriptor1);
		AbstractStatusHandler statusHandler1 = statusHandlerDescriptor1
				.getStatusHandler();
		assertNotNull(statusHandler1);

		statusHandler1.handle(new StatusAdapter(new Status(IStatus.ERROR,
				PLUGIN_PREFIX2, "")), StatusManager.NONE);

		WeakReference ref = new WeakReference(statusHandlerDescriptor1, queue);
		WeakReference ref2 = new WeakReference(statusHandler1, queue2);

		statusHandlerDescriptors = null;
		statusHandlerDescriptor1 = null; // null the reference
		statusHandler1 = null;

		removeBundle();

		try {
			LeakTests.checkRef(queue, ref);
			LeakTests.checkRef(queue2, ref2);
		} catch (Exception e) {
			fail(e.getMessage());
		}

		assertNull(StatusHandlerRegistry.getDefault().getHandlerDescriptor(
				STATUS_HANDLER_ID1));
	}

	/**
	 * Tests to ensure that the status handlers are removed when the plugin is
	 * unloaded. Checks if the default product handlers are handled correctly.
	 */
	public void testProductBindingRemoval() throws CoreException {
		getBundle();

		ReferenceQueue queue = new ReferenceQueue();
		ReferenceQueue queue2 = new ReferenceQueue();

		StatusHandlerDescriptor productStatusHandlerDescriptor = StatusHandlerRegistry
				.getDefault().getDefaultHandlerDescriptor();
		assertNotNull(productStatusHandlerDescriptor);
		AbstractStatusHandler productStatusHandler = productStatusHandlerDescriptor
				.getStatusHandler();
		assertNotNull(productStatusHandler);

		productStatusHandler.handle(new StatusAdapter(new Status(IStatus.ERROR,
				PLUGIN_PREFIX2, "")), StatusManager.NONE);

		WeakReference ref = new WeakReference(productStatusHandlerDescriptor,
				queue);
		WeakReference ref2 = new WeakReference(productStatusHandler, queue2);

		productStatusHandlerDescriptor = null; // null the reference
		productStatusHandler = null;

		removeBundle();

		try {
			LeakTests.checkRef(queue, ref);
			LeakTests.checkRef(queue2, ref2);
		} catch (Exception e) {
			fail(e.getMessage());
		}

		assertNull(StatusHandlerRegistry.getDefault().getHandlerDescriptor(
				STATUS_HANDLER_ID1));
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionId()
	 */
	protected String getExtensionId() {
		return "newStatusHandler1.testDynamicStatusHandlerAddition";
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionPoint()
	 */
	protected String getExtensionPoint() {
		return "statusHandlers";
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getInstallLocation()
	 */
	protected String getInstallLocation() {
		return "data/org.eclipse.newStatusHandler1";
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getMarkerClass()
	 */
	protected String getMarkerClass() {
		return "org.eclipse.ui.dynamic.DynamicStatusHandler";
	}
}
