/*******************************************************************************
 * Copyright (c) 2003, 2006 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)
	 */
	@Override
	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)
	 */
	@Override
	public String getTargetObjectName(Object object) {
		if (object != null)
			return object.toString();
		return null;
	}


}
