Author: adrianc Date: Fri Dec 26 06:47:13 2014 New Revision: 1647936 URL: http://svn.apache.org/r1647936 Log: Rewrite ModelFormField.java and related classes. Most of this is thread-safe now. Implemented a builder design because the original ModelForm design makes several passes over the fields - modifying them incrementally. Now ModelForm modifies builders instead, then when the parsing process is complete, the builders create the thread-safe field models.
Added: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormFieldBuilder.java Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/WidgetWorker.java ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/FormRenderer.java ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/MacroFormRenderer.java ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelForm.java ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormField.java Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/WidgetWorker.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/WidgetWorker.java?rev=1647936&r1=1647935&r2=1647936&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/WidgetWorker.java (original) +++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/WidgetWorker.java Fri Dec 26 06:47:13 2014 @@ -330,6 +330,11 @@ public class WidgetWorker { } } + /** + * Models the <parameter> element. + * + * @see <code>widget-form.xsd</code> + */ public static class Parameter { protected String name; protected FlexibleStringExpander value; Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/FormRenderer.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/FormRenderer.java?rev=1647936&r1=1647935&r2=1647936&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/FormRenderer.java (original) +++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/FormRenderer.java Fri Dec 26 06:47:13 2014 @@ -206,10 +206,6 @@ public class FormRenderer { * itemIndex (Integer, for lists only, otherwise null), bshInterpreter, * formName (String, optional alternate name for form, defaults to the * value of the name attribute) - * @param formStringRenderer An implementation of the FormStringRenderer - * interface that is responsible for the actual text generation for - * different form elements; implementing your own makes it possible to - * use the same form definitions for many types of form UIs */ public void render(Appendable writer, Map<String, Object> context) throws Exception { @@ -237,13 +233,7 @@ public class FormRenderer { positions = curPos; } FieldInfo currentFieldInfo = modelFormField.getFieldInfo(); - if (currentFieldInfo != null) { - ModelFormField fieldInfoFormField = currentFieldInfo.getModelFormField(); - if (fieldInfoFormField != null) { - // FIXME - //fieldInfoFormField.setModelForm(this); - } - } else { + if (currentFieldInfo == null) { throw new IllegalArgumentException( "Error rendering form, a field has no FieldInfo, ie no sub-element for the type of field for field named: " + modelFormField.getName()); Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/MacroFormRenderer.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/MacroFormRenderer.java?rev=1647936&r1=1647935&r2=1647936&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/MacroFormRenderer.java (original) +++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/MacroFormRenderer.java Fri Dec 26 06:47:13 2014 @@ -75,6 +75,7 @@ import org.ofbiz.widget.form.ModelFormFi import org.ofbiz.widget.form.ModelFormField.TextField; import org.ofbiz.widget.form.ModelFormField.TextFindField; import org.ofbiz.widget.form.ModelFormField.TextareaField; +import org.ofbiz.widget.form.ModelFormFieldBuilder; import org.ofbiz.widget.screen.ModelScreenWidget; import com.ibm.icu.util.Calendar; @@ -355,7 +356,7 @@ public final class MacroFormRenderer imp mask = textField.getMask(); } String ajaxUrl = createAjaxParamsFromUpdateAreas(updateAreas, "", context); - boolean disabled = textField.disabled; + boolean disabled = textField.getDisabled(); StringWriter sr = new StringWriter(); sr.append("<@renderTextField "); sr.append("name=\""); @@ -541,17 +542,21 @@ public final class MacroFormRenderer imp localizedInputTitle = uiLabelMap.get("CommonFormatDateTime"); } } - String contextValue = null; - // If time-dropdown deactivate encodingOutput for found hour and minutes + /* + * FIXME: Using a builder here is a hack. Replace the builder with appropriate code. + */ + ModelFormFieldBuilder builder = new ModelFormFieldBuilder(modelFormField); boolean memEncodeOutput = modelFormField.getEncodeOutput(); if (useTimeDropDown) - // FIXME: This is not thread-safe! Never modify a model's state! - modelFormField.setEncodeOutput(false); + // If time-dropdown deactivate encodingOutput for found hour and minutes + // FIXME: Encoding should be controlled by the renderer, not by the model. + builder.setEncodeOutput(false); // FIXME: modelFormField.getEntry ignores shortDateInput when converting Date objects to Strings. - // Object type conversion should be done by the renderer, not by the model. - contextValue = modelFormField.getEntry(context, dateTimeField.getDefaultValue(context)); - if (useTimeDropDown) - modelFormField.setEncodeOutput(memEncodeOutput); + if (useTimeDropDown) { + builder.setEncodeOutput(memEncodeOutput); + } + modelFormField = builder.build(); + String contextValue = modelFormField.getEntry(context, dateTimeField.getDefaultValue(context)); String value = contextValue; if (UtilValidate.isNotEmpty(value)) { if (value.length() > maxlength) { @@ -2024,7 +2029,7 @@ public final class MacroFormRenderer imp } String event = modelFormField.getEvent(); String action = modelFormField.getAction(context); - boolean readonly = lookupField.readonly; + boolean readonly = lookupField.getReadonly(); // add lookup pop-up button String descriptionFieldName = lookupField.getDescriptionFieldName(); ModelForm modelForm = modelFormField.getModelForm(); @@ -2937,9 +2942,9 @@ public final class MacroFormRenderer imp String encodedDescription = encode(description, modelFormField, context); // get the parameterized pagination index and size fields int paginatorNumber = WidgetWorker.getPaginatorNumber(context); - String viewIndexField = modelFormField.modelForm.getMultiPaginateIndexField(context); - String viewSizeField = modelFormField.modelForm.getMultiPaginateSizeField(context); - ModelForm modelForm = modelFormField.modelForm; + ModelForm modelForm = modelFormField.getModelForm(); + String viewIndexField = modelForm.getMultiPaginateIndexField(context); + String viewSizeField = modelForm.getMultiPaginateSizeField(context); int viewIndex = Paginator.getViewIndex(modelForm, context); int viewSize = Paginator.getViewSize(modelForm, context); if (viewIndexField.equals("viewIndex" + "_" + paginatorNumber)) { @@ -2951,7 +2956,7 @@ public final class MacroFormRenderer imp if ("hidden-form".equals(realLinkType)) { parameterMap.put(viewIndexField, Integer.toString(viewIndex)); parameterMap.put(viewSizeField, Integer.toString(viewSize)); - if (modelFormField != null && "multi".equals(modelFormField.getModelForm().getType())) { + if (modelFormField != null && "multi".equals(modelForm.getType())) { WidgetWorker.makeHiddenFormLinkAnchor(writer, linkStyle, encodedDescription, confirmation, modelFormField, request, response, context); // this is a bit trickier, since we can't do a nested form we'll have to put the link to submit the form in place, but put the actual form def elsewhere, ie after the big form is closed Map<String, Object> wholeFormContext = UtilGenerics.checkMap(context.get("wholeFormContext")); Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelForm.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelForm.java?rev=1647936&r1=1647935&r2=1647936&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelForm.java (original) +++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelForm.java Fri Dec 26 06:47:13 2014 @@ -560,15 +560,15 @@ public class ModelForm extends ModelWidg if (parentModelForm != null) { useWhenFields.addAll(parentModelForm.useWhenFields); } - ArrayList<ModelFormField> fieldList = new ArrayList<ModelFormField>(); - Map<String, ModelFormField> fieldMap = new HashMap<String, ModelFormField>(); + ArrayList<ModelFormFieldBuilder> fieldBuilderList = new ArrayList<ModelFormFieldBuilder>(); + Map<String, ModelFormFieldBuilder> fieldBuilderMap = new HashMap<String, ModelFormFieldBuilder>(); if (parentModelForm != null) { // Create this fieldList/Map from clones of parentModelForm's for (ModelFormField parentChildField : parentModelForm.fieldList) { - ModelFormField childField = new ModelFormField(this); - childField.mergeOverrideModelFormField(parentChildField); - fieldList.add(childField); - fieldMap.put(childField.getName(), childField); + ModelFormFieldBuilder builder = new ModelFormFieldBuilder(parentChildField); + builder.setModelForm(this); + fieldBuilderList.add(builder); + fieldBuilderMap.put(builder.getName(), builder); } } Map<String, FieldGroupBase> fieldGroupMap = new HashMap<String, FieldGroupBase>(); @@ -731,7 +731,7 @@ public class ModelForm extends ModelWidg rowCountExdr = parentModelForm.rowCountExdr; } this.rowCountExdr = paginate; - ArrayList<ModelFormField> multiSubmitFields = new ArrayList<ModelFormField>(); + ArrayList<ModelFormFieldBuilder> multiSubmitBuilders = new ArrayList<ModelFormFieldBuilder>(); ArrayList<AutoFieldsService> autoFieldsServices = new ArrayList<AutoFieldsService>(); ArrayList<AutoFieldsEntity> autoFieldsEntities = new ArrayList<AutoFieldsEntity>(); ArrayList<SortField> sortOrderFields = new ArrayList<SortField>(); @@ -739,21 +739,21 @@ public class ModelForm extends ModelWidg for (Element autoFieldsServiceElement : UtilXml.childElementList(formElement, "auto-fields-service")) { AutoFieldsService autoFieldsService = new AutoFieldsService(autoFieldsServiceElement); autoFieldsServices.add(autoFieldsService); - addAutoFieldsFromService(autoFieldsService, entityModelReader, dispatchContext, useWhenFields, fieldList, fieldMap); + addAutoFieldsFromService(autoFieldsService, entityModelReader, dispatchContext, useWhenFields, fieldBuilderList, fieldBuilderMap); } for (Element autoFieldsEntityElement : UtilXml.childElementList(formElement, "auto-fields-entity")) { AutoFieldsEntity autoFieldsEntity = new AutoFieldsEntity(autoFieldsEntityElement); autoFieldsEntities.add(autoFieldsEntity); - addAutoFieldsFromEntity(autoFieldsEntity, entityModelReader, useWhenFields, fieldList, fieldMap); + addAutoFieldsFromEntity(autoFieldsEntity, entityModelReader, useWhenFields, fieldBuilderList, fieldBuilderMap); } String thisType = this.getType(); for (Element fieldElement : UtilXml.childElementList(formElement, "field")) { - ModelFormField modelFormField = new ModelFormField(fieldElement, this, entityModelReader, dispatchContext); - FieldInfo fieldInfo = modelFormField.getFieldInfo(); + ModelFormFieldBuilder builder = new ModelFormFieldBuilder(fieldElement, this, entityModelReader, dispatchContext); + FieldInfo fieldInfo = builder.getFieldInfo(); if (thisType.equals("multi") && fieldInfo instanceof ModelFormField.SubmitField) { - multiSubmitFields.add(modelFormField); + multiSubmitBuilders.add(builder); } else { - modelFormField = addUpdateField(modelFormField, useWhenFields, fieldList, fieldMap); + addUpdateField(builder, useWhenFields, fieldBuilderList, fieldBuilderMap); } } // get the sort-order @@ -787,61 +787,67 @@ public class ModelForm extends ModelWidg } } if (sortOrderFields.size() > 0) { - ArrayList<ModelFormField> sortedFields = new ArrayList<ModelFormField>(); + ArrayList<ModelFormFieldBuilder> sortedFields = new ArrayList<ModelFormFieldBuilder>(); for (SortField sortField : sortOrderFields) { String fieldName = sortField.getFieldName(); if (UtilValidate.isEmpty(fieldName)) { continue; } // get all fields with the given name from the existing list and put them in the sorted list - Iterator<ModelFormField> fieldIter = fieldList.iterator(); + Iterator<ModelFormFieldBuilder> fieldIter = fieldBuilderList.iterator(); while (fieldIter.hasNext()) { - ModelFormField modelFormField = fieldIter.next(); - if (fieldName.equals(modelFormField.getName())) { + ModelFormFieldBuilder builder = fieldIter.next(); + if (fieldName.equals(builder.getName())) { // matched the name; remove from the original last and add to the sorted list if (UtilValidate.isNotEmpty(sortField.getPosition())) { - modelFormField.setPosition(sortField.getPosition()); + builder.setPosition(sortField.getPosition()); } fieldIter.remove(); - sortedFields.add(modelFormField); + sortedFields.add(builder); } } } // now add all of the rest of the fields from fieldList, ie those that were not explicitly listed in the sort order - sortedFields.addAll(fieldList); + sortedFields.addAll(fieldBuilderList); // sortedFields all done, set fieldList - fieldList = sortedFields; + fieldBuilderList = sortedFields; } if (UtilValidate.isNotEmpty(lastOrderFields)) { - List<ModelFormField> lastedFields = new LinkedList<ModelFormField>(); + List<ModelFormFieldBuilder> lastedFields = new LinkedList<ModelFormFieldBuilder>(); for (String fieldName : lastOrderFields) { if (UtilValidate.isEmpty(fieldName)) { continue; } // get all fields with the given name from the existing list and put them in the lasted list - Iterator<ModelFormField> fieldIter = fieldList.iterator(); + Iterator<ModelFormFieldBuilder> fieldIter = fieldBuilderList.iterator(); while (fieldIter.hasNext()) { - ModelFormField modelFormField = fieldIter.next(); - if (fieldName.equals(modelFormField.getName())) { + ModelFormFieldBuilder builder = fieldIter.next(); + if (fieldName.equals(builder.getName())) { // matched the name; remove from the original last and add to the lasted list fieldIter.remove(); - lastedFields.add(modelFormField); + lastedFields.add(builder); } } } //now put all lastedFields at the field list end - fieldList.addAll(lastedFields); + fieldBuilderList.addAll(lastedFields); + } + List<ModelFormField> fieldList = new ArrayList<ModelFormField>(fieldBuilderList.size()); + for (ModelFormFieldBuilder builder : fieldBuilderList) { + fieldList.add(builder.build()); } - this.useWhenFields = Collections.unmodifiableSet(useWhenFields); - fieldList.trimToSize(); this.fieldList = Collections.unmodifiableList(fieldList); + List<ModelFormField> multiSubmitFields = new ArrayList<ModelFormField>(multiSubmitBuilders.size()); + for (ModelFormFieldBuilder builder : multiSubmitBuilders) { + multiSubmitFields.add(builder.build()); + } + this.multiSubmitFields = Collections.unmodifiableList(multiSubmitFields); + this.useWhenFields = Collections.unmodifiableSet(useWhenFields); this.fieldGroupMap = Collections.unmodifiableMap(fieldGroupMap); fieldGroupList.trimToSize(); this.fieldGroupList = Collections.unmodifiableList(fieldGroupList); lastOrderFields.trimToSize(); this.lastOrderFields = Collections.unmodifiableList(lastOrderFields); - multiSubmitFields.trimToSize(); - this.multiSubmitFields = Collections.unmodifiableList(multiSubmitFields); autoFieldsServices.trimToSize(); this.autoFieldsServices = Collections.unmodifiableList(autoFieldsServices); autoFieldsEntities.trimToSize(); @@ -866,7 +872,7 @@ public class ModelForm extends ModelWidg } private void addAutoFieldsFromEntity(AutoFieldsEntity autoFieldsEntity, ModelReader entityModelReader, - Set<String> useWhenFields, List<ModelFormField> fieldList, Map<String, ModelFormField> fieldMap) { + Set<String> useWhenFields, List<ModelFormFieldBuilder> fieldBuilderList, Map<String, ModelFormFieldBuilder> fieldBuilderMap) { // read entity def and auto-create fields ModelEntity modelEntity = null; try { @@ -878,7 +884,6 @@ public class ModelForm extends ModelWidg throw new IllegalArgumentException("Error finding Entity with name " + autoFieldsEntity.entityName + " for auto-fields-entity in a form widget"); } - Iterator<ModelField> modelFieldIter = modelEntity.getFieldsIterator(); while (modelFieldIter.hasNext()) { ModelField modelField = modelFieldIter.next(); @@ -886,18 +891,23 @@ public class ModelForm extends ModelWidg // don't ever auto-add these, should only be added if explicitly referenced continue; } - ModelFormField modelFormField = this.addFieldFromEntityField(modelEntity, modelField, - autoFieldsEntity.defaultFieldType, autoFieldsEntity.defaultPosition, useWhenFields, fieldList, fieldMap); + ModelFormFieldBuilder builder = new ModelFormFieldBuilder(); + builder.setModelForm(this); + builder.setName(modelField.getName()); + builder.setEntityName(modelEntity.getEntityName()); + builder.setFieldName(modelField.getName()); + builder.induceFieldInfoFromEntityField(modelEntity, modelField, autoFieldsEntity.defaultFieldType); + builder.setPosition(autoFieldsEntity.defaultPosition); if (UtilValidate.isNotEmpty(autoFieldsEntity.mapName)) { - modelFormField.setMapName(autoFieldsEntity.mapName); + builder.setMapName(autoFieldsEntity.mapName); } + addUpdateField(builder, useWhenFields, fieldBuilderList, fieldBuilderMap); } } private void addAutoFieldsFromService(AutoFieldsService autoFieldsService, ModelReader entityModelReader, - DispatchContext dispatchContext, Set<String> useWhenFields, List<ModelFormField> fieldList, - Map<String, ModelFormField> fieldMap) { - + DispatchContext dispatchContext, Set<String> useWhenFields, List<ModelFormFieldBuilder> fieldBuilderList, + Map<String, ModelFormFieldBuilder> fieldBuilderMap) { // read service def and auto-create fields ModelService modelService = null; try { @@ -908,11 +918,9 @@ public class ModelForm extends ModelWidg Debug.logError(e, errmsg, module); throw new IllegalArgumentException(errmsg); } - for (ModelParam modelParam : modelService.getInModelParamList()) { - // skip auto params that the service engine populates... - if ("userLogin".equals(modelParam.name) || "locale".equals(modelParam.name) || "timeZone".equals(modelParam.name) - || "login.username".equals(modelParam.name) || "login.password".equals(modelParam.name)) { + if (modelParam.internal) { + // skip auto params that the service engine populates... continue; } if (modelParam.formDisplay) { @@ -924,13 +932,17 @@ public class ModelForm extends ModelWidg ModelField modelField = modelEntity.getField(modelParam.fieldName); if (modelField != null) { // okay, populate using the entity field info... - ModelFormField modelFormField = addFieldFromEntityField(modelEntity, modelField, - autoFieldsService.defaultFieldType, autoFieldsService.defaultPosition, useWhenFields, - fieldList, fieldMap); + ModelFormFieldBuilder builder = new ModelFormFieldBuilder(); + builder.setModelForm(this); + builder.setName(modelField.getName()); + builder.setEntityName(modelEntity.getEntityName()); + builder.setFieldName(modelField.getName()); + builder.induceFieldInfoFromEntityField(modelEntity, modelField, autoFieldsService.defaultFieldType); if (UtilValidate.isNotEmpty(autoFieldsService.mapName)) { - modelFormField.setMapName(autoFieldsService.mapName); + builder.setMapName(autoFieldsService.mapName); } - modelFormField.setRequiredField(!modelParam.optional); + builder.setRequiredField(!modelParam.optional); + addUpdateField(builder, useWhenFields, fieldBuilderList, fieldBuilderMap); // continue to skip creating based on service param continue; } @@ -939,79 +951,52 @@ public class ModelForm extends ModelWidg Debug.logError(e, module); } } - - ModelFormField modelFormField = this - .addFieldFromServiceParam(modelService, modelParam, autoFieldsService.defaultFieldType, - autoFieldsService.defaultPosition, useWhenFields, fieldList, fieldMap); + ModelFormFieldBuilder builder = new ModelFormFieldBuilder(); + builder.setModelForm(this); + builder.setName(modelParam.name); + builder.setServiceName(modelService.name); + builder.setAttributeName(modelParam.name); + builder.setTitle(modelParam.formLabel); + builder.setRequiredField(!modelParam.optional); + builder.induceFieldInfoFromServiceParam(modelService, modelParam, autoFieldsService.defaultFieldType); + builder.setPosition(autoFieldsService.defaultPosition); if (UtilValidate.isNotEmpty(autoFieldsService.mapName)) { - modelFormField.setMapName(autoFieldsService.mapName); + builder.setMapName(autoFieldsService.mapName); } + addUpdateField(builder, useWhenFields, fieldBuilderList, fieldBuilderMap); } } } - private ModelFormField addFieldFromEntityField(ModelEntity modelEntity, ModelField modelField, String defaultFieldType, - int defaultPosition, Set<String> useWhenFields, List<ModelFormField> fieldList, Map<String, ModelFormField> fieldMap) { - // create field def from entity field def - ModelFormField newFormField = new ModelFormField(this); - newFormField.setName(modelField.getName()); - newFormField.setEntityName(modelEntity.getEntityName()); - newFormField.setFieldName(modelField.getName()); - newFormField.induceFieldInfoFromEntityField(modelEntity, modelField, defaultFieldType); - newFormField.setPosition(defaultPosition); - return this.addUpdateField(newFormField, useWhenFields, fieldList, fieldMap); - } - - private ModelFormField addFieldFromServiceParam(ModelService modelService, ModelParam modelParam, String defaultFieldType, - int defaultPosition, Set<String> useWhenFields, List<ModelFormField> fieldList, Map<String, ModelFormField> fieldMap) { - // create field def from service param def - ModelFormField newFormField = new ModelFormField(this); - newFormField.setName(modelParam.name); - newFormField.setServiceName(modelService.name); - newFormField.setAttributeName(modelParam.name); - newFormField.setTitle(modelParam.formLabel); - newFormField.setRequiredField(!modelParam.optional); - newFormField.induceFieldInfoFromServiceParam(modelService, modelParam, defaultFieldType); - newFormField.setPosition(defaultPosition); - return this.addUpdateField(newFormField, useWhenFields, fieldList, fieldMap); - } - - /** - * add/override modelFormField using the fieldList and fieldMap - * - * @return The same ModelFormField, or if merged with an existing field, the existing field. - */ - private ModelFormField addUpdateField(ModelFormField modelFormField, Set<String> useWhenFields, - List<ModelFormField> fieldList, Map<String, ModelFormField> fieldMap) { - if (!modelFormField.isUseWhenEmpty() || useWhenFields.contains(modelFormField.getName())) { - useWhenFields.add(modelFormField.getName()); + private void addUpdateField(ModelFormFieldBuilder builder, Set<String> useWhenFields, + List<ModelFormFieldBuilder> fieldBuilderList, Map<String, ModelFormFieldBuilder> fieldBuilderMap) { + if (!builder.getUseWhen().isEmpty() || useWhenFields.contains(builder.getName())) { + useWhenFields.add(builder.getName()); // is a conditional field, add to the List but don't worry about the Map //for adding to list, see if there is another field with that name in the list and if so, put it before that one boolean inserted = false; - for (int i = 0; i < fieldList.size(); i++) { - ModelFormField curField = fieldList.get(i); - if (curField.getName() != null && curField.getName().equals(modelFormField.getName())) { - fieldList.add(i, modelFormField); + for (int i = 0; i < fieldBuilderList.size(); i++) { + ModelFormFieldBuilder curField = fieldBuilderList.get(i); + if (curField.getName() != null && curField.getName().equals(builder.getName())) { + fieldBuilderList.add(i, builder); inserted = true; break; } } if (!inserted) { - fieldList.add(modelFormField); + fieldBuilderList.add(builder); } - return modelFormField; + return; } else { // not a conditional field, see if a named field exists in Map - ModelFormField existingField = fieldMap.get(modelFormField.getName()); + ModelFormFieldBuilder existingField = fieldBuilderMap.get(builder.getName()); if (existingField != null) { // does exist, update the field by doing a merge/override - existingField.mergeOverrideModelFormField(modelFormField); - return existingField; + existingField.mergeOverrideModelFormField(builder); } else { // does not exist, add to List and Map - fieldList.add(modelFormField); - fieldMap.put(modelFormField.getName(), modelFormField); - return modelFormField; + fieldBuilderList.add(builder); + fieldBuilderMap.put(builder.getName(), builder); } } } @@ -1518,7 +1503,6 @@ public class ModelForm extends ModelWidg Debug.logError(e, errmsg, module); throw new IllegalArgumentException(errmsg); } - return styles; } @@ -1535,7 +1519,6 @@ public class ModelForm extends ModelWidg if (simpleEncoder != null) { expanderContext = StringUtil.HtmlEncodingMapWrapper.getHtmlEncodingMapWrapper(context, simpleEncoder); } - try { // use the same Interpreter (ie with the same context setup) for all evals Interpreter bsh = this.getBshInterpreter(context); @@ -1561,7 +1544,6 @@ public class ModelForm extends ModelWidg Debug.logError(e, errmsg, module); throw new IllegalArgumentException(errmsg); } - return target.expandString(expanderContext); }