/*******************************************************************************
 * Copyright (c) 2004, 2005 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.pageflow.util;

import java.util.Iterator;

import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Path;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
import org.eclipse.osgi.util.NLS;

/**
 * Pageflow's validation functions
 * 
 * @author Xiao-guang Zhang
 */
public class PageflowValidation {
	/** PageflowValidation singleton instance */
	private static PageflowValidation instance;

	/** constructor */
	private PageflowValidation() {
	    // no external instantiation
	}

	/**
	 * get the singleton instance of pageflow validation
	 * 
	 * @return the singleton instance of pageflow validation
	 */
	public static PageflowValidation getInstance() {
		if (instance == null) {
			instance = new PageflowValidation();
		}
		return instance;
	}

	/**
	 * check whether the source and target pageflow node are allowed to create a
	 * new link NOT allowed source and target: 1. target node is Begin or source
	 * node is End 2. both of source and target node are Action. 3. double
	 * connection from the same source to target
	 * 
	 * @param source -
	 *            source pageflow node
	 * @param target -
	 *            target pageflow node
	 * @return - is valid link or not.
	 * 
	 */
	public boolean isValidLinkForCreation(PageflowNode source,
			PageflowNode target) {
		// Source and target must be pointing to some real pageflow node
		if (source == null || target == null) {
			return false;
		}
		return true;
	}

	/**
	 * determine the pflink is valid or not for property souce. in our model,
	 * there are five types of invalid pflinke for property source. 1. link
	 * between page and action 2. the source of link is Begin or End node 3. the
	 * target of link is Begin or End node.
	 * @param link 
	 * 
	 * @return - valid link or not.
	 * 
	 */
	public boolean isValidLinkForProperty(PageflowLink link) {
		return true;
	}

	/**
	 * determine the pflink is valid or not for face-config rule in our model,
	 * there are four types of invalid pflinke. 1. the source of link is Begin
	 * or End node 2. the target of link is Begin or End node.
	 * @param link 
	 * 
	 * @return - valid link or not.
	 * 
	 */
	public boolean isValidLinkForNavigationRule(PageflowLink link) {
		return true;
	}

	/**
	 * determine the pflink is valid or not for face-config rule in our model,
	 * there are four types of invalid pflinke.
	 * @param link 
	 * 
	 * @return - valid link or not.
	 * 
	 */
	public String isValidLink(PageflowLink link) {
		String errorMessage = null;
		// action-page style
		// TODO: it should guarantee that outcome should be defined in the
		// managed bean's method.

		if (link.getSource() instanceof PageflowPage
				&& link.getTarget() instanceof PageflowPage) {
			String outcome = link.getOutcome();
			if (outcome != null && outcome.length() >= 0) {
				// if (isValidServiceOutcome(outcome))
				// {
				// return errorMessage;
				// }
				String webPath = ((PageflowPage) link.getSource()).getPath();
				if (webPath != null) {
					String projectPath = WebrootUtil.getProjectPath(link,
							webPath);

					Path resourcePath = new Path(projectPath);
					IWorkspaceRoot workspaceRoot = ResourcesPlugin
							.getWorkspace().getRoot();
					final IResource resource = workspaceRoot
							.findMember(resourcePath);

					if (resource == null || !resource.exists()) {
						// Pageflow.Validation.NotExistedSourcePage = The source
						// page {0} is not existed.
						errorMessage = NLS
								.bind(
										PageflowMessages.Pageflow_Validation_UndefinedOutcome,
										outcome, webPath);
					}
				} else {
					// Pageflow.Validation.MissingSourcePage = The source page
					// should be specified.
					errorMessage = PageflowMessages.Pageflow_Validation_MissingSourcePage;
				}
			}
		}
		return errorMessage;
	}

	/**
	 * Check whether the page is already existed in the pageflow.
	 * 
	 * @param pageflow
	 * @param page
	 * @return true if page exists (?)
	 */
	public boolean isExistedPage(Pageflow pageflow, PageflowPage page) {
		if (pageflow == null || page == null || page.getPath() == null) {
			return false;
		}

		return isExistedPage(pageflow, page.getPath());
	}

	/**
	 * Check whether the page is already existed in the pageflow.
	 * 
	 * @param pageflow
	 * @param pagePath
	 * @return true if pageflow's path is equal to pagePath
	 */
	public boolean isExistedPage(Pageflow pageflow, String pagePath) {
		if (pageflow == null || pagePath == null) {
			return false;
		}

		Iterator iter = pageflow.getNodes().iterator();

		while (iter.hasNext()) {
			PageflowNode existedNode = (PageflowNode) iter.next();

			if (existedNode instanceof PageflowPage) {
				if (((PageflowPage) existedNode).getPath() != null
						&& ((PageflowPage) existedNode).getPath()
								.equalsIgnoreCase(pagePath)) {
					return true;
				}
			}
		}

		return false;
	}

	/**
	 * Check whether the page is valid or not validate page is : 1. if the page
	 * is general jsp page, it should physically existed. 2. if the page is in
	 * the form of /foldername/* (it contains the folder), the folder should be
	 * existed.
	 * 
	 * @param page
	 * @return the notify message for page
	 */
	public String getNotifyMessage(PageflowPage page) {
		String errorMessage = null;
		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
		String pagePath = page.getPath();

		// Check the path is empty or not
		if (pagePath != null && pagePath.length() > 0) {
			String resourceName = WebrootUtil.getProjectPath(page, pagePath);
			Path resourcePath = new Path(resourceName);

			final IResource resource = workspaceRoot.findMember(resourcePath);

			if (resource != null && resource.exists()) {
				// This page is related with jsp file
				if (resourcePath.getFileExtension() != null) {
					if (!WebrootUtil.isValidWebFile(resourcePath)) {
						// Pageflow.Validation.InvalidWebPage = the file {0} is
						// not valid web file.
						errorMessage = NLS
								.bind(
										PageflowMessages.Pageflow_Validation_InvalidWebPage,
										pagePath);
					}
				}
			} else {
				// Pageflow.Validation.NotExitedWebPage = the web page {0} is
				// not existed.
				errorMessage = NLS.bind(
						PageflowMessages.Pageflow_Validation_NotExitedWebPage,
						pagePath);
			}
		} else {
			// Pageflow.Validation.MissingWebPage = the web page's path should
			// be specified.
			errorMessage = PageflowMessages.Pageflow_Validation_MissingWebPage;
		}
		return errorMessage;
	}

	/**
	 * check that the action is valid EL or not,
	 * 
	 * @param actionEL -
	 *            action string, it should be in the form of #{...}
	 * @return - True or False
	 */
	public static boolean isValidActionEL(String actionEL) {
		if (actionEL != null && actionEL.length() > 3) {
			// action is defined in JSF expression language, e.g,
			// #{beanname.methodname}
			if (actionEL.substring(0, 2).equalsIgnoreCase("#{")//$NON-NLS-1$
					&& actionEL.substring(actionEL.length() - 1,
							actionEL.length()).equalsIgnoreCase("}"))//$NON-NLS-1$
			{
				// Check the bean is existed or not.
				return true;
			}

		}
		return false;
	}

	/**
	 * get the managed bean from action's expression, e.g., beanName.methodName.
	 * The return will be beanName.
	 * 
	 * @param actionEL
	 * @return the managed bean name
	 */
	public static String getManagedBeanforAction(String actionEL) {
		String managedBeanName = null;
		if (isValidActionEL(actionEL)) {
			actionEL = actionEL.substring(2, actionEL.length() - 1);
			String[] actionParts = actionEL.split("[.]");
			managedBeanName = actionParts[0];//$NON-NLS-1$
		}

		return managedBeanName;
	}

}
