package railo.runtime.tag;
import org.apache.oro.text.regex.MalformedPatternException;
import railo.commons.lang.StringUtil;
import railo.runtime.exp.ApplicationException;
import railo.runtime.exp.PageException;
import railo.runtime.ext.tag.TagImpl;
import railo.runtime.op.Caster;
import railo.runtime.query.QueryCacheFilter;
import railo.runtime.query.QueryCacheFilterImpl;
import railo.runtime.query.QueryCacheFilterUDF;
import railo.runtime.query.QueryCacheSupport;
import railo.runtime.type.UDF;
/**
* Flushes the query cache
*
*
*
**/
public final class ObjectCache extends TagImpl {
/** Clears queries from the cache in the Application scope. */
private String action="clear";
private QueryCacheFilter filter;
private String result="cfObjectCache";
/** set the value action
* Clears queries from the cache in the Application scope.
* @param action value to set
**/
public void setAction(String action) {
this.action=action;
}
public void setResult(String result) {
this.result=result;
}
public void setFilter(Object filter) throws PageException {
this.filter=createFilter(filter, false);
}
public void setFilter(String filter) throws PageException {
this.filter=createFilter(filter, false);
}
public void setFilterignorecase(String filter) throws PageException {
this.filter=createFilter(filter, true);
}
public static QueryCacheFilter createFilter(Object filter,boolean ignoreCase) throws PageException {
if(filter instanceof UDF)
return createFilter((UDF)filter);
return createFilter(Caster.toString(filter),ignoreCase);
}
public static QueryCacheFilter createFilter(UDF filter) throws PageException {
return new QueryCacheFilterUDF(filter);
}
public static QueryCacheFilter createFilter(String pattern,boolean ignoreCase) throws PageException {
if(!StringUtil.isEmpty(pattern,true)) {
try {
return new QueryCacheFilterImpl(pattern,ignoreCase);
} catch (MalformedPatternException e) {
throw Caster.toPageException(e);
}
}
return null;
}
@Override
public int doStartTag() throws PageException {
_doStartTag();
return SKIP_BODY;
}
public void _doStartTag() throws PageException {
QueryCacheSupport qc = ((QueryCacheSupport)pageContext.getQueryCache());
if(action.equalsIgnoreCase("clear")) {
if(filter==null)
qc.clear(pageContext);
else
qc.clear(pageContext,filter);
}
else if(action.equalsIgnoreCase("size")) {
pageContext.setVariable(result, Caster.toDouble(qc.size(pageContext)));
}
else throw new ApplicationException("attribute action has an invalid value ["+action+"], valid is only [clear,size]");
}
@Override
public int doEndTag() {
return EVAL_PAGE;
}
@Override
public void release() {
super.release();
action="clear";
result="cfObjectCache";
filter=null;
}
}