Author: jonesde
Date: Thu Jul 2 06:43:50 2009 New Revision: 790472 URL: http://svn.apache.org/viewvc?rev=790472&view=rev Log: Added ability to specify an entity-condition as part of a view-entity in order to encapsulate a full query definition in a view-entity Modified: ofbiz/trunk/framework/entity/dtd/entitymodel.xsd ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericDelegator.java ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java ofbiz/trunk/framework/entity/src/org/ofbiz/entity/finder/ByConditionFinder.java ofbiz/trunk/framework/entity/src/org/ofbiz/entity/finder/EntityFinderUtil.java ofbiz/trunk/framework/entity/src/org/ofbiz/entity/finder/Finder.java ofbiz/trunk/framework/entity/src/org/ofbiz/entity/finder/ListFinder.java ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelEntity.java ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelViewEntity.java ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/entityops/EntityCount.java ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormField.java Modified: ofbiz/trunk/framework/entity/dtd/entitymodel.xsd URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/dtd/entitymodel.xsd?rev=790472&r1=790471&r2=790472&view=diff ============================================================================== --- ofbiz/trunk/framework/entity/dtd/entitymodel.xsd (original) +++ ofbiz/trunk/framework/entity/dtd/entitymodel.xsd Thu Jul 2 06:43:50 2009 @@ -60,12 +60,12 @@ </xs:element> <!-- see the children of entitymodel section for description, etc. --> <xs:attributeGroup name="attlist.entity"> - <xs:attribute type="xs:string" name="entity-name" use="required"/> - <xs:attribute type="xs:string" name="table-name"/> - <xs:attribute type="xs:string" name="package-name" use="required"/> - <xs:attribute type="xs:string" name="default-resource-name"/> - <xs:attribute type="xs:string" name="dependent-on"/> - <xs:attribute type="xs:string" name="sequence-bank-size"/> + <xs:attribute name="entity-name" type="xs:string" use="required"/> + <xs:attribute name="table-name" type="xs:string"/> + <xs:attribute name="package-name" type="xs:string" use="required"/> + <xs:attribute name="default-resource-name" type="xs:string"/> + <xs:attribute name="dependent-on" type="xs:string"/> + <xs:attribute name="sequence-bank-size" type="xs:string"/> <xs:attribute name="enable-lock" default="false"> <xs:simpleType> <xs:restriction base="xs:token"> @@ -98,10 +98,10 @@ </xs:restriction> </xs:simpleType> </xs:attribute> - <xs:attribute type="xs:string" name="title"/> - <xs:attribute type="xs:string" name="copyright"/> - <xs:attribute type="xs:string" name="author"/> - <xs:attribute type="xs:string" name="version"/> + <xs:attribute name="title" type="xs:string"/> + <xs:attribute name="copyright" type="xs:string"/> + <xs:attribute name="author" type="xs:string"/> + <xs:attribute name="version" type="xs:string"/> </xs:attributeGroup> <xs:element name="prim-key"> <xs:complexType> @@ -109,7 +109,7 @@ </xs:complexType> </xs:element> <xs:attributeGroup name="attlist.prim-key"> - <xs:attribute type="xs:string" name="field" use="required"/> + <xs:attribute name="field" type="xs:string" use="required"/> </xs:attributeGroup> <!-- ==================== field ===================== --> <xs:element name="field"> @@ -122,9 +122,9 @@ </xs:complexType> </xs:element> <xs:attributeGroup name="attlist.field"> - <xs:attribute type="xs:string" name="name" use="required"/> - <xs:attribute type="xs:string" name="col-name"/> - <xs:attribute type="xs:string" name="type" use="required"/> + <xs:attribute name="name" type="xs:string" use="required"/> + <xs:attribute name="col-name" type="xs:string"/> + <xs:attribute name="type" type="xs:string" use="required"/> <xs:attribute name="encrypt" default="false"> <xs:simpleType> <xs:restriction base="xs:token"> @@ -171,7 +171,7 @@ </xs:complexType> </xs:element> <xs:attributeGroup name="attlist.validate"> - <xs:attribute type="xs:string" name="name" use="required"/> + <xs:attribute name="name" type="xs:string" use="required"/> </xs:attributeGroup> <!-- ==================== relation ====================== --> <!-- specifies whether or not the relation is a dependent one; ie if the related entity can exist without the main entity --> @@ -194,9 +194,9 @@ </xs:restriction> </xs:simpleType> </xs:attribute> - <xs:attribute type="xs:string" name="title"/> - <xs:attribute type="xs:string" name="rel-entity-name" use="required"/> - <xs:attribute type="xs:string" name="fk-name"/> + <xs:attribute name="title" type="xs:string"/> + <xs:attribute name="rel-entity-name" type="xs:string" use="required"/> + <xs:attribute name="fk-name" type="xs:string"/> </xs:attributeGroup> <xs:element name="key-map"> <xs:complexType> @@ -204,8 +204,8 @@ </xs:complexType> </xs:element> <xs:attributeGroup name="attlist.key-map"> - <xs:attribute type="xs:string" name="field-name" use="required"/> - <xs:attribute type="xs:string" name="rel-field-name"/> + <xs:attribute name="field-name" type="xs:string" use="required"/> + <xs:attribute name="rel-field-name" type="xs:string"/> </xs:attributeGroup> <!-- ==================== index ===================== --> <xs:element name="index"> @@ -218,7 +218,7 @@ </xs:complexType> </xs:element> <xs:attributeGroup name="attlist.index"> - <xs:attribute type="xs:string" name="name" use="required"/> + <xs:attribute name="name" type="xs:string" use="required"/> <xs:attribute name="unique" default="false"> <xs:simpleType> <xs:restriction base="xs:token"> @@ -234,8 +234,9 @@ </xs:complexType> </xs:element> <xs:attributeGroup name="attlist.index-field"> - <xs:attribute type="xs:string" name="name" use="required"/> + <xs:attribute name="name" type="xs:string" use="required"/> </xs:attributeGroup> + <!-- ================== view-entity ===================== --> <xs:element name="view-entity"> <xs:complexType> @@ -246,16 +247,17 @@ <xs:element minOccurs="0" maxOccurs="unbounded" ref="alias"/> <xs:element minOccurs="0" maxOccurs="unbounded" ref="view-link"/> <xs:element minOccurs="0" maxOccurs="unbounded" ref="relation"/> + <xs:element minOccurs="0" ref="entity-condition"/> </xs:sequence> <xs:attributeGroup ref="attlist.view-entity"/> </xs:complexType> </xs:element> <!-- see the children of entitymodel section for description, etc. --> <xs:attributeGroup name="attlist.view-entity"> - <xs:attribute type="xs:string" name="entity-name" use="required"/> - <xs:attribute type="xs:string" name="package-name" use="required"/> - <xs:attribute type="xs:string" name="dependent-on"/> - <xs:attribute type="xs:string" name="default-resource-name"/> + <xs:attribute name="entity-name" type="xs:string" use="required"/> + <xs:attribute name="package-name" type="xs:string" use="required"/> + <xs:attribute name="dependent-on" type="xs:string"/> + <xs:attribute name="default-resource-name" type="xs:string"/> <xs:attribute name="never-cache" default="false"> <xs:simpleType> <xs:restriction base="xs:token"> @@ -272,10 +274,10 @@ </xs:restriction> </xs:simpleType> </xs:attribute> - <xs:attribute type="xs:string" name="title"/> - <xs:attribute type="xs:string" name="copyright"/> - <xs:attribute type="xs:string" name="author"/> - <xs:attribute type="xs:string" name="version"/> + <xs:attribute name="title" type="xs:string"/> + <xs:attribute name="copyright" type="xs:string"/> + <xs:attribute name="author" type="xs:string"/> + <xs:attribute name="version" type="xs:string"/> </xs:attributeGroup> <xs:element name="member-entity"> <xs:complexType> @@ -286,8 +288,8 @@ </xs:complexType> </xs:element> <xs:attributeGroup name="attlist.member-entity"> - <xs:attribute type="xs:string" name="entity-alias" use="required"/> - <xs:attribute type="xs:string" name="entity-name" use="required"/> + <xs:attribute name="entity-alias" type="xs:string" use="required"/> + <xs:attribute name="entity-name" type="xs:string" use="required"/> </xs:attributeGroup> <xs:element name="alias-all"> <xs:complexType> @@ -299,8 +301,8 @@ </xs:complexType> </xs:element> <xs:attributeGroup name="attlist.alias-all"> - <xs:attribute type="xs:string" name="entity-alias" use="required"/> - <xs:attribute type="xs:string" name="prefix"/> + <xs:attribute name="entity-alias" type="xs:string" use="required"/> + <xs:attribute name="prefix" type="xs:string"/> <xs:attribute name="group-by" default="false"> <xs:simpleType> <xs:restriction base="xs:token"> @@ -330,7 +332,7 @@ </xs:complexType> </xs:element> <xs:attributeGroup name="attlist.exclude"> - <xs:attribute type="xs:string" name="field" use="required"/> + <xs:attribute name="field" type="xs:string" use="required"/> </xs:attributeGroup> <xs:element name="alias"> <xs:complexType> @@ -342,11 +344,11 @@ </xs:complexType> </xs:element> <xs:attributeGroup name="attlist.alias"> - <xs:attribute type="xs:string" name="entity-alias"/> - <xs:attribute type="xs:string" name="name" use="required"/> - <xs:attribute type="xs:string" name="field"/> - <xs:attribute type="xs:string" name="col-alias"/> - <xs:attribute type="xs:string" name="prim-key"/> + <xs:attribute name="entity-alias" type="xs:string"/> + <xs:attribute name="name" type="xs:string" use="required"/> + <xs:attribute name="field" type="xs:string"/> + <xs:attribute name="col-alias" type="xs:string"/> + <xs:attribute name="prim-key" type="xs:string"/> <xs:attribute name="group-by" default="false"> <xs:simpleType> <xs:restriction base="xs:token"> @@ -393,7 +395,7 @@ </xs:complexType> </xs:element> <xs:attributeGroup name="attlist.complex-alias"> - <xs:attribute type="xs:string" name="operator" use="required"/> + <xs:attribute name="operator" type="xs:string" use="required"/> </xs:attributeGroup> <xs:element name="complex-alias-field"> <xs:complexType> @@ -401,9 +403,9 @@ </xs:complexType> </xs:element> <xs:attributeGroup name="attlist.complex-alias-field"> - <xs:attribute type="xs:string" name="entity-alias" use="required"/> - <xs:attribute type="xs:string" name="field" use="required"/> - <xs:attribute type="xs:string" name="default-value"/> + <xs:attribute name="entity-alias" type="xs:string" use="required"/> + <xs:attribute name="field" type="xs:string" use="required"/> + <xs:attribute name="default-value" type="xs:string"/> <xs:attribute name="function"> <xs:simpleType> <xs:restriction base="xs:token"> @@ -429,8 +431,8 @@ </xs:complexType> </xs:element> <xs:attributeGroup name="attlist.view-link"> - <xs:attribute type="xs:string" name="entity-alias" use="required"/> - <xs:attribute type="xs:string" name="rel-entity-alias" use="required"/> + <xs:attribute name="entity-alias" type="xs:string" use="required"/> + <xs:attribute name="rel-entity-alias" type="xs:string" use="required"/> <xs:attribute name="rel-optional" default="false"> <xs:simpleType> <xs:restriction base="xs:token"> @@ -440,7 +442,155 @@ </xs:simpleType> </xs:attribute> </xs:attributeGroup> + <xs:element name="entity-condition"> + <xs:complexType> + <xs:sequence> + <xs:choice minOccurs="0"> + <xs:element ref="condition-expr"/> + <xs:element ref="condition-list"/> + <xs:element ref="condition-object"/> + </xs:choice> + <xs:element minOccurs="0" ref="having-condition-list"/> + <xs:element minOccurs="0" maxOccurs="unbounded" ref="order-by"/> + </xs:sequence> + <xs:attributeGroup ref="attlist.entity-condition"/> + </xs:complexType> + </xs:element> + <xs:attributeGroup name="attlist.entity-condition"> + <xs:attribute name="filter-by-date" default="false"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="true"/> + <xs:enumeration value="false"/> + <xs:enumeration value="by-name"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="distinct" default="false"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="true"/> + <xs:enumeration value="false"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:attributeGroup> + <xs:element name="condition-expr"> + <xs:complexType> + <xs:attributeGroup ref="attlist.condition-expr"/> + </xs:complexType> + </xs:element> + <xs:attributeGroup name="attlist.condition-expr"> + <xs:attribute name="field-name" type="xs:string" use="required"/> + <xs:attribute name="operator" default="equals"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="less"/> + <xs:enumeration value="greater"/> + <xs:enumeration value="less-equals"/> + <xs:enumeration value="greater-equals"/> + <xs:enumeration value="equals"/> + <xs:enumeration value="not-equals"/> + <xs:enumeration value="in"/> + <xs:enumeration value="between"/> + <xs:enumeration value="like"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="from-field" type="xs:string"/> + <xs:attribute name="value" type="xs:string"/> + <xs:attribute name="ignore-if-null" default="false"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="true"/> + <xs:enumeration value="false"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="ignore-if-empty" default="false"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="true"/> + <xs:enumeration value="false"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="ignore-case" default="false"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="true"/> + <xs:enumeration value="false"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="ignore" default="false"> + <xs:annotation> + <xs:documentation> + Ignore the condition if flag is true. + Defaults to false. + </xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:attributeGroup> + <xs:element name="condition-list"> + <xs:complexType> + <xs:choice maxOccurs="unbounded"> + <xs:element ref="condition-expr"/> + <xs:element ref="condition-list"/> + <xs:element ref="condition-object"/> + </xs:choice> + <xs:attributeGroup ref="attlist.condition-list"/> + </xs:complexType> + </xs:element> + <xs:attributeGroup name="attlist.condition-list"> + <xs:attribute name="combine" default="and"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="and"/> + <xs:enumeration value="or"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:attributeGroup> + <xs:element name="condition-object"> + <xs:complexType> + <xs:attributeGroup ref="attlist.condition-object"/> + </xs:complexType> + </xs:element> + <xs:attributeGroup name="attlist.condition-object"> + <xs:attribute name="field" type="xs:string" use="required"/> + </xs:attributeGroup> + <xs:element name="having-condition-list"> + <xs:complexType> + <xs:choice maxOccurs="unbounded"> + <xs:element ref="condition-expr"/> + <xs:element ref="condition-list"/> + <xs:element ref="condition-object"/> + </xs:choice> + <xs:attributeGroup ref="attlist.having-condition-list"/> + </xs:complexType> + </xs:element> + <xs:attributeGroup name="attlist.having-condition-list"> + <xs:attribute name="combine" default="and"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="and"/> + <xs:enumeration value="or"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:attributeGroup> + <xs:element name="order-by"> + <xs:complexType> + <xs:attributeGroup ref="attlist.order-by"/> + </xs:complexType> + </xs:element> + <xs:attributeGroup name="attlist.order-by"> + <xs:attribute name="field-name" type="xs:string" use="required"/> + </xs:attributeGroup> + + <!-- ================== extend-entity ===================== --> <xs:element name="extend-entity"> <xs:complexType> <xs:sequence> @@ -452,6 +602,6 @@ </xs:complexType> </xs:element> <xs:attributeGroup name="attlist.extend-entity"> - <xs:attribute type="xs:string" name="entity-name" use="required"/> + <xs:attribute name="entity-name" type="xs:string" use="required"/> </xs:attributeGroup> </xs:schema> Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericDelegator.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericDelegator.java?rev=790472&r1=790471&r2=790472&view=diff ============================================================================== --- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericDelegator.java (original) +++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericDelegator.java Thu Jul 2 06:43:50 2009 @@ -506,16 +506,19 @@ *@return ModelFieldType instance for the named type from the helper that corresponds to the specified entity */ public ModelFieldType getEntityFieldType(ModelEntity entity, String type) throws GenericEntityException { + return this.getModelFieldTypeReader(entity).getModelFieldType(type); + } + + public ModelFieldTypeReader getModelFieldTypeReader(ModelEntity entity) { String helperName = getEntityHelperName(entity); - - if (helperName == null || helperName.length() <= 0) + if (helperName == null || helperName.length() <= 0) { return null; + } ModelFieldTypeReader modelFieldTypeReader = ModelFieldTypeReader.getModelFieldTypeReader(helperName); - if (modelFieldTypeReader == null) { - throw new GenericEntityException("ModelFieldTypeReader not found for entity " + entity.getEntityName() + " with helper name " + helperName); + throw new IllegalArgumentException("ModelFieldTypeReader not found for entity " + entity.getEntityName() + " with helper name " + helperName); } - return modelFieldTypeReader.getModelFieldType(type); + return modelFieldTypeReader; } /** Gets field type names from the helper that corresponds to the specified entity Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java?rev=790472&r1=790471&r2=790472&view=diff ============================================================================== --- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java (original) +++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java Thu Jul 2 06:43:50 2009 @@ -621,6 +621,11 @@ if (modelEntity == null) { return null; } + + ModelViewEntity modelViewEntity = null; + if (modelEntity instanceof ModelViewEntity) { + modelViewEntity = (ModelViewEntity) modelEntity; + } // if no find options passed, use default if (findOptions == null) findOptions = new EntityFindOptions(); @@ -677,17 +682,30 @@ } String viewClause = SqlJdbcUtil.makeViewWhereClause(modelEntity, datasourceInfo.joinStyle); - - if (viewClause.length() > 0) { - if (entityCondWhereString.length() > 0) { - whereString.append("("); - whereString.append(entityCondWhereString); - whereString.append(") AND "); + String viewEntityCondWhereString = null; + if (modelViewEntity != null && modelViewEntity.getByConditionFinder() != null) { + EntityCondition viewWhereEntityCondition = modelViewEntity.getByConditionFinder().getWhereEntityCondition(FastMap.<String, Object>newInstance(), modelEntity, this.modelFieldTypeReader); + if (viewWhereEntityCondition != null) { + viewEntityCondWhereString = viewWhereEntityCondition.makeWhereString(modelEntity, whereEntityConditionParams, this.datasourceInfo); } + } - whereString.append(viewClause); - } else { + if (entityCondWhereString.length() > 0) { + whereString.append("("); whereString.append(entityCondWhereString); + whereString.append(")"); + } + + if (UtilValidate.isNotEmpty(viewEntityCondWhereString)) { + if (whereString.length() > 0) whereString.append(" AND "); + whereString.append("("); + whereString.append(viewEntityCondWhereString); + whereString.append(")"); + } + + if (viewClause.length() > 0) { + if (whereString.length() > 0) whereString.append(" AND "); + whereString.append(viewClause); } if (whereString.length() > 0) { @@ -696,8 +714,7 @@ } // GROUP BY clause for view-entity - if (modelEntity instanceof ModelViewEntity) { - ModelViewEntity modelViewEntity = (ModelViewEntity) modelEntity; + if (modelViewEntity != null) { String groupByString = modelViewEntity.colNameString(modelViewEntity.getGroupBysCopy(selectFields), ", ", "", false); if (UtilValidate.isNotEmpty(groupByString)) { @@ -709,17 +726,51 @@ // HAVING clause String entityCondHavingString = ""; List<EntityConditionParam> havingEntityConditionParams = FastList.newInstance(); - if (havingEntityCondition != null) { entityCondHavingString = havingEntityCondition.makeWhereString(modelEntity, havingEntityConditionParams, this.datasourceInfo); } - if (entityCondHavingString.length() > 0) { + + String viewEntityCondHavingString = null; + if (modelViewEntity != null && modelViewEntity.getByConditionFinder() != null) { + EntityCondition viewHavingEntityCondition = modelViewEntity.getByConditionFinder().getHavingEntityCondition(FastMap.<String, Object>newInstance(), modelEntity, this.modelFieldTypeReader); + if (viewHavingEntityCondition != null) { + viewEntityCondHavingString = viewHavingEntityCondition.makeWhereString(modelEntity, havingEntityConditionParams, this.datasourceInfo); + } + } + + StringBuilder havingString = new StringBuilder(); + if (UtilValidate.isNotEmpty(entityCondHavingString)) { + havingString.append("("); + havingString.append(entityCondHavingString); + havingString.append(")"); + } + if (UtilValidate.isNotEmpty(viewEntityCondHavingString)) { + if (havingString.length() > 0) havingString.append(" AND "); + havingString.append("("); + havingString.append(viewEntityCondHavingString); + havingString.append(")"); + } + + if (havingString.length() > 0) { sqlBuffer.append(" HAVING "); - sqlBuffer.append(entityCondHavingString); + sqlBuffer.append(havingString); } // ORDER BY clause - sqlBuffer.append(SqlJdbcUtil.makeOrderByClause(modelEntity, orderBy, datasourceInfo)); + List<String> orderByExpanded = FastList.<String>newInstance(); + // add the manually specified ones, then the ones in the view entity's entity-condition + if (orderBy != null) { + orderByExpanded.addAll(orderBy); + } + if (modelViewEntity != null && modelViewEntity.getByConditionFinder() != null) { + List<String> viewOrderBy = modelViewEntity.getByConditionFinder().getOrderByFieldList(FastMap.<String, Object>newInstance()); + if (viewOrderBy != null && viewOrderBy.size() > 0) { + orderByExpanded.addAll(viewOrderBy); + } + } + sqlBuffer.append(SqlJdbcUtil.makeOrderByClause(modelEntity, orderByExpanded, datasourceInfo)); + + // make the final SQL String String sql = sqlBuffer.toString(); SQLProcessor sqlP = new SQLProcessor(helperName); Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/finder/ByConditionFinder.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/finder/ByConditionFinder.java?rev=790472&r1=790471&r2=790472&view=diff ============================================================================== --- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/finder/ByConditionFinder.java (original) +++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/finder/ByConditionFinder.java Thu Jul 2 06:43:50 2009 @@ -21,21 +21,20 @@ import java.util.Map; import org.ofbiz.base.util.UtilXml; -import org.ofbiz.entity.GenericDelegator; import org.ofbiz.entity.condition.EntityCondition; -import org.ofbiz.entity.condition.EntityConditionList; -import org.ofbiz.entity.condition.EntityJoinOperator; import org.ofbiz.entity.finder.EntityFinderUtil.Condition; import org.ofbiz.entity.finder.EntityFinderUtil.ConditionExpr; import org.ofbiz.entity.finder.EntityFinderUtil.ConditionList; import org.ofbiz.entity.finder.EntityFinderUtil.ConditionObject; import org.ofbiz.entity.model.ModelEntity; +import org.ofbiz.entity.model.ModelFieldTypeReader; import org.w3c.dom.Element; /** * Uses the delegator to find entity values by a condition * */ +@SuppressWarnings("serial") public class ByConditionFinder extends ListFinder { public static final String module = ByConditionFinder.class.getName(); @@ -59,18 +58,18 @@ } } - protected EntityCondition getWhereEntityCondition(Map<String, Object> context, ModelEntity modelEntity, GenericDelegator delegator) { + public EntityCondition getWhereEntityCondition(Map<String, Object> context, ModelEntity modelEntity, ModelFieldTypeReader modelFieldTypeReader) { // create whereEntityCondition from whereCondition if (this.whereCondition != null) { - return this.whereCondition.createCondition(context, modelEntity.getEntityName(), delegator); + return this.whereCondition.createCondition(context, modelEntity, modelFieldTypeReader); } return null; } - protected EntityCondition getHavingEntityCondition(Map<String, Object> context, ModelEntity modelEntity, GenericDelegator delegator) { + public EntityCondition getHavingEntityCondition(Map<String, Object> context, ModelEntity modelEntity, ModelFieldTypeReader modelFieldTypeReader) { // create havingEntityCondition from havingCondition if (this.havingCondition != null) { - return this.havingCondition.createCondition(context, modelEntity.getEntityName(), delegator); + return this.havingCondition.createCondition(context, modelEntity, modelFieldTypeReader); } return null; } Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/finder/EntityFinderUtil.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/finder/EntityFinderUtil.java?rev=790472&r1=790471&r2=790472&view=diff ============================================================================== --- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/finder/EntityFinderUtil.java (original) +++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/finder/EntityFinderUtil.java Thu Jul 2 06:43:50 2009 @@ -18,11 +18,11 @@ *******************************************************************************/ package org.ofbiz.entity.finder; +import static org.ofbiz.base.util.UtilGenerics.cast; + import java.io.Serializable; import java.util.Collection; -import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -31,26 +31,22 @@ import javolution.util.FastMap; import org.ofbiz.base.util.Debug; -import org.ofbiz.base.util.UtilValidate; -import org.ofbiz.base.util.StringUtil; import org.ofbiz.base.util.ObjectType; -import static org.ofbiz.base.util.UtilGenerics.cast; +import org.ofbiz.base.util.StringUtil; import org.ofbiz.base.util.UtilFormatOut; +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.GenericDelegator; import org.ofbiz.entity.GenericEntityException; import org.ofbiz.entity.GenericValue; import org.ofbiz.entity.condition.EntityComparisonOperator; import org.ofbiz.entity.condition.EntityCondition; -import org.ofbiz.entity.condition.EntityConditionList; -import org.ofbiz.entity.condition.EntityExpr; import org.ofbiz.entity.condition.EntityFunction; import org.ofbiz.entity.condition.EntityJoinOperator; import org.ofbiz.entity.condition.EntityOperator; import org.ofbiz.entity.model.ModelEntity; -import org.ofbiz.entity.model.ModelField; +import org.ofbiz.entity.model.ModelFieldTypeReader; import org.ofbiz.entity.util.EntityListIterator; import org.w3c.dom.Element; @@ -150,7 +146,7 @@ } public static interface Condition extends Serializable { - public EntityCondition createCondition(Map<String, ? extends Object> context, String entityName, GenericDelegator delegator); + public EntityCondition createCondition(Map<String, ? extends Object> context, ModelEntity modelEntity, ModelFieldTypeReader modelFieldTypeReader); } public static class ConditionExpr implements Condition { protected FlexibleStringExpander fieldNameExdr; @@ -182,12 +178,7 @@ this.ignoreExdr = FlexibleStringExpander.getInstance(conditionExprElement.getAttribute("ignore")); } - public EntityCondition createCondition(Map<String, ? extends Object> context, String entityName, GenericDelegator delegator) { - ModelEntity modelEntity = delegator.getModelEntity(entityName); - if (modelEntity == null) { - throw new IllegalArgumentException("Error in Entity Find: could not find entity with name [" + entityName + "]"); - } - + public EntityCondition createCondition(Map<String, ? extends Object> context, ModelEntity modelEntity, ModelFieldTypeReader modelFieldTypeReader) { String fieldName = fieldNameExdr.expandString(context); Object value = null; @@ -221,14 +212,14 @@ } if(modelEntity.getField(fieldName) == null) { - throw new IllegalArgumentException("Error in Entity Find: could not find field [" + fieldName + "] in entity with name [" + entityName + "]"); + throw new IllegalArgumentException("Error in Entity Find: could not find field [" + fieldName + "] in entity with name [" + modelEntity.getEntityName() + "]"); } // don't convert the field to the desired type if this is an IN or BETWEEN operator and we have a Collection if (!((operator == EntityOperator.IN || operator == EntityOperator.BETWEEN) && value instanceof Collection)) { // now to a type conversion for the target fieldName - value = modelEntity.convertFieldValue(modelEntity.getField(fieldName), value, delegator, context); + value = modelEntity.convertFieldValue(modelEntity.getField(fieldName), value, modelFieldTypeReader, context); } if (Debug.verboseOn()) Debug.logVerbose("Got value for fieldName [" + fieldName + "]: " + value, module); @@ -290,18 +281,18 @@ } } - public EntityCondition createCondition(Map<String, ? extends Object> context, String entityName, GenericDelegator delegator) { + public EntityCondition createCondition(Map<String, ? extends Object> context, ModelEntity modelEntity, ModelFieldTypeReader modelFieldTypeReader) { if (this.conditionList.size() == 0) { return null; } if (this.conditionList.size() == 1) { Condition condition = this.conditionList.get(0); - return condition.createCondition(context, entityName, delegator); + return condition.createCondition(context, modelEntity, modelFieldTypeReader); } List<EntityCondition> entityConditionList = new LinkedList<EntityCondition>(); for (Condition curCondition: conditionList) { - EntityCondition econd = curCondition.createCondition(context, entityName, delegator); + EntityCondition econd = curCondition.createCondition(context, modelEntity, modelFieldTypeReader); if (econd != null) { entityConditionList.add(econd); } @@ -327,7 +318,7 @@ } } - public EntityCondition createCondition(Map<String, ? extends Object> context, String entityName, GenericDelegator delegator) { + public EntityCondition createCondition(Map<String, ? extends Object> context, ModelEntity modelEntity, ModelFieldTypeReader modelFieldTypeReader) { EntityCondition condition = (EntityCondition) fieldNameAcsr.get(context); return condition; } Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/finder/Finder.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/finder/Finder.java?rev=790472&r1=790471&r2=790472&view=diff ============================================================================== --- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/finder/Finder.java (original) +++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/finder/Finder.java Thu Jul 2 06:43:50 2009 @@ -26,6 +26,7 @@ import org.ofbiz.base.util.string.FlexibleStringExpander; import org.ofbiz.entity.GenericDelegator; +@SuppressWarnings("serial") public abstract class Finder implements Serializable { protected FlexibleStringExpander entityNameExdr; protected FlexibleStringExpander useCacheStrExdr; @@ -42,6 +43,10 @@ return entName; } + public void setEntityName(String entityName) { + this.entityNameExdr = FlexibleStringExpander.getInstance(entityName); + } + public abstract void runFind(Map<String, Object> context, GenericDelegator delegator) throws GeneralException; } Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/finder/ListFinder.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/finder/ListFinder.java?rev=790472&r1=790471&r2=790472&view=diff ============================================================================== --- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/finder/ListFinder.java (original) +++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/finder/ListFinder.java Thu Jul 2 06:43:50 2009 @@ -18,45 +18,42 @@ *******************************************************************************/ package org.ofbiz.entity.finder; +import java.sql.ResultSet; import java.util.List; import java.util.Map; import java.util.Set; import javolution.util.FastList; -import javolution.util.FastMap; import org.ofbiz.base.util.Debug; import org.ofbiz.base.util.GeneralException; +import org.ofbiz.base.util.UtilMisc; import org.ofbiz.base.util.UtilValidate; import org.ofbiz.base.util.UtilXml; -import org.ofbiz.base.util.UtilMisc; import org.ofbiz.base.util.collections.FlexibleMapAccessor; import org.ofbiz.base.util.string.FlexibleStringExpander; import org.ofbiz.entity.GenericDelegator; import org.ofbiz.entity.GenericEntityException; import org.ofbiz.entity.GenericValue; import org.ofbiz.entity.condition.EntityCondition; -import org.ofbiz.entity.condition.EntityConditionList; -import org.ofbiz.entity.condition.EntityJoinOperator; import org.ofbiz.entity.finder.EntityFinderUtil.GetAll; import org.ofbiz.entity.finder.EntityFinderUtil.LimitRange; import org.ofbiz.entity.finder.EntityFinderUtil.LimitView; import org.ofbiz.entity.finder.EntityFinderUtil.OutputHandler; import org.ofbiz.entity.finder.EntityFinderUtil.UseIterator; import org.ofbiz.entity.model.ModelEntity; +import org.ofbiz.entity.model.ModelFieldTypeReader; import org.ofbiz.entity.transaction.TransactionUtil; import org.ofbiz.entity.util.EntityFindOptions; import org.ofbiz.entity.util.EntityListIterator; import org.ofbiz.entity.util.EntityUtil; import org.w3c.dom.Element; -import java.io.Serializable; -import java.sql.ResultSet; - /** * Uses the delegator to find entity values by a and * */ +@SuppressWarnings("serial") public abstract class ListFinder extends Finder { public static final String module = ListFinder.class.getName(); @@ -141,8 +138,8 @@ delegator = GenericDelegator.getGenericDelegator(delegatorName); } - EntityCondition whereEntityCondition = getWhereEntityCondition(context, modelEntity, delegator); - EntityCondition havingEntityCondition = getHavingEntityCondition(context, modelEntity, delegator); + EntityCondition whereEntityCondition = getWhereEntityCondition(context, modelEntity, delegator.getModelFieldTypeReader(modelEntity)); + EntityCondition havingEntityCondition = getHavingEntityCondition(context, modelEntity, delegator.getModelFieldTypeReader(modelEntity)); if (useCache) { // if useCache == true && outputHandler instanceof UseIterator, throw exception; not a valid combination if (outputHandler instanceof UseIterator) { @@ -224,12 +221,17 @@ throw new GeneralException(errMsg, e); } } + + public List<String> getOrderByFieldList(Map<String, Object> context) { + List<String> orderByFields = EntityFinderUtil.makeOrderByFieldList(this.orderByExpanderList, context); + return orderByFields; + } - protected EntityCondition getWhereEntityCondition(Map<String, Object> context, ModelEntity modelEntity, GenericDelegator delegator) { + public EntityCondition getWhereEntityCondition(Map<String, Object> context, ModelEntity modelEntity, ModelFieldTypeReader modelFieldTypeReader) { return null; } - protected EntityCondition getHavingEntityCondition(Map<String, Object> context, ModelEntity modelEntity, GenericDelegator delegator) { + public EntityCondition getHavingEntityCondition(Map<String, Object> context, ModelEntity modelEntity, ModelFieldTypeReader modelFieldTypeReader) { return null; } } Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelEntity.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelEntity.java?rev=790472&r1=790471&r2=790472&view=diff ============================================================================== --- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelEntity.java (original) +++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelEntity.java Thu Jul 2 06:43:50 2009 @@ -55,6 +55,7 @@ * Generic Entity - Entity model class * */ +@SuppressWarnings("serial") public class ModelEntity extends ModelInfo implements Comparable<ModelEntity>, Serializable { public static final String module = ModelEntity.class.getName(); @@ -1297,24 +1298,22 @@ /** Convert a field value from one Java data type to another. This is the preferred method - * which takes into consideration the user's locale and time zone (for conversions that * require them). - * @param modelField - * @param value - * @param delegator - * @param context * @return the converted value */ public Object convertFieldValue(ModelField modelField, Object value, GenericDelegator delegator, Map<String, ? extends Object> context) { + ModelFieldTypeReader modelFieldTypeReader = delegator.getModelFieldTypeReader(this); + return this.convertFieldValue(modelField, value, modelFieldTypeReader, context); + } + /** Convert a field value from one Java data type to another. This is the preferred method - + * which takes into consideration the user's locale and time zone (for conversions that + * require them). + * @return the converted value + */ + public Object convertFieldValue(ModelField modelField, Object value, ModelFieldTypeReader modelFieldTypeReader, Map<String, ? extends Object> context) { if (value == null || value == GenericEntity.NULL_FIELD) { return null; } - String fieldJavaType = null; - try { - fieldJavaType = delegator.getEntityFieldType(this, modelField.getType()).getJavaType(); - } catch (GenericEntityException e) { - String errMsg = "Could not convert field value: could not find Java type for the field: [" + modelField.getName() + "] on the [" + this.getEntityName() + "] entity: " + e.toString(); - Debug.logError(e, errMsg, module); - throw new IllegalArgumentException(errMsg); - } + String fieldJavaType = modelFieldTypeReader.getModelFieldType(modelField.getType()).getJavaType(); try { return ObjectType.simpleTypeConvert(value, fieldJavaType, null, (TimeZone) context.get("timeZone"), (Locale) context.get("locale"), true); } catch (GeneralException e) { Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelViewEntity.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelViewEntity.java?rev=790472&r1=790471&r2=790472&view=diff ============================================================================== --- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelViewEntity.java (original) +++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelViewEntity.java Thu Jul 2 06:43:50 2009 @@ -33,8 +33,8 @@ import org.ofbiz.base.util.UtilTimer; import org.ofbiz.base.util.UtilValidate; import org.ofbiz.base.util.UtilXml; -import org.ofbiz.entity.GenericEntity; import org.ofbiz.entity.condition.EntityOperator; +import org.ofbiz.entity.finder.ByConditionFinder; import org.ofbiz.entity.jdbc.SqlJdbcUtil; import org.w3c.dom.Element; import org.w3c.dom.NodeList; @@ -42,6 +42,7 @@ /** * This class extends ModelEntity and provides additional information appropriate to view entities */ +@SuppressWarnings("serial") public class ModelViewEntity extends ModelEntity { public static final String module = ModelViewEntity.class.getName(); @@ -79,6 +80,8 @@ protected List<ModelField> groupBys = FastList.newInstance(); protected Map<String, Map<String, ModelConversion>> conversions = FastMap.newInstance(); + + protected ByConditionFinder byConditionFinder = null; public ModelViewEntity(ModelReader reader, Element entityElement, UtilTimer utilTimer, ModelInfo def) { super(reader, entityElement, def); @@ -118,6 +121,13 @@ if (utilTimer != null) utilTimer.timerString(" createModelEntity: before relations"); this.populateRelated(reader, entityElement); + + Element entityConditionElement = UtilXml.firstChildElement(entityElement, "entity-condition"); + if (entityConditionElement != null) { + this.byConditionFinder = new ByConditionFinder(entityConditionElement); + // make sure the entity name is set since the XML for this particular condition doesn't allow it + this.byConditionFinder.setEntityName(this.entityName); + } // before finishing, make sure the table name is null, this should help bring up errors early... this.tableName = null; @@ -266,6 +276,10 @@ public void addViewLink(ModelViewLink viewLink) { this.viewLinks.add(viewLink); } + + public ByConditionFinder getByConditionFinder() { + return this.byConditionFinder; + } public String colNameString(String separator, String afterLast, boolean alias, ModelField... flds) { return colNameString(Arrays.asList(flds), separator, afterLast, alias); Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/entityops/EntityCount.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/entityops/EntityCount.java?rev=790472&r1=790471&r2=790472&view=diff ============================================================================== --- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/entityops/EntityCount.java (original) +++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/entityops/EntityCount.java Thu Jul 2 06:43:50 2009 @@ -32,6 +32,7 @@ import org.ofbiz.entity.finder.EntityFinderUtil.ConditionExpr; import org.ofbiz.entity.finder.EntityFinderUtil.ConditionList; import org.ofbiz.entity.finder.EntityFinderUtil.ConditionObject; +import org.ofbiz.entity.model.ModelEntity; import org.ofbiz.minilang.SimpleMethod; import org.ofbiz.minilang.method.MethodContext; import org.ofbiz.minilang.method.MethodOperation; @@ -102,16 +103,18 @@ delegator = GenericDelegator.getGenericDelegator(delegatorName); } + ModelEntity modelEntity = delegator.getModelEntity(entityName); + // create whereEntityCondition from whereCondition EntityCondition whereEntityCondition = null; if (this.whereCondition != null) { - whereEntityCondition = this.whereCondition.createCondition(context, entityName, delegator); + whereEntityCondition = this.whereCondition.createCondition(context, modelEntity, delegator.getModelFieldTypeReader(modelEntity)); } // create havingEntityCondition from havingCondition EntityCondition havingEntityCondition = null; if (this.havingCondition != null) { - havingEntityCondition = this.havingCondition.createCondition(context, entityName, delegator); + havingEntityCondition = this.havingCondition.createCondition(context, modelEntity, delegator.getModelFieldTypeReader(modelEntity)); } long count = delegator.findCountByCondition(entityName, whereEntityCondition, havingEntityCondition, null); Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormField.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormField.java?rev=790472&r1=790471&r2=790472&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormField.java (original) +++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormField.java Thu Jul 2 06:43:50 2009 @@ -1703,7 +1703,8 @@ if (UtilValidate.isNotEmpty(this.constraintList)) { List<EntityCondition> expandedConditionList = new LinkedList<EntityCondition>(); for (EntityFinderUtil.Condition condition: constraintList) { - expandedConditionList.add(condition.createCondition(context, this.entityName, delegator)); + ModelEntity modelEntity = delegator.getModelEntity(this.entityName); + expandedConditionList.add(condition.createCondition(context, modelEntity, delegator.getModelFieldTypeReader(modelEntity))); } findCondition = EntityCondition.makeCondition(expandedConditionList); } |
Free forum by Nabble | Edit this page |