/*******************************************************************************
 * Copyright (c) 2003, 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 org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
import org.eclipse.wst.validation.internal.operations.WorkbenchContext;


public abstract class J2EEValidationHelper extends WorkbenchContext {
		
	/**
	 * Constructor for J2EEValidationHelper.
	 */
	public J2EEValidationHelper() {
		super();
	}

	/*
	 * @see IWorkbenchContext#getFile(Object)
	 */
	public IResource getResource(Object object) {
		Resource resource = null;
		if (object != null && object instanceof EObject)
			resource = ((EObject) object).eResource();
		if (resource != null)
			return WorkbenchResourceHelper.getFile(resource);
		return null;
	}

	/**
	 * Given a resource, return its non-eclipse-specific location. If this resource, or type of
	 * resource, isn't handled by this helper, return null.
	 */
	protected String getFileName(IFile file, IContainer[] containers) {
		if ((file == null) || (containers == null)) {
			return null;
		}

		for (int c = 0; c < containers.length; c++) {
			IPath resourcePath = getContainerRelativePath(file, containers[c]);
			if (resourcePath != null) {
				// file has been found
				return resourcePath.toString();
			}
		}

		return null;
	}

	/**
	 * Given a file name, return its corresponding IFile, if one exists. This method checks if the
	 * IContainer passed in contains a file with the given file name. If the container does not have
	 * the IFile, null is returned.
	 */
	protected IFile getFile(String fileName, IContainer[] containers) {
		IFile clazzFile = null;
		if ((fileName == null) || (containers == null)) {
			return null;
		}

		for (int c = 0; c < containers.length; c++) {
			IContainer container = containers[c];
			IPath filePath = container.getProjectRelativePath();
			clazzFile = getProject().getFile(filePath.append(fileName));

			if (clazzFile.exists()) {
				return clazzFile;
			}
		}

		return null;
	}

//	protected IFile getXmlFile(String xmlFileName, J2EENature nature) {
//		if (nature == null) {
//			return null;
//		}
//		return nature.getMetaFolder().getFile(xmlFileName);
//	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.wst.validation.internal.operations.IWorkbenchContext#getTargetObjectName(java.lang.Object)
	 */
	public String getTargetObjectName(Object object) {
		if (object != null)
			return object.toString();
		return null;
	}


}
