001    package railo.transformer.bytecode.statement.tag;
002    
003    import org.objectweb.asm.Type;
004    import org.objectweb.asm.commons.GeneratorAdapter;
005    import org.objectweb.asm.commons.Method;
006    
007    import railo.commons.lang.RandomUtil;
008    import railo.runtime.tag.ThreadTag;
009    import railo.transformer.bytecode.Body;
010    import railo.transformer.bytecode.BodyBase;
011    import railo.transformer.bytecode.BytecodeContext;
012    import railo.transformer.bytecode.BytecodeException;
013    import railo.transformer.bytecode.Page;
014    import railo.transformer.bytecode.Position;
015    import railo.transformer.bytecode.literal.LitString;
016    import railo.transformer.bytecode.util.ASMUtil;
017    import railo.transformer.bytecode.util.Types;
018    
019    public final class TagThread extends TagBaseNoFinal {
020    
021            
022            
023            public static final Type THREAD_TAG = Type.getType(ThreadTag.class);
024            
025            
026            private static final Method REGISTER = new Method(
027                            "register",Types.VOID,new Type[]{Types.PAGE,Types.INT_VALUE});
028    
029    
030            public TagThread(Position start,Position end) {
031                    super(start,end);
032            }
033            
034            
035            
036            
037    
038            /**
039             *
040             * @see railo.transformer.bytecode.statement.tag.TagBase#_writeOut(railo.transformer.bytecode.BytecodeContext)
041             */
042            public void _writeOut(BytecodeContext bc) throws BytecodeException {
043                    String action=ASMUtil.getAttributeString(this, "action","run");
044                    // no body
045                    if(!"run".equalsIgnoreCase(action)) {
046                            super._writeOut(bc);
047                            return;
048                    }
049                    /*if("run".equalsIgnoreCase(action)
050                                    super.getBody()==null || 
051                                    super.getBody().getStatements()==null || 
052                                    super.getBody().getStatements().size()==0) {
053                            super._writeOut(bc);
054                            return;
055                    }*/
056                    Attribute name = getAttribute("name");
057                    if(name==null){
058                            addAttribute(new Attribute(false, "name",LitString.toExprString("thread"+RandomUtil.createRandomStringLC(20)), "string"));
059                    }
060    
061                    GeneratorAdapter adapter = bc.getAdapter();
062                    Page page = ASMUtil.getAncestorPage(this);
063                    
064                    int index=page.addThread(this);
065                    super._writeOut(bc,false);
066                    
067                    adapter.loadLocal(bc.getCurrentTag());
068                    adapter.loadThis();
069            adapter.push(index);
070                    adapter.invokeVirtual(THREAD_TAG, REGISTER);
071                    
072            }
073    
074    
075    
076    
077    
078            /**
079             * @see railo.transformer.bytecode.statement.tag.TagBase#getBody()
080             */
081            public Body getBody() {
082                    return new BodyBase();
083            }
084            
085            public Body getRealBody() {
086                    return super.getBody();
087            }
088            
089    }