/*******************************************************************************
* 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.Properties;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.util.XModelObjectLoaderUtil;
import org.jboss.tools.common.util.FileUtil;
import org.jboss.tools.jsf.web.JSFWebProject;
import org.jboss.tools.jst.web.tld.IFilePathEncoder;
import org.jboss.tools.jst.web.tld.TaglibData;
import org.jboss.tools.jst.web.tld.VpeTaglibManager;
public class FilePathEncoder implements IFilePathEncoder {
public String encode(String path, XModelObject f, String tag,
VpeTaglibManager taglibs, Properties context) {
if(tag != null && tag.startsWith("/")) {
tag = tag.substring(1);
if(tag.indexOf('@') >= 0) tag = tag.substring(0, tag.indexOf('@'));
}
String pathType = context.getProperty(PATH_TYPE);
String pathAddition = context.getProperty(PATH_ADDITION);
if(!isPath(path) && (pathAddition == null || !path.startsWith(pathAddition))) return path;
int d = tag.indexOf(":");
String prefix = (d < 0) ? "" : tag.substring(0, d);
if(d > 0) tag = tag.substring(d + 1);
if(prefix.equals("jsp")) return path;
String uri = getUri(prefix, taglibs);
if(!RELATIVE_PATH.equals(pathType)) {
JSFWebProject wp = JSFWebProject.getInstance(f.getModel());
if(uri != null && wp.getUrlPattern().isJSFUrl(path)
&& path.indexOf('/') >= 0 && !doNotEncodeToJSFURL(uri, tag)) {
path = wp.getUrlPattern().getJSFUrl(path);
}
if(pathAddition != null) path = pathAddition + path;
} else {
String current = XModelObjectLoaderUtil.getResourcePath(f.getParent());
if(current == null || current.length() == 0) current = "";
String fake = "FAKE:/" + path;
String root = "FAKE:/" + current;
String p = FileUtil.getRelativePath(root, fake);
if(p != null) {
path = p;
if(path.startsWith("/")) path = path.substring(1);
}
}
return path;
}
public String decode(String path, XModelObject f, String tag,
VpeTaglibManager taglibs, Properties context) {
if(tag != null && tag.startsWith("/")) {
tag = tag.substring(1);
if(tag.indexOf('@') >= 0) tag = tag.substring(0, tag.indexOf('@'));
}
String pathType = context.getProperty(PATH_TYPE);
String pathAddition = context.getProperty(PATH_ADDITION);
if(!isPath(path) && (pathAddition == null || !path.startsWith(pathAddition))) return path;
int d = tag.indexOf(":");
String prefix = (d < 0) ? "" : tag.substring(0, d);
if(d > 0) tag = tag.substring(d);
if(prefix.equals("jsp")) return path;
String uri = getUri(prefix, taglibs);
if(!RELATIVE_PATH.equals(pathType)) {
if(pathAddition != null && path.startsWith(pathAddition)) {
path = path.substring(pathAddition.length());
}
JSFWebProject wp = JSFWebProject.getInstance(f.getModel());
if(uri != null && wp.getUrlPattern().isJSFUrl("/" + path) && path.indexOf('.') >= 0) {
if(!path.startsWith("/")) path = "/" + path;
path = wp.getUrlPattern().getJSFPath(path);
}
} else {
String current = XModelObjectLoaderUtil.getResourcePath(f.getParent());
if(current == null || current.length() == 0) current = "";
if(!path.startsWith("/")) path = "/" + path;
while(path.startsWith("/..")) {
path = path.substring(3);
d = current.lastIndexOf('/');
if(d >= 0) current = current.substring(0, d);
}
path = current + path;
}
return path;
}
String getUri(String prefix, VpeTaglibManager taglibs) {
if(taglibs == null) return null;
TaglibData[] data = taglibs.getTagLibs().toArray(new TaglibData[0]);
for (int i = 0; i < data.length; i++) {
if(prefix.equals(data[i].getPrefix())) return data[i].getUri();
}
return null;
}
boolean isPath(String path) {
if(path == null || path.length() == 0) return false;
if(path.indexOf('{') > 0) return false;
if(path.indexOf('}') > 0) return false;
if(path.indexOf('#') > 0) return false;
return true;
}
static String NO_JSF_URL = ".composition.decorate.include.";
boolean doNotEncodeToJSFURL(String uri, String tag) {
if(NO_JSF_URL.indexOf("." + tag + ".") >= 0
&& "http://java.sun.com/jsf/facelets".equals(uri)) {
return true;
}
return false;
}
}