/******************************************************************************* * 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.web.pattern; import java.util.ArrayList; import org.jboss.tools.common.model.*; import org.jboss.tools.common.model.util.XModelObjectUtil; import org.jboss.tools.jsf.model.JSFConstants; import org.jboss.tools.jst.web.browser.wtp.RunOnServerContext; import org.jboss.tools.jst.web.model.helpers.WebAppHelper; public class PatternLoader { public static final String[] DEFAULT_SUFFIXES = {".jsp", ".xhtml", ".jspx"}; public static JSFUrlPattern DEFAULT_PATTERN = new PostfixUrlPattern(); static JSFUrlPattern[] DEFAULT_PATTERNS = new JSFUrlPattern[]{DEFAULT_PATTERN}; CompoundPattern pattern = new CompoundPattern(); private long timeStamp = -1; public JSFUrlPattern getUrlPattern() { return pattern.patterns.length == 1 ? pattern.patterns[0] : pattern; } public void revalidate(XModelObject webxml) { if(webxml == null || webxml.getChildren().length == 0) return; if(timeStamp == webxml.getTimeStamp()) return; timeStamp = webxml.getTimeStamp(); XModelObject[] mappings = WebAppHelper.getServletMappings(webxml); if(mappings.length == 0) { pattern.setPatterns(DEFAULT_PATTERNS); return; } String[] fileSuffixes = getFileSuffix(webxml); ArrayList<JSFUrlPattern> list = new ArrayList<JSFUrlPattern>(); String servletName = getFacesServletName(webxml); for (int i = 0; i < mappings.length; i++) { String servlet = mappings[i].getAttributeValue("servlet-name"); if(!servletName.equals(servlet)) continue; String pattern = mappings[i].getAttributeValue("url-pattern"); JSFUrlPattern up = load(pattern); if(up instanceof PostfixUrlPattern) { ((PostfixUrlPattern)up).setFileSuffixes(fileSuffixes); } if(up != null) { list.add(up); } } if(list.size() == 0 && fileSuffixes == DEFAULT_SUFFIXES) { pattern.setPatterns(DEFAULT_PATTERNS); } else if(list.size() == 0) { JSFUrlPattern[] ps = new JSFUrlPattern[1]; ps[0] = new PostfixUrlPattern(); ((PostfixUrlPattern)ps[0]).setFileSuffixes(fileSuffixes); pattern.setPatterns(ps); } else { pattern.setPatterns((JSFUrlPattern[])list.toArray(new JSFUrlPattern[0])); } RunOnServerContext.getInstance().revalidate(); } String getFacesServletName(XModelObject webxml) { XModelObject s = WebAppHelper.findServlet(webxml, JSFConstants.FACES_SERVLET_CLASS, null); return (s != null) ? s.getAttributeValue("servlet-name") : "FacesServlet"; } String[] getFileSuffix(XModelObject webxml) { String[] list = WebAppHelper.getWebAppContextParamValueList(webxml, "javax.faces.DEFAULT_SUFFIX"); if(list != null && list.length == 1) { list = XModelObjectUtil.asStringArray(list[0].trim(), " "); } return list == null || list.length == 0 || !list[0].startsWith(".") ? DEFAULT_SUFFIXES : list; } JSFUrlPattern load(String p) { if(p == null || p.length() == 0) return null; int s = p.indexOf(','); if(s > 0) p = p.substring(0, s); if(p.startsWith("*.")) { String n = p.substring(2); for (int i = 0; i < n.length(); i++) if(!Character.isJavaIdentifierPart(n.charAt(i))) return null; PostfixUrlPattern up = new PostfixUrlPattern(); up.setPostfix(p.substring(1)); return up; } else if(p.endsWith("/*") && p.startsWith("/") && p.length() > 2) { String n = p.substring(1, p.length() - 2); for (int i = 0; i < n.length(); i++) if(!Character.isJavaIdentifierPart(n.charAt(i))) return null; PrefixUrlPattern up = new PrefixUrlPattern(); up.setPrefix(p.substring(0, p.length() - 1)); return up; } return null; } }