public Object getValue()

in struts2-uel-plugin/src/main/java/org/apache/struts2/uel/elresolvers/XWorkListELResolver.java [40:104]


    public Object getValue(ELContext elContext, Object target, Object property) {
        if (target != null && property != null && target instanceof List) {

            Map<String, Object> valueStackContext = getValueStackContext(elContext);
            List list = (List) target;

            Class lastClass = (Class) valueStackContext.get(XWorkConverter.LAST_BEAN_CLASS_ACCESSED);
            String lastProperty = (String) valueStackContext.get(XWorkConverter.LAST_BEAN_PROPERTY_ACCESSED);

            Integer numericValue = null;
            try {
                numericValue = Integer.valueOf(property.toString());
            } catch (NumberFormatException e) {
                //ignore
            }

            if (numericValue != null) {
                if (ReflectionContextState.isCreatingNullObjects(valueStackContext) && objectTypeDeterminer.shouldCreateIfNew(lastClass, lastProperty, target, null, true)) {
                    int index = numericValue.intValue();
                    int listSize = list.size();

                    /*if (lastClass == null || lastProperty == null) {
                        return super.getProperty(context, target, name);
                    }*/
                    Class beanClass = objectTypeDeterminer.getElementClass(lastClass, lastProperty, property);
                    if (listSize <= index) {
                        Object result;

                        for (int i = listSize; i < index; i++) {
                            list.add(null);
                        }
                        try {
                            list.add(index, result = objectFactory.buildBean(beanClass, valueStackContext));
                        } catch (Exception exc) {
                            throw new ELException(exc);
                        }

                        elContext.setPropertyResolved(true);
                        return result;
                    } else if (list.get(index) == null) {
                        Object result = null;
                        try {
                            list.set(index, result = objectFactory.buildBean(beanClass, valueStackContext));
                        } catch (Exception exc) {
                            throw new ELException(exc);
                        }

                        elContext.setPropertyResolved(true);
                        return result;
                    } else {
                        elContext.setPropertyResolved(true);
                        return list.get(index);
                    }
                } else {
                    //try normal list
                    if (numericValue < list.size()) {
                        elContext.setPropertyResolved(true);
                        return list.get(numericValue);
                    }
                }
            }
        }

        return null;
    }