/** * Implements the CFML Function expandpath */ package railo.runtime.functions.system; import java.io.IOException; import railo.commons.io.SystemUtil; import railo.commons.io.res.Resource; import railo.commons.io.res.util.ResourceUtil; import railo.commons.lang.StringUtil; import railo.runtime.PageContext; import railo.runtime.PageContextImpl; import railo.runtime.PageSource; import railo.runtime.config.ConfigWeb; import railo.runtime.config.ConfigWebImpl; import railo.runtime.config.ConfigWebUtil; import railo.runtime.exp.PageException; import railo.runtime.ext.function.Function; import railo.runtime.type.util.ArrayUtil; public final class ExpandPath implements Function { private static final long serialVersionUID = 6192659914120397912L; public static String call(PageContext pc , String realPath) throws PageException { ConfigWeb config=pc.getConfig(); realPath=realPath.replace('\\','/'); String contextPath = pc.getHttpServletRequest().getContextPath(); if ( !StringUtil.isEmpty( contextPath ) && realPath.startsWith( contextPath ) ) { boolean sws=StringUtil.startsWith(realPath, '/'); realPath = realPath.substring( contextPath.length() ); if(sws && !StringUtil.startsWith(realPath, '/')) realPath="/"+realPath; } Resource res; if(StringUtil.startsWith(realPath,'/')) { PageContextImpl pci=(PageContextImpl) pc; ConfigWebImpl cwi=(ConfigWebImpl) config; PageSource[] sources = cwi.getPageSources(pci, pc.getApplicationContext().getMappings(), realPath, false, pci.useSpecialMappings(), true); if(!ArrayUtil.isEmpty(sources)) { // first check for existing for(int i=0;i<sources.length;i++){ if(sources[i].exists()) { return toReturnValue(realPath,sources[i].getResource()); } } // no expand needed if(!SystemUtil.isWindows() && !sources[0].exists()) { res=pc.getConfig().getResource(realPath); if(res.exists()) { return toReturnValue(realPath,res); } } for(int i=0;i<sources.length;i++){ res=sources[i].getResource(); if(res!=null) { return toReturnValue(realPath,res); } } } // no expand needed else if(!SystemUtil.isWindows()) { res=pc.getConfig().getResource(realPath); if(res.exists()) { return toReturnValue(realPath,res); } } //Resource[] reses = cwi.getPhysicalResources(pc,pc.getApplicationContext().getMappings(),realPath,false,pci.useSpecialMappings(),true); } realPath=ConfigWebUtil.replacePlaceholder(realPath, config); res=pc.getConfig().getResource(realPath); if(res.isAbsolute()) return toReturnValue(realPath,res); res=ResourceUtil.getResource(pc,pc.getBasePageSource()); if(!res.isDirectory())res=res.getParentResource(); res = res.getRealResource(realPath); return toReturnValue(realPath,res); } private static String toReturnValue(String realPath,Resource res) { String path; char pathChar='/'; try { path=res.getCanonicalPath(); pathChar=ResourceUtil.FILE_SEPERATOR; } catch (IOException e) { path= res.getAbsolutePath(); } boolean pathEndsWithSep=StringUtil.endsWith(path,pathChar); boolean realEndsWithSep=StringUtil.endsWith(realPath,'/'); if(realEndsWithSep) { if(!pathEndsWithSep)path=path+pathChar; } else if(pathEndsWithSep) { path=path.substring(0,path.length()-1); } return path; } }