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 6039c30934 Remove this-escape warnings in the temporal expressions
6039c30934 is described below

commit 6039c30934b471081fbfb86d15525f7346716fc5
Author: Mridul Pathak <[email protected]>
AuthorDate: Sat Oct 31 16:12:39 2026 +0530

    Remove this-escape warnings in the temporal expressions
    
    Every TemporalExpressions constructor set its sequence through the public 
setSequence method, and the composite expressions also passed this to 
containsExpression, so a subclass could see a half-built object. The sequence 
is now a final field set through a new protected TemporalExpression(int) 
constructor; the expressions compute it before calling super, and the 
no-argument constructor keeps Integer.MAX_VALUE. setSequence is removed, and so 
is containsExpression: it could never return [...]
---
 .../ofbiz/service/calendar/TemporalExpression.java |  32 ++--
 .../service/calendar/TemporalExpressions.java      | 174 +++++++--------------
 2 files changed, 71 insertions(+), 135 deletions(-)

diff --git 
a/framework/service/src/main/java/org/apache/ofbiz/service/calendar/TemporalExpression.java
 
b/framework/service/src/main/java/org/apache/ofbiz/service/calendar/TemporalExpression.java
index 81592d1ae4..dad078ff21 100644
--- 
a/framework/service/src/main/java/org/apache/ofbiz/service/calendar/TemporalExpression.java
+++ 
b/framework/service/src/main/java/org/apache/ofbiz/service/calendar/TemporalExpression.java
@@ -32,7 +32,7 @@ public abstract class TemporalExpression implements 
Serializable, Comparable<Tem
     /** Field used to sort expressions. Expression evaluation depends
      * on correct ordering. Expressions are evaluated from lowest value
      * to highest value. */
-    private int sequence = Integer.MAX_VALUE;
+    private final int sequence;
 
     /**
      * Gets sequence.
@@ -42,19 +42,22 @@ public abstract class TemporalExpression implements 
Serializable, Comparable<Tem
         return sequence;
     }
 
-    /**
-     * Sets sequence.
-     * @param sequence the sequence
-     */
-    public void setSequence(int sequence) {
-        this.sequence = sequence;
-    }
-
     /** A unique ID for this expression. This field is intended to be used by
      * persistence classes. */
     private String id = null;
 
-    protected TemporalExpression() { }
+    /** Creates an expression that is evaluated after all expressions with a 
lower sequence. */
+    protected TemporalExpression() {
+        this(Integer.MAX_VALUE);
+    }
+
+    /**
+     * Creates an expression with the given evaluation sequence.
+     * @param sequence the sequence, see {@link #getSequence()}
+     */
+    protected TemporalExpression(int sequence) {
+        this.sequence = sequence;
+    }
 
     /** Handles a <code>TemporalExpressionVisitor</code> visit.
      * @param visitor
@@ -123,15 +126,6 @@ public abstract class TemporalExpression implements 
Serializable, Comparable<Tem
         return result;
     }
 
-    /**
-     * Contains expression boolean.
-     * @param expression the expression
-     * @return the boolean
-     */
-    protected boolean containsExpression(TemporalExpression expression) {
-        return false;
-    }
-
     /** Returns a date representing the first occurrence of this expression
      * on or after a specified date. Returns <code>null</code> if there
      * is no matching date.
diff --git 
a/framework/service/src/main/java/org/apache/ofbiz/service/calendar/TemporalExpressions.java
 
b/framework/service/src/main/java/org/apache/ofbiz/service/calendar/TemporalExpressions.java
index c84a227045..bb8a3887a3 100644
--- 
a/framework/service/src/main/java/org/apache/ofbiz/service/calendar/TemporalExpressions.java
+++ 
b/framework/service/src/main/java/org/apache/ofbiz/service/calendar/TemporalExpressions.java
@@ -23,6 +23,7 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.Iterator;
 import java.util.Set;
+import java.util.SortedSet;
 import java.util.TreeSet;
 
 import org.apache.ofbiz.base.util.Debug;
@@ -69,6 +70,22 @@ public class TemporalExpressions implements Serializable {
         return Boolean.compare(iter.hasNext(), otherIter.hasNext());
     }
 
+    /** Returns the sequence of the included expression, which Difference and 
Substitution adopt. */
+    private static int sequenceOfIncluded(TemporalExpression included) {
+        if (included == null) {
+            throw new IllegalArgumentException("included argument cannot be 
null");
+        }
+        return included.getSequence();
+    }
+
+    /** Returns an unmodifiable copy of a member set, in evaluation order. */
+    private static SortedSet<TemporalExpression> 
sortedMembers(Set<TemporalExpression> expressionSet) {
+        if (expressionSet == null) {
+            throw new IllegalArgumentException("expressionSet argument cannot 
be null");
+        }
+        return Collections.unmodifiableSortedSet(new TreeSet<>(expressionSet));
+    }
+
     /** A temporal expression that represents a range of dates. */
     public static class DateRange extends TemporalExpression {
         private static final String MODULE = DateRange.class.getName();
@@ -79,11 +96,8 @@ public class TemporalExpressions implements Serializable {
         }
 
         public DateRange(Date start, Date end) {
+            super(SEQUENCE_DATE_RANGE);
             this.range = new org.apache.ofbiz.base.util.DateRange(start, end);
-            this.setSequence(SEQUENCE_DATE_RANGE);
-            if (Debug.verboseOn()) {
-                Debug.logVerbose("Created " + this, MODULE);
-            }
         }
 
         @Override
@@ -164,6 +178,7 @@ public class TemporalExpressions implements Serializable {
          * @param occurrence An integer in the range of -5 to 5, excluding zero
          */
         public DayInMonth(int dayOfWeek, int occurrence) {
+            super(sequence(dayOfWeek, occurrence));
             if (dayOfWeek < Calendar.SUNDAY || dayOfWeek > Calendar.SATURDAY) {
                 throw new IllegalArgumentException("Invalid day argument");
             }
@@ -172,16 +187,16 @@ public class TemporalExpressions implements Serializable {
             }
             this.dayOfWeek = dayOfWeek;
             this.occurrence = occurrence;
+        }
+
+        private static int sequence(int dayOfWeek, int occurrence) {
             int result = occurrence;
             if (result < 0) {
                 // Make negative values a higher sequence
                 // Example: Last Monday should come after first Monday
                 result += 11;
             }
-            this.setSequence(SEQUENCE_DAY_IN_MONTH + (result * 10) + 
dayOfWeek);
-            if (Debug.verboseOn()) {
-                Debug.logVerbose("Created " + this, MODULE);
-            }
+            return SEQUENCE_DAY_IN_MONTH + (result * 10) + dayOfWeek;
         }
 
         @Override
@@ -332,18 +347,15 @@ public class TemporalExpressions implements Serializable {
          * @param end An integer in the range of 1 to 31
          */
         public DayOfMonthRange(int start, int end) {
+            super(SEQUENCE_DOM_RANGE + start);
             if (start < 1 || start > end) {
                 throw new IllegalArgumentException("Invalid start argument");
             }
             if (end < 1 || end > 31) {
                 throw new IllegalArgumentException("Invalid end argument");
             }
-            this.setSequence(SEQUENCE_DOM_RANGE + start);
             this.start = start;
             this.end = end;
-            if (Debug.verboseOn()) {
-                Debug.logVerbose("Created " + this, MODULE);
-            }
         }
 
         @Override
@@ -458,18 +470,15 @@ public class TemporalExpressions implements Serializable {
          * to <code>Calendar.SATURDAY</code>
          */
         public DayOfWeekRange(int start, int end) {
+            super(SEQUENCE_DOW_RANGE + start);
             if (start < Calendar.SUNDAY || start > Calendar.SATURDAY) {
                 throw new IllegalArgumentException("Invalid start argument");
             }
             if (end < Calendar.SUNDAY || end > Calendar.SATURDAY) {
                 throw new IllegalArgumentException("Invalid end argument");
             }
-            this.setSequence(SEQUENCE_DOW_RANGE + start);
             this.start = start;
             this.end = end;
-            if (Debug.verboseOn()) {
-                Debug.logVerbose("Created " + this, MODULE);
-            }
         }
 
         @Override
@@ -593,18 +602,12 @@ public class TemporalExpressions implements Serializable {
         private final TemporalExpression included;
 
         public Difference(TemporalExpression included, TemporalExpression 
excluded) {
-            if (included == null) {
-                throw new IllegalArgumentException("included argument cannot 
be null");
+            super(sequenceOfIncluded(included));
+            if (excluded == null) {
+                throw new IllegalArgumentException("excluded argument cannot 
be null");
             }
             this.included = included;
             this.excluded = excluded;
-            if (containsExpression(this)) {
-                throw new IllegalArgumentException("recursive expression");
-            }
-            this.setSequence(included.getSequence());
-            if (Debug.verboseOn()) {
-                Debug.logVerbose("Created " + this, MODULE);
-            }
         }
 
         @Override
@@ -612,11 +615,6 @@ public class TemporalExpressions implements Serializable {
             visitor.visit(this);
         }
 
-        @Override
-        protected boolean containsExpression(TemporalExpression expression) {
-            return this.included.containsExpression(expression) || 
this.excluded.containsExpression(expression);
-        }
-
         @Override
         public int hashCode() {
             final int prime = 31;
@@ -712,6 +710,7 @@ public class TemporalExpressions implements Serializable {
          * @param freqCount A positive integer
          */
         public Frequency(Date start, int freqType, int freqCount) {
+            super(SEQUENCE_FREQ + freqType);
             if (freqType != Calendar.SECOND && freqType != Calendar.MINUTE
                     && freqType != Calendar.HOUR && freqType != 
Calendar.DAY_OF_MONTH
                     && freqType != Calendar.MONTH && freqType != 
Calendar.YEAR) {
@@ -725,12 +724,8 @@ public class TemporalExpressions implements Serializable {
             } else {
                 this.start = new Date();
             }
-            this.setSequence(SEQUENCE_FREQ + freqType);
             this.freqType = freqType;
             this.freqCount = freqCount;
-            if (Debug.verboseOn()) {
-                Debug.logVerbose("Created " + this, MODULE);
-            }
         }
 
         @Override
@@ -892,6 +887,7 @@ public class TemporalExpressions implements Serializable {
          * @param end An integer in the range of 0 to 23.
          */
         public HourRange(int start, int end) {
+            super(SEQUENCE_HOUR_RANGE + start);
             if (start < 0 || start > 23) {
                 throw new IllegalArgumentException("Invalid start argument");
             }
@@ -900,10 +896,6 @@ public class TemporalExpressions implements Serializable {
             }
             this.start = start;
             this.end = end;
-            this.setSequence(SEQUENCE_HOUR_RANGE + start);
-            if (Debug.verboseOn()) {
-                Debug.logVerbose("Created " + this, MODULE);
-            }
         }
 
         @Override
@@ -1046,27 +1038,24 @@ public class TemporalExpressions implements 
Serializable {
         private final Set<TemporalExpression> expressionSet;
 
         public Intersection(Set<TemporalExpression> expressionSet) {
-            if (expressionSet == null) {
-                throw new IllegalArgumentException("expressionSet argument 
cannot be null");
-            }
-            this.expressionSet = expressionSet;
-            if (containsExpression(this)) {
-                throw new IllegalArgumentException("recursive expression");
-            }
-            if (!this.expressionSet.isEmpty()) {
-                // Aggregate member expression sequences in a way that will
-                // ensure the proper evaluation sequence for the entire 
collection
-                int result = 0;
-                TemporalExpression[] exprArray = 
this.expressionSet.toArray(new TemporalExpression[this.expressionSet.size()]);
-                for (int i = exprArray.length - 1; i >= 0; i--) {
-                    result *= 10;
-                    result += exprArray[i].getSequence();
-                }
-                this.setSequence(result);
+            super(sequence(expressionSet));
+            this.expressionSet = sortedMembers(expressionSet);
+        }
+
+        private static int sequence(Set<TemporalExpression> expressionSet) {
+            SortedSet<TemporalExpression> members = 
sortedMembers(expressionSet);
+            if (members.isEmpty()) {
+                return Integer.MAX_VALUE;
             }
-            if (Debug.verboseOn()) {
-                Debug.logVerbose("Created " + this, MODULE);
+            // Aggregate member expression sequences in a way that will
+            // ensure the proper evaluation sequence for the entire collection
+            int result = 0;
+            TemporalExpression[] exprArray = members.toArray(new 
TemporalExpression[members.size()]);
+            for (int i = exprArray.length - 1; i >= 0; i--) {
+                result *= 10;
+                result += exprArray[i].getSequence();
             }
+            return result;
         }
 
         @Override
@@ -1074,16 +1063,6 @@ public class TemporalExpressions implements Serializable 
{
             visitor.visit(this);
         }
 
-        @Override
-        protected boolean containsExpression(TemporalExpression expression) {
-            for (TemporalExpression setItem : this.expressionSet) {
-                if (setItem.containsExpression(expression)) {
-                    return true;
-                }
-            }
-            return false;
-        }
-
         @Override
         public int hashCode() {
             final int prime = 31;
@@ -1132,7 +1111,7 @@ public class TemporalExpressions implements Serializable {
          * @return The member expression <code>Set</code>
          */
         public Set<TemporalExpression> getExpressionSet() {
-            return Collections.unmodifiableSet(this.expressionSet);
+            return this.expressionSet;
         }
 
         @Override
@@ -1191,6 +1170,7 @@ public class TemporalExpressions implements Serializable {
          * @param end An integer in the range of 0 to 59.
          */
         public MinuteRange(int start, int end) {
+            super(SEQUENCE_MINUTE_RANGE + start);
             if (start < 0 || start > 59) {
                 throw new IllegalArgumentException("Invalid start argument");
             }
@@ -1199,10 +1179,6 @@ public class TemporalExpressions implements Serializable 
{
             }
             this.start = start;
             this.end = end;
-            this.setSequence(SEQUENCE_MINUTE_RANGE + start);
-            if (Debug.verboseOn()) {
-                Debug.logVerbose("Created " + this, MODULE);
-            }
         }
 
         @Override
@@ -1355,18 +1331,15 @@ public class TemporalExpressions implements 
Serializable {
          * to <code>Calendar.UNDECIMBER</code>
          */
         public MonthRange(int start, int end) {
+            super(SEQUENCE_MONTH_RANGE + start);
             if (start < Calendar.JANUARY || start > Calendar.UNDECIMBER) {
                 throw new IllegalArgumentException("Invalid start argument");
             }
             if (end < Calendar.JANUARY || end > Calendar.UNDECIMBER) {
                 throw new IllegalArgumentException("Invalid end argument");
             }
-            this.setSequence(SEQUENCE_MONTH_RANGE + start);
             this.start = start;
             this.end = end;
-            if (Debug.verboseOn()) {
-                Debug.logVerbose("Created " + this, MODULE);
-            }
         }
 
         @Override
@@ -1511,9 +1484,7 @@ public class TemporalExpressions implements Serializable {
         private final TemporalExpression substitute;
 
         public Substitution(TemporalExpression included, TemporalExpression 
excluded, TemporalExpression substitute) {
-            if (included == null) {
-                throw new IllegalArgumentException("included argument cannot 
be null");
-            }
+            super(sequenceOfIncluded(included));
             if (excluded == null) {
                 throw new IllegalArgumentException("excluded argument cannot 
be null");
             }
@@ -1523,13 +1494,6 @@ public class TemporalExpressions implements Serializable 
{
             this.included = included;
             this.excluded = excluded;
             this.substitute = substitute;
-            if (containsExpression(this)) {
-                throw new IllegalArgumentException("recursive expression");
-            }
-            this.setSequence(included.getSequence());
-            if (Debug.verboseOn()) {
-                Debug.logVerbose("Created " + this, MODULE);
-            }
         }
 
         @Override
@@ -1537,11 +1501,6 @@ public class TemporalExpressions implements Serializable 
{
             visitor.visit(this);
         }
 
-        @Override
-        protected boolean containsExpression(TemporalExpression expression) {
-            return this.included.containsExpression(expression) || 
this.excluded.containsExpression(expression);
-        }
-
         @Override
         public int hashCode() {
             final int prime = 31;
@@ -1640,35 +1599,18 @@ public class TemporalExpressions implements 
Serializable {
         private final Set<TemporalExpression> expressionSet;
 
         public Union(Set<TemporalExpression> expressionSet) {
-            if (expressionSet == null) {
-                throw new IllegalArgumentException("expressionSet argument 
cannot be null");
-            }
-            this.expressionSet = expressionSet;
-            if (containsExpression(this)) {
-                throw new IllegalArgumentException("recursive expression");
-            }
-            if (!this.expressionSet.isEmpty()) {
-                TemporalExpression that = this.expressionSet.iterator().next();
-                this.setSequence(that.getSequence());
-            }
-            if (Debug.verboseOn()) {
-                Debug.logVerbose("Created " + this, MODULE);
-            }
+            super(sequence(expressionSet));
+            this.expressionSet = sortedMembers(expressionSet);
         }
 
-        @Override
-        public void accept(TemporalExpressionVisitor visitor) {
-            visitor.visit(this);
+        private static int sequence(Set<TemporalExpression> expressionSet) {
+            SortedSet<TemporalExpression> members = 
sortedMembers(expressionSet);
+            return members.isEmpty() ? Integer.MAX_VALUE : 
members.first().getSequence();
         }
 
         @Override
-        protected boolean containsExpression(TemporalExpression expression) {
-            for (TemporalExpression setItem : this.expressionSet) {
-                if (setItem.containsExpression(expression)) {
-                    return true;
-                }
-            }
-            return false;
+        public void accept(TemporalExpressionVisitor visitor) {
+            visitor.visit(this);
         }
 
         @Override
@@ -1715,7 +1657,7 @@ public class TemporalExpressions implements Serializable {
          * @return The member expression <code>Set</code>
          */
         public Set<TemporalExpression> getExpressionSet() {
-            return Collections.unmodifiableSet(this.expressionSet);
+            return this.expressionSet;
         }
 
         @Override

Reply via email to