/**********************************************************************
 * This file is part of "Object Teams Development Tooling"-Software
 * 
 * Copyright 2010 Stephan Herrmann
 * 
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * $Id$
 * 
 * Please visit http://www.eclipse.org/objectteams for updates and contact.
 * 
 * Contributors:
 * 		Stephan Herrmann - Initial API and implementation
 **********************************************************************/
package org.eclipse.objectteams.otdt.internal.migration;

import org.eclipse.core.resources.IFile;
import org.eclipse.osgi.util.ManifestElement;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.internal.core.builders.IHeader;
import org.w3c.dom.Element;

import base org.eclipse.pde.internal.core.builders.BundleErrorReporter;
import base org.eclipse.pde.internal.core.builders.ExtensionsErrorReporter;

/**
 * Hook into existing validations as to find project setups needing an update for
 * the migration org.objectteams -> org.eclipse.objectteams.
 * 
 * Handles: MANIFEST.MF and plugin.xml.
 */
@SuppressWarnings("restriction")
public team class OTEquinoxMigration 
{
	
	public static final String OLD_OTEQUINOX_NAME = "org.objectteams.otequinox"; //$NON-NLS-1$
	public static final String OLD_OTEQUINOX_EXTENSIONPOINT = "org.objectteams.otequinox.aspectBindings"; //$NON-NLS-1$

	/**
	 * Checks whether a RequireBundle directive mentions obsolete org.objectteams.otequinox
	 */
	@SuppressWarnings("decapsulation")
	protected class BundleErrorReporter playedBy BundleErrorReporter 
	{		
		int getPackageLine(IHeader header, ManifestElement element) 
		-> int getPackageLine(IHeader header, ManifestElement element);

		IPluginModelBase getFModel() -> get IPluginModelBase fModel;
		
		removeMarkers <- before validateRequireBundle;
		
		void removeMarkers() {
			// remove old markers:
			MigrationMarkers.removeMarkers(getFModel().getUnderlyingResource(), 
										   new int[] {MigrationMarkers.PROBLEM_ID_OTEQUINOX_BUNDLE});
		}
		
		validateBundleName <- before validateBundleVersionAttribute;
		
		void validateBundleName(IHeader header, ManifestElement element) 
		{
			if (OTEquinoxMigration.OLD_OTEQUINOX_NAME.equals(element.getValue())) {
				MigrationMarkers.addProblemMarker(
						getFModel().getUnderlyingResource(), 
						Messages.OTEquinoxMigration_old_otequinox_bundle_message,
						MigrationMarkers.PROBLEM_ID_OTEQUINOX_BUNDLE,
						getPackageLine(header, element));
			}
		}
	}

	/**
	 * Check whether an extension refers to aspectBinding extension point by its old obsolete name.
	 */
	@SuppressWarnings("decapsulation")
	protected class ExtensionAnalyzer playedBy ExtensionsErrorReporter 
	{	
		IFile getFFile() -> get IFile fFile;

		int getLine(Element element) -> int getLine(Element element);
		
		removeMarkers <- before validate;
		
		void removeMarkers() {			
			MigrationMarkers.removeMarkers(getFFile(), 
										   new int[] {MigrationMarkers.PROBLEM_ID_EXTENSIONPOINT});
		}
		
		void checkAspectBinding(Element element) <- after void validateExtension(Element element);

		protected void checkAspectBinding(Element element) 
		{
			Object pointID = element.getAttribute("point"); //$NON-NLS-1$
			if (OLD_OTEQUINOX_EXTENSIONPOINT.equals(pointID))
				MigrationMarkers.addProblemMarker(getFFile(), 
						Messages.OTEquinoxMigration_old_otequinox_extensionpoint_message,
						MigrationMarkers.PROBLEM_ID_EXTENSIONPOINT, 
						getLine(element));
		}
	}
}
