Package railo.transformer.cfml.evaluator.impl

Source Code of railo.transformer.cfml.evaluator.impl.Sprite$Previous

package railo.transformer.cfml.evaluator.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import railo.commons.lang.IDGenerator;
import railo.commons.lang.Md5;
import railo.runtime.exp.PageRuntimeException;
import railo.runtime.op.Caster;
import railo.transformer.bytecode.Page;
import railo.transformer.bytecode.expression.Expression;
import railo.transformer.bytecode.literal.LitString;
import railo.transformer.bytecode.op.OpString;
import railo.transformer.bytecode.statement.tag.Attribute;
import railo.transformer.bytecode.statement.tag.Tag;
import railo.transformer.bytecode.util.ASMUtil;
import railo.transformer.cfml.evaluator.EvaluatorException;
import railo.transformer.cfml.evaluator.EvaluatorSupport;
import railo.transformer.library.function.FunctionLib;
import railo.transformer.library.tag.TagLibTag;


public final class Sprite extends EvaluatorSupport {
 
  private static final Expression DELIMITER = LitString.toExprString(",");
  private static Map<String,Previous> sprites=new HashMap<String,Previous>();
 
 
 
 
  /**
   *
   * @see railo.transformer.cfml.evaluator.EvaluatorSupport#evaluate(railo.transformer.bytecode.statement.tag.Tag, railo.transformer.library.tag.TagLibTag, railo.transformer.library.function.FunctionLib[])
   */
  public void evaluate(Tag tag,TagLibTag tagLibTag,FunctionLib[] flibs) throws EvaluatorException {
        String id="sprite_"+IDGenerator.intId();
        try {
      Page page = ASMUtil.getAncestorPage(tag);
      String key=Md5.getDigestAsString(Thread.currentThread().getId()+":"+page.getSource());
      Expression src = tag.getAttribute("src").getValue();
     
     
      // get data from previous sprites
      Previous previous = sprites.get(key);
      if(previous!=null) {
        previous.tag.removeAttribute("_ids");
        previous.tag.removeAttribute("_srcs");
        previous.tag=tag;
      }
      else {
        sprites.put(key, previous = new Previous(tag));
      }
     
      previous.ids.add(id);
      if(previous.src==null)previous.src=src;
      else {
        previous.src=OpString.toExprString(previous.src,DELIMITER);
        previous.src=OpString.toExprString(previous.src,src);
      }
     
     
     
      tag.addAttribute(
          new Attribute(
              false,
              "_id",
              LitString.toExprString(id),
              "string"
          ));
      tag.addAttribute(
          new Attribute(
              false,
              "_ids",
              LitString.toExprString(railo.runtime.type.util.ListUtil.listToList(previous.ids, ",")),
              "string"
          ));

      tag.addAttribute(
          new Attribute(
              false,
              "_srcs",
              previous.src,
              "string"
          ));
     
    }
        catch (Throwable e) {// TODO handle Excpetion much more precise
      throw new PageRuntimeException(Caster.toPageException(e));
    }
      
  }
 
  private static class Previous {
    public Previous(Tag tag) {
      this.tag=tag;
    }
    private List<String> ids=new ArrayList<String>();
    private Expression src=null;
    private Tag tag;
   
  }
 
}
TOP

Related Classes of railo.transformer.cfml.evaluator.impl.Sprite$Previous

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.