/*******************************************************************************
* 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;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import org.jboss.tools.common.meta.action.XActionInvoker;
import org.jboss.tools.common.model.*;
import org.jboss.tools.common.model.filesystems.impl.FileSystemsImpl;
import org.jboss.tools.common.model.impl.XModelImpl;
import org.jboss.tools.common.model.util.XModelObjectUtil;
import org.jboss.tools.jst.web.model.helpers.WebAppHelper;
public class JSFWebHelper {
public static String PARAM_NAME = "param-name";
public static String PARAM_VALUE = "param-value";
public static ConfigFilesData FACES_CONFIG_DATA =
new ConfigFilesData(
"javax.faces.CONFIG_FILES",
new String[]{"/WEB-INF/faces-config.xml"}
);
public static ConfigFilesData FACELET_TAGLIB_DATA =
new ConfigFilesData(
"facelets.LIBRARIES",
new String[]{},
";"
);
public static ConfigFilesData FACELETS_LIBRARIES =
new ConfigFilesData(
"javax.faces.FACELETS_LIBRARIES",
new String[]{},
";"
);
static {
FACES_CONFIG_DATA.usesDefaultWithoutRegistration = true;
}
public static XModelObject getWebConfig(XModel model) {
return model.getByPath("/web.xml");
}
public static String[] getFacesConfigList(XModelObject webxml) {
return getConfigFilesList(webxml, FACES_CONFIG_DATA);
}
public static String getFacesConfigListAsString(XModelObject webxml) {
return getConfigFilesListAsString(webxml, FACES_CONFIG_DATA);
}
public static void registerFacesConfig(XModel model, String path) throws XModelException {
registerConfigFile(model, path, FACES_CONFIG_DATA);
}
public static boolean isRegisterFacesConfig(XModel model, String path) {
return isConfigFileRegistered(model, path, FACES_CONFIG_DATA);
}
public static void unregisterFacesConfig(XModel model, String path) throws XModelException {
unregisterConfigFile(model, path, FACES_CONFIG_DATA);
}
public static void registerFaceletsTaglib(XModel model, String path) throws XModelException {
registerConfigFile(model, path, FACELET_TAGLIB_DATA);
registerConfigFile(model, path, FACELETS_LIBRARIES);
}
public static XModelObject findInitParam(XModelObject webxml) {
return findInitParam(webxml, FACES_CONFIG_DATA.param);
}
public static XModelObject findInitParam(XModelObject webxml, String name) {
return WebAppHelper.findWebAppContextParam(webxml, name);
}
public static void registerFacesConfigRename(XModel model, String oldConfigName, String newConfigName, String path) throws XModelException {
registerConfigFileRename(model, oldConfigName, newConfigName, path, FACES_CONFIG_DATA);
}
public static String[] getConfigFilesList(XModelObject webxml, ConfigFilesData data) {
XModelObject p = findInitParam(webxml, data.param);
return (p == null) ? data.defaultList : XModelObjectUtil.asStringArray(p.getAttributeValue("param-value"), data.separator);
}
public static String[] getCompleteConfigFilesList(XModelObject webxml, ConfigFilesData data) {
XModelObject p = findInitParam(webxml, data.param);
if(p == null) return data.defaultList;
String[] ls = XModelObjectUtil.asStringArray(p.getAttributeValue("param-value"), data.separator);
if(ls.length == 0 || arrayEquals(data.defaultList, ls)) return data.defaultList;
List<String> list = new ArrayList<String>();
for (int i = 0; i < ls.length; i++) {
if(!list.contains(ls[i])) list.add(ls[i]);
}
for (int i = 0; i < data.defaultList.length; i++) {
if(!list.contains(data.defaultList[i])) list.add(data.defaultList[i]);
}
return (String[])list.toArray(new String[0]);
}
private static boolean arrayEquals(String[] a, String[] b) {
if(a.length != b.length) return false;
for (int i = 0; i < a.length; i++) if(!a[i].equals(b[i])) return false;
return true;
}
public static String getConfigFilesListAsString(XModelObject webxml, ConfigFilesData data) {
XModelObject p = findInitParam(webxml, data.param);
if(p != null) {
String r = p.getAttributeValue("param-value");
if(data.usesDefaultWithoutRegistration && data.defaultList != null) {
for (int i = 0; i < data.defaultList.length; i++) {
String path = data.defaultList[i];
if(("," + r + ",").indexOf("," + path + ",") >= 0) continue;
XModelObject o = XModelImpl.getByRelativePath(webxml.getModel(), path);
if(o == null) continue;
if(!r.startsWith(",")) r = path + "," + r; else r = path + r;
}
}
return r;
}
if(data.defaultList == null || data.defaultList.length == 0) return "";
if(data.defaultList.length == 1) return data.defaultList[0];
StringBuilder sb = new StringBuilder();
for (int i = 0; i < data.defaultList.length; i++) {
if(sb.length() > 0) sb.append(data.separator.charAt(0));
sb.append(data.defaultList[i]);
}
return sb.toString();
}
public static void getConfigFiles(List<XModelObject> list, Set<XModelObject> set, XModel model, ConfigFilesData data) {
FileSystemsImpl fs = (FileSystemsImpl)model.getByPath("FileSystems");
if(fs != null) {
fs.updateOverlapped();
}
XModelObject webxml = getWebConfig(model);
String[] paths = getCompleteConfigFilesList(webxml, data);
if(paths != null) for (int i = 0; i < paths.length; i++) {
String path = paths[i];
XModelObject o = XModelImpl.getByRelativePath(model, path);
while(o == null) {
int d = path.indexOf("/", 1);
if(d < 0) break;
path = path.substring(d);
o = XModelImpl.getByRelativePath(model, path);
}
if(o != null && !set.contains(o)) {
list.add(o);
set.add(o);
}
}
XModelObject[] js = fs.getChildren("FileSystemJar");
for (XModelObject o: js) {
XModelObject c = o.getChildByPath("META-INF/faces-config.xml");
if(c != null && !set.contains(c)) {
list.add(c);
set.add(c);
}
}
}
public static void registerConfigFile(XModel model, String path, ConfigFilesData data) throws XModelException {
XModelObject webxml = getWebConfig(model);
if(webxml == null) return;
XModelObject p = findInitParam(webxml, data.param);
if(p == null) {
if(!data.usesDefaultWithoutRegistration && data.defaultList != null && data.defaultList.length > 0 && webxml.getModel().getByPath(data.defaultList[0]) != null) {
String path0 = data.defaultList[0];
path = path0 + data.separator + path;
}
p = WebAppHelper.setWebAppContextParam(webxml, data.param, path);
} else {
String s = "" + data.separator.charAt(0);
String v = p.getAttributeValue(PARAM_VALUE);
if((s + v + s).indexOf(s + path + s) < 0) {
if(v.length() > 0 && !v.endsWith(s)) v += s;
v += path;
model.changeObjectAttribute(p, PARAM_VALUE, v);
}
}
if(webxml.isModified()) {
XActionInvoker.invoke("SaveActions.Save", webxml, new Properties());
}
}
public static boolean isConfigFileDefault(String path, ConfigFilesData data) {
if(data == null || data.defaultList == null) return false;
for (int i = 0; i < data.defaultList.length; i++) {
if(data.defaultList[i].equals(path)) return true;
}
return false;
}
public static boolean isConfigFileRegistered(XModel model, String path, ConfigFilesData data) {
XModelObject webxml = getWebConfig(model);
if(webxml == null) return false;
XModelObject p = findInitParam(webxml, data.param);
if(p == null) return false;
String[] cs = getConfigFilesList(webxml, data);
for (int i = 0; i < cs.length; i++) {
if(cs[i].toLowerCase().endsWith(path.toLowerCase())) return true;
}
return false;
}
public static void unregisterConfigFile(XModel model, String path, ConfigFilesData data) throws XModelException {
XModelObject webxml = getWebConfig(model);
if(webxml == null) return;
XModelObject p = findInitParam(webxml, data.param);
if(p == null) return;
StringBuilder sb = new StringBuilder();
String[] cs = getConfigFilesList(webxml, data);
for (int i = 0; i < cs.length; i++) {
if(cs[i].toLowerCase().equals(path.toLowerCase())) continue;
if(sb.length() > 0) sb.append(data.separator.charAt(0));
sb.append(cs[i]);
}
model.changeObjectAttribute(p, PARAM_VALUE, sb.toString());
}
public static void registerConfigFileRename(XModel model, String oldConfigName, String newConfigName, String path, ConfigFilesData data) throws XModelException {
XModelObject webxml = getWebConfig(model);
if(webxml == null || "yes".equals(webxml.get("isIncorrect"))) return;
XModelObject p = findInitParam(webxml, data.param);
if(p == null) {
if(data.defaultList != null && data.defaultList[0].endsWith("/" + oldConfigName) && path != null) {
registerConfigFile(model, path, data);
}
return;
}
StringBuilder sb = new StringBuilder();
String[] cs = getConfigFilesList(webxml, data);
boolean done = false;
for (int i = 0; i < cs.length; i++) {
if(cs[i].endsWith("/" + oldConfigName)) {
String n = cs[i].substring(0, cs[i].length() - oldConfigName.length()) + newConfigName;
if(n.equals(path)) {
cs[i] = n;
done = true;
}
}
if(sb.length() > 0) sb.append(data.separator.charAt(0));
sb.append(cs[i]);
}
if(!done && data.defaultList != null && data.defaultList[0].endsWith("/" + oldConfigName)) {
if(sb.length() > 0) sb.append(data.separator.charAt(0));
sb.append(path);
}
model.changeObjectAttribute(p, PARAM_VALUE, sb.toString());
if(webxml != null) XActionInvoker.invoke("SaveActions.Save", webxml, null);
}
}