Added: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormFieldBuilder.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormFieldBuilder.java?rev=1647936&view=auto ============================================================================== --- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormFieldBuilder.java (added) +++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormFieldBuilder.java Fri Dec 26 06:47:13 2014 @@ -0,0 +1,925 @@ +/******************************************************************************* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + *******************************************************************************/ +package org.ofbiz.widget.form; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.ofbiz.base.util.Debug; +import org.ofbiz.base.util.UtilValidate; +import org.ofbiz.base.util.UtilXml; +import org.ofbiz.base.util.collections.FlexibleMapAccessor; +import org.ofbiz.base.util.string.FlexibleStringExpander; +import org.ofbiz.entity.GenericEntityException; +import org.ofbiz.entity.model.ModelEntity; +import org.ofbiz.entity.model.ModelField; +import org.ofbiz.entity.model.ModelReader; +import org.ofbiz.service.DispatchContext; +import org.ofbiz.service.GenericServiceException; +import org.ofbiz.service.ModelParam; +import org.ofbiz.service.ModelService; +import org.ofbiz.widget.form.ModelForm.UpdateArea; +import org.ofbiz.widget.form.ModelFormField.CheckField; +import org.ofbiz.widget.form.ModelFormField.ContainerField; +import org.ofbiz.widget.form.ModelFormField.DateFindField; +import org.ofbiz.widget.form.ModelFormField.DateTimeField; +import org.ofbiz.widget.form.ModelFormField.DisplayEntityField; +import org.ofbiz.widget.form.ModelFormField.DisplayField; +import org.ofbiz.widget.form.ModelFormField.DropDownField; +import org.ofbiz.widget.form.ModelFormField.FileField; +import org.ofbiz.widget.form.ModelFormField.HiddenField; +import org.ofbiz.widget.form.ModelFormField.HyperlinkField; +import org.ofbiz.widget.form.ModelFormField.IgnoredField; +import org.ofbiz.widget.form.ModelFormField.ImageField; +import org.ofbiz.widget.form.ModelFormField.LookupField; +import org.ofbiz.widget.form.ModelFormField.OptionSource; +import org.ofbiz.widget.form.ModelFormField.PasswordField; +import org.ofbiz.widget.form.ModelFormField.RadioField; +import org.ofbiz.widget.form.ModelFormField.RangeFindField; +import org.ofbiz.widget.form.ModelFormField.ResetField; +import org.ofbiz.widget.form.ModelFormField.SubmitField; +import org.ofbiz.widget.form.ModelFormField.TextField; +import org.ofbiz.widget.form.ModelFormField.TextFindField; +import org.ofbiz.widget.form.ModelFormField.TextareaField; +import org.w3c.dom.Element; + +/** + * A <code>ModelFormField</code> builder. + */ +public class ModelFormFieldBuilder { + + public static final String module = ModelFormFieldBuilder.class.getName(); + + private FlexibleStringExpander action = FlexibleStringExpander.getInstance("");; + private String attributeName = ""; + private boolean encodeOutput = true; + private String entityName = ""; + private FlexibleMapAccessor<Object> entryAcsr = null; + private String event = ""; + private FieldInfo fieldInfo = null; + private String fieldName = ""; + private String fieldType = null; + private String headerLink = ""; + private String headerLinkStyle = ""; + private String idName = ""; + private FlexibleMapAccessor<Map<String, ? extends Object>> mapAcsr = null; + private ModelForm modelForm = null; + private String name = ""; + private List<UpdateArea> onChangeUpdateAreas = new ArrayList<UpdateArea>(); + private List<UpdateArea> onClickUpdateAreas = new ArrayList<UpdateArea>(); + private String parameterName = ""; + private Integer position = null; + private String redWhen = ""; + private Boolean requiredField = null; + private String requiredFieldStyle = ""; + private boolean separateColumn = false; + private String serviceName = ""; + private Boolean sortField = null; + private String sortFieldAscStyle = ""; + private String sortFieldDescStyle = ""; + private String sortFieldHelpText = ""; + private String sortFieldStyle = ""; + private FlexibleStringExpander title = FlexibleStringExpander.getInstance("");; + private String titleAreaStyle = ""; + private String titleStyle = ""; + private FlexibleStringExpander tooltip = FlexibleStringExpander.getInstance("");; + private String tooltipStyle = ""; + private FlexibleStringExpander useWhen = FlexibleStringExpander.getInstance("");; + private String widgetAreaStyle = ""; + private String widgetStyle = ""; + + public ModelFormFieldBuilder() { + } + + /** XML Constructor */ + public ModelFormFieldBuilder(Element fieldElement, ModelForm modelForm, ModelReader entityModelReader, + DispatchContext dispatchContext) { + String name = fieldElement.getAttribute("name"); + this.action = FlexibleStringExpander.getInstance(fieldElement.getAttribute("action")); + this.attributeName = UtilXml.checkEmpty(fieldElement.getAttribute("attribute-name"), name); + this.encodeOutput = !"false".equals(fieldElement.getAttribute("encode-output")); + this.entityName = fieldElement.getAttribute("entity-name"); + this.entryAcsr = FlexibleMapAccessor.getInstance(UtilXml.checkEmpty(fieldElement.getAttribute("entry-name"), name)); + this.event = fieldElement.getAttribute("event"); + this.fieldName = UtilXml.checkEmpty(fieldElement.getAttribute("field-name"), name); + this.headerLink = fieldElement.getAttribute("header-link"); + this.headerLinkStyle = fieldElement.getAttribute("header-link-style"); + this.idName = fieldElement.getAttribute("id-name"); + this.mapAcsr = FlexibleMapAccessor.getInstance(fieldElement.getAttribute("map-name")); + this.modelForm = modelForm; + this.name = name; + this.parameterName = UtilXml.checkEmpty(fieldElement.getAttribute("parameter-name"), name); + String positionAtttr = fieldElement.getAttribute("position"); + Integer position = null; + if (!positionAtttr.isEmpty()) { + position = Integer.parseInt(positionAtttr); + } + this.position = position; + this.redWhen = fieldElement.getAttribute("red-when"); + String requiredField = fieldElement.getAttribute("required-field"); + this.requiredField = requiredField.isEmpty() ? null : "true".equals(requiredField); + this.requiredFieldStyle = fieldElement.getAttribute("required-field-style"); + this.separateColumn = "true".equals(fieldElement.getAttribute("separate-column")); + this.serviceName = fieldElement.getAttribute("service-name"); + String sortField = fieldElement.getAttribute("sort-field"); + this.sortField = sortField.isEmpty() ? null : "true".equals(sortField); + this.sortFieldAscStyle = fieldElement.getAttribute("sort-field-asc-style"); + this.sortFieldDescStyle = fieldElement.getAttribute("sort-field-desc-style"); + this.sortFieldHelpText = fieldElement.getAttribute("sort-field-help-text"); + this.sortFieldStyle = fieldElement.getAttribute("sort-field-style"); + this.title = FlexibleStringExpander.getInstance(fieldElement.getAttribute("title")); + this.titleAreaStyle = fieldElement.getAttribute("title-area-style"); + this.titleStyle = fieldElement.getAttribute("title-style"); + this.tooltip = FlexibleStringExpander.getInstance(fieldElement.getAttribute("tooltip")); + this.tooltipStyle = fieldElement.getAttribute("tooltip-style"); + this.useWhen = FlexibleStringExpander.getInstance(fieldElement.getAttribute("use-when")); + this.widgetAreaStyle = fieldElement.getAttribute("widget-area-style"); + this.widgetStyle = fieldElement.getAttribute("widget-style"); + Element childElement = null; + List<? extends Element> subElements = UtilXml.childElementList(fieldElement); + for (Element subElement : subElements) { + String subElementName = subElement.getTagName(); + if ("on-field-event-update-area".equals(subElementName)) { + UpdateArea updateArea = new UpdateArea(subElement); + if ("change".equals(updateArea.getEventType())) + onChangeUpdateAreas.add(updateArea); + else if ("click".equals(updateArea.getEventType())) + onClickUpdateAreas.add(updateArea); + } else { + if (this.fieldType != null) { + throw new IllegalArgumentException("Multiple field types found: " + this.fieldType + ", " + subElementName); + } + this.fieldType = subElementName; + childElement = subElement; + } + } + if (UtilValidate.isEmpty(this.fieldType)) { + this.induceFieldInfo(modelForm, null, entityModelReader, dispatchContext); + } else if ("display".equals(this.fieldType)) + this.fieldInfo = new DisplayField(childElement, null); + else if ("display-entity".equals(this.fieldType)) + this.fieldInfo = new DisplayEntityField(childElement, null); + else if ("hyperlink".equals(this.fieldType)) + this.fieldInfo = new HyperlinkField(childElement, null); + else if ("text".equals(this.fieldType)) + this.fieldInfo = new TextField(childElement, null); + else if ("textarea".equals(this.fieldType)) + this.fieldInfo = new TextareaField(childElement, null); + else if ("date-time".equals(this.fieldType)) + this.fieldInfo = new DateTimeField(childElement, null); + else if ("drop-down".equals(this.fieldType)) + this.fieldInfo = new DropDownField(childElement, null); + else if ("check".equals(this.fieldType)) + this.fieldInfo = new CheckField(childElement, null); + else if ("radio".equals(this.fieldType)) + this.fieldInfo = new RadioField(childElement, null); + else if ("submit".equals(this.fieldType)) + this.fieldInfo = new SubmitField(childElement, null); + else if ("reset".equals(this.fieldType)) + this.fieldInfo = new ResetField(childElement, null); + else if ("hidden".equals(this.fieldType)) + this.fieldInfo = new HiddenField(childElement, null); + else if ("ignored".equals(this.fieldType)) + this.fieldInfo = new IgnoredField(childElement, null); + else if ("text-find".equals(this.fieldType)) + this.fieldInfo = new TextFindField(childElement, null); + else if ("date-find".equals(this.fieldType)) + this.fieldInfo = new DateFindField(childElement, null); + else if ("range-find".equals(this.fieldType)) + this.fieldInfo = new RangeFindField(childElement, null); + else if ("lookup".equals(this.fieldType)) + this.fieldInfo = new LookupField(childElement, null); + else if ("file".equals(this.fieldType)) + this.fieldInfo = new FileField(childElement, null); + else if ("password".equals(this.fieldType)) + this.fieldInfo = new PasswordField(childElement, null); + else if ("image".equals(this.fieldType)) + this.fieldInfo = new ImageField(childElement, null); + else if ("container".equals(this.fieldType)) + this.fieldInfo = new ContainerField(childElement, null); + else + throw new IllegalArgumentException("The field sub-element with name " + this.fieldType + " is not supported"); + Debug.logInfo("fieldType = " + fieldType + ", fieldInfo = " + fieldInfo, module); + } + + public ModelFormFieldBuilder(ModelFormField modelFormField) { + this.action = modelFormField.getAction(); + this.attributeName = modelFormField.getAttributeName(); + this.encodeOutput = modelFormField.getEncodeOutput(); + this.entityName = modelFormField.getEntityName(); + this.entryAcsr = modelFormField.getEntryAcsr(); + this.event = modelFormField.getEvent(); + this.fieldInfo = modelFormField.getFieldInfo(); + this.fieldName = modelFormField.getFieldName(); + this.headerLink = modelFormField.getHeaderLink(); + this.headerLinkStyle = modelFormField.getHeaderLinkStyle(); + this.idName = modelFormField.getIdName(); + this.mapAcsr = modelFormField.getMapAcsr(); + this.modelForm = modelFormField.getModelForm(); + this.name = modelFormField.getName(); + this.onChangeUpdateAreas.addAll(modelFormField.getOnChangeUpdateAreas()); + this.onClickUpdateAreas.addAll(modelFormField.getOnClickUpdateAreas()); + this.parameterName = modelFormField.getParameterName(); + this.position = modelFormField.getPosition(); + this.redWhen = modelFormField.getRedWhen(); + this.requiredField = modelFormField.getRequiredField(); + this.requiredFieldStyle = modelFormField.getRequiredFieldStyle(); + this.separateColumn = modelFormField.getSeparateColumn(); + this.serviceName = modelFormField.getServiceName(); + this.sortField = modelFormField.getSortField(); + this.sortFieldAscStyle = modelFormField.getSortFieldAscStyle(); + this.sortFieldDescStyle = modelFormField.getSortFieldDescStyle(); + this.sortFieldHelpText = modelFormField.getSortFieldHelpText(); + this.sortFieldStyle = modelFormField.getSortFieldStyle(); + this.title = modelFormField.getTitle(); + this.titleAreaStyle = modelFormField.getTitleAreaStyle(); + this.titleStyle = modelFormField.getTitleStyle(); + this.tooltip = modelFormField.getTooltip(); + this.tooltipStyle = modelFormField.getTooltipStyle(); + this.useWhen = modelFormField.getUseWhen(); + this.widgetAreaStyle = modelFormField.getWidgetAreaStyle(); + this.widgetStyle = modelFormField.getWidgetStyle(); + } + + public ModelFormFieldBuilder(ModelFormFieldBuilder builder) { + this.action = builder.getAction(); + this.attributeName = builder.getAttributeName(); + this.encodeOutput = builder.getEncodeOutput(); + this.entityName = builder.getEntityName(); + this.entryAcsr = builder.getEntryAcsr(); + this.event = builder.getEvent(); + this.fieldInfo = builder.getFieldInfo(); + this.fieldName = builder.getFieldName(); + this.headerLink = builder.getHeaderLink(); + this.headerLinkStyle = builder.getHeaderLinkStyle(); + this.idName = builder.getIdName(); + this.mapAcsr = builder.getMapAcsr(); + this.modelForm = builder.getModelForm(); + this.name = builder.getName(); + this.onChangeUpdateAreas.addAll(builder.getOnChangeUpdateAreas()); + this.onClickUpdateAreas.addAll(builder.getOnClickUpdateAreas()); + this.parameterName = builder.getParameterName(); + this.position = builder.getPosition(); + this.redWhen = builder.getRedWhen(); + this.requiredField = builder.getRequiredField(); + this.requiredFieldStyle = builder.getRequiredFieldStyle(); + this.separateColumn = builder.getSeparateColumn(); + this.serviceName = builder.getServiceName(); + this.sortField = builder.getSortField(); + this.sortFieldAscStyle = builder.getSortFieldAscStyle(); + this.sortFieldDescStyle = builder.getSortFieldDescStyle(); + this.sortFieldHelpText = builder.getSortFieldHelpText(); + this.sortFieldStyle = builder.getSortFieldStyle(); + this.title = builder.getTitle(); + this.titleAreaStyle = builder.getTitleAreaStyle(); + this.titleStyle = builder.getTitleStyle(); + this.tooltip = builder.getTooltip(); + this.tooltipStyle = builder.getTooltipStyle(); + this.useWhen = builder.getUseWhen(); + this.widgetAreaStyle = builder.getWidgetAreaStyle(); + this.widgetStyle = builder.getWidgetStyle(); + } + + public ModelFormFieldBuilder addOnChangeUpdateArea(UpdateArea onChangeUpdateArea) { + this.onChangeUpdateAreas.add(onChangeUpdateArea); + return this; + } + + public ModelFormFieldBuilder addOnClickUpdateArea(UpdateArea onClickUpdateArea) { + this.onClickUpdateAreas.add(onClickUpdateArea); + return this; + } + + public ModelFormField build() { + return ModelFormField.from(this); + } + + public FlexibleStringExpander getAction() { + return action; + } + + public String getAttributeName() { + return attributeName; + } + + public boolean getEncodeOutput() { + return encodeOutput; + } + + public String getEntityName() { + return entityName; + } + + public FlexibleMapAccessor<Object> getEntryAcsr() { + return entryAcsr; + } + + public String getEvent() { + return event; + } + + public FieldInfo getFieldInfo() { + return fieldInfo; + } + + public String getFieldName() { + return fieldName; + } + + public String getFieldType() { + return fieldType; + } + + public String getHeaderLink() { + return headerLink; + } + + public String getHeaderLinkStyle() { + return headerLinkStyle; + } + + public String getIdName() { + return idName; + } + + public FlexibleMapAccessor<Map<String, ? extends Object>> getMapAcsr() { + return mapAcsr; + } + + public ModelForm getModelForm() { + return modelForm; + } + + public String getName() { + return name; + } + + public List<UpdateArea> getOnChangeUpdateAreas() { + return onChangeUpdateAreas; + } + + public List<UpdateArea> getOnClickUpdateAreas() { + return onClickUpdateAreas; + } + + public String getParameterName() { + return parameterName; + } + + public Integer getPosition() { + return position; + } + + public String getRedWhen() { + return redWhen; + } + + public Boolean getRequiredField() { + return requiredField; + } + + public String getRequiredFieldStyle() { + return requiredFieldStyle; + } + + public boolean getSeparateColumn() { + return separateColumn; + } + + public String getServiceName() { + return serviceName; + } + + public Boolean getSortField() { + return sortField; + } + + public String getSortFieldAscStyle() { + return sortFieldAscStyle; + } + + public String getSortFieldDescStyle() { + return sortFieldDescStyle; + } + + public String getSortFieldHelpText() { + return sortFieldHelpText; + } + + public String getSortFieldStyle() { + return sortFieldStyle; + } + + public FlexibleStringExpander getTitle() { + return title; + } + + public String getTitleAreaStyle() { + return titleAreaStyle; + } + + public String getTitleStyle() { + return titleStyle; + } + + public FlexibleStringExpander getTooltip() { + return tooltip; + } + + public String getTooltipStyle() { + return tooltipStyle; + } + + public FlexibleStringExpander getUseWhen() { + return useWhen; + } + + public String getWidgetAreaStyle() { + return widgetAreaStyle; + } + + public String getWidgetStyle() { + return widgetStyle; + } + + private boolean induceFieldInfo(ModelForm modelForm, String defaultFieldType, ModelReader entityModelReader, DispatchContext dispatchContext) { + if (induceFieldInfoFromEntityField(defaultFieldType, entityModelReader)) + return true; + if (induceFieldInfoFromServiceParam(defaultFieldType, entityModelReader, dispatchContext)) + return true; + return false; + } + + public boolean induceFieldInfoFromEntityField(ModelEntity modelEntity, ModelField modelField, String defaultFieldType) { + if (modelEntity == null || modelField == null) + return false; + this.entityName = modelEntity.getEntityName(); + this.fieldName = modelField.getName(); + if ("find".equals(defaultFieldType)) { + if ("id".equals(modelField.getType()) || "id-ne".equals(modelField.getType())) { + ModelFormField.TextFindField textField = new ModelFormField.TextFindField(FieldInfo.SOURCE_AUTO_ENTITY, 20, + Integer.valueOf(20), null); + this.setFieldInfo(textField); + } else if ("id-long".equals(modelField.getType()) || "id-long-ne".equals(modelField.getType())) { + ModelFormField.TextFindField textField = new ModelFormField.TextFindField(FieldInfo.SOURCE_AUTO_ENTITY, 40, + Integer.valueOf(60), null); + this.setFieldInfo(textField); + } else if ("id-vlong".equals(modelField.getType()) || "id-vlong-ne".equals(modelField.getType())) { + ModelFormField.TextFindField textField = new ModelFormField.TextFindField(FieldInfo.SOURCE_AUTO_ENTITY, 60, + Integer.valueOf(250), null); + this.setFieldInfo(textField); + } else if ("very-short".equals(modelField.getType())) { + ModelFormField.TextField textField = new ModelFormField.TextField(FieldInfo.SOURCE_AUTO_ENTITY, 6, + Integer.valueOf(10), null); + this.setFieldInfo(textField); + } else if ("name".equals(modelField.getType()) || "short-varchar".equals(modelField.getType())) { + ModelFormField.TextFindField textField = new ModelFormField.TextFindField(FieldInfo.SOURCE_AUTO_ENTITY, 40, + Integer.valueOf(60), null); + this.setFieldInfo(textField); + } else if ("value".equals(modelField.getType()) || "comment".equals(modelField.getType()) + || "description".equals(modelField.getType()) || "long-varchar".equals(modelField.getType()) + || "url".equals(modelField.getType()) || "email".equals(modelField.getType())) { + ModelFormField.TextFindField textField = new ModelFormField.TextFindField(FieldInfo.SOURCE_AUTO_ENTITY, 60, + Integer.valueOf(250), null); + this.setFieldInfo(textField); + } else if ("floating-point".equals(modelField.getType()) || "currency-amount".equals(modelField.getType()) + || "numeric".equals(modelField.getType())) { + ModelFormField.RangeFindField textField = new ModelFormField.RangeFindField(FieldInfo.SOURCE_AUTO_ENTITY, 6, null); + this.setFieldInfo(textField); + } else if ("date-time".equals(modelField.getType()) || "date".equals(modelField.getType()) + || "time".equals(modelField.getType())) { + String type = modelField.getType(); + if ("date-time".equals(modelField.getType())) { + type = "timestamp"; + } + ModelFormField.DateFindField dateTimeField = new ModelFormField.DateFindField(FieldInfo.SOURCE_AUTO_ENTITY, type); + this.setFieldInfo(dateTimeField); + } else { + ModelFormField.TextFindField textField = new ModelFormField.TextFindField(FieldInfo.SOURCE_AUTO_ENTITY, null); + this.setFieldInfo(textField); + } + } else if ("display".equals(defaultFieldType)) { + ModelFormField.DisplayField displayField = new ModelFormField.DisplayField(FieldInfo.SOURCE_AUTO_SERVICE, null); + this.setFieldInfo(displayField); + } else if ("hidden".equals(defaultFieldType)) { + ModelFormField.HiddenField hiddenField = new ModelFormField.HiddenField(FieldInfo.SOURCE_AUTO_SERVICE, null); + this.setFieldInfo(hiddenField); + } else { + if ("id".equals(modelField.getType()) || "id-ne".equals(modelField.getType())) { + ModelFormField.TextField textField = new ModelFormField.TextField(FieldInfo.SOURCE_AUTO_ENTITY, 20, + Integer.valueOf(20), null); + this.setFieldInfo(textField); + } else if ("id-long".equals(modelField.getType()) || "id-long-ne".equals(modelField.getType())) { + ModelFormField.TextField textField = new ModelFormField.TextField(FieldInfo.SOURCE_AUTO_ENTITY, 40, + Integer.valueOf(60), null); + this.setFieldInfo(textField); + } else if ("id-vlong".equals(modelField.getType()) || "id-vlong-ne".equals(modelField.getType())) { + ModelFormField.TextField textField = new ModelFormField.TextField(FieldInfo.SOURCE_AUTO_ENTITY, 60, + Integer.valueOf(250), null); + this.setFieldInfo(textField); + } else if ("indicator".equals(modelField.getType())) { + ArrayList<OptionSource> optionSources = new ArrayList<OptionSource>(); + optionSources.add(new ModelFormField.SingleOption("Y", null, null)); + optionSources.add(new ModelFormField.SingleOption("N", null, null)); + ModelFormField.DropDownField dropDownField = new ModelFormField.DropDownField(FieldInfo.SOURCE_AUTO_ENTITY, + optionSources); + this.setFieldInfo(dropDownField); + } else if ("very-short".equals(modelField.getType())) { + ModelFormField.TextField textField = new ModelFormField.TextField(FieldInfo.SOURCE_AUTO_ENTITY, 6, + Integer.valueOf(10), null); + this.setFieldInfo(textField); + } else if ("very-long".equals(modelField.getType())) { + ModelFormField.TextareaField textareaField = new ModelFormField.TextareaField(FieldInfo.SOURCE_AUTO_ENTITY, null); + this.setFieldInfo(textareaField); + } else if ("name".equals(modelField.getType()) || "short-varchar".equals(modelField.getType())) { + ModelFormField.TextField textField = new ModelFormField.TextField(FieldInfo.SOURCE_AUTO_ENTITY, 40, + Integer.valueOf(60), null); + this.setFieldInfo(textField); + } else if ("value".equals(modelField.getType()) || "comment".equals(modelField.getType()) + || "description".equals(modelField.getType()) || "long-varchar".equals(modelField.getType()) + || "url".equals(modelField.getType()) || "email".equals(modelField.getType())) { + ModelFormField.TextField textField = new ModelFormField.TextField(FieldInfo.SOURCE_AUTO_ENTITY, 60, + Integer.valueOf(250), null); + this.setFieldInfo(textField); + } else if ("floating-point".equals(modelField.getType()) || "currency-amount".equals(modelField.getType()) + || "numeric".equals(modelField.getType())) { + ModelFormField.TextField textField = new ModelFormField.TextField(FieldInfo.SOURCE_AUTO_ENTITY, 6, null, null); + this.setFieldInfo(textField); + } else if ("date-time".equals(modelField.getType()) || "date".equals(modelField.getType()) + || "time".equals(modelField.getType())) { + String type = modelField.getType(); + if ("date-time".equals(modelField.getType())) { + type = "timestamp"; + } + ModelFormField.DateFindField dateTimeField = new ModelFormField.DateFindField(FieldInfo.SOURCE_AUTO_ENTITY, type); + this.setFieldInfo(dateTimeField); + } else { + ModelFormField.TextField textField = new ModelFormField.TextField(FieldInfo.SOURCE_AUTO_ENTITY, null); + this.setFieldInfo(textField); + } + } + + return true; + } + + private boolean induceFieldInfoFromEntityField(String defaultFieldType, ModelReader entityModelReader) { + if (UtilValidate.isEmpty(this.getEntityName()) || UtilValidate.isEmpty(this.getFieldName())) + return false; + try { + ModelEntity modelEntity = entityModelReader.getModelEntity(this.getEntityName()); + if (modelEntity != null) { + ModelField modelField = modelEntity.getField(this.getFieldName()); + if (modelField != null) { + // okay, populate using the entity field info... + this.induceFieldInfoFromEntityField(modelEntity, modelField, defaultFieldType); + return true; + } + } + } catch (GenericEntityException e) { + Debug.logError(e, module); + } + return false; + } + + public boolean induceFieldInfoFromServiceParam(ModelService modelService, ModelParam modelParam, String defaultFieldType) { + if (modelService == null || modelParam == null) + return false; + this.serviceName = modelService.name; + this.attributeName = modelParam.name; + if ("find".equals(defaultFieldType)) { + if (modelParam.type.indexOf("Double") != -1 || modelParam.type.indexOf("Float") != -1 + || modelParam.type.indexOf("Long") != -1 || modelParam.type.indexOf("Integer") != -1) { + ModelFormField.RangeFindField textField = new ModelFormField.RangeFindField(FieldInfo.SOURCE_AUTO_SERVICE, 6, + null); + this.setFieldInfo(textField); + } else if (modelParam.type.indexOf("Timestamp") != -1) { + ModelFormField.DateFindField dateTimeField = new ModelFormField.DateFindField(FieldInfo.SOURCE_AUTO_SERVICE, + "timestamp"); + this.setFieldInfo(dateTimeField); + } else if (modelParam.type.indexOf("Date") != -1) { + ModelFormField.DateFindField dateTimeField = new ModelFormField.DateFindField(FieldInfo.SOURCE_AUTO_SERVICE, + "date"); + this.setFieldInfo(dateTimeField); + } else if (modelParam.type.indexOf("Time") != -1) { + ModelFormField.DateFindField dateTimeField = new ModelFormField.DateFindField(FieldInfo.SOURCE_AUTO_SERVICE, + "time"); + this.setFieldInfo(dateTimeField); + } else { + ModelFormField.TextFindField textField = new ModelFormField.TextFindField(FieldInfo.SOURCE_AUTO_SERVICE, null); + this.setFieldInfo(textField); + } + } else if ("display".equals(defaultFieldType)) { + ModelFormField.DisplayField displayField = new ModelFormField.DisplayField(FieldInfo.SOURCE_AUTO_SERVICE, null); + this.setFieldInfo(displayField); + } else { + // default to "edit" + if (modelParam.type.indexOf("Double") != -1 || modelParam.type.indexOf("Float") != -1 + || modelParam.type.indexOf("Long") != -1 || modelParam.type.indexOf("Integer") != -1) { + ModelFormField.TextField textField = new ModelFormField.TextField(FieldInfo.SOURCE_AUTO_SERVICE, 6, null, null); + this.setFieldInfo(textField); + } else if (modelParam.type.indexOf("Timestamp") != -1) { + ModelFormField.DateTimeField dateTimeField = new ModelFormField.DateTimeField(FieldInfo.SOURCE_AUTO_SERVICE, + "timestamp"); + this.setFieldInfo(dateTimeField); + } else if (modelParam.type.indexOf("Date") != -1) { + ModelFormField.DateTimeField dateTimeField = new ModelFormField.DateTimeField(FieldInfo.SOURCE_AUTO_SERVICE, + "date"); + this.setFieldInfo(dateTimeField); + } else if (modelParam.type.indexOf("Time") != -1) { + ModelFormField.DateTimeField dateTimeField = new ModelFormField.DateTimeField(FieldInfo.SOURCE_AUTO_SERVICE, + "time"); + this.setFieldInfo(dateTimeField); + } else { + ModelFormField.TextField textField = new ModelFormField.TextField(FieldInfo.SOURCE_AUTO_SERVICE, null); + this.setFieldInfo(textField); + } + } + return true; + } + + private boolean induceFieldInfoFromServiceParam(String defaultFieldType, ModelReader entityModelReader, + DispatchContext dispatchContext) { + if (UtilValidate.isEmpty(this.getServiceName()) || UtilValidate.isEmpty(this.getAttributeName())) + return false; + try { + ModelService modelService = dispatchContext.getModelService(this.getServiceName()); + if (modelService != null) { + ModelParam modelParam = modelService.getParam(this.getAttributeName()); + if (modelParam != null) { + if (UtilValidate.isNotEmpty(modelParam.entityName) && UtilValidate.isNotEmpty(modelParam.fieldName)) { + this.entityName = modelParam.entityName; + this.fieldName = modelParam.fieldName; + if (this.induceFieldInfoFromEntityField(defaultFieldType, entityModelReader)) { + return true; + } + } + + this.induceFieldInfoFromServiceParam(modelService, modelParam, defaultFieldType); + return true; + } + } + } catch (GenericServiceException e) { + Debug.logError(e, + "error getting service parameter definition for auto-field with serviceName: " + this.getServiceName() + + ", and attributeName: " + this.getAttributeName(), module); + } + return false; + } + + public void mergeOverrideModelFormField(ModelFormFieldBuilder builder) { + if (builder == null) + return; + if (UtilValidate.isNotEmpty(builder.getName())) + this.name = builder.getName(); + if (UtilValidate.isNotEmpty(builder.getMapAcsr())) + this.mapAcsr = builder.getMapAcsr(); + if (UtilValidate.isNotEmpty(builder.getEntityName())) + this.entityName = builder.getEntityName(); + if (UtilValidate.isNotEmpty(builder.getServiceName())) + this.serviceName = builder.getServiceName(); + if (UtilValidate.isNotEmpty(builder.getEntryAcsr())) + this.entryAcsr = builder.getEntryAcsr(); + if (UtilValidate.isNotEmpty(builder.getParameterName())) + this.parameterName = builder.getParameterName(); + if (UtilValidate.isNotEmpty(builder.getFieldName())) + this.fieldName = builder.getFieldName(); + if (!builder.getAttributeName().isEmpty()) + this.attributeName = builder.getAttributeName(); + if (UtilValidate.isNotEmpty(builder.getTitle())) + this.title = builder.getTitle(); + if (UtilValidate.isNotEmpty(builder.getTooltip())) + this.tooltip = builder.getTooltip(); + if (builder.getSortField() != null) + this.sortField = builder.getSortField(); + if (UtilValidate.isNotEmpty(builder.getSortFieldHelpText())) + this.sortFieldHelpText = builder.getSortFieldHelpText(); + if (UtilValidate.isNotEmpty(builder.getTitleAreaStyle())) + this.titleAreaStyle = builder.getTitleAreaStyle(); + if (UtilValidate.isNotEmpty(builder.getWidgetAreaStyle())) + this.widgetAreaStyle = builder.getWidgetAreaStyle(); + if (UtilValidate.isNotEmpty(builder.getTitleStyle())) + this.titleStyle = builder.getTitleStyle(); + if (UtilValidate.isNotEmpty(builder.getWidgetStyle())) + this.widgetStyle = builder.getWidgetStyle(); + if (UtilValidate.isNotEmpty(builder.getRedWhen())) + this.redWhen = builder.getRedWhen(); + if (UtilValidate.isNotEmpty(builder.getEvent())) + this.event = builder.getEvent(); + if (!builder.getAction().isEmpty()) + this.action = builder.getAction(); + if (UtilValidate.isNotEmpty(builder.getUseWhen())) + this.useWhen = builder.getUseWhen(); + if (builder.getFieldInfo() != null) + this.setFieldInfo(builder.getFieldInfo()); + if (UtilValidate.isNotEmpty(builder.getHeaderLink())) + this.headerLink = builder.getHeaderLink(); + if (UtilValidate.isNotEmpty(builder.getHeaderLinkStyle())) + this.headerLinkStyle = builder.getHeaderLinkStyle(); + if (UtilValidate.isNotEmpty(builder.getIdName())) + this.idName = builder.getIdName(); + if (UtilValidate.isNotEmpty(builder.getOnChangeUpdateAreas())) + this.onChangeUpdateAreas.addAll(builder.getOnChangeUpdateAreas()); + if (UtilValidate.isNotEmpty(builder.getOnClickUpdateAreas())) + this.onClickUpdateAreas.addAll(builder.getOnClickUpdateAreas()); + this.encodeOutput = builder.getEncodeOutput(); + this.position = builder.getPosition(); + this.requiredField = builder.getRequiredField(); + this.separateColumn = builder.getSeparateColumn(); + } + + public ModelFormFieldBuilder setAction(String action) { + this.action = FlexibleStringExpander.getInstance(action); + return this; + } + + public ModelFormFieldBuilder setAttributeName(String attributeName) { + this.attributeName = attributeName; + return this; + } + + public ModelFormFieldBuilder setEncodeOutput(boolean encodeOutput) { + this.encodeOutput = encodeOutput; + return this; + } + + public ModelFormFieldBuilder setEntityName(String entityName) { + this.entityName = entityName; + return this; + } + + public ModelFormFieldBuilder setEntryName(String entryName) { + this.entryAcsr = FlexibleMapAccessor.getInstance(entryName); + return this; + } + + public ModelFormFieldBuilder setEvent(String event) { + this.event = event; + return this; + } + + public ModelFormFieldBuilder setFieldInfo(FieldInfo fieldInfo) { + Debug.logInfo("this.fieldInfo = " + this.fieldInfo + ", fieldInfo = " + fieldInfo, module); + if (fieldInfo != null && (this.fieldInfo == null || (fieldInfo.getFieldSource() <= this.fieldInfo.getFieldSource()))) { + this.fieldInfo = fieldInfo; + } + Debug.logInfo("this.fieldInfo = " + this.fieldInfo + ", fieldInfo = " + fieldInfo, module); + return this; + } + + public ModelFormFieldBuilder setFieldName(String fieldName) { + this.fieldName = fieldName; + return this; + } + + public ModelFormFieldBuilder setFieldType(String fieldType) { + this.fieldType = fieldType; + return this; + } + + public ModelFormFieldBuilder setHeaderLink(String headerLink) { + this.headerLink = headerLink; + return this; + } + + public ModelFormFieldBuilder setHeaderLinkStyle(String headerLinkStyle) { + this.headerLinkStyle = headerLinkStyle; + return this; + } + + public ModelFormFieldBuilder setIdName(String idName) { + this.idName = idName; + return this; + } + + public ModelFormFieldBuilder setMapName(String mapName) { + this.mapAcsr = FlexibleMapAccessor.getInstance(mapName); + return this; + } + + public ModelFormFieldBuilder setModelForm(ModelForm modelForm) { + this.modelForm = modelForm; + return this; + } + + public ModelFormFieldBuilder setName(String name) { + this.name = name; + return this; + } + + public ModelFormFieldBuilder setParameterName(String parameterName) { + this.parameterName = parameterName; + return this; + } + + public ModelFormFieldBuilder setPosition(Integer position) { + this.position = position; + return this; + } + + public ModelFormFieldBuilder setRedWhen(String redWhen) { + this.redWhen = redWhen; + return this; + } + + public ModelFormFieldBuilder setRequiredField(Boolean requiredField) { + this.requiredField = requiredField; + return this; + } + + public ModelFormFieldBuilder setRequiredFieldStyle(String requiredFieldStyle) { + this.requiredFieldStyle = requiredFieldStyle; + return this; + } + + public ModelFormFieldBuilder setSeparateColumn(boolean separateColumn) { + this.separateColumn = separateColumn; + return this; + } + + public ModelFormFieldBuilder setServiceName(String serviceName) { + this.serviceName = serviceName; + return this; + } + + public ModelFormFieldBuilder setSortField(Boolean sortField) { + this.sortField = sortField; + return this; + } + + public ModelFormFieldBuilder setSortFieldAscStyle(String sortFieldAscStyle) { + this.sortFieldAscStyle = sortFieldAscStyle; + return this; + } + + public ModelFormFieldBuilder setSortFieldDescStyle(String sortFieldDescStyle) { + this.sortFieldDescStyle = sortFieldDescStyle; + return this; + } + + public ModelFormFieldBuilder setSortFieldHelpText(String sortFieldHelpText) { + this.sortFieldHelpText = sortFieldHelpText; + return this; + } + + public ModelFormFieldBuilder setSortFieldStyle(String sortFieldStyle) { + this.sortFieldStyle = sortFieldStyle; + return this; + } + + public ModelFormFieldBuilder setTitle(String title) { + this.title = FlexibleStringExpander.getInstance(title); + return this; + } + + public ModelFormFieldBuilder setTitleAreaStyle(String titleAreaStyle) { + this.titleAreaStyle = titleAreaStyle; + return this; + } + + public ModelFormFieldBuilder setTitleStyle(String titleStyle) { + this.titleStyle = titleStyle; + return this; + } + + public ModelFormFieldBuilder setTooltip(String tooltip) { + this.tooltip = FlexibleStringExpander.getInstance(tooltip); + return this; + } + + public ModelFormFieldBuilder setTooltipStyle(String tooltipStyle) { + this.tooltipStyle = tooltipStyle; + return this; + } + + public ModelFormFieldBuilder setUseWhen(String useWhen) { + this.useWhen = FlexibleStringExpander.getInstance(useWhen); + return this; + } + + public ModelFormFieldBuilder setWidgetAreaStyle(String widgetAreaStyle) { + this.widgetAreaStyle = widgetAreaStyle; + return this; + } + + public ModelFormFieldBuilder setWidgetStyle(String widgetStyle) { + this.widgetStyle = widgetStyle; + return this; + } +}