/*******************************************************************************
 * Copyright (c) 2001, 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.j2ee.internal.validation;


import java.util.logging.Level;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IProjectNature;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jem.internal.plugin.JavaEMFNature;
import org.eclipse.jem.util.logger.LogEntry;
import org.eclipse.jem.util.logger.proxy.Logger;
import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
import org.eclipse.wst.validation.internal.operations.WorkbenchContext;
import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;


/**
 * Abstract base class for registration of symbolic model names, and also provides the mechanism for
 * registering the load model method which loads a specific type of MOF model, as identified by the
 * symbolic model name.
 */
public abstract class AWorkbenchMOFHelper extends WorkbenchContext {
	public IResource getResource(Object obj) {
		IResource res = null;
		if ((obj != null) && (obj instanceof EObject)) {
			JavaEMFNature nature = getMOFNature(getProject());
			if (nature != null) {
				EObject ro = (EObject) obj;
				res = WorkbenchResourceHelper.getFile(ro.eResource());
			}
		}

		if ((res == null) || (!res.exists())) {
			return super.getResource(obj);
		}

		return res;
	}

	public JavaEMFNature getMOFNature(IProject project) {
		if (project == null) {
			return null;
		}

		IProjectDescription desc = null;
		try {
			desc = project.getDescription();
		} catch (CoreException exc) {
			Logger logger = J2EEPlugin.getDefault().getMsgLogger();
			if (logger.isLoggingLevel(Level.FINE)) {
				LogEntry entry = J2EEPlugin.getLogEntry();
				entry.setSourceID("WorkbenchContext.getMOFNature(IProject)"); //$NON-NLS-1$
				entry.setTargetException(exc);
				logger.write(Level.FINE, entry);
			}
			return null;
		}

		String[] natureIds = desc.getNatureIds();
		for (int i = 0; i < natureIds.length; i++) {
			try {
				IProjectNature nature = project.getNature(natureIds[i]);
				if (nature instanceof JavaEMFNature) {
					return (JavaEMFNature) nature;
				}
			} catch (CoreException exc) {
				// log and attempt next nature
				Logger logger = J2EEPlugin.getDefault().getMsgLogger();
				if (logger.isLoggingLevel(Level.FINE)) {
					LogEntry entry = J2EEPlugin.getLogEntry();
					entry.setSourceID("WorkbenchContext.getMOFNature(IProject)"); //$NON-NLS-1$
					entry.setTargetException(exc);
					logger.write(Level.FINE, entry);
				}
			}
		}
		return null;
	}
}
