OperateDataCacheManager.java 3.8 KB
Newer Older
T
update  
tianqiao 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
package com.ql.util.express.instruction;

import java.util.Stack;

import com.ql.util.express.CallResult;
import com.ql.util.express.ExpressLoader;
import com.ql.util.express.ExpressRunner;
import com.ql.util.express.IExpressContext;
import com.ql.util.express.InstructionSet;
import com.ql.util.express.InstructionSetContext;
import com.ql.util.express.OperateData;
import com.ql.util.express.RunEnvironment;
import com.ql.util.express.instruction.opdata.OperateDataArrayItem;
import com.ql.util.express.instruction.opdata.OperateDataAttr;
import com.ql.util.express.instruction.opdata.OperateDataField;
import com.ql.util.express.instruction.opdata.OperateDataKeyValue;
import com.ql.util.express.instruction.opdata.OperateDataLocalVar;


public class OperateDataCacheManager {

	private static ThreadLocal<RunnerDataCache> m_OperateDataObjectCache = new ThreadLocal<RunnerDataCache>(){
		protected RunnerDataCache initialValue() {
	        return new RunnerDataCache();
	    }
	};
	public static void push(ExpressRunner aRunner){
		m_OperateDataObjectCache.get().push(aRunner);
	}
	public static IOperateDataCache getOperateDataCache(){
		return m_OperateDataObjectCache.get().cache;
	}
	public static OperateData fetchOperateData(Object obj, Class<?> aType) {
		return getOperateDataCache().fetchOperateData(obj, aType);
	}
	public static OperateDataAttr fetchOperateDataAttr(String name, Class<?> aType) {
		return getOperateDataCache().fetchOperateDataAttr(name, aType);
	}
	public static OperateDataLocalVar fetchOperateDataLocalVar(String name, Class<?> aType) {
		return getOperateDataCache().fetchOperateDataLocalVar(name, aType);
	}
	public static OperateDataField fetchOperateDataField(Object aFieldObject,String aFieldName){
		return getOperateDataCache().fetchOperateDataField(aFieldObject, aFieldName);
	}
	public static OperateDataArrayItem fetchOperateDataArrayItem(OperateData aArrayObject,int aIndex){
		return getOperateDataCache().fetchOperateDataArrayItem(aArrayObject, aIndex);
	}
	public static OperateDataKeyValue fetchOperateDataKeyValue(OperateData aKey, OperateData aValue){
		return getOperateDataCache().fetchOperateDataKeyValue(aKey, aValue);
	}
	
	public static RunEnvironment fetRunEnvironment(InstructionSet aInstructionSet,InstructionSetContext  aContext,boolean aIsTrace){
		return getOperateDataCache().fetRunEnvironment(aInstructionSet, aContext, aIsTrace);
	}
	public static CallResult fetchCallResult(Object aReturnValue,boolean aIsExit){
		return getOperateDataCache().fetchCallResult(aReturnValue, aIsExit);
	}
	public static InstructionSetContext fetchInstructionSetContext(boolean aIsExpandToParent,ExpressRunner aRunner,IExpressContext<String,Object> aParent,ExpressLoader aExpressLoader,boolean aIsSupportDynamicFieldName){
		return getOperateDataCache().fetchInstructionSetContext(aIsExpandToParent, aRunner, aParent, aExpressLoader, aIsSupportDynamicFieldName);
	}
	
	public static long getFetchCount(){
		return getOperateDataCache().getFetchCount();
	}
    
	public static void resetCache(ExpressRunner aRunner){
		getOperateDataCache().resetCache();
		m_OperateDataObjectCache.get().pop(aRunner);
		
	}
		
	

}

class RunnerDataCache{
	IOperateDataCache cache;
	
	Stack<ExpressRunner> stack = new Stack<ExpressRunner>();
	
	public void push(ExpressRunner aRunner){
		this.cache = aRunner.getOperateDataCache();
		this.stack.push(aRunner);
	}
	public IOperateDataCache getOperateDataCache(){
		return this.cache;
	}
	public void pop(ExpressRunner aRunner){
89 90 91 92 93 94 95 96 97 98 99
	    
//	    原有的逻辑
//		this.cache = this.stack.pop().getOperateDataCache();
	    
        //bugfix处理ExpressRunner嵌套情况下,cache还原的问题
        this.stack.pop();
        if(!this.stack.isEmpty()){
            this.cache = this.stack.peek().getOperateDataCache();
        }else{
            this.cache = null;
        }
T
update  
tianqiao 已提交
100 101 102
	}

}