001    package railo.transformer.cfml.evaluator.impl;
002    
003    import railo.transformer.bytecode.Statement;
004    import railo.transformer.bytecode.statement.TryCatchFinally;
005    import railo.transformer.bytecode.statement.tag.Tag;
006    import railo.transformer.cfml.evaluator.EvaluatorException;
007    import railo.transformer.cfml.evaluator.EvaluatorSupport;
008    import railo.transformer.library.tag.TagLib;
009    import railo.transformer.library.tag.TagLibTag;
010    
011    
012    
013    /**
014     * Prueft den Kontext des Tag break.
015     * Das Tag <code>break</code> darf nur innerhalb des Tag <code>loop, while, foreach</code> liegen.
016     */
017    public final class Retry extends EvaluatorSupport {
018    
019    
020            /**
021             * @see railo.transformer.cfml.evaluator.EvaluatorSupport#evaluate(org.w3c.dom.Element, railo.transformer.library.tag.TagLibTag)
022             */
023            public void evaluate(Tag tag,TagLibTag libTag) throws EvaluatorException { 
024                    String ns=libTag.getTagLib().getNameSpaceAndSeparator();
025                    String name=ns+"catch";
026                    
027                    if(getAncestorCatch(libTag.getTagLib(),tag)==null)
028                            throw new EvaluatorException("Wrong Context, tag "+libTag.getFullName()+" must be inside a "+name+" tag");
029            }
030            
031            public static Statement getAncestorCatch(TagLib tagLib, Statement stat) {
032                    String name=tagLib.getNameSpaceAndSeparator()+"catch";
033                    Tag tag;
034                    Statement parent=stat;
035                    while(true)     {
036                            parent=parent.getParent();
037                            if(parent==null)return null;
038                            if(parent instanceof Tag)       {
039                                    tag=(Tag) parent;
040                                    if(tag.getFullname().equalsIgnoreCase(name))
041                                            return tag;
042                            }
043                            else if(parent instanceof TryCatchFinally)
044                                    return parent;
045                    }
046            }
047    
048    }