This is an automated email from the ASF dual-hosted git repository.

mridulpathak pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 2c5ae5ad01 Fixed: EntityExpr no longer hardcodes the "default" 
delegator when validating condition types (OFBIZ-5100)
2c5ae5ad01 is described below

commit 2c5ae5ad013af220371a5c4db6b83c85c68a480d
Author: Mridul Pathak <[email protected]>
AuthorDate: Fri Jul 3 18:36:19 2026 +0530

    Fixed: EntityExpr no longer hardcodes the "default" delegator when 
validating condition types (OFBIZ-5100)
    
    EntityExpr.checkRhsType() always resolved 
DelegatorFactory.getDelegator("default")
    instead of using the delegator actually running the query, so any setup 
using a
    non-"default"-named delegator could throw GenericEntityException when 
building a
    WHERE clause. The real delegator was already available at every call site in
    GenericDAO; it just wasn't being passed down.
    
    Threads the real Delegator through EntityCondition.makeWhereString(...) as 
a new
    backward-compatible default method, and forwards it through every condition 
type
    that wraps or combines other conditions (EntityConditionList, 
EntityFieldMap,
    EntityNotCondition, EntityConditionBuilder) down to 
EntityExpr.checkRhsType(),
    which now skips RHS type validation instead of guessing at "default" when no
    delegator is available.
---
 .../ofbiz/entity/condition/EntityCondition.java    | 14 +++++++++
 .../entity/condition/EntityConditionBuilder.java   |  8 +++++-
 .../entity/condition/EntityConditionListBase.java  |  8 +++++-
 .../apache/ofbiz/entity/condition/EntityExpr.java  | 15 ++++++----
 .../ofbiz/entity/condition/EntityJoinOperator.java | 16 ++++++++++-
 .../ofbiz/entity/condition/EntityNotCondition.java |  8 +++++-
 .../apache/ofbiz/entity/datasource/GenericDAO.java | 33 +++++++++++++---------
 7 files changed, 79 insertions(+), 23 deletions(-)

diff --git 
a/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityCondition.java
 
b/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityCondition.java
index 5324ee9c46..a994adc351 100644
--- 
a/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityCondition.java
+++ 
b/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityCondition.java
@@ -269,6 +269,20 @@ public interface EntityCondition extends IsEmpty, 
Serializable {
     String makeWhereString(ModelEntity modelEntity, List<EntityConditionParam> 
entityConditionParams,
             Datasource datasourceInfo);
 
+    /**
+     * Dumps the corresponding SQL string, using {@code delegator} (when 
available) to validate
+     * field/value type compatibility instead of assuming the {@code 
"default"} delegator.
+     * @param modelEntity the model of the entity
+     * @param entityConditionParams the effective parameters used to 
substitute '?' parameters
+     * @param datasourceInfo the model of the data source interpreting the SQL
+     * @param delegator the delegator actually being used to run this query, 
or {@code null} if unavailable
+     * @return the corresponding SQL string
+     */
+    default String makeWhereString(ModelEntity modelEntity, 
List<EntityConditionParam> entityConditionParams,
+            Datasource datasourceInfo, Delegator delegator) {
+        return makeWhereString(modelEntity, entityConditionParams, 
datasourceInfo);
+    }
+
     /**
      * Verifies that this condition expression is valid.
      * @param modelEntity the model of the entity
diff --git 
a/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionBuilder.java
 
b/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionBuilder.java
index f820bf16d1..f458cdf17d 100644
--- 
a/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionBuilder.java
+++ 
b/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionBuilder.java
@@ -51,7 +51,13 @@ public class EntityConditionBuilder extends BuilderSupport {
 
         @Override
         public String makeWhereString(ModelEntity modelEntity, 
List<EntityConditionParam> entityConditionParams, Datasource datasourceInfo) {
-            return condition.makeWhereString(modelEntity, 
entityConditionParams, datasourceInfo);
+            return makeWhereString(modelEntity, entityConditionParams, 
datasourceInfo, null);
+        }
+
+        @Override
+        public String makeWhereString(ModelEntity modelEntity, 
List<EntityConditionParam> entityConditionParams,
+                Datasource datasourceInfo, Delegator delegator) {
+            return condition.makeWhereString(modelEntity, 
entityConditionParams, datasourceInfo, delegator);
         }
 
         @Override
diff --git 
a/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionListBase.java
 
b/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionListBase.java
index f15ab68be9..90042f3e82 100644
--- 
a/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionListBase.java
+++ 
b/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityConditionListBase.java
@@ -76,8 +76,14 @@ abstract class EntityConditionListBase<T extends 
EntityCondition> implements Ent
 
     @Override
     public String makeWhereString(ModelEntity modelEntity, 
List<EntityConditionParam> entityConditionParams, Datasource datasourceInfo) {
+        return makeWhereString(modelEntity, entityConditionParams, 
datasourceInfo, null);
+    }
+
+    @Override
+    public String makeWhereString(ModelEntity modelEntity, 
List<EntityConditionParam> entityConditionParams,
+            Datasource datasourceInfo, Delegator delegator) {
         StringBuilder sql = new StringBuilder();
-        operator.addSqlValue(sql, modelEntity, entityConditionParams, 
conditions, datasourceInfo);
+        operator.addSqlValue(sql, modelEntity, entityConditionParams, 
conditions, datasourceInfo, delegator);
         return sql.toString();
     }
 
diff --git 
a/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityExpr.java
 
b/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityExpr.java
index 816f018639..618a25ddb5 100644
--- 
a/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityExpr.java
+++ 
b/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityExpr.java
@@ -27,7 +27,6 @@ import org.apache.ofbiz.base.util.Debug;
 import org.apache.ofbiz.base.util.ObjectType;
 import org.apache.ofbiz.base.util.UtilGenerics;
 import org.apache.ofbiz.entity.Delegator;
-import org.apache.ofbiz.entity.DelegatorFactory;
 import org.apache.ofbiz.entity.GenericEntity;
 import org.apache.ofbiz.entity.GenericEntityException;
 import org.apache.ofbiz.entity.GenericModelException;
@@ -136,7 +135,13 @@ public final class EntityExpr implements EntityCondition {
     @Override
     public String makeWhereString(ModelEntity modelEntity, 
List<EntityConditionParam> entityConditionParams,
             Datasource datasourceInfo) {
-        checkRhsType(modelEntity, null);
+        return makeWhereString(modelEntity, entityConditionParams, 
datasourceInfo, null);
+    }
+
+    @Override
+    public String makeWhereString(ModelEntity modelEntity, 
List<EntityConditionParam> entityConditionParams,
+            Datasource datasourceInfo, Delegator delegator) {
+        checkRhsType(modelEntity, delegator);
         StringBuilder sql = new StringBuilder();
         operator.addSqlValue(sql, modelEntity, entityConditionParams, true, 
lhs, rhs, datasourceInfo);
         return sql.toString();
@@ -174,7 +179,7 @@ public final class EntityExpr implements EntityCondition {
      * @param delegator the delegator used to check the condition expression
      */
     public void checkRhsType(ModelEntity modelEntity, Delegator delegator) {
-        if (EntityExpr.isNullField(rhs) || modelEntity == null) {
+        if (EntityExpr.isNullField(rhs) || modelEntity == null || delegator == 
null) {
             return;
         }
 
@@ -194,9 +199,7 @@ public final class EntityExpr implements EntityCondition {
             }
         }
 
-        // This will be the common case for now as the delegator isn't 
available where we want to do this
-        // we'll cheat a little here and assume the default delegator.
-        Delegator deleg = (delegator == null) ? 
DelegatorFactory.getDelegator("default") : delegator;
+        Delegator deleg = delegator;
 
         String fieldName = null;
         ModelField curField;
diff --git 
a/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityJoinOperator.java
 
b/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityJoinOperator.java
index 9cc6036dbe..2f25a2f7c6 100644
--- 
a/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityJoinOperator.java
+++ 
b/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityJoinOperator.java
@@ -65,6 +65,20 @@ public class EntityJoinOperator extends 
EntityOperator<EntityCondition, EntityCo
      */
     public void addSqlValue(StringBuilder sql, ModelEntity modelEntity, 
List<EntityConditionParam> entityConditionParams,
                             List<? extends EntityCondition> conditionList, 
Datasource datasourceInfo) {
+        addSqlValue(sql, modelEntity, entityConditionParams, conditionList, 
datasourceInfo, null);
+    }
+
+    /**
+     * Add sql value.
+     * @param sql the sql
+     * @param modelEntity the model entity
+     * @param entityConditionParams the entity condition params
+     * @param conditionList the condition list
+     * @param datasourceInfo the datasource info
+     * @param delegator the delegator actually being used to run this query, 
or {@code null} if unavailable
+     */
+    public void addSqlValue(StringBuilder sql, ModelEntity modelEntity, 
List<EntityConditionParam> entityConditionParams,
+                            List<? extends EntityCondition> conditionList, 
Datasource datasourceInfo, Delegator delegator) {
         if (UtilValidate.isNotEmpty(conditionList)) {
             boolean hadSomething = false;
             Iterator<? extends EntityCondition> conditionIter = 
conditionList.iterator();
@@ -81,7 +95,7 @@ public class EntityJoinOperator extends 
EntityOperator<EntityCondition, EntityCo
                     hadSomething = true;
                     sql.append('(');
                 }
-                sql.append(condition.makeWhereString(modelEntity, 
entityConditionParams, datasourceInfo));
+                sql.append(condition.makeWhereString(modelEntity, 
entityConditionParams, datasourceInfo, delegator));
             }
             if (hadSomething) {
                 sql.append(')');
diff --git 
a/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityNotCondition.java
 
b/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityNotCondition.java
index dde8acde6d..dafdc4eb7c 100644
--- 
a/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityNotCondition.java
+++ 
b/framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityNotCondition.java
@@ -66,9 +66,15 @@ public class EntityNotCondition implements EntityCondition {
 
     @Override
     public String makeWhereString(ModelEntity modelEntity, 
List<EntityConditionParam> entityConditionParams, Datasource datasourceInfo) {
+        return makeWhereString(modelEntity, entityConditionParams, 
datasourceInfo, null);
+    }
+
+    @Override
+    public String makeWhereString(ModelEntity modelEntity, 
List<EntityConditionParam> entityConditionParams,
+            Datasource datasourceInfo, Delegator delegator) {
         return new StringBuilder()
                 .append("NOT(")
-                .append(condition.makeWhereString(modelEntity, 
entityConditionParams, datasourceInfo))
+                .append(condition.makeWhereString(modelEntity, 
entityConditionParams, datasourceInfo, delegator))
                 .append(')')
                 .toString();
     }
diff --git 
a/framework/entity/src/main/java/org/apache/ofbiz/entity/datasource/GenericDAO.java
 
b/framework/entity/src/main/java/org/apache/ofbiz/entity/datasource/GenericDAO.java
index 404bb82d55..6833daa1f6 100644
--- 
a/framework/entity/src/main/java/org/apache/ofbiz/entity/datasource/GenericDAO.java
+++ 
b/framework/entity/src/main/java/org/apache/ofbiz/entity/datasource/GenericDAO.java
@@ -407,7 +407,7 @@ public class GenericDAO {
                 params.add(new EntityConditionParam(field, entry.getValue()));
             }
         }
-        sql.append(" WHERE ").append(condition.makeWhereString(modelEntity, 
params, this.datasource));
+        sql.append(" WHERE ").append(condition.makeWhereString(modelEntity, 
params, this.datasource, sqlP.getDelegator()));
 
         sqlP.prepareStatement(sql.toString());
         for (EntityConditionParam param : params) {
@@ -825,7 +825,7 @@ public class GenericDAO {
 
         // WHERE clause
         List<EntityConditionParam> whereEntityConditionParams = new 
LinkedList<>();
-        makeConditionWhereString(sqlBuffer, " WHERE ", modelEntity, 
whereEntityCondition, viewWhereConditions, whereEntityConditionParams);
+        makeConditionWhereString(sqlBuffer, " WHERE ", modelEntity, 
whereEntityCondition, viewWhereConditions, whereEntityConditionParams, 
delegator);
 
         // GROUP BY clause for view-entity
         if (modelViewEntity != null) {
@@ -834,7 +834,8 @@ public class GenericDAO {
 
         // HAVING clause
         List<EntityConditionParam> havingEntityConditionParams = new 
LinkedList<>();
-        makeConditionHavingString(sqlBuffer, " HAVING ", modelEntity, 
havingEntityCondition, viewHavingConditions, havingEntityConditionParams);
+        makeConditionHavingString(sqlBuffer, " HAVING ", modelEntity, 
havingEntityCondition, viewHavingConditions,
+                havingEntityConditionParams, delegator);
 
         // ORDER BY clause
         List<String> orderByExpanded = new LinkedList<>();
@@ -911,7 +912,8 @@ public class GenericDAO {
     protected StringBuilder makeConditionWhereString(ModelEntity modelEntity, 
EntityCondition whereEntityCondition,
                                                      List<EntityCondition> 
viewWhereConditions,
                                                      
List<EntityConditionParam> whereEntityConditionParams) throws 
GenericEntityException {
-        return makeConditionWhereString(new StringBuilder(), "", modelEntity, 
whereEntityCondition, viewWhereConditions, whereEntityConditionParams);
+        return makeConditionWhereString(new StringBuilder(), "", modelEntity, 
whereEntityCondition, viewWhereConditions,
+                whereEntityConditionParams, null);
     }
 
     /**
@@ -922,12 +924,14 @@ public class GenericDAO {
      * @param whereEntityCondition the where entity condition
      * @param viewWhereConditions the view where conditions
      * @param whereEntityConditionParams the where entity condition params
+     * @param delegator the delegator actually being used to run this query, 
or {@code null} if unavailable
      * @return the string builder
      * @throws GenericEntityException the generic entity exception
      */
     protected StringBuilder makeConditionWhereString(StringBuilder 
whereString, String prefix, ModelEntity modelEntity,
                                                      EntityCondition 
whereEntityCondition, List<EntityCondition> viewWhereConditions,
-                                                     
List<EntityConditionParam> whereEntityConditionParams) throws 
GenericEntityException {
+                                                     
List<EntityConditionParam> whereEntityConditionParams, Delegator delegator)
+            throws GenericEntityException {
         ModelViewEntity modelViewEntity = null;
         if (modelEntity instanceof ModelViewEntity) {
             modelViewEntity = (ModelViewEntity) modelEntity;
@@ -954,7 +958,7 @@ public class GenericDAO {
         if (!conditions.isEmpty()) {
             whereString.append(prefix);
             whereString.append(EntityCondition.makeCondition(conditions, 
EntityOperator.AND).makeWhereString(modelEntity,
-                    whereEntityConditionParams, this.datasource));
+                    whereEntityConditionParams, this.datasource, delegator));
         }
 
         return whereString;
@@ -974,7 +978,7 @@ public class GenericDAO {
                                                       List<EntityCondition> 
viewHavingConditions,
                                                       
List<EntityConditionParam> havingEntityConditionParams) throws 
GenericEntityException {
         return makeConditionHavingString(new StringBuilder(), "", modelEntity, 
havingEntityCondition, viewHavingConditions,
-                havingEntityConditionParams);
+                havingEntityConditionParams, null);
     }
 
     /**
@@ -985,12 +989,14 @@ public class GenericDAO {
      * @param havingEntityCondition the having entity condition
      * @param viewHavingConditions the view having conditions
      * @param havingEntityConditionParams the having entity condition params
+     * @param delegator the delegator actually being used to run this query, 
or {@code null} if unavailable
      * @return the string builder
      * @throws GenericEntityException the generic entity exception
      */
     protected StringBuilder makeConditionHavingString(StringBuilder 
havingString, String prefix, ModelEntity modelEntity,
                                                       EntityCondition 
havingEntityCondition, List<EntityCondition> viewHavingConditions,
-                                                      
List<EntityConditionParam> havingEntityConditionParams) throws 
GenericEntityException {
+                                                      
List<EntityConditionParam> havingEntityConditionParams, Delegator delegator)
+            throws GenericEntityException {
         ModelViewEntity modelViewEntity = null;
         if (modelEntity instanceof ModelViewEntity) {
             modelViewEntity = (ModelViewEntity) modelEntity;
@@ -998,14 +1004,14 @@ public class GenericDAO {
 
         String entityCondHavingString = "";
         if (havingEntityCondition != null) {
-            entityCondHavingString = 
havingEntityCondition.makeWhereString(modelEntity, havingEntityConditionParams, 
this.datasource);
+            entityCondHavingString = 
havingEntityCondition.makeWhereString(modelEntity, havingEntityConditionParams, 
this.datasource, delegator);
         }
 
         String viewEntityCondHavingString = null;
         if (modelViewEntity != null) {
             EntityCondition viewHavingEntityCondition = 
EntityCondition.makeCondition(viewHavingConditions);
             viewEntityCondHavingString = 
viewHavingEntityCondition.makeWhereString(modelEntity,
-                    havingEntityConditionParams, this.datasource);
+                    havingEntityConditionParams, this.datasource, delegator);
         }
 
         if (UtilValidate.isNotEmpty(entityCondHavingString) || 
UtilValidate.isNotEmpty(viewEntityCondHavingString)) {
@@ -1280,7 +1286,7 @@ public class GenericDAO {
 
         // WHERE clause
         List<EntityConditionParam> whereEntityConditionParams = new 
LinkedList<>();
-        makeConditionWhereString(sqlBuffer, " WHERE ", modelEntity, 
whereEntityCondition, viewWhereConditions, whereEntityConditionParams);
+        makeConditionWhereString(sqlBuffer, " WHERE ", modelEntity, 
whereEntityCondition, viewWhereConditions, whereEntityConditionParams, 
delegator);
 
         // GROUP BY clause for view-entity
         if (isGroupBy) {
@@ -1289,7 +1295,8 @@ public class GenericDAO {
 
         // HAVING clause
         List<EntityConditionParam> havingEntityConditionParams = new 
LinkedList<>();
-        makeConditionHavingString(sqlBuffer, " HAVING ", modelEntity, 
havingEntityCondition, viewHavingConditions, havingEntityConditionParams);
+        makeConditionHavingString(sqlBuffer, " HAVING ", modelEntity, 
havingEntityCondition, viewHavingConditions,
+                havingEntityConditionParams, delegator);
 
         if (isGroupBy) {
             sqlBuffer.append(") TEMP_NAME");
@@ -1420,7 +1427,7 @@ public class GenericDAO {
 
         StringBuilder sql = new StringBuilder("DELETE FROM 
").append(modelEntity.getTableName(this.datasource));
 
-        String whereCondition = condition.makeWhereString(modelEntity, null, 
this.datasource);
+        String whereCondition = condition.makeWhereString(modelEntity, null, 
this.datasource, sqlP.getDelegator());
         if (UtilValidate.isNotEmpty(whereCondition)) {
             sql.append(" WHERE ").append(whereCondition);
         }

Reply via email to