blob: 62393279f13634ee9e7c1b32a06540edda83eaa7 [file] [log] [blame]
/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*******************************************************************************/
package org.apache.ofbiz.service.calendar;
import java.io.Serializable;
import com.ibm.icu.util.Calendar;
import java.util.Date;
import java.util.Set;
import java.util.TreeSet;
/** Temporal expression abstract class. */
@SuppressWarnings("serial")
public abstract class TemporalExpression implements Serializable, Comparable<TemporalExpression> {
/** Field used to sort expressions. Expression evaluation depends
* on correct ordering. Expressions are evaluated from lowest value
* to highest value. */
protected int sequence = Integer.MAX_VALUE;
/** A unique ID for this expression. This field is intended to be used by
* persistence classes. */
protected String id = null;
protected TemporalExpression() {}
/** Handles a <code>TemporalExpressionVisitor</code> visit.
* @param visitor
*/
public abstract void accept(TemporalExpressionVisitor visitor);
public int compareTo(TemporalExpression obj) {
if (this.equals(obj) || obj.sequence == this.sequence) {
return 0;
}
return obj.sequence < this.sequence ? 1 : -1;
}
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.
* @param cal A date to evaluate
* @return A Calendar instance representing the first matching date,
* or <code>null</code> if no matching date is found
*/
public abstract Calendar first(Calendar cal);
/** Returns this expression's ID.
* @return Expression ID String
*/
public String getId() {
return this.id;
}
/** Returns a range of dates matching this expression. Returns an
* empty Set if no dates are found.
* @param range The range of dates to evaluate
* @param cal The starting date
* @return A Set of matching <code>Date</code> objects
*/
public Set<Date> getRange(org.apache.ofbiz.base.util.DateRange range, Calendar cal) {
Set<Date> set = new TreeSet<Date>();
Date last = range.start();
Calendar next = first(cal);
while (next != null && range.includesDate(next.getTime())) {
last = next.getTime();
set.add(last);
next = next(next);
if (next != null && last.equals(next.getTime())) {
break;
}
}
return set;
}
/** Returns true if this expression includes the specified date.
* @param cal A date to evaluate
* @return true if this expression includes the date represented by
* <code>cal</code>
*/
public abstract boolean includesDate(Calendar cal);
/** Returns true if this expression is a candidate for substitution
* using the expression <code>expressionToTest</code> for the date
* <code>cal</code>. A <code>Substitution</code> object will call this
* method when it needs to know if this expression could have produced
* the date <code>cal</code> based on the expression
* <code>expressionToTest</code>.
* @param cal A date to evaluate
* @param expressionToTest An expression to evaluate
* @return true if this expression could have produced the date
* <code>cal</code> using the expression <code>expressionToTest</code>
*/
public abstract boolean isSubstitutionCandidate(Calendar cal, TemporalExpression expressionToTest);
/** Returns a date representing the next occurrence of this expression
* after a specified date. Returns <code>null</code> if there
* is no matching date.
* @param cal A date to evaluate
* @return A Calendar instance representing the first matching date,
* or <code>null</code> if no matching date is found
*/
public Calendar next(Calendar cal) {
return next(cal, new ExpressionContext());
}
protected abstract Calendar next(Calendar cal, ExpressionContext context);
/** Sets this expression's ID.
* @param id Expression ID String
*/
public void setId(String id) {
this.id = id;
}
@Override
public String toString() {
return this.getClass().getSimpleName() + " [" + this.id + "]";
}
protected class ExpressionContext {
public boolean hourBumped = false;
public boolean dayBumped = false;
public boolean monthBumped = false;
}
}