PrepareOperationsのcreateActionContext


//ValueStack   ,       OgnlValueStack
//OgnlValueStack          :
//CompoundRoot root
//transient Map<String, Object> context;

// context    OgnlContext,OgnlContext         :
//private Object _root;
//private Map _values = new HashMap(23);

package org.apache.struts2.dispatcher.ng;
PrepareOperationsクラス:

    public ActionContext createActionContext(HttpServletRequest request, HttpServletResponse response) {
        ActionContext ctx;
        Integer counter = 1;
        Integer oldCounter = (Integer) request.getAttribute(CLEANUP_RECURSION_COUNTER);
        if (oldCounter != null) {
            counter = oldCounter + 1;
        }
        
        ActionContext oldContext = ActionContext.getContext();
        if (oldContext != null) {

            ctx = new ActionContext(new HashMap<String, Object>(oldContext.getContextMap()));
        } else {
            ValueStack stack = dispatcher.getContainer().getInstance(ValueStackFactory.class).createValueStack();
            stack.getContext().putAll(dispatcher.createContextMap(request, response, null, servletContext));
            ctx = new ActionContext(stack.getContext());            
        }
        request.setAttribute(CLEANUP_RECURSION_COUNTER, counter);
        ActionContext.setContext(ctx);
        return ctx;
    }

   
//一言ずつ見て
   
   
   
    ValueStack stack = dispatcher.getContainer().getInstance(ValueStackFactory.class).createValueStack();

   
   //dispatcher.getContainer().getInstance(ValueStackFactory.class)の部分はまだよくわかりませんが、
//文字通り見積もると、ValueStackFactoryを作成するインスタンスです.
//ValueStackFactoryはインタフェースであり、デフォルトの実装はOgnlValueStackFactoryである
//OgnlValueStackFactoryのcreateValueStack()を呼び出す:
   
   
    public ValueStack createValueStack() {
    	  //ValueStack   ,       OgnlValueStack,      new  OgnlValueStack  。
        ValueStack stack = new OgnlValueStack(xworkConverter, compoundRootAccessor, textProvider, allowStaticMethodAccess);
        container.inject(stack);
        //     OgnlValueStack.context,      OgnlContext context 。
        stack.getContext().put(ActionContext.CONTAINER, container);
        return stack;
    }

   
   
   
    //OgnlValueStack     
    protected OgnlValueStack(XWorkConverter xworkConverter, CompoundRootAccessor accessor, TextProvider prov, boolean allowStaticAccess) {
    	  //new  CompoundRoot  
        setRoot(xworkConverter, accessor, new CompoundRoot(), allowStaticAccess);
        push(prov);
    }

   
       
       
    protected void setRoot(XWorkConverter xworkConverter, CompoundRootAccessor accessor, CompoundRoot compoundRoot,
                           boolean allowStaticMethodAccess) {
        //OgnlValueStack.root = compoundRoot;             	 
        this.root = compoundRoot;
        //  /      。
        this.securityMemberAccess = new SecurityMemberAccess(allowStaticMethodAccess);
        //  context ,  context    ongl     。
        //Ognl.createDefaultContext    OgnlContext     
        //  OgnlContext  ,root OgnlValueStack  compoundRoot,map OgnlContext     private Map _values = new HashMap(23);
        this.context = Ognl.createDefaultContext(this.root, accessor, new OgnlTypeConverterWrapper(xworkConverter), securityMemberAccess);  
        
                      
        //     ,    :
        //context      OgnlContext,   HashMap  _values    k-v:
        //key:com.opensymphony.xwork2.util.ValueStack.ValueStack
        //value:this,        OgnlValueStack  。
        //         ,_values   :
        //com.opensymphony.xwork2.ActionContext.container=com.opensymphony.xwork2.inject.ContainerImpl@96231e
        //com.opensymphony.xwork2.util.ValueStack.ValueStack=com.opensymphony.xwork2.ognl.OgnlValueStack@4d912
        context.put(VALUE_STACK, this);
        //  :OgnlValueStack  compoundRoot   ;
        //context   OgnlContext,   _root  OgnlValueStack  root,_values     ,     。
        //OgnlContext      。
        Ognl.setClassResolver(context, accessor);
        ((OgnlContext) context).setTraceEvaluations(false);
        ((OgnlContext) context).setKeepLastEvaluation(false);
    }        
        

       
    //      :package ognl;
    public static Map createDefaultContext( Object root, ClassResolver classResolver, TypeConverter converter, MemberAccess memberAccess )
    {
    	  //new  OgnlContext  。
    	  //     OgnlContext  ,root,map      ,  ,         。
        return addDefaultContext( root, classResolver, converter, memberAccess, new OgnlContext() );
    }
    
    // new   OgnlContext        ,  :
    //root   OgnlContext   private Object _root;
    
    //OgnlContext  Map,             ,new           :private Map _values = new HashMap(23);
    //              ,      ,     。
    //     OgnlContext  ,root,map      ,  ,         。
    public static Map addDefaultContext( Object root, ClassResolver classResolver, TypeConverter converter, MemberAccess memberAccess, Map context )
    {
        OgnlContext     result;
        
        if (!(context instanceof OgnlContext)) {
            result = new OgnlContext();
            result.setValues(context);
        } else {
            result = (OgnlContext)context;
        }
        
        
        if (classResolver != null) {
            result.setClassResolver(classResolver);
        }
        if (converter != null) {
            result.setTypeConverter(converter);
        }
        if (memberAccess != null) {
            result.setMemberAccess(memberAccess);
        }
        result.setRoot(root);
        return result;
    }        
            

   
///OgnlContextの_root、OgnlValueStackのrootを指す
    public void setRoot(Object value)
    {
        _root = value;
        _accessorStack.clear();
        _typeStack.clear();
        _currentObject = value;
        if (_currentObject != null)
        {
            setCurrentType(_currentObject.getClass());
        }
    }