package railo.runtime.component;
import railo.runtime.ComponentImpl;
import railo.runtime.InterfaceImpl;
import railo.runtime.Page;
import railo.runtime.PageContext;
import railo.runtime.PageSource;
import railo.runtime.PageSourceImpl;
import railo.runtime.exp.PageException;
import railo.runtime.type.util.ArrayUtil;
public class MetadataUtil {
public static Page getPageWhenMetaDataStillValid(PageContext pc,ComponentImpl comp, boolean ignoreCache) throws PageException {
Page page = getPage(pc,comp._getPageSource());
if(ignoreCache) return page;
if(page.metaData!=null && page.metaData.get()!=null) {
if(hasChanged(pc,((MetaDataSoftReference)page.metaData).creationTime,comp)) {
page.metaData=null;
}
}
return page;
}
public static Page getPageWhenMetaDataStillValid(PageContext pc,InterfaceImpl interf, boolean ignoreCache) throws PageException {
Page page = getPage(pc,interf.getPageSource());
if(ignoreCache) return page;
if(page.metaData!=null && page.metaData.get()!=null) {
if(hasChanged(pc,((MetaDataSoftReference)page.metaData).creationTime,interf))
page.metaData=null;
}
return page;
}
private static boolean hasChanged(PageContext pc,long lastMetaCreation, ComponentImpl cfc) throws PageException {
if(cfc==null) return false;
// check the component
Page p = getPage(pc, cfc._getPageSource());
if(hasChanged(p.getCompileTime(),lastMetaCreation)) return true;
// check interfaces
InterfaceCollection ic = cfc._interfaceCollection();
if(ic!=null){
if(hasChanged(pc,lastMetaCreation,ic.getInterfaces())) return true;
}
// check base
return hasChanged(pc, lastMetaCreation, (ComponentImpl)cfc._base());
}
private static boolean hasChanged(PageContext pc,long lastMetaCreation,InterfaceImpl[] interfaces) throws PageException {
if(!ArrayUtil.isEmpty(interfaces)){
for(int i=0;i<interfaces.length;i++){
if(hasChanged(pc,lastMetaCreation,interfaces[i])) return true;
}
}
return false;
}
private static boolean hasChanged(PageContext pc,long lastMetaCreation, InterfaceImpl inter) throws PageException {
Page p = getPage(pc, inter.getPageSource());
if(hasChanged(p.getCompileTime(),lastMetaCreation)) return true;
return hasChanged(pc,lastMetaCreation,inter.getExtends());
}
private static boolean hasChanged(long compileTime, long lastMetaCreation) {
return compileTime>lastMetaCreation;
}
private static Page getPage(PageContext pc,PageSource ps) throws PageException {
Page page = ((PageSourceImpl)ps).getPage();
if(page==null) {
page = ps.loadPage(pc.getConfig());
}
return page;
}
}