/*******************************************************************************
 * Copyright (c) 2004, 2007 Sybase, Inc. and others.
 *
 * All rights reserved. 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
 *
 * Contributors:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/

package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;

import java.util.Iterator;

import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;

/**
 * 
 * Utility class to add and remove edit part markers.
 * 
 * FIXME: add the identification mechanism of the model and remove the
 * dependency on the PageflowElement
 * 
 * @author Xiao-guang Zhang
 * 
 * 
 */
public class EditPartMarkerUtil {

	/**
	 * Removes all markers that were created using createMarker()
	 * 
	 * @param model -
	 *            the emf model related with edit part
	 * @throws CoreException 
	 */
	public static void removeAllMarkers(EObject model) throws CoreException {
		IResource resource = getResource(model);

		if (resource != null) {
			String markerTypes[] = { IMarker.PROBLEM, IMarker.TASK };

			for (int iMT = 0; iMT < markerTypes.length; iMT++) {
				IMarker[] markers = resource.findMarkers(markerTypes[iMT],
						false, IResource.DEPTH_ONE);

				for (int iMark = 0; iMark < markers.length; iMark++) {
					markers[iMark].delete();
				}
			}
		}
	}

	/**
	 * Removes a specific problem marker type with the given severity.
	 * 
	 * @param model -
	 *            the model related with this edit part.
	 * @param sMarkerType -
	 *            the marker type, either IMarker.PROBLEM or IMarker.TASK
	 * @param iSeverity -
	 *            severity/priority: if sMarkerType is IMarker.PROBLEM, then
	 *            this value is one of the PROBLEM severities; if sMarkerType is
	 *            IMarker.TASK, this is a task priority.
	 * @throws CoreException
	 *             passed on from IResource.findMarkers()
	 */
	public static void removeAllMarkers(EObject model, String sMarkerType,
			int iSeverity) throws CoreException {
		IResource resource = getResource(model);

		if (resource != null) {
			IMarker[] markers = resource.findMarkers(sMarkerType, false,
					IResource.DEPTH_ONE);

			for (int i = 0; i < markers.length; i++) {
				IMarker marker = markers[i];
				int iMarkerSeverity = marker.getAttribute(IMarker.SEVERITY,
						IMarker.SEVERITY_ERROR);

				if (iMarkerSeverity == iSeverity || iSeverity == -1) {
					markers[i].delete();
				}
			}
		}
	}

	/**
	 * get the resouce according to part or model.
	 * 
	 * @param part
	 * @param model
	 * @return
	 */
	private static IResource getResource(EObject model) {
		IResource resource = null;
		resource = WebrootUtil.getResource(model);
		return resource;
	}

	/**
	 * Create a problem marker.
	 * 
	 * @param model -
	 *            the model related with this edit part.
	 * @param sMarkerType 
	 * @param severity -
	 *            the problem severity, one of IMarker.SEVERITY_ERROR,
	 *            IMarker.SEVERITY_WARNING or IMarker.SEVERITY_INFO
	 * @param message -
	 *            the text associated with this marker
	 * @param location -
	 *            a unique ID that the application can use to locate the
	 *            editpart
	 * 
	 * that corresponds to this marker; this is typically the DiagramElement's
	 * ID string
	 * @throws CoreException
	 */
	public static void createMarker(EObject model, String sMarkerType,
			int severity, String message, String location) throws CoreException {
		IResource resource = getResource(model);

		if (resource != null) {
			IMarker marker = resource.createMarker(sMarkerType);
			marker.setAttribute(IMarker.MESSAGE, message);
			marker.setAttribute(IMarker.SEVERITY, severity);
			// The problem view doesn't show the location - only the line number
			// is shown in the "location" column. Doh!
			if (location != null && location.length() > 0) {
				marker.setAttribute(IMarker.LOCATION, location);
			}
		}
	}

	/**
	 * Removes a specific problem marker type with the given severity.
	 * 
	 * @param model -
	 *            the model related with this edit part.
	 * @param sMarkerType -
	 *            the marker type, either IMarker.PROBLEM or IMarker.TASK
	 * @throws CoreException
	 *             passed on from IResource.findMarkers()
	 */
	public static void removeMarker(EObject model, String sMarkerType)
			throws CoreException {
		IResource resource = getResource(model);
		if (resource != null) {
			IMarker[] markers = resource.findMarkers(sMarkerType, false,
					IResource.DEPTH_ONE);

			for (int i = 0; i < markers.length; i++) {
				IMarker marker = markers[i];
				// get the marker's location
				Object id = marker.getAttribute(IMarker.LOCATION);

				if (model instanceof PageflowElement) {
					if (((PageflowElement) model).getId().equals(id)) {
						markers[i].delete();
					}
				}
			}
		}
	}

	/**
	 * Searches the hierarchy starting at the given EditPart for a given model
	 * object ID string (the DiagramElement.ID value) and returns that EditPart
	 * 
	 * @param containerPart
	 * @param id
	 * @return the EditPart that corresponds to the given ID string, or null if
	 *         not found
	 */
	public static GraphicalEditPart findEditPart(
			GraphicalEditPart containerPart, String id) {
		Object model = containerPart.getModel();
		if (model instanceof PageflowElement) {
			String modelId = ((PageflowElement) model).getId();
			if (modelId != null && modelId.equals(id)) {
				return containerPart;
			}
		}

		Iterator iterNode = containerPart.getChildren().iterator();
		while (iterNode.hasNext()) {
			GraphicalEditPart child = (GraphicalEditPart) iterNode.next();
			GraphicalEditPart foundPart = findEditPart(child, id);
			if (foundPart != null) {
				return foundPart;
			}
		}

		Iterator iterConnection = containerPart.getSourceConnections()
				.iterator();
		while (iterConnection.hasNext()) {
			GraphicalEditPart child = (GraphicalEditPart) iterConnection.next();
			GraphicalEditPart foundPart = findEditPart(child, id);
			if (foundPart != null) {
				return foundPart;
			}
		}

		return null;
	}

}
