/******************************************************************************* * 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.jsf.model.helpers.pages; import java.util.*; 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.*; import org.jboss.tools.common.model.util.EclipseResourceUtil; import org.jboss.tools.jsf.messages.JSFUIMessages; import org.jboss.tools.jsf.model.JSFConstants; import org.jboss.tools.jsf.model.pv.*; import org.jboss.tools.jst.web.model.pv.WebProjectNode; import org.jboss.tools.jst.web.project.WebProject; public class OpenCaseHelper { 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()); CaseSearchResult result = findCase(model, viewPath, action); if(result.ruleObject == null) return NLS.bind(JSFUIMessages.CANNOT_FIND_MATCHING_RULE_FOR_PATH, viewPath); XModelObject object = result.getObject(); XAction xaction = XActionInvoker.getAction("Select", object); //$NON-NLS-1$ if(xaction != null && xaction.isEnabled(object)) { XActionInvoker.invoke("Select", object, new Properties()); //$NON-NLS-1$ } /* if(result.caseObject == object) { xaction = XActionInvoker.getAction("OpenPage", object); if(xaction != null && xaction.isEnabled(object)) { XActionInvoker.invoke("OpenPage", object, new Properties()); } else { return "Cannot open page \"" + object.getAttributeValue(JSFConstants.ATT_TO_VIEW_ID) + "\"."; } } else { return "Cannot find matching case for action " + action + "."; } */ return null; } class CaseSearchResult { String match = null; XModelObject caseObject = null; XModelObject ruleObject = null; public XModelObject getObject() { return caseObject != null ? caseObject : ruleObject; } } private CaseSearchResult findCase(XModel model, String viewPath, String action) { CaseSearchResult result = new CaseSearchResult(); JSFProjectsRoot root = JSFProjectsTree.getProjectsRoot(model); if(root == null) return result; WebProjectNode n = (WebProjectNode)root.getChildByPath(JSFProjectTreeConstants.CONFIGURATION); if(n == null) return result; XModelObject[] os = n.getTreeChildren(); for (int i = 0; i < os.length; i++) { XModelObject r = os[i].getChildByPath(JSFConstants.FOLDER_NAVIGATION_RULES); if(r == null) continue; XModelObject[] rs = r.getChildren(); for (int j = 0; j < rs.length; j++) { String fromViewId = rs[j].getAttributeValue(JSFConstants.ATT_FROM_VIEW_ID); if(!OpenCaseHelper.isPatternMatches(fromViewId, viewPath)) continue; XModelObject[] cs = rs[j].getChildren(); for (int k = 0; k < cs.length; k++) { String q1 = cs[k].getAttributeValue(JSFConstants.ATT_FROM_OUTCOME); String q2 = cs[k].getAttributeValue(JSFConstants.ATT_FROM_ACTION); if(!action.equals(q1) && !action.equals(q2)) continue; if(result.match == null || result.match.length() < fromViewId.length() || result.caseObject == null) { result.caseObject = cs[k]; result.ruleObject = rs[j]; result.match = fromViewId; } } if(result.match == null || (result.match.length() < fromViewId.length() && result.caseObject == null) || result.ruleObject == null) { result.ruleObject = rs[j]; result.match = fromViewId; } } } return result; } 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; } }