/*******************************************************************************
* 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.ui.adopt;
import java.util.*;
public class JSPAdoptHelper {
public static String getPrefixForURI(Token root, String uri, String defaultValue) {
String p = getPrefixForURI(root, uri);
if (p == null || p.length() == 0) {
p = getPrefixForURIFromXMLNS(root, uri);
}
return (p == null || p.length() == 0) ? defaultValue : p;
}
public static String getPrefixForURI(Token root, String uri) {
Token t = root.firstChild;
for (; t != null; t = t.nextSibling) {
if(t.kind != JSPTokenizer.DIRECTIVE) continue;
if(!"taglib".equals(t.name) || t.attributes == null) continue; //$NON-NLS-1$
if(!uri.equalsIgnoreCase(t.attributes.getProperty("uri"))) continue; //$NON-NLS-1$
String prefix = t.attributes.getProperty("prefix"); //$NON-NLS-1$
return prefix == null ? "?" : prefix; //$NON-NLS-1$
}
return null;
}
public static String getPrefixForURIFromXMLNS(Token root, String uri) {
Token t = root.firstChild;
for (; t != null; t = t.nextSibling) {
if(t.kind == JSPTokenizer.TAG && "jsp:root".equals(t.name) && t.attributes != null) { //$NON-NLS-1$
Enumeration names = t.attributes.keys();
while (names != null && names.hasMoreElements()) {
String name = (String)names.nextElement();
String value = (String)t.attributes.get(name);
if (value == null) continue;
if (!value.equals(uri)) continue;
if (!name.startsWith("xmlns:")) continue; //$NON-NLS-1$
String prefix = name.substring("xmlns:".length()); //$NON-NLS-1$
return prefix == null ? "?" : prefix; //$NON-NLS-1$
}
} else {
String prefix = getPrefixForURIFromXMLNS(t, uri);
if (prefix != null && prefix.length() > 0) return prefix;
}
}
return null;
}
public static String getLoadedBundleVar(Token root, String jsfCorePrefix, String baseName) {
if (root == null ||
jsfCorePrefix == null || jsfCorePrefix.length() == 0 ||
baseName == null || baseName.length() == 0) return null;
String tagName = jsfCorePrefix + ":loadBundle"; //$NON-NLS-1$
for (Token t = root.firstChild; t != null; t = t.nextSibling) {
if (t.kind == JSPTokenizer.TAG && tagName.equals(t.name) && t.attributes != null) {
if (!baseName.equals(t.attributes.getProperty("basename"))) continue; //$NON-NLS-1$
String v = t.attributes.getProperty("var"); //$NON-NLS-1$
return v == null ? "?" : v; //$NON-NLS-1$
} else {
String v = getLoadedBundleVar(t, jsfCorePrefix, baseName);
if (v != null && v.length() > 0) return v;
}
}
return null;
}
public static int getPositionForBundle(Token root, String jsfCorePrefix) {
if(isXHTML(root)) {
}
return getPositionForBundle(root, jsfCorePrefix, 0);
}
public static boolean isXHTML(Token root) {
return root.firstChild != null && root.firstChild.kind == JSPTokenizer.DOCTYPE
&& root.firstChild.attributes.getProperty("public") != null //$NON-NLS-1$
&& root.firstChild.attributes.getProperty("public").startsWith("-//W3C//DTD XHTML"); //$NON-NLS-1$ //$NON-NLS-2$
}
private static int getPositionForBundle(Token root, String jsfCorePrefix, int off) {
int q = off;
for (Token t = root.firstChild; t != null; t = t.nextSibling) {
if (t.kind == JSPTokenizer.TAG) {
if(t.name.equals("jsp:root")) { //$NON-NLS-1$
q = t.off + t.length;
return getPositionForBundle(t, jsfCorePrefix, q);
}
if(t.name.equalsIgnoreCase("html")) { //$NON-NLS-1$
if(isXHTML(root)) return t.off + t.length;
return q;
} else if(t.name.equals(jsfCorePrefix + ":loadBundle")) { //$NON-NLS-1$
q = t.off + t.length;
}
} else if(t.kind == JSPTokenizer.DIRECTIVE) {
if(t.name.equals("include")) { //$NON-NLS-1$
return q;
} else {
q = t.off + t.length;
}
}
}
return q;
}
public static String getNameForNewBundle(Token root, String jsfCorePrefix) {
String n = jsfCorePrefix + ":loadBundle"; //$NON-NLS-1$
Set<String> set = new HashSet<String>();
for (Token t = root.firstChild; t != null; t = t.nextSibling) {
if (t.kind != JSPTokenizer.TAG) continue;
if(!t.name.equals(n) || t.attributes == null) continue;
String v = t.attributes.getProperty("var"); //$NON-NLS-1$
if(v != null) set.add(v);
}
String v = "msg"; //$NON-NLS-1$
if(set.contains(v)) {
int i = 1;
while(set.contains(v + i)) ++i;
v += i;
}
return v;
}
public final static String JSF_CORE_TAGLIB_URI = "http://java.sun.com/jsf/core"; //$NON-NLS-1$
public final static String JSF_CORE_TAGLIB_PREFIX_DEFAULT = "f"; //$NON-NLS-1$
public final static String JSF_HTML_TAGLIB_URI = "http://java.sun.com/jsf/html"; //$NON-NLS-1$
public final static String JSF_HTML_TAGLIB_PREFIX_DEFAULT = "h"; //$NON-NLS-1$
public static String cutOffQuotes(String text) {
if (text == null) return null;
StringBuilder buffer = new StringBuilder(text);
boolean doCutOff = false;
if (buffer.charAt(0) == '"' && buffer.charAt(buffer.length() - 1) == '"') doCutOff = true;
if (buffer.charAt(0) == '\'' && buffer.charAt(buffer.length() - 1) == '\'') doCutOff = true;
return (doCutOff ? buffer.substring(1, buffer.length() - 1).toString() : text);
}
}