📄 modelentity.java
字号:
/*
* $Id: ModelEntity.java,v 1.12 2004/02/06 22:14:09 jonesde Exp $
*
* Copyright (c) 2001, 2002 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.entity.model;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.UtilTimer;
import org.ofbiz.base.util.UtilXml;
import org.ofbiz.entity.config.EntityConfigUtil;
import org.ofbiz.entity.jdbc.DatabaseUtil;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
/**
* Generic Entity - Entity model class
*
* @author <a href="mailto:jonesde@ofbiz.org">David E. Jones</a>
* @author <a href="mailto:jaz@ofbiz.org">Andy Zeneski</a>
* @version $Revision: 1.12 $
* @since 2.0
*/
public class ModelEntity implements Comparable {
public static final String module = ModelEntity.class.getName();
/** The name of the time stamp field for locking/syncronization */
public static final String STAMP_FIELD = "lastUpdatedStamp";
public static final String STAMP_TX_FIELD = "lastUpdatedTxStamp";
public static final String CREATE_STAMP_FIELD = "createdStamp";
public static final String CREATE_STAMP_TX_FIELD = "createdTxStamp";
/** The ModelReader that created this Entity */
protected ModelReader modelReader = null;
/** The entity-name of the Entity */
protected String entityName = "";
/** The table-name of the Entity */
protected String tableName = "";
/** The package-name of the Entity */
protected String packageName = "";
/** The default-resource-name of the Entity, used with the getResource call to check for a value in a resource bundle */
protected String defaultResourceName = "";
/** The entity-name of the Entity that this Entity is dependent on, if empty then no dependency */
protected String dependentOn = "";
// Strings to go in the comment header.
/** The title for documentation purposes */
protected String title = "";
/** The description for documentation purposes */
protected String description = "";
/** The copyright for documentation purposes */
protected String copyright = "";
/** The author for documentation purposes */
protected String author = "";
/** The version for documentation purposes */
protected String version = "";
/** A List of the Field objects for the Entity */
protected List fields = new ArrayList();
protected Map fieldsMap = null;
/** A List of the Field objects for the Entity, one for each Primary Key */
protected List pks = new ArrayList();
/** A List of the Field objects for the Entity, one for each NON Primary Key */
protected List nopks = new ArrayList();
/** relations defining relationships between this entity and other entities */
protected List relations = new ArrayList();
/** indexes on fields/columns in this entity */
protected List indexes = new ArrayList();
/** An indicator to specify if this entity requires locking for updates */
protected boolean doLock = false;
/** Can be used to disable automatically creating update stamp fields and populating them on inserts and updates */
protected boolean noAutoStamp = false;
/** An indicator to specify if this entity is never cached.
* If true causes the delegator to not clear caches on write and to not get
* from cache on read showing a warning messages to that effect
*/
protected boolean neverCache = false;
// ===== CONSTRUCTORS =====
/** Default Constructor */
public ModelEntity() {}
/** XML Constructor */
public ModelEntity(ModelReader reader, Element entityElement, Element docElement, UtilTimer utilTimer, Hashtable docElementValues) {
this.modelReader = reader;
if (utilTimer != null) utilTimer.timerString(" createModelEntity: before general/basic info");
this.populateBasicInfo(entityElement, docElement, docElementValues);
if (utilTimer != null) utilTimer.timerString(" createModelEntity: before fields");
NodeList fieldList = entityElement.getElementsByTagName("field");
for (int i = 0; i < fieldList.getLength(); i++) {
ModelField field = reader.createModelField((Element) fieldList.item(i), docElement, docElementValues);
if (field != null) this.fields.add(field);
}
// if applicable automatically add the STAMP_FIELD and STAMP_TX_FIELD fields
if ((this.doLock || !this.noAutoStamp) && !this.isField(STAMP_FIELD)) {
ModelField newField = reader.createModelField(STAMP_FIELD, "date-time", null, false);
newField.setIsAutoCreatedInternal(true);
this.fields.add(newField);
}
if (!this.noAutoStamp && !this.isField(STAMP_TX_FIELD)) {
ModelField newField = reader.createModelField(STAMP_TX_FIELD, "date-time", null, false);
newField.setIsAutoCreatedInternal(true);
this.fields.add(newField);
// also add an index for this field
String indexName = ModelUtil.shortenDbName(this.tableName + "_TXSTMP", 18);
ModelIndex txIndex = new ModelIndex(this, indexName, false);
txIndex.addIndexField(ModelEntity.STAMP_TX_FIELD);
indexes.add(txIndex);
}
// if applicable automatically add the CREATE_STAMP_FIELD and CREATE_STAMP_TX_FIELD fields
if ((this.doLock || !this.noAutoStamp) && !this.isField(CREATE_STAMP_FIELD)) {
ModelField newField = reader.createModelField(CREATE_STAMP_FIELD, "date-time", null, false);
newField.setIsAutoCreatedInternal(true);
this.fields.add(newField);
}
if (!this.noAutoStamp && !this.isField(CREATE_STAMP_TX_FIELD)) {
ModelField newField = reader.createModelField(CREATE_STAMP_TX_FIELD, "date-time", null, false);
newField.setIsAutoCreatedInternal(true);
this.fields.add(newField);
// also add an index for this field
String indexName = ModelUtil.shortenDbName(this.tableName + "_TXCRTS", 18);
ModelIndex txIndex = new ModelIndex(this, indexName, false);
txIndex.addIndexField(ModelEntity.CREATE_STAMP_TX_FIELD);
indexes.add(txIndex);
}
if (utilTimer != null) utilTimer.timerString(" createModelEntity: before prim-keys");
NodeList pkList = entityElement.getElementsByTagName("prim-key");
for (int i = 0; i < pkList.getLength(); i++) {
ModelField field = reader.findModelField(this, ((Element) pkList.item(i)).getAttribute("field"));
if (field != null) {
this.pks.add(field);
field.isPk = true;
} else {
Debug.logError("[ModelReader.createModelEntity] ERROR: Could not find field \"" +
((Element) pkList.item(i)).getAttribute("field") + "\" specified in a prim-key", module);
}
}
// now that we have the pks and the fields, make the nopks vector
this.nopks = new ArrayList();
for (int ind = 0; ind < this.fields.size(); ind++) {
ModelField field = (ModelField) this.fields.get(ind);
if (!field.isPk) this.nopks.add(field);
}
if (utilTimer != null) utilTimer.timerString(" createModelEntity: before relations");
this.populateRelated(reader, entityElement);
this.populateIndexes(entityElement);
}
/** DB Names Constructor */
public ModelEntity(String tableName, List colList, ModelFieldTypeReader modelFieldTypeReader, boolean isCaseSensitive) {
// if there is a dot in the name, remove it and everything before it, should be the schema name
this.tableName = tableName;
int dotIndex = this.tableName.indexOf(".");
if (dotIndex >= 0) {
this.tableName = this.tableName.substring(dotIndex + 1);
}
this.entityName = ModelUtil.dbNameToClassName(this.tableName);
Iterator columns = colList.iterator();
while (columns.hasNext()) {
DatabaseUtil.ColumnCheckInfo ccInfo = (DatabaseUtil.ColumnCheckInfo) columns.next();
ModelField newField = new ModelField(ccInfo, modelFieldTypeReader);
this.fields.add(newField);
}
this.updatePkLists();
}
protected void populateBasicInfo(Element entityElement, Element docElement, Hashtable docElementValues) {
this.entityName = UtilXml.checkEmpty(entityElement.getAttribute("entity-name"));
this.tableName = UtilXml.checkEmpty(entityElement.getAttribute("table-name"), ModelUtil.javaNameToDbName(this.entityName));
this.packageName = UtilXml.checkEmpty(entityElement.getAttribute("package-name"));
this.defaultResourceName = UtilXml.checkEmpty(entityElement.getAttribute("default-resource-name"));
this.dependentOn = UtilXml.checkEmpty(entityElement.getAttribute("dependent-on"));
this.doLock = UtilXml.checkBoolean(entityElement.getAttribute("enable-lock"), false);
this.noAutoStamp = UtilXml.checkBoolean(entityElement.getAttribute("no-auto-stamp"), false);
this.neverCache = UtilXml.checkBoolean(entityElement.getAttribute("never-cache"), false);
if (docElementValues == null) {
this.title = UtilXml.checkEmpty(entityElement.getAttribute("title"), UtilXml.childElementValue(docElement, "title"), "None");
this.description = UtilXml.checkEmpty(UtilXml.childElementValue(entityElement, "description"), UtilXml.childElementValue(docElement, "description"), "None");
this.copyright = UtilXml.checkEmpty(entityElement.getAttribute("copyright"), UtilXml.childElementValue(docElement, "copyright"), "Copyright (c) 2001 The Open For Business Project - www.ofbiz.org");
this.author = UtilXml.checkEmpty(entityElement.getAttribute("author"), UtilXml.childElementValue(docElement, "author"), "None");
this.version = UtilXml.checkEmpty(entityElement.getAttribute("version"), UtilXml.childElementValue(docElement, "version"), "1.0");
} else {
if (!docElementValues.containsKey("title")) docElementValues.put("title", UtilXml.childElementValue(docElement, "title"));
if (!docElementValues.containsKey("description")) docElementValues.put("description", UtilXml.childElementValue(docElement, "description"));
if (!docElementValues.containsKey("copyright")) docElementValues.put("copyright", UtilXml.childElementValue(docElement, "copyright"));
if (!docElementValues.containsKey("author")) docElementValues.put("author", UtilXml.childElementValue(docElement, "author"));
if (!docElementValues.containsKey("version")) docElementValues.put("version", UtilXml.childElementValue(docElement, "version"));
this.title = UtilXml.checkEmpty(entityElement.getAttribute("title"), (String) docElementValues.get("title"), "None");
this.description = UtilXml.checkEmpty(UtilXml.childElementValue(entityElement, "description"), (String) docElementValues.get("description"), "None");
this.copyright = UtilXml.checkEmpty(entityElement.getAttribute("copyright"), (String) docElementValues.get("copyright"), "Copyright (c) 2001 The Open For Business Project - www.ofbiz.org");
this.author = UtilXml.checkEmpty(entityElement.getAttribute("author"), (String) docElementValues.get("author"), "None");
this.version = UtilXml.checkEmpty(entityElement.getAttribute("version"), (String) docElementValues.get("version"), "1.0");
}
}
protected void populateRelated(ModelReader reader, Element entityElement) {
NodeList relationList = entityElement.getElementsByTagName("relation");
for (int i = 0; i < relationList.getLength(); i++) {
Element relationElement = (Element) relationList.item(i);
if (relationElement.getParentNode() == entityElement) {
ModelRelation relation = reader.createRelation(this, relationElement);
if (relation != null) this.relations.add(relation);
}
}
}
protected void populateIndexes(Element entityElement) {
NodeList indexList = entityElement.getElementsByTagName("index");
for (int i = 0; i < indexList.getLength(); i++) {
Element indexElement = (Element) indexList.item(i);
if (indexElement.getParentNode() == entityElement) {
ModelIndex index = new ModelIndex(this, indexElement);
this.indexes.add(index);
}
}
}
// ===== GETTERS/SETTERS =====
public ModelReader getModelReader() {
return modelReader;
}
/** The entity-name of the Entity */
public String getEntityName() {
return this.entityName;
}
public void setEntityName(String entityName) {
this.entityName = entityName;
}
/** The plain table-name of the Entity without a schema name prefix */
public String getPlainTableName() {
return this.tableName;
}
/** The table-name of the Entity including a Schema name if specified in the datasource config */
public String getTableName(String helperName) {
return getTableName(EntityConfigUtil.getDatasourceInfo(helperName));
}
/** The table-name of the Entity including a Schema name if specified in the datasource config */
public String getTableName(EntityConfigUtil.DatasourceInfo datasourceInfo) {
if (datasourceInfo != null && datasourceInfo.schemaName != null && datasourceInfo.schemaName.length() > 0) {
return datasourceInfo.schemaName + "." + this.tableName;
} else {
return this.tableName;
}
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
/** The package-name of the Entity */
public String getPackageName() {
return this.packageName;
}
public void setPackageName(String packageName) {
this.packageName = packageName;
}
/** The default-resource-name of the Entity */
public String getDefaultResourceName() {
return this.defaultResourceName;
}
public void setDefaultResourceName(String defaultResourceName) {
this.defaultResourceName = defaultResourceName;
}
/** The entity-name of the Entity that this Entity is dependent on, if empty then no dependency */
public String getDependentOn() {
return this.dependentOn;
}
public void setDependentOn(String dependentOn) {
this.dependentOn = dependentOn;
}
// Strings to go in the comment header.
/** The title for documentation purposes */
public String getTitle() {
return this.title;
}
public void setTitle(String title) {
this.title = title;
}
/** The description for documentation purposes */
public String getDescription() {
return this.description;
}
public void setDescription(String description) {
this.description = description;
}
/** The copyright for documentation purposes */
public String getCopyright() {
return this.copyright;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -