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 }