/*******************************************************************************
 * Copyright (c) 2004, 2006 Sybase, Inc. 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.jsf.facesconfig.ui.util;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;

/**
 * This utility class is used to make a bridge between the relative path from
 * webroot and physical path in the project.
 * 
 * @author Xiao-guang Zhang
 * 
 */
public class WebrootUtil extends
		org.eclipse.jst.jsf.facesconfig.common.utils.WebrootUtil {

	/**
	 * get the the project path for webpath The project path is something like
	 * "/projectname/webroot/filename.jsp", or "/projectname/webroot/folder".
	 * The project information should be removed from project path, e.g,
	 * "/filename.jsp" or "/folder/*";
	 * 
	 * @param strPath -
	 *            the web path
	 * @return - project path from "/projectname/webroot"
	 */
	static public String getProjectPath(EObject model, String strPath) {

		IProject project = getProject(model);

		String strProjectPath = "";
		if (strPath != null) {
			IPath path = new Path(strPath);
			// jsp file
			if (path.getFileExtension() != null) {
				IPath webContentPath = getWebContentPath(project);
				if (webContentPath != null)
					strProjectPath = webContentPath.toString() + strPath;

			} else
			// jsp folder
			{
				strPath = new String(strPath.getBytes(), 0,
						strPath.length() - 1);
				IPath webContentPath = getWebContentPath(project);
				if (webContentPath != null)
					strProjectPath = webContentPath.toString() + strPath;
			}
		}
		return strProjectPath;
	}

	/**
	 * get the current resource according to EMF model
	 * 
	 * @param model -
	 *            emf model
	 * @return
	 */
	static public IResource getResource(EObject model) {
		IResource resource = null;

		if (model != null && model.eResource() != null) {
			URI uri = model.eResource().getURI();
			IPath path = new Path(URI.decode(uri.devicePath()));

			// since the uri format is "platform:/resource/..."
			// we will remove the first part
			path = path.removeFirstSegments(1);

			IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace()
					.getRoot();
			resource = workspaceRoot.findMember(path);
		}

		return resource;
	}

	/**
	 * get the current project according to EMF model
	 * 
	 * @param model -
	 *            emf model
	 * @return
	 */
	static public IProject getProject(EObject model) {
		IProject project = null;

		IResource resource = getResource(model);

		if (resource != null) {
			project = resource.getProject();
		}

		return project;
	}
}
