blob: 7f69a64ff5d02803420067def0eb03da93d93a0c [file] [log] [blame]
/*******************************************************************************
* 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("[.]"); //$NON-NLS-1$
managedBeanName = actionParts[0];
}
return managedBeanName;
}
}