Package railo.runtime.type.scope.storage

Source Code of railo.runtime.type.scope.storage.StorageScopeCookie

package railo.runtime.type.scope.storage;

import java.util.Date;

import railo.commons.io.log.Log;
import railo.commons.lang.StringUtil;
import railo.runtime.PageContext;
import railo.runtime.converter.ScriptConverter;
import railo.runtime.interpreter.CFMLExpressionInterpreter;
import railo.runtime.listener.ApplicationContext;
import railo.runtime.op.Caster;
import railo.runtime.type.KeyImpl;
import railo.runtime.type.Struct;
import railo.runtime.type.StructImpl;
import railo.runtime.type.dt.DateTime;
import railo.runtime.type.dt.DateTimeImpl;
import railo.runtime.type.dt.TimeSpan;
import railo.runtime.type.scope.Cookie;
import railo.runtime.type.scope.ScopeContext;
import railo.runtime.type.util.KeyConstants;

/**
* client scope that store it's data in the cookie of the client
*/
public abstract class StorageScopeCookie extends StorageScopeImpl {

  private static final long serialVersionUID = -3509170569488448183L;
 
  private static ScriptConverter serializer=new ScriptConverter();
  protected static CFMLExpressionInterpreter evaluator=new CFMLExpressionInterpreter();
  //private Cookie cookie;
  private String cookieName;

  //private TimeSpan timeout;
 
 
  static {
    ignoreSet.add(KeyConstants._cfid);
    ignoreSet.add(KeyConstants._cftoken);
    ignoreSet.add(KeyConstants._urltoken);
    ignoreSet.add(KeyConstants._lastvisit);
    ignoreSet.add(KeyConstants._hitcount);
    ignoreSet.add(KeyConstants._timecreated);
  }
 

 
  /**
   * Constructor of the class
   * @param pc
   * @param name
   * @param sct
   */
  protected StorageScopeCookie(PageContext pc,String cookieName,String strType,int type,Struct sct) {
    super(
        sct,
        doNowIfNull(pc,Caster.toDate(sct.get(TIMECREATED,null),false,pc.getTimeZone(),null)),
        doNowIfNull(pc,Caster.toDate(sct.get(LASTVISIT,null),false,pc.getTimeZone(),null)),
        -1,
        type==SCOPE_CLIENT?Caster.toIntValue(sct.get(HITCOUNT,"1"),1):0,
        strType,type);
    this.cookieName=cookieName; 
  }

  /**
   * Constructor of the class, clone existing
   * @param other
   */
  protected StorageScopeCookie(StorageScopeCookie other,boolean deepCopy) {
    super(other,deepCopy);
    cookieName=other.cookieName;
  }
 
  private static DateTime doNowIfNull(PageContext pc,DateTime dt) {
    if(dt==null)return new DateTimeImpl(pc.getConfig());
    return dt;
  }
 
  public void touchAfterRequest(PageContext pc) {
    boolean _isInit=isinit;
    super.touchAfterRequest(pc);
    if(!_isInit) return;
   
    ApplicationContext ac=pc.getApplicationContext();
    TimeSpan timespan=(getType()==SCOPE_CLIENT)?ac.getClientTimeout():ac.getSessionTimeout();
    Cookie cookie = pc.cookieScope();
   
   
    Date exp = new DateTimeImpl(pc,System.currentTimeMillis()+timespan.getMillis(),true);
    try {
      String ser=serializer.serializeStruct(sct, ignoreSet);
      if(hasChanges()){
        cookie.setCookie(KeyImpl.init(cookieName), ser,exp, false, "/", null);
      }
      cookie.setCookie(KeyImpl.init(cookieName+"_LV"), Caster.toString(_lastvisit.getTime()), exp, false, "/", null);
     
      if(getType()==SCOPE_CLIENT){
        cookie.setCookie(KeyImpl.init(cookieName+"_TC"), Caster.toString(timecreated.getTime()),exp, false, "/", null);
        cookie.setCookie(KeyImpl.init(cookieName+"_HC"), Caster.toString(sct.get(HITCOUNT,"")), exp, false, "/", null);
      }
     
    }
    catch (Throwable t) {}
  }
 
  @Override
  public String getStorageType() {
    return "Cookie";
  }


  protected static Struct _loadData(PageContext pc, String cookieName, int type,String strType, Log log) {
    String data = (String)pc.cookieScope().get(cookieName,null);
    if(data!=null) {     
      try {
        Struct sct = (Struct) evaluator.interpret(pc,data);
        long l;
        String str;
       
        // last visit
        str = (String)pc.cookieScope().get(cookieName+"_LV",null);
        if(!StringUtil.isEmpty(str)) {
          l=Caster.toLongValue(str,0);
          if(l>0)sct.setEL(LASTVISIT, new DateTimeImpl(pc,l,true));
        }
       
       
        if(type==SCOPE_CLIENT){
          // hit count
          str= (String)pc.cookieScope().get(cookieName+"_HC",null);
            if(!StringUtil.isEmpty(str)) sct.setEL(HITCOUNT, Caster.toDouble(str,null));
         
          // time created
          str = (String)pc.cookieScope().get(cookieName+"_TC",null);
          if(!StringUtil.isEmpty(str)) {
            l=Caster.toLongValue(str,0);
            if(l>0)sct.setEL(TIMECREATED, new DateTimeImpl(pc,l,true));
          }
        }
               
        ScopeContext.info(log,"load data from cookie for "+strType+" scope for "+pc.getApplicationContext().getName()+"/"+pc.getCFID());
        return sct;
      }
      catch (Exception e) {
       
      }
    }
    ScopeContext.info(log,"create new "+strType+" scope for "+pc.getApplicationContext().getName()+"/"+pc.getCFID());
   
    return new StructImpl();
  }
 
  protected static boolean has(PageContext pc, String cookieName, int type,String strType) {
    // TODO better impl
    String data = (String)pc.cookieScope().get(cookieName,null);
    return data!=null;
   
  }
}
TOP

Related Classes of railo.runtime.type.scope.storage.StorageScopeCookie

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.