001    package railo.transformer.cfml.evaluator.impl;
002    
003    import java.util.ArrayList;
004    import java.util.HashMap;
005    import java.util.List;
006    import java.util.Map;
007    
008    import railo.commons.lang.IDGenerator;
009    import railo.commons.lang.Md5;
010    import railo.runtime.exp.PageRuntimeException;
011    import railo.runtime.op.Caster;
012    import railo.transformer.bytecode.Page;
013    import railo.transformer.bytecode.expression.Expression;
014    import railo.transformer.bytecode.literal.LitString;
015    import railo.transformer.bytecode.op.OpString;
016    import railo.transformer.bytecode.statement.tag.Attribute;
017    import railo.transformer.bytecode.statement.tag.Tag;
018    import railo.transformer.bytecode.util.ASMUtil;
019    import railo.transformer.cfml.evaluator.EvaluatorException;
020    import railo.transformer.cfml.evaluator.EvaluatorSupport;
021    import railo.transformer.library.function.FunctionLib;
022    import railo.transformer.library.tag.TagLibTag;
023    
024    
025    public final class Sprite extends EvaluatorSupport {
026            
027            private static final Expression DELIMITER = LitString.toExprString(",");
028            private static Map<String,Previous> sprites=new HashMap<String,Previous>(); 
029            
030            
031            
032            
033            /**
034             *
035             * @see railo.transformer.cfml.evaluator.EvaluatorSupport#evaluate(railo.transformer.bytecode.statement.tag.Tag, railo.transformer.library.tag.TagLibTag, railo.transformer.library.function.FunctionLib[])
036             */
037            public void evaluate(Tag tag,TagLibTag tagLibTag,FunctionLib[] flibs) throws EvaluatorException {
038            String id="sprite_"+IDGenerator.intId();
039            try {
040                            Page page = ASMUtil.getAncestorPage(tag);
041                            String key=Md5.getDigestAsString(Thread.currentThread().getId()+":"+page.getSource());
042                            Expression src = tag.getAttribute("src").getValue();
043                            
044                            
045                            // get data from previous sprites
046                            Previous previous = sprites.get(key);
047                            if(previous!=null) {
048                                    previous.tag.removeAttribute("_ids");
049                                    previous.tag.removeAttribute("_srcs");
050                                    previous.tag=tag;
051                            }
052                            else {
053                                    sprites.put(key, previous = new Previous(tag));
054                            }
055                            
056                            previous.ids.add(id);
057                            if(previous.src==null)previous.src=src;
058                            else {
059                                    previous.src=OpString.toExprString(previous.src,DELIMITER);
060                                    previous.src=OpString.toExprString(previous.src,src);
061                            }
062                            
063                            
064                            
065                            tag.addAttribute(
066                                            new Attribute(
067                                                            false,
068                                                            "_id",
069                                                            LitString.toExprString(id),
070                                                            "string"
071                                            ));
072                            tag.addAttribute(
073                                            new Attribute(
074                                                            false,
075                                                            "_ids",
076                                                            LitString.toExprString(railo.runtime.type.util.ListUtil.listToList(previous.ids, ",")),
077                                                            "string"
078                                            ));
079    
080                            tag.addAttribute(
081                                            new Attribute(
082                                                            false,
083                                                            "_srcs",
084                                                            previous.src,
085                                                            "string"
086                                            ));
087                            
088                    } 
089            catch (Throwable e) {// TODO handle Excpetion much more precise
090                            throw new PageRuntimeException(Caster.toPageException(e));
091                    }
092                       
093            }
094            
095            private static class Previous {
096                    public Previous(Tag tag) {
097                            this.tag=tag;
098                    }
099                    private List<String> ids=new ArrayList<String>();
100                    private Expression src=null;
101                    private Tag tag;
102                    
103            }
104            
105    }