/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.seam.xml.components.model.helpers;
import java.util.Properties;
import java.util.StringTokenizer;
import org.eclipse.core.resources.IFile;
import org.eclipse.osgi.util.NLS;
import org.jboss.tools.common.meta.action.XAction;
import org.jboss.tools.common.meta.action.XActionInvoker;
import org.jboss.tools.common.model.XModel;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.filesystems.FileSystemsHelper;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
import org.jboss.tools.jst.web.project.WebProject;
import org.jboss.tools.seam.xml.SeamXMLMessages;
//see OpenCaseHelper
public class OpenRuleHelper {
public String run(XModel model, IFile jsp, String action) {
if(model == null || jsp == null || action == null) return null;
XModelObject jspObject = EclipseResourceUtil.getObjectByResource(jsp);
if(jspObject == null) return null;
WebProject p = WebProject.getInstance(model);
String jspLocation = jsp.getLocation().toString().replace('\\', '/');
String webRoot = p.getWebRootLocation().replace('\\', '/');
if(webRoot.endsWith("/")) webRoot = webRoot.substring(0, webRoot.length() - 1); //$NON-NLS-1$
if(!jspLocation.startsWith(webRoot)) return null;
String viewPath = jspLocation.substring(webRoot.length());
XModelObject result = findRule(model, viewPath, action);
if(result == null)
return NLS.bind(SeamXMLMessages.CANNOT_FIND_MATCHING_RULE_FOR_PATH, viewPath);
XModelObject object = result;
XAction xaction = XActionInvoker.getAction("Select", object); //$NON-NLS-1$
if(xaction != null && xaction.isEnabled(object)) {
XActionInvoker.invoke("Select", object, new Properties()); //$NON-NLS-1$
}
return null;
}
private XModelObject findRule(XModel model, String viewPath, String action) {
XModelObject webinf = FileSystemsHelper.getWebInf(model);
if(webinf == null) return null;
XModelObject pagesXML = webinf.getChildByPath("pages.xml"); //$NON-NLS-1$
if(pagesXML == null) return null;
XModelObject pagesFolder = pagesXML.getChildByPath("Pages"); //$NON-NLS-1$
if(pagesFolder == null) return null; //happens when pages.xml is broken
XModelObject[] ps = pagesFolder.getChildren();
for (int i = 0; i < ps.length; i++) {
String viewId = ps[i].getAttributeValue("view id"); //$NON-NLS-1$
if(!isPatternMatches(viewId, viewPath)) continue;
XModelObject[] ns = ps[i].getChildren();
for (int j = 0; j < ns.length; j++) {
String entity = ns[j].getModelEntity().getName();
if(!entity.startsWith("SeamPageNavigation")) continue; //$NON-NLS-1$
if(entity.startsWith("SeamPageNavigationRule")) continue;
XModelObject[] rs = ns[j].getChildren();
for (int k = 0; k < rs.length; k++) {
String a = rs[k].getAttributeValue("if outcome"); //$NON-NLS-1$
if(a != null && a.equals(action)) {
//TODO compare match length
return rs[k];
}
}
}
}
return null;
}
public static boolean isPatternMatches(String pattern, String fromViewId) {
if(pattern.length() == 0 || "*".equals(pattern)) return true;
pattern = pattern.toLowerCase().replace('\\', '/');
fromViewId = fromViewId.toLowerCase().replace('\\', '/');
if(pattern.indexOf('*') < 0) return pattern.equals(fromViewId);
StringTokenizer st = new StringTokenizer(pattern, "*", true);
boolean f = true;
while(st.hasMoreTokens()) {
String t = st.nextToken();
if("*".equals(t)) {
f = false;
} else {
int i = fromViewId.indexOf(t);
if(i < 0 || (f && i > 0)) return false;
fromViewId = fromViewId.substring(i);
}
}
return true;
}
}