📄 modelform.java
字号:
/*
* $Id: ModelForm.java,v 1.6 2004/01/17 03:57:46 byersa Exp $
*
* Copyright (c) 2003 The Open For Business Project - www.ofbiz.org
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
* OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package org.ofbiz.content.widget.form;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import org.ofbiz.base.util.BshUtil;
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.FlexibleMapAccessor;
import org.ofbiz.base.util.UtilValidate;
import org.ofbiz.base.util.UtilXml;
import org.ofbiz.entity.GenericDelegator;
import org.ofbiz.entity.model.ModelEntity;
import org.ofbiz.entity.model.ModelField;
import org.ofbiz.service.GenericServiceException;
import org.ofbiz.service.LocalDispatcher;
import org.ofbiz.service.ModelParam;
import org.ofbiz.service.ModelService;
import org.w3c.dom.Element;
import bsh.EvalError;
import bsh.Interpreter;
/**
* Widget Library - Form model class
*
* @author <a href="mailto:jonesde@ofbiz.org">David E. Jones</a>
* @author <a href="mailto:byersa@automationgroups.com">Al Byers</a>
* @version $Revision: 1.6 $
* @since 2.2
*/
public class ModelForm {
public static final String module = ModelForm.class.getName();
protected GenericDelegator delegator;
protected LocalDispatcher dispatcher;
protected String name;
protected String type;
protected String target;
protected String title;
protected String tooltip;
protected String listName;
protected String listEntryName;
protected FlexibleMapAccessor defaultMapName;
protected String defaultEntityName;
protected String defaultServiceName;
protected String defaultTitleStyle;
protected String defaultWidgetStyle;
protected String defaultTooltipStyle;
protected String itemIndexSeparator;
protected String paginateTarget;
protected List altTargets = new LinkedList();
protected List autoFieldsServices = new LinkedList();
protected List autoFieldsEntities = new LinkedList();
protected List sortOrderFields = new LinkedList();
/** This List will contain one copy of each field for each field name in the order
* they were encountered in the service, entity, or form definition; field definitions
* with constraints will also be in this list but may appear multiple times for the same
* field name.
*
* When rendering the form the order in this list should be following and it should not be
* necessary to use the Map. The Map is used when loading the form definition to keep the
* list clean and implement the override features for field definitions.
*/
protected List fieldList = new LinkedList();
/** This Map is keyed with the field name and has a ModelFormField for the value; fields
* with conditions will not be put in this Map so field definition overrides for fields
* with conditions is not possible.
*/
protected Map fieldMap = new HashMap();
// ===== CONSTRUCTORS =====
/** Default Constructor */
public ModelForm() {}
/** XML Constructor */
public ModelForm(Element formElement, GenericDelegator delegator, LocalDispatcher dispatcher) {
this.delegator = delegator;
this.dispatcher = dispatcher;
// check if there is a parent form to inherit from
String parentResource = formElement.getAttribute("extends-resource");
String parentForm = formElement.getAttribute("extends");
//TODO: Modify this to allow for extending a form with the same name but different resource
if (parentForm.length() > 0 && !parentForm.equals(formElement.getAttribute("name"))) {
ModelForm parent = null;
// check if we have a resource name (part of the string before the ?)
if (parentResource.length() > 0) {
try {
parent = FormFactory.getFormFromClass(parentResource, parentForm, delegator, dispatcher);
} catch (Exception e) {
Debug.logError(e, "Failed to load parent form definition '" + parentForm + "' at resource '" + parentResource + "'", module);
}
} else {
// try to find a form definition in the same file
Element rootElement = formElement.getOwnerDocument().getDocumentElement();
List formElements = UtilXml.childElementList(rootElement, "form");
//Uncomment below to add support for abstract forms
//formElements.addAll(UtilXml.childElementList(rootElement, "abstract-form"));
Iterator formElementIter = formElements.iterator();
while (formElementIter.hasNext()) {
Element formElementEntry = (Element) formElementIter.next();
if (formElementEntry.getAttribute("name").equals(parentForm)) {
parent = new ModelForm(formElementEntry, delegator, dispatcher);
break;
}
}
if (parent == null) {
Debug.logError("Failed to find parent form defenition '" + parentForm + "' in same document.", module);
}
}
if (parent != null) {
this.type = parent.type;
this.target = parent.target;
this.title = parent.title;
this.tooltip = parent.tooltip;
this.listName = parent.listName;
this.listEntryName = parent.listEntryName;
this.tooltip = parent.tooltip;
this.defaultEntityName = parent.defaultEntityName;
this.defaultServiceName = parent.defaultServiceName;
this.defaultTitleStyle = parent.defaultTitleStyle;
this.defaultWidgetStyle = parent.defaultWidgetStyle;
this.defaultTooltipStyle = parent.defaultTooltipStyle;
this.itemIndexSeparator = parent.itemIndexSeparator;
this.fieldList = parent.fieldList;
this.fieldMap = parent.fieldMap;
}
}
this.name = formElement.getAttribute("name");
if (this.type == null || formElement.hasAttribute("type"))
this.type = formElement.getAttribute("type");
if (this.target == null || formElement.hasAttribute("target"))
this.target = formElement.getAttribute("target");
if (this.title == null || formElement.hasAttribute("title"))
this.title = formElement.getAttribute("title");
if (this.tooltip == null || formElement.hasAttribute("tooltip"))
this.tooltip = formElement.getAttribute("tooltip");
if (this.listName == null || formElement.hasAttribute("listName"))
this.listName = formElement.getAttribute("list-name");
if (this.listEntryName == null || formElement.hasAttribute("listEntryName"))
this.listEntryName = formElement.getAttribute("list-entry-name");
if (this.defaultMapName == null || formElement.hasAttribute("default-map-name"))
this.setDefaultMapName(formElement.getAttribute("default-map-name"));
if (this.defaultEntityName == null || formElement.hasAttribute("defaultEntityName"))
this.defaultEntityName = formElement.getAttribute("default-entity-name");
if (this.defaultServiceName == null || formElement.hasAttribute("defaultServiceName"))
this.defaultServiceName = formElement.getAttribute("default-service-name");
if (this.defaultTitleStyle == null || formElement.hasAttribute("defaultTitleStyle"))
this.defaultTitleStyle = formElement.getAttribute("default-title-style");
if (this.defaultWidgetStyle == null || formElement.hasAttribute("defaultWidgetStyle"))
this.defaultWidgetStyle = formElement.getAttribute("default-widget-style");
if (this.defaultTooltipStyle == null || formElement.hasAttribute("defaultTooltipStyle"))
this.defaultTooltipStyle = formElement.getAttribute("default-tooltip-style");
if (this.itemIndexSeparator == null || formElement.hasAttribute("itemIndexSeparator"))
this.itemIndexSeparator = formElement.getAttribute("item-index-separator");
if (this.paginateTarget == null || formElement.hasAttribute("paginateTarget"))
this.paginateTarget = formElement.getAttribute("paginate-target");
// alt-target
List altTargetElements = UtilXml.childElementList(formElement, "alt-target");
Iterator altTargetElementIter = altTargetElements.iterator();
while (altTargetElementIter.hasNext()) {
Element altTargetElement = (Element) altTargetElementIter.next();
AltTarget altTarget = new AltTarget(altTargetElement);
this.addAltTarget(altTarget);
}
// auto-fields-service
List autoFieldsServiceElements = UtilXml.childElementList(formElement, "auto-fields-service");
Iterator autoFieldsServiceElementIter = autoFieldsServiceElements.iterator();
while (autoFieldsServiceElementIter.hasNext()) {
Element autoFieldsServiceElement = (Element) autoFieldsServiceElementIter.next();
AutoFieldsService autoFieldsService = new AutoFieldsService(autoFieldsServiceElement);
this.addAutoFieldsFromService(autoFieldsService, dispatcher);
}
// auto-fields-entity
List autoFieldsEntityElements = UtilXml.childElementList(formElement, "auto-fields-entity");
Iterator autoFieldsEntityElementIter = autoFieldsEntityElements.iterator();
while (autoFieldsEntityElementIter.hasNext()) {
Element autoFieldsEntityElement = (Element) autoFieldsEntityElementIter.next();
AutoFieldsEntity autoFieldsEntity = new AutoFieldsEntity(autoFieldsEntityElement);
this.addAutoFieldsFromEntity(autoFieldsEntity, delegator);
}
// read in add field defs, add/override one by one using the fieldList and fieldMap
List fieldElements = UtilXml.childElementList(formElement, "field");
Iterator fieldElementIter = fieldElements.iterator();
while (fieldElementIter.hasNext()) {
Element fieldElement = (Element) fieldElementIter.next();
ModelFormField modelFormField = new ModelFormField(fieldElement, this);
modelFormField = this.addUpdateField(modelFormField);
//Debug.logInfo("Added field " + modelFormField.getName() + " from def, mapName=" + modelFormField.getMapName(), module);
}
// get the sort-order
Element sortOrderElement = UtilXml.firstChildElement(formElement, "sort-order");
if (sortOrderElement != null) {
// read in sort-field
List sortFieldElements = UtilXml.childElementList(sortOrderElement, "sort-field");
Iterator sortFieldElementIter = sortFieldElements.iterator();
while (sortFieldElementIter.hasNext()) {
Element sortFieldElement = (Element) sortFieldElementIter.next();
this.sortOrderFields.add(sortFieldElement.getAttribute("name"));
}
}
// reorder fields according to sort order
if (sortOrderFields.size() > 0) {
List sortedFields = new ArrayList(this.fieldList.size());
Iterator sortOrderFieldIter = this.sortOrderFields.iterator();
while (sortOrderFieldIter.hasNext()) {
String fieldName = (String) sortOrderFieldIter.next();
if (UtilValidate.isEmpty(fieldName)) {
continue;
}
// get all fields with the given name from the existing list and put them in the sorted list
Iterator fieldIter = this.fieldList.iterator();
while (fieldIter.hasNext()) {
ModelFormField modelFormField = (ModelFormField) fieldIter.next();
if (fieldName.equals(modelFormField.getName())) {
// matched the name; remove from the original last and add to the sorted list
fieldIter.remove();
sortedFields.add(modelFormField);
}
}
}
// now add all of the rest of the fields from fieldList, ie those that were not explicitly listed in the sort order
sortedFields.addAll(this.fieldList);
// sortedFields all done, set fieldList
this.fieldList = sortedFields;
}
}
/**
* add/override modelFormField using the fieldList and fieldMap
*
* @return The same ModelFormField, or if merged with an existing field, the existing field.
*/
public ModelFormField addUpdateField(ModelFormField modelFormField) {
if (!modelFormField.isUseWhenEmpty()) {
// 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 < this.fieldList.size(); i++) {
ModelFormField curField = (ModelFormField) this.fieldList.get(i);
if (curField.getName() != null && curField.getName().equals(modelFormField.getName())) {
this.fieldList.add(i, modelFormField);
inserted = true;
break;
}
}
if (!inserted) {
this.fieldList.add(modelFormField);
}
return modelFormField;
} else {
// not a conditional field, see if a named field exists in Map
ModelFormField existingField = (ModelFormField) this.fieldMap.get(modelFormField.getName());
if (existingField != null) {
// does exist, update the field by doing a merge/override
existingField.mergeOverrideModelFormField(modelFormField);
return existingField;
} else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -