You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@struts.apache.org by "Lukasz Lenart (JIRA)" <ji...@apache.org> on 2013/03/25 22:13:15 UTC

[jira] [Updated] (WW-3603) XWorkMapPropertyAccessor always create new map entries

     [ https://issues.apache.org/jira/browse/WW-3603?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Lukasz Lenart updated WW-3603:
------------------------------

    Description: 
XWorkMapPropertyAccessor uses "context.get(ReflectionContextState.CREATE_NULL_OBJECTS) != null" to check if it in create new objects mode.
{code:java}
            if (result == null &&
                    context.get(ReflectionContextState.CREATE_NULL_OBJECTS) != null //BUG
                    &&  objectTypeDeterminer.shouldCreateIfNew(lastClass,lastProperty,target,null,false)) {
                Class valueClass = objectTypeDeterminer.getElementClass(lastClass, lastProperty, key);

                try {
                    result = objectFactory.buildBean(valueClass, context);
                    map.put(key, result);
                } catch (Exception exc) {

                }

            }
{code}

However ParametersInterceptor uses ReflectionContextState.setCreatingNullObjects(contextMap, true\false); to turn this mode on and off. In result "context.get(ReflectionContextState.CREATE_NULL_OBJECTS) != null" is always true and result bean is always created.

{code:java}
                Map<String, Object> contextMap = ac.getContextMap();
                try {
                    ReflectionContextState.setCreatingNullObjects(contextMap, true);
                    ReflectionContextState.setDenyMethodExecution(contextMap, true);
                    ReflectionContextState.setReportingConversionErrors(contextMap, true);

                    ValueStack stack = ac.getValueStack();
                    setParameters(action, stack, parameters);
                } finally {
                    ReflectionContextState.setCreatingNullObjects(contextMap, false);
                    ReflectionContextState.setDenyMethodExecution(contextMap, false);
                    ReflectionContextState.setReportingConversionErrors(contextMap, false);
                }
{code}

  was:
XWorkMapPropertyAccessor uses "context.get(ReflectionContextState.CREATE_NULL_OBJECTS) != null" to check if it in create new objects mode.
==================
            if (result == null &&
                    context.get(ReflectionContextState.CREATE_NULL_OBJECTS) != null //BUG
                    &&  objectTypeDeterminer.shouldCreateIfNew(lastClass,lastProperty,target,null,false)) {
                Class valueClass = objectTypeDeterminer.getElementClass(lastClass, lastProperty, key);

                try {
                    result = objectFactory.buildBean(valueClass, context);
                    map.put(key, result);
                } catch (Exception exc) {

                }

            }
==================

However ParametersInterceptor uses ReflectionContextState.setCreatingNullObjects(contextMap, true\false); to turn this mode on and off. In result "context.get(ReflectionContextState.CREATE_NULL_OBJECTS) != null" is always true and result bean is always created.

==================
                Map<String, Object> contextMap = ac.getContextMap();
                try {
                    ReflectionContextState.setCreatingNullObjects(contextMap, true);
                    ReflectionContextState.setDenyMethodExecution(contextMap, true);
                    ReflectionContextState.setReportingConversionErrors(contextMap, true);

                    ValueStack stack = ac.getValueStack();
                    setParameters(action, stack, parameters);
                } finally {
                    ReflectionContextState.setCreatingNullObjects(contextMap, false);
                    ReflectionContextState.setDenyMethodExecution(contextMap, false);
                    ReflectionContextState.setReportingConversionErrors(contextMap, false);
                }
==================

    
> XWorkMapPropertyAccessor always create new map entries
> ------------------------------------------------------
>
>                 Key: WW-3603
>                 URL: https://issues.apache.org/jira/browse/WW-3603
>             Project: Struts 2
>          Issue Type: Bug
>    Affects Versions: 2.2.1
>            Reporter: Igor Evgrafov
>             Fix For: 3.0
>
>
> XWorkMapPropertyAccessor uses "context.get(ReflectionContextState.CREATE_NULL_OBJECTS) != null" to check if it in create new objects mode.
> {code:java}
>             if (result == null &&
>                     context.get(ReflectionContextState.CREATE_NULL_OBJECTS) != null //BUG
>                     &&  objectTypeDeterminer.shouldCreateIfNew(lastClass,lastProperty,target,null,false)) {
>                 Class valueClass = objectTypeDeterminer.getElementClass(lastClass, lastProperty, key);
>                 try {
>                     result = objectFactory.buildBean(valueClass, context);
>                     map.put(key, result);
>                 } catch (Exception exc) {
>                 }
>             }
> {code}
> However ParametersInterceptor uses ReflectionContextState.setCreatingNullObjects(contextMap, true\false); to turn this mode on and off. In result "context.get(ReflectionContextState.CREATE_NULL_OBJECTS) != null" is always true and result bean is always created.
> {code:java}
>                 Map<String, Object> contextMap = ac.getContextMap();
>                 try {
>                     ReflectionContextState.setCreatingNullObjects(contextMap, true);
>                     ReflectionContextState.setDenyMethodExecution(contextMap, true);
>                     ReflectionContextState.setReportingConversionErrors(contextMap, true);
>                     ValueStack stack = ac.getValueStack();
>                     setParameters(action, stack, parameters);
>                 } finally {
>                     ReflectionContextState.setCreatingNullObjects(contextMap, false);
>                     ReflectionContextState.setDenyMethodExecution(contextMap, false);
>                     ReflectionContextState.setReportingConversionErrors(contextMap, false);
>                 }
> {code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira