/*******************************************************************************
 * Copyright (c) 2010, 2011 Mia-Software.
 * 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:
 *    Nicolas Bros (Mia-Software) - initial API and implementation
 *******************************************************************************/
package org.eclipse.gmt.modisco.infra.common.core.internal.validation;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.gmt.modisco.infra.common.core.internal.CommonModiscoActivator;
import org.eclipse.gmt.modisco.infra.common.core.internal.Messages;
import org.eclipse.gmt.modisco.infra.common.core.internal.utils.BuildPropertiesUtils;
import org.eclipse.gmt.modisco.infra.common.core.internal.utils.PluginUtils;
import org.eclipse.gmt.modisco.infra.common.core.logging.MoDiscoLogger;
import org.eclipse.osgi.util.NLS;
import org.eclipse.pde.core.build.IBuildEntry;

public final class ValidationUtils {

	private ValidationUtils() {
		// utilities class
	}

	/**
	 * Check that all files with the given extension are registered in the
	 * plugin.xml and build.properties.
	 * <p>
	 * Puts warning markers on the plugin.xml, build.properties, or directly on
	 * the project if needed. Replaces previous markers of the same type.
	 *
	 * @param project
	 *            the project in which the element should be registered
	 * @param extensionToCheck
	 *            the file extension of the elements that should be registered
	 * @param markerType
	 *            the type of the marker that will be used
	 * @param elementType
	 *            a name for the element type in the error message
	 * @param extensionPoint
	 *            the extension point that is used to register elements of this
	 *            kind (elements must be declared with a "file" attribute)
	 */
	public static void validateRegistered(final IProject project, final String extensionToCheck,
			final String markerType, final String elementType, final String extensionPoint) {
		final List<IFile> notDeclared = new ArrayList<IFile>();
		final List<IFile> notInBuild = new ArrayList<IFile>();
		try {
			project.accept(new IResourceVisitor() {
				public boolean visit(final IResource resource) throws CoreException {
					String fileExtension = resource.getFileExtension();
					if (resource.getType() == IResource.FILE && fileExtension != null
							&& fileExtension.equals(extensionToCheck)) {
						IFile file = (IFile) resource;
						if (!PluginUtils.isRegistered(file, extensionPoint)) {
							notDeclared.add(file);
						}
						try {
							if (!BuildPropertiesUtils.isInBuild(file)) {
								notInBuild.add(file);
							}
						} catch (CoreException e) {
							MoDiscoLogger.logError(e, CommonModiscoActivator.getDefault());
						}
					}
					return true;
				}
			});
		} catch (CoreException e) {
			MoDiscoLogger.logError(e, CommonModiscoActivator.getDefault());
		}

		try {
			project.deleteMarkers(markerType, true, IResource.DEPTH_ONE);
		} catch (CoreException e) {
			MoDiscoLogger.logError(e, CommonModiscoActivator.getDefault());
		}

		IResource markersResource;
		IFile pluginXML = project.getFile("plugin.xml"); //$NON-NLS-1$
		if (pluginXML.exists()) {
			markersResource = pluginXML;
			try {
				pluginXML.deleteMarkers(markerType, true, IResource.DEPTH_ONE);
			} catch (CoreException e) {
				MoDiscoLogger.logError(e, CommonModiscoActivator.getDefault());
			}
		} else {
			markersResource = project;
		}

		IResource buildMarkersResource;
		IFile buildProperties = project.getFile("build.properties"); //$NON-NLS-1$
		if (buildProperties.exists()) {
			buildMarkersResource = buildProperties;
			try {
				buildProperties.deleteMarkers(markerType, true, IResource.DEPTH_ONE);
			} catch (CoreException e) {
				MoDiscoLogger.logError(e, CommonModiscoActivator.getDefault());
			}
		} else {
			buildMarkersResource = project;
		}

		for (IFile file : notDeclared) {
			try {
				String message = NLS.bind(Messages.ValidationUtils_shouldBeRegistered, elementType,
						file.getName());
				IMarker marker = markersResource.createMarker(markerType);
				marker.setAttribute(IMarker.MESSAGE, message);
				marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_WARNING);
			} catch (CoreException e) {
				MoDiscoLogger.logError(e, CommonModiscoActivator.getDefault());
			}
		}

		for (IFile file : notInBuild) {
			try {
				String message = NLS.bind(Messages.ValidationUtils_shouldBeInBin,
						new Object[] { IBuildEntry.BIN_INCLUDES, elementType, file.getName() });
				IMarker marker = buildMarkersResource.createMarker(markerType);
				marker.setAttribute(IMarker.MESSAGE, message);
				marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_WARNING);
			} catch (CoreException e) {
				MoDiscoLogger.logError(e, CommonModiscoActivator.getDefault());
			}
		}
	}
}
