package railo.runtime.tag; import railo.runtime.exp.TemplateException; import railo.runtime.ext.tag.TagImpl; import railo.runtime.type.scope.Scope; /** * Used to: Abort the processing of the currently executing CFML custom tag, exit the template * within the currently executing CFML custom tag and reexecute a section of code within the currently * executing CFML custom tag * * * **/ public final class Exit extends TagImpl { private static final short MODE_LOOP=0; private static final short MODE_EXIT_TAG=1; private static final short MODE_EXIT_TEMPLATE=2; /** */ private short method=MODE_EXIT_TAG; @Override public void release() { super.release(); method=MODE_EXIT_TAG; } /** set the value method * * @param method value to set **/ public void setMethod(String method) { method=method.toLowerCase(); if(method.equals("loop"))this.method=MODE_LOOP; else if(method.equals("exittag"))this.method=MODE_EXIT_TAG; else if(method.equals("exittemplate"))this.method=MODE_EXIT_TEMPLATE; } @Override public int doStartTag() { return SKIP_BODY; } @Override public int doEndTag() throws TemplateException { Scope variables = pageContext.variablesScope(); Object thistagObj=variables.get("thistag",null); boolean insideCT=(thistagObj !=null) && (thistagObj instanceof railo.runtime.type.Collection); //executebody // Inside Custom Tag if(insideCT) { railo.runtime.type.Collection thistag=(railo.runtime.type.Collection) thistagObj; //executionmode Object exeModeObj=thistag.get("executionmode",null); boolean isEndMode=(exeModeObj !=null) && (exeModeObj instanceof String) && exeModeObj.toString().equalsIgnoreCase("end"); // Start if(!isEndMode) { if(method==MODE_LOOP) { throw new TemplateException("invalid context for the tag exit, method loop can only be used in the end tag of a custom tag"); } else if(method==MODE_EXIT_TAG) { thistag.setEL("executebody",Boolean.FALSE); return SKIP_PAGE; } } // End else if(method==MODE_LOOP) { thistag.setEL("executebody",Boolean.TRUE); return SKIP_PAGE; } return SKIP_PAGE; } // OUTside Custom Tag if(method==MODE_LOOP) throw new TemplateException("invalid context for the tag exit, method loop can only be used inside a custom tag"); return SKIP_PAGE; } }