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);
     }
 


Reply via email to