|
Author: adrianc
Date: Sat Jan 16 20:59:37 2010 New Revision: 900024 URL: http://svn.apache.org/viewvc?rev=900024&view=rev Log: Temporal Expression bug fixes. Internationalization note: this commit contains new UI labels. Deprecated the time of day expression - it was a bad design. Replaced it with separate hour and minute expressions. Fixed the createTemporalExpression service. It wouldn't allow user-specified expression IDs. Modified: ofbiz/trunk/applications/workeffort/src/org/ofbiz/workeffort/workeffort/ICalRecurConverter.java ofbiz/trunk/framework/common/config/TemporalExpressionUiLabels.xml ofbiz/trunk/framework/common/servicedef/services.xml ofbiz/trunk/framework/common/webcommon/includes/commonMacros.ftl ofbiz/trunk/framework/service/data/ServiceDemoData.xml ofbiz/trunk/framework/service/src/org/ofbiz/service/calendar/TemporalExpressionVisitor.java ofbiz/trunk/framework/service/src/org/ofbiz/service/calendar/TemporalExpressionWorker.java ofbiz/trunk/framework/service/src/org/ofbiz/service/calendar/TemporalExpressions.java ofbiz/trunk/framework/webtools/webapp/webtools/tempexpr/tempExprMacros.ftl ofbiz/trunk/framework/webtools/webapp/webtools/tempexpr/tempExprMaint.ftl Modified: ofbiz/trunk/applications/workeffort/src/org/ofbiz/workeffort/workeffort/ICalRecurConverter.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/workeffort/src/org/ofbiz/workeffort/workeffort/ICalRecurConverter.java?rev=900024&r1=900023&r2=900024&view=diff ============================================================================== --- ofbiz/trunk/applications/workeffort/src/org/ofbiz/workeffort/workeffort/ICalRecurConverter.java (original) +++ ofbiz/trunk/applications/workeffort/src/org/ofbiz/workeffort/workeffort/ICalRecurConverter.java Sat Jan 16 20:59:37 2010 @@ -44,15 +44,6 @@ */ public class ICalRecurConverter implements TemporalExpressionVisitor { protected static final WeekDay dayOfWeekArray[] = {WeekDay.SU, WeekDay.MO, WeekDay.TU, WeekDay.WE, WeekDay.TH, WeekDay.FR, WeekDay.SA}; - protected DtStart dateStart = null; - protected List<DateListProperty> incDateList = FastList.newInstance(); - protected List<DateListProperty> exDateList = FastList.newInstance(); - protected List<RRule> incRuleList = FastList.newInstance(); - protected List<ExRule> exRuleList = FastList.newInstance(); - protected VisitorState state = new VisitorState(); - protected Stack<VisitorState> stateStack = new Stack<VisitorState>(); - - protected ICalRecurConverter() {} @SuppressWarnings("unchecked") public static void convert(TemporalExpression expr, PropertyList eventProps) { @@ -78,16 +69,85 @@ eventProps.addAll(converter.exRuleList); } - // ----- TemporalExpressionVisitor Implementation ----- // + protected DtStart dateStart = null; + protected List<DateListProperty> incDateList = FastList.newInstance(); + protected List<DateListProperty> exDateList = FastList.newInstance(); + protected List<RRule> incRuleList = FastList.newInstance(); + protected List<ExRule> exRuleList = FastList.newInstance(); + protected VisitorState state = new VisitorState(); + protected Stack<VisitorState> stateStack = new Stack<VisitorState>(); - public void visit(Null expr) {} + protected ICalRecurConverter() {} - public void visit(Union expr) { - for (TemporalExpression childExpr : expr.getExpressionSet()) { - childExpr.accept(this); + @SuppressWarnings("unchecked") + protected Recur consolidateRecurs(List<Recur> recurList) { + // Try to consolidate a list of Recur instances into one instance + Set<Integer> monthList = FastSet.newInstance(); + Set<Integer> monthDayList = FastSet.newInstance(); + Set<WeekDay> weekDayList = FastSet.newInstance(); + Set<Integer> hourList = FastSet.newInstance(); + String freq = null; + int freqCount = 0; + for (Recur recur : recurList) { + monthList.addAll(recur.getMonthList()); + monthDayList.addAll(recur.getMonthDayList()); + weekDayList.addAll(recur.getDayList()); + hourList.addAll(recur.getHourList()); + if (recur.getInterval() != 0 && freq == null) { + freq = recur.getFrequency(); + freqCount = recur.getInterval(); + } + } + if (freq == null && monthList.size() > 0) { + freq = Recur.MONTHLY; + } else if (freq == null && (monthDayList.size() > 0 || weekDayList.size() > 0)) { + freq = Recur.DAILY; + } else if (freq == null && hourList.size() > 0) { + freq = Recur.HOURLY; + } + if (freq == null) { + throw new IllegalStateException("Unable to convert intersection"); + } + Recur newRecur = new Recur(freq, 0); + if (freqCount != 0) { + newRecur.setInterval(freqCount); + } + newRecur.getMonthList().addAll(monthList); + newRecur.getMonthDayList().addAll(monthDayList); + newRecur.getDayList().addAll(weekDayList); + newRecur.getHourList().addAll(hourList); + return newRecur; + } + + // ----- TemporalExpressionVisitor Implementation ----- // + + @Override + public void visit(Difference expr) { + VisitorState newState = new VisitorState(); + newState.isIntersection = this.state.isIntersection; + this.stateStack.push(this.state); + this.state = newState; + expr.getIncluded().accept(this); + newState.isExcluded = true; + expr.getExcluded().accept(this); + this.state = this.stateStack.pop(); + if (this.state.isIntersection) { + this.state.inclRecurList.addAll(newState.inclRecurList); + this.state.exRecurList.addAll(newState.exRecurList); } } + @SuppressWarnings("unchecked") + @Override + public void visit(HourRange expr) { + NumberList hourList = new NumberList(); + hourList.addAll(expr.getHourRangeAsSet()); + Recur recur = new Recur(Recur.HOURLY, 0); + recur.getHourList().addAll(hourList); + this.state.addRecur(recur); + } + + @Override public void visit(Intersection expr) { this.stateStack.push(this.state); VisitorState newState = new VisitorState(); @@ -106,21 +166,20 @@ } } - public void visit(Difference expr) { - VisitorState newState = new VisitorState(); - newState.isIntersection = this.state.isIntersection; - this.stateStack.push(this.state); - this.state = newState; - expr.getIncluded().accept(this); - newState.isExcluded = true; - expr.getExcluded().accept(this); - this.state = this.stateStack.pop(); - if (this.state.isIntersection) { - this.state.inclRecurList.addAll(newState.inclRecurList); - this.state.exRecurList.addAll(newState.exRecurList); - } + @SuppressWarnings("unchecked") + @Override + public void visit(MinuteRange expr) { + NumberList minuteList = new NumberList(); + minuteList.addAll(expr.getMinuteRangeAsSet()); + Recur recur = new Recur(Recur.MINUTELY, 0); + recur.getMinuteList().addAll(minuteList); + this.state.addRecur(recur); } + @Override + public void visit(Null expr) {} + + @Override public void visit(TemporalExpressions.DateRange expr) { if (this.state.isExcluded) { throw new IllegalStateException("iCalendar does not support excluded date ranges"); @@ -131,84 +190,49 @@ this.incDateList.add(new RDate(periodList)); } - @SuppressWarnings("unchecked") - public void visit(TimeOfDayRange expr) { - // TODO: this needs a better conversion - int startHr = expr.getStartHours(); - int endHr = expr.getEndHours(); - NumberList hourList = new NumberList(); - hourList.add(startHr); - while (startHr != endHr) { - startHr++; - if (startHr == 24) { - startHr = 0; - } - hourList.add(startHr); - } - Recur recur = new Recur(Recur.HOURLY, 0); - recur.getHourList().addAll(hourList); + @Override + public void visit(TemporalExpressions.DayInMonth expr) { + Recur recur = new Recur(Recur.MONTHLY, 0); + recur.getDayList().add(new WeekDay(dayOfWeekArray[expr.getDayOfWeek() - 1], expr.getOccurrence())); this.state.addRecur(recur); } @SuppressWarnings("unchecked") - public void visit(TemporalExpressions.DayOfWeekRange expr) { + @Override + public void visit(TemporalExpressions.DayOfMonthRange expr) { int startDay = expr.getStartDay(); int endDay = expr.getEndDay(); - WeekDayList dayList = new WeekDayList(); - dayList.add(dayOfWeekArray[startDay - 1]); + NumberList dayList = new NumberList(); + dayList.add(startDay); while (startDay != endDay) { startDay++; - if (startDay > Calendar.SATURDAY) { - startDay = Calendar.SUNDAY; - } - dayList.add(dayOfWeekArray[startDay - 1]); + dayList.add(startDay); } Recur recur = new Recur(Recur.DAILY, 0); - recur.getDayList().addAll(dayList); - this.state.addRecur(recur); - } - - @SuppressWarnings("unchecked") - public void visit(TemporalExpressions.MonthRange expr) { - int startMonth = expr.getStartMonth(); - int endMonth = expr.getEndMonth(); - Calendar cal = Calendar.getInstance(); - int maxMonth = cal.getActualMaximum(Calendar.MONTH); - NumberList monthList = new NumberList(); - monthList.add(startMonth + 1); - while (startMonth != endMonth) { - startMonth++; - if (startMonth > maxMonth) { - startMonth = Calendar.JANUARY; - } - monthList.add(startMonth + 1); - } - Recur recur = new Recur(Recur.MONTHLY, 0); - recur.getMonthList().addAll(monthList); + recur.getMonthDayList().addAll(dayList); this.state.addRecur(recur); } @SuppressWarnings("unchecked") - public void visit(TemporalExpressions.DayOfMonthRange expr) { + @Override + public void visit(TemporalExpressions.DayOfWeekRange expr) { int startDay = expr.getStartDay(); int endDay = expr.getEndDay(); - NumberList dayList = new NumberList(); - dayList.add(startDay); + WeekDayList dayList = new WeekDayList(); + dayList.add(dayOfWeekArray[startDay - 1]); while (startDay != endDay) { startDay++; - dayList.add(startDay); + if (startDay > Calendar.SATURDAY) { + startDay = Calendar.SUNDAY; + } + dayList.add(dayOfWeekArray[startDay - 1]); } Recur recur = new Recur(Recur.DAILY, 0); - recur.getMonthDayList().addAll(dayList); - this.state.addRecur(recur); - } - - public void visit(TemporalExpressions.DayInMonth expr) { - Recur recur = new Recur(Recur.MONTHLY, 0); - recur.getDayList().add(new WeekDay(dayOfWeekArray[expr.getDayOfWeek() - 1], expr.getOccurrence())); + recur.getDayList().addAll(dayList); this.state.addRecur(recur); } + @Override public void visit(TemporalExpressions.Frequency expr) { if (this.dateStart == null) { this.dateStart = new DtStart(new net.fortuna.ical4j.model.Date(expr.getStartDate())); @@ -232,43 +256,50 @@ } @SuppressWarnings("unchecked") - protected Recur consolidateRecurs(List<Recur> recurList) { - // Try to consolidate a list of Recur instances into one instance - Set<Integer> monthList = FastSet.newInstance(); - Set<Integer> monthDayList = FastSet.newInstance(); - Set<WeekDay> weekDayList = FastSet.newInstance(); - Set<Integer> hourList = FastSet.newInstance(); - String freq = null; - int freqCount = 0; - for (Recur recur : recurList) { - monthList.addAll(recur.getMonthList()); - monthDayList.addAll(recur.getMonthDayList()); - weekDayList.addAll(recur.getDayList()); - hourList.addAll(recur.getHourList()); - if (recur.getInterval() != 0 && freq == null) { - freq = recur.getFrequency(); - freqCount = recur.getInterval(); + @Override + public void visit(TemporalExpressions.MonthRange expr) { + int startMonth = expr.getStartMonth(); + int endMonth = expr.getEndMonth(); + Calendar cal = Calendar.getInstance(); + int maxMonth = cal.getActualMaximum(Calendar.MONTH); + NumberList monthList = new NumberList(); + monthList.add(startMonth + 1); + while (startMonth != endMonth) { + startMonth++; + if (startMonth > maxMonth) { + startMonth = Calendar.JANUARY; } + monthList.add(startMonth + 1); } - if (freq == null && monthList.size() > 0) { - freq = Recur.MONTHLY; - } else if (freq == null && (monthDayList.size() > 0 || weekDayList.size() > 0)) { - freq = Recur.DAILY; - } else if (freq == null && hourList.size() > 0) { - freq = Recur.HOURLY; - } - if (freq == null) { - throw new IllegalStateException("Unable to convert intersection"); + Recur recur = new Recur(Recur.MONTHLY, 0); + recur.getMonthList().addAll(monthList); + this.state.addRecur(recur); + } + + @SuppressWarnings("unchecked") + @Override + public void visit(TimeOfDayRange expr) { + int startHr = expr.getStartHours(); + int endHr = expr.getEndHours(); + NumberList hourList = new NumberList(); + hourList.add(startHr); + while (startHr != endHr) { + startHr++; + if (startHr == 24) { + startHr = 0; + } + hourList.add(startHr); } - Recur newRecur = new Recur(freq, 0); - if (freqCount != 0) { - newRecur.setInterval(freqCount); + Recur recur = new Recur(Recur.HOURLY, 0); + recur.getHourList().addAll(hourList); + this.state.addRecur(recur); + } + + @Override + public void visit(Union expr) { + for (TemporalExpression childExpr : expr.getExpressionSet()) { + childExpr.accept(this); } - newRecur.getMonthList().addAll(monthList); - newRecur.getMonthDayList().addAll(monthDayList); - newRecur.getDayList().addAll(weekDayList); - newRecur.getHourList().addAll(hourList); - return newRecur; } protected class VisitorState { Modified: ofbiz/trunk/framework/common/config/TemporalExpressionUiLabels.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/config/TemporalExpressionUiLabels.xml?rev=900024&r1=900023&r2=900024&view=diff ============================================================================== --- ofbiz/trunk/framework/common/config/TemporalExpressionUiLabels.xml (original) +++ ofbiz/trunk/framework/common/config/TemporalExpressionUiLabels.xml Sat Jan 16 20:59:37 2010 @@ -126,12 +126,18 @@ <value xml:lang="it">Frequenza</value> <value xml:lang="zh">é¢ç</value> </property> + <property key="TemporalExpression_HOUR_RANGE"> + <value xml:lang="en">Hour Range</value> + </property> <property key="TemporalExpression_INTERSECTION"> <value xml:lang="en">Intersection</value> <value xml:lang="fr">Intersection</value> <value xml:lang="it">Intersezione</value> <value xml:lang="zh">交åç¹</value> </property> + <property key="TemporalExpression_MINUTE_RANGE"> + <value xml:lang="en">Minute Range</value> + </property> <property key="TemporalExpression_MONTH_RANGE"> <value xml:lang="en">Month Range</value> <value xml:lang="fr">Intervalle entre 2 mois</value> @@ -139,7 +145,7 @@ <value xml:lang="zh">æçèå´</value> </property> <property key="TemporalExpression_TIME_OF_DAY_RANGE"> - <value xml:lang="en">Time Of Day Range</value> + <value xml:lang="en">Time Of Day Range (deprecated)</value> <value xml:lang="fr">Intervalle entre 2 heures d'un jour</value> <value xml:lang="it">Ora nel giorno dell'intervallo</value> <value xml:lang="zh">æ¥ä¸æ¶é´çèå´</value> Modified: ofbiz/trunk/framework/common/servicedef/services.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/servicedef/services.xml?rev=900024&r1=900023&r2=900024&view=diff ============================================================================== --- ofbiz/trunk/framework/common/servicedef/services.xml (original) +++ ofbiz/trunk/framework/common/servicedef/services.xml Sat Jan 16 20:59:37 2010 @@ -537,7 +537,7 @@ <service name="createTemporalExpression" default-entity-name="TemporalExpression" engine="entity-auto" invoke="create" auth="true"> <description>Create a Temporal Expression</description> <permission-service service-name="tempExprPermissionCheck" main-action="CREATE"/> - <auto-attributes include="pk" mode="OUT" optional="false"/> + <auto-attributes include="pk" mode="INOUT" optional="true"/> <auto-attributes include="nonpk" mode="IN" optional="true"/> </service> <service name="updateTemporalExpression" default-entity-name="TemporalExpression" engine="entity-auto" invoke="update" auth="true"> Modified: ofbiz/trunk/framework/common/webcommon/includes/commonMacros.ftl URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/webcommon/includes/commonMacros.ftl?rev=900024&r1=900023&r2=900024&view=diff ============================================================================== --- ofbiz/trunk/framework/common/webcommon/includes/commonMacros.ftl (original) +++ ofbiz/trunk/framework/common/webcommon/includes/commonMacros.ftl Sat Jan 16 20:59:37 2010 @@ -53,6 +53,28 @@ </#if> </#macro> +<#macro HourOfDayField fieldName="" fieldValue=-1 fieldClass=""> + <select name="${fieldName}"<#if fieldClass?has_content> class="${fieldClass}"</#if>> + <#list 0..23 as i> + <option value="${i}"<#if i == fieldValue> selected="selected"</#if>>${i}</option> + </#list> + </select> + <#if fieldClass == "required"> + <span class="tooltip">${uiLabelMap.CommonRequired}</span> + </#if> +</#macro> + +<#macro MinuteField fieldName="" fieldValue=-1 fieldClass=""> + <select name="${fieldName}"<#if fieldClass?has_content> class="${fieldClass}"</#if>> + <#list 0..59 as i> + <option value="${i}"<#if i == fieldValue> selected="selected"</#if>>${i}</option> + </#list> + </select> + <#if fieldClass == "required"> + <span class="tooltip">${uiLabelMap.CommonRequired}</span> + </#if> +</#macro> + <#macro DayOfWeekField fieldName="" fieldValue=-1 fieldClass=""> <select name="${fieldName}"<#if fieldClass?has_content> class="${fieldClass}"</#if>> <#list dayValueList as dayValue> Modified: ofbiz/trunk/framework/service/data/ServiceDemoData.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/data/ServiceDemoData.xml?rev=900024&r1=900023&r2=900024&view=diff ============================================================================== --- ofbiz/trunk/framework/service/data/ServiceDemoData.xml (original) +++ ofbiz/trunk/framework/service/data/ServiceDemoData.xml Sat Jan 16 20:59:37 2010 @@ -21,6 +21,94 @@ <entity-engine-xml> <!-- Temporal Expression demo data --> + <!-- Pre-define all 60 minutes --> + <TemporalExpression tempExprId="MINUTE_00" tempExprTypeId="MINUTE_RANGE" integer1="0" integer2="0"/> + <TemporalExpression tempExprId="MINUTE_01" tempExprTypeId="MINUTE_RANGE" integer1="1" integer2="1"/> + <TemporalExpression tempExprId="MINUTE_02" tempExprTypeId="MINUTE_RANGE" integer1="2" integer2="2"/> + <TemporalExpression tempExprId="MINUTE_03" tempExprTypeId="MINUTE_RANGE" integer1="3" integer2="3"/> + <TemporalExpression tempExprId="MINUTE_04" tempExprTypeId="MINUTE_RANGE" integer1="4" integer2="4"/> + <TemporalExpression tempExprId="MINUTE_05" tempExprTypeId="MINUTE_RANGE" integer1="5" integer2="5"/> + <TemporalExpression tempExprId="MINUTE_06" tempExprTypeId="MINUTE_RANGE" integer1="6" integer2="6"/> + <TemporalExpression tempExprId="MINUTE_07" tempExprTypeId="MINUTE_RANGE" integer1="7" integer2="7"/> + <TemporalExpression tempExprId="MINUTE_08" tempExprTypeId="MINUTE_RANGE" integer1="8" integer2="8"/> + <TemporalExpression tempExprId="MINUTE_09" tempExprTypeId="MINUTE_RANGE" integer1="9" integer2="9"/> + <TemporalExpression tempExprId="MINUTE_10" tempExprTypeId="MINUTE_RANGE" integer1="10" integer2="10"/> + <TemporalExpression tempExprId="MINUTE_11" tempExprTypeId="MINUTE_RANGE" integer1="11" integer2="11"/> + <TemporalExpression tempExprId="MINUTE_12" tempExprTypeId="MINUTE_RANGE" integer1="12" integer2="12"/> + <TemporalExpression tempExprId="MINUTE_13" tempExprTypeId="MINUTE_RANGE" integer1="13" integer2="13"/> + <TemporalExpression tempExprId="MINUTE_14" tempExprTypeId="MINUTE_RANGE" integer1="14" integer2="14"/> + <TemporalExpression tempExprId="MINUTE_15" tempExprTypeId="MINUTE_RANGE" integer1="15" integer2="15"/> + <TemporalExpression tempExprId="MINUTE_16" tempExprTypeId="MINUTE_RANGE" integer1="16" integer2="16"/> + <TemporalExpression tempExprId="MINUTE_17" tempExprTypeId="MINUTE_RANGE" integer1="17" integer2="17"/> + <TemporalExpression tempExprId="MINUTE_18" tempExprTypeId="MINUTE_RANGE" integer1="18" integer2="18"/> + <TemporalExpression tempExprId="MINUTE_19" tempExprTypeId="MINUTE_RANGE" integer1="19" integer2="19"/> + <TemporalExpression tempExprId="MINUTE_20" tempExprTypeId="MINUTE_RANGE" integer1="20" integer2="20"/> + <TemporalExpression tempExprId="MINUTE_21" tempExprTypeId="MINUTE_RANGE" integer1="21" integer2="21"/> + <TemporalExpression tempExprId="MINUTE_22" tempExprTypeId="MINUTE_RANGE" integer1="22" integer2="22"/> + <TemporalExpression tempExprId="MINUTE_23" tempExprTypeId="MINUTE_RANGE" integer1="23" integer2="23"/> + <TemporalExpression tempExprId="MINUTE_24" tempExprTypeId="MINUTE_RANGE" integer1="24" integer2="24"/> + <TemporalExpression tempExprId="MINUTE_25" tempExprTypeId="MINUTE_RANGE" integer1="25" integer2="25"/> + <TemporalExpression tempExprId="MINUTE_26" tempExprTypeId="MINUTE_RANGE" integer1="26" integer2="26"/> + <TemporalExpression tempExprId="MINUTE_27" tempExprTypeId="MINUTE_RANGE" integer1="27" integer2="27"/> + <TemporalExpression tempExprId="MINUTE_28" tempExprTypeId="MINUTE_RANGE" integer1="28" integer2="28"/> + <TemporalExpression tempExprId="MINUTE_29" tempExprTypeId="MINUTE_RANGE" integer1="29" integer2="29"/> + <TemporalExpression tempExprId="MINUTE_30" tempExprTypeId="MINUTE_RANGE" integer1="30" integer2="30"/> + <TemporalExpression tempExprId="MINUTE_31" tempExprTypeId="MINUTE_RANGE" integer1="31" integer2="31"/> + <TemporalExpression tempExprId="MINUTE_32" tempExprTypeId="MINUTE_RANGE" integer1="32" integer2="32"/> + <TemporalExpression tempExprId="MINUTE_33" tempExprTypeId="MINUTE_RANGE" integer1="33" integer2="33"/> + <TemporalExpression tempExprId="MINUTE_34" tempExprTypeId="MINUTE_RANGE" integer1="34" integer2="34"/> + <TemporalExpression tempExprId="MINUTE_35" tempExprTypeId="MINUTE_RANGE" integer1="35" integer2="35"/> + <TemporalExpression tempExprId="MINUTE_36" tempExprTypeId="MINUTE_RANGE" integer1="36" integer2="36"/> + <TemporalExpression tempExprId="MINUTE_37" tempExprTypeId="MINUTE_RANGE" integer1="37" integer2="37"/> + <TemporalExpression tempExprId="MINUTE_38" tempExprTypeId="MINUTE_RANGE" integer1="38" integer2="38"/> + <TemporalExpression tempExprId="MINUTE_39" tempExprTypeId="MINUTE_RANGE" integer1="39" integer2="39"/> + <TemporalExpression tempExprId="MINUTE_40" tempExprTypeId="MINUTE_RANGE" integer1="40" integer2="40"/> + <TemporalExpression tempExprId="MINUTE_41" tempExprTypeId="MINUTE_RANGE" integer1="41" integer2="41"/> + <TemporalExpression tempExprId="MINUTE_42" tempExprTypeId="MINUTE_RANGE" integer1="42" integer2="42"/> + <TemporalExpression tempExprId="MINUTE_43" tempExprTypeId="MINUTE_RANGE" integer1="43" integer2="43"/> + <TemporalExpression tempExprId="MINUTE_44" tempExprTypeId="MINUTE_RANGE" integer1="44" integer2="44"/> + <TemporalExpression tempExprId="MINUTE_45" tempExprTypeId="MINUTE_RANGE" integer1="45" integer2="45"/> + <TemporalExpression tempExprId="MINUTE_46" tempExprTypeId="MINUTE_RANGE" integer1="46" integer2="46"/> + <TemporalExpression tempExprId="MINUTE_47" tempExprTypeId="MINUTE_RANGE" integer1="47" integer2="47"/> + <TemporalExpression tempExprId="MINUTE_48" tempExprTypeId="MINUTE_RANGE" integer1="48" integer2="48"/> + <TemporalExpression tempExprId="MINUTE_49" tempExprTypeId="MINUTE_RANGE" integer1="49" integer2="49"/> + <TemporalExpression tempExprId="MINUTE_50" tempExprTypeId="MINUTE_RANGE" integer1="50" integer2="50"/> + <TemporalExpression tempExprId="MINUTE_51" tempExprTypeId="MINUTE_RANGE" integer1="51" integer2="51"/> + <TemporalExpression tempExprId="MINUTE_52" tempExprTypeId="MINUTE_RANGE" integer1="52" integer2="52"/> + <TemporalExpression tempExprId="MINUTE_53" tempExprTypeId="MINUTE_RANGE" integer1="53" integer2="53"/> + <TemporalExpression tempExprId="MINUTE_54" tempExprTypeId="MINUTE_RANGE" integer1="54" integer2="54"/> + <TemporalExpression tempExprId="MINUTE_55" tempExprTypeId="MINUTE_RANGE" integer1="55" integer2="55"/> + <TemporalExpression tempExprId="MINUTE_56" tempExprTypeId="MINUTE_RANGE" integer1="56" integer2="56"/> + <TemporalExpression tempExprId="MINUTE_57" tempExprTypeId="MINUTE_RANGE" integer1="57" integer2="57"/> + <TemporalExpression tempExprId="MINUTE_58" tempExprTypeId="MINUTE_RANGE" integer1="58" integer2="58"/> + <TemporalExpression tempExprId="MINUTE_59" tempExprTypeId="MINUTE_RANGE" integer1="59" integer2="59"/> + + <!-- Pre-define all 24 hours of the day --> + <TemporalExpression tempExprId="HOUR_00" tempExprTypeId="HOUR_RANGE" integer1="0" integer2="0"/> + <TemporalExpression tempExprId="HOUR_01" tempExprTypeId="HOUR_RANGE" integer1="1" integer2="1"/> + <TemporalExpression tempExprId="HOUR_02" tempExprTypeId="HOUR_RANGE" integer1="2" integer2="2"/> + <TemporalExpression tempExprId="HOUR_03" tempExprTypeId="HOUR_RANGE" integer1="3" integer2="3"/> + <TemporalExpression tempExprId="HOUR_04" tempExprTypeId="HOUR_RANGE" integer1="4" integer2="4"/> + <TemporalExpression tempExprId="HOUR_05" tempExprTypeId="HOUR_RANGE" integer1="5" integer2="5"/> + <TemporalExpression tempExprId="HOUR_06" tempExprTypeId="HOUR_RANGE" integer1="6" integer2="6"/> + <TemporalExpression tempExprId="HOUR_07" tempExprTypeId="HOUR_RANGE" integer1="7" integer2="7"/> + <TemporalExpression tempExprId="HOUR_08" tempExprTypeId="HOUR_RANGE" integer1="8" integer2="8"/> + <TemporalExpression tempExprId="HOUR_09" tempExprTypeId="HOUR_RANGE" integer1="9" integer2="9"/> + <TemporalExpression tempExprId="HOUR_10" tempExprTypeId="HOUR_RANGE" integer1="10" integer2="10"/> + <TemporalExpression tempExprId="HOUR_11" tempExprTypeId="HOUR_RANGE" integer1="11" integer2="11"/> + <TemporalExpression tempExprId="HOUR_12" tempExprTypeId="HOUR_RANGE" integer1="12" integer2="12"/> + <TemporalExpression tempExprId="HOUR_13" tempExprTypeId="HOUR_RANGE" integer1="13" integer2="13"/> + <TemporalExpression tempExprId="HOUR_14" tempExprTypeId="HOUR_RANGE" integer1="14" integer2="14"/> + <TemporalExpression tempExprId="HOUR_15" tempExprTypeId="HOUR_RANGE" integer1="15" integer2="15"/> + <TemporalExpression tempExprId="HOUR_16" tempExprTypeId="HOUR_RANGE" integer1="16" integer2="16"/> + <TemporalExpression tempExprId="HOUR_17" tempExprTypeId="HOUR_RANGE" integer1="17" integer2="17"/> + <TemporalExpression tempExprId="HOUR_18" tempExprTypeId="HOUR_RANGE" integer1="18" integer2="18"/> + <TemporalExpression tempExprId="HOUR_19" tempExprTypeId="HOUR_RANGE" integer1="19" integer2="19"/> + <TemporalExpression tempExprId="HOUR_20" tempExprTypeId="HOUR_RANGE" integer1="20" integer2="20"/> + <TemporalExpression tempExprId="HOUR_21" tempExprTypeId="HOUR_RANGE" integer1="21" integer2="21"/> + <TemporalExpression tempExprId="HOUR_22" tempExprTypeId="HOUR_RANGE" integer1="22" integer2="22"/> + <TemporalExpression tempExprId="HOUR_23" tempExprTypeId="HOUR_RANGE" integer1="23" integer2="23"/> + <!-- Pre-define all days of the week (Sunday -> Saturday) --> <TemporalExpression tempExprId="DAYOFWEEK_01" tempExprTypeId="DAY_OF_WEEK_RANGE" integer1="1" integer2="1"/> <TemporalExpression tempExprId="DAYOFWEEK_02" tempExprTypeId="DAY_OF_WEEK_RANGE" integer1="2" integer2="2"/> @@ -155,8 +243,7 @@ <!-- An 8am Mon-Fri expression that excludes US federal holidays --> <TemporalExpression tempExprId="DAILY_GRIND" tempExprTypeId="INTERSECTION"/> - <TemporalExpression tempExprId="8AM" tempExprTypeId="TIME_OF_DAY_RANGE" string1="08:00" string2="08:00"/> - <TemporalExpressionAssoc fromTempExprId="DAILY_GRIND" toTempExprId="8AM"/> + <TemporalExpressionAssoc fromTempExprId="DAILY_GRIND" toTempExprId="HOUR_08"/> <TemporalExpressionAssoc fromTempExprId="DAILY_GRIND" toTempExprId="GOVT_WORK_SCHED"/> <!-- An every-other-Monday at 5pm expression --> @@ -168,15 +255,17 @@ values are typically obtained from the java.util.Calendar field constants. For more information, see the org.ofbiz.service.calendar.TemporalExpressions.java file. - tempExprTypeId integer1 integer2 date1 date2 string1 string2 - ==================== ============== =============== ====== ====== ========== ======== - DATE_RANGE start end - TIME_OF_DAY_RANGE interval [9] count [7] start [1] end [1] - DAY_OF_WEEK_RANGE start [2] end [2] - MONTH_RANGE start [3] end [3] - DAY_OF_MONTH_RANGE start [4] end [4] - DAY_IN_MONTH day [2] occurrence [5] - FREQUENCY freq type [6] freq count [7] start[8] + tempExprTypeId integer1 integer2 date1 date2 string1 string2 + ==================== ============== =============== ====== ====== ========== ======== + HOUR_RANGE start[11] end[11] + DATE_RANGE start end + TIME_OF_DAY_RANGE[10] interval [9] count [7] start [1] end [1] + DAY_OF_WEEK_RANGE start [2] end [2] + MINUTE_RANGE start [12] end [12] + MONTH_RANGE start [3] end [3] + DAY_OF_MONTH_RANGE start [4] end [4] + DAY_IN_MONTH day [2] occurrence [5] + FREQUENCY freq type [6] freq count [7] start[8] [1] hh:mm:ss [2] Day of week: 1 = Sunday, 7 = Saturday @@ -187,6 +276,9 @@ [7] Positive integer, zero excluded [8] If null, defaults to system date when the expression was retrieved from storage. [9] Second = 13, Minute = 12, Hour = 11 (default) + [10] Deprecated - do not use + [11] Integer: 0 to 23, midnight = 0 + [12] Integer: 0 to 59 --> </entity-engine-xml> Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/calendar/TemporalExpressionVisitor.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/calendar/TemporalExpressionVisitor.java?rev=900024&r1=900023&r2=900024&view=diff ============================================================================== --- ofbiz/trunk/framework/service/src/org/ofbiz/service/calendar/TemporalExpressionVisitor.java (original) +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/calendar/TemporalExpressionVisitor.java Sat Jan 16 20:59:37 2010 @@ -20,15 +20,17 @@ /** Temporal expression visitor interface. */ public interface TemporalExpressionVisitor { - void visit(TemporalExpressions.Null expr); - void visit(TemporalExpressions.Union expr); - void visit(TemporalExpressions.Intersection expr); - void visit(TemporalExpressions.Difference expr); void visit(TemporalExpressions.DateRange expr); - void visit(TemporalExpressions.TimeOfDayRange expr); - void visit(TemporalExpressions.DayOfWeekRange expr); - void visit(TemporalExpressions.MonthRange expr); - void visit(TemporalExpressions.DayOfMonthRange expr); void visit(TemporalExpressions.DayInMonth expr); + void visit(TemporalExpressions.DayOfMonthRange expr); + void visit(TemporalExpressions.DayOfWeekRange expr); + void visit(TemporalExpressions.Difference expr); void visit(TemporalExpressions.Frequency expr); + void visit(TemporalExpressions.HourRange expr); + void visit(TemporalExpressions.Intersection expr); + void visit(TemporalExpressions.MinuteRange expr); + void visit(TemporalExpressions.MonthRange expr); + void visit(TemporalExpressions.Null expr); + void visit(TemporalExpressions.TimeOfDayRange expr); + void visit(TemporalExpressions.Union expr); } Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/calendar/TemporalExpressionWorker.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/calendar/TemporalExpressionWorker.java?rev=900024&r1=900023&r2=900024&view=diff ============================================================================== --- ofbiz/trunk/framework/service/src/org/ofbiz/service/calendar/TemporalExpressionWorker.java (original) +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/calendar/TemporalExpressionWorker.java Sat Jan 16 20:59:37 2010 @@ -23,6 +23,7 @@ import java.util.Set; import java.util.TreeSet; +import org.ofbiz.base.util.Debug; import org.ofbiz.base.util.UtilMisc; import org.ofbiz.base.util.UtilValidate; import org.ofbiz.entity.Delegator; @@ -34,6 +35,8 @@ /** TemporalExpression persistence worker. */ public class TemporalExpressionWorker { + public final static String module = TemporalExpressionWorker.class.getName(); + // Temporal expression constants public final static String DateRange = "DATE_RANGE"; public final static String DayInMonth = "DAY_IN_MONTH"; @@ -41,7 +44,9 @@ public final static String DayOfWeekRange = "DAY_OF_WEEK_RANGE"; public final static String Difference = "DIFFERENCE"; public final static String Frequency = "FREQUENCY"; + public final static String HourRange = "HOUR_RANGE"; public final static String Intersection = "INTERSECTION"; + public final static String MinuteRange = "MINUTE_RANGE"; public final static String MonthRange = "MONTH_RANGE"; public final static String TimeOfDayRange = "TIME_OF_DAY_RANGE"; public final static String Union = "UNION"; @@ -92,11 +97,16 @@ } } else if (Frequency.equals(tempExprTypeId)) { return new TemporalExpressions.Frequency(exprValue.getTimestamp("date1"), exprValue.getLong("integer1").intValue(), exprValue.getLong("integer2").intValue()); + } else if (HourRange.equals(tempExprTypeId)) { + return new TemporalExpressions.HourRange(exprValue.getLong("integer1").intValue(), exprValue.getLong("integer2").intValue()); + } else if (MinuteRange.equals(tempExprTypeId)) { + return new TemporalExpressions.MinuteRange(exprValue.getLong("integer1").intValue(), exprValue.getLong("integer2").intValue()); } else if (Intersection.equals(tempExprTypeId)) { return new TemporalExpressions.Intersection(getChildExpressions(delegator, tempExprId)); } else if (MonthRange.equals(tempExprTypeId)) { return new TemporalExpressions.MonthRange(exprValue.getLong("integer1").intValue(), exprValue.getLong("integer2").intValue()); } else if (TimeOfDayRange.equals(tempExprTypeId)) { + Debug.logWarning(TimeOfDayRange + " has been deprecated. Use " + HourRange + " and/or " + MinuteRange, module); int interval = Calendar.HOUR_OF_DAY; int count = 1; Long longObj = exprValue.getLong("integer1"); Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/calendar/TemporalExpressions.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/calendar/TemporalExpressions.java?rev=900024&r1=900023&r2=900024&view=diff ============================================================================== --- ofbiz/trunk/framework/service/src/org/ofbiz/service/calendar/TemporalExpressions.java (original) +++ ofbiz/trunk/framework/service/src/org/ofbiz/service/calendar/TemporalExpressions.java Sat Jan 16 20:59:37 2010 @@ -24,6 +24,7 @@ import java.util.Date; import java.util.Set; import java.util.TreeSet; + import org.ofbiz.base.util.Debug; import org.ofbiz.base.util.UtilValidate; @@ -467,6 +468,246 @@ } } + /** A temporal expression that represents an hour range. */ + public static class HourRange extends TemporalExpression { + protected final int start; + protected final int end; + + /** + * @param hour An integer in the range of 0 to 23. + */ + public HourRange(int hour) { + this(hour, hour); + } + + /** + * @param start An integer in the range of 0 to 23. + * @param end An integer in the range of 0 to 23. + */ + public HourRange(int start, int end) { + if (start < 0 || start > 23) { + throw new IllegalArgumentException("Invalid start argument"); + } + if (end < 0 || end > 23) { + throw new IllegalArgumentException("Invalid end argument"); + } + this.start = start; + this.end = end; + this.sequence = 600; + this.subSequence = start * 4000; + if (Debug.verboseOn()) { + Debug.logVerbose("Created " + this, module); + } + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + try { + HourRange that = (HourRange) obj; + return this.start == that.start && this.end == that.end; + } catch (ClassCastException e) {} + return false; + } + + @Override + public String toString() { + return super.toString() + ", start = " + this.start + ", end = " + this.end; + } + + @Override + public boolean includesDate(Calendar cal) { + int hour = cal.get(Calendar.HOUR_OF_DAY); + if (hour == this.start || hour == this.end) { + return true; + } + Calendar compareCal = (Calendar) cal.clone(); + compareCal.set(Calendar.HOUR_OF_DAY, this.start); + while (compareCal.get(Calendar.HOUR_OF_DAY) != this.end) { + if (compareCal.get(Calendar.HOUR_OF_DAY) == hour) { + return true; + } + compareCal.add(Calendar.HOUR_OF_DAY, 1); + } + return false; + } + + @Override + public Calendar first(Calendar cal) { + Calendar first = (Calendar) cal.clone(); + while (!includesDate(first)) { + first.add(Calendar.HOUR_OF_DAY, 1); + } + return first; + } + + @Override + public Calendar next(Calendar cal) { + Calendar next = (Calendar) cal.clone(); + next.add(Calendar.HOUR_OF_DAY, 1); + while (!includesDate(next)) { + next.add(Calendar.HOUR_OF_DAY, 1); + } + return next; + } + + @Override + public void accept(TemporalExpressionVisitor visitor) { + visitor.visit(this); + } + + /** Returns the starting hour of this range. + * @return The starting hour of this range + */ + public int getStartHour() { + return this.start; + } + + /** Returns the ending hour of this range. + * @return The ending hour of this range + */ + public int getEndHour() { + return this.end; + } + + public Set<Integer> getHourRangeAsSet() { + Set<Integer> rangeSet = new TreeSet<Integer>(); + if (this.start == this.end) { + rangeSet.add(this.start); + } else { + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.HOUR_OF_DAY, this.start); + while (cal.get(Calendar.HOUR_OF_DAY) != this.end) { + rangeSet.add(cal.get(Calendar.HOUR_OF_DAY)); + cal.add(Calendar.HOUR_OF_DAY, 1); + } + } + return rangeSet; + } + } + + + /** A temporal expression that represents a minute range. */ + public static class MinuteRange extends TemporalExpression { + protected final int start; + protected final int end; + + /** + * @param hour An integer in the range of 0 to 59. + */ + public MinuteRange(int minute) { + this(minute, minute); + } + + /** + * @param start An integer in the range of 0 to 59. + * @param end An integer in the range of 0 to 59. + */ + public MinuteRange(int start, int end) { + if (start < 0 || start > 23) { + throw new IllegalArgumentException("Invalid start argument"); + } + if (end < 0 || end > 23) { + throw new IllegalArgumentException("Invalid end argument"); + } + this.start = start; + this.end = end; + this.sequence = 600; + this.subSequence = start; + if (Debug.verboseOn()) { + Debug.logVerbose("Created " + this, module); + } + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + try { + MinuteRange that = (MinuteRange) obj; + return this.start == that.start && this.end == that.end; + } catch (ClassCastException e) {} + return false; + } + + @Override + public String toString() { + return super.toString() + ", start = " + this.start + ", end = " + this.end; + } + + @Override + public boolean includesDate(Calendar cal) { + int minute = cal.get(Calendar.MINUTE); + if (minute == this.start || minute == this.end) { + return true; + } + Calendar compareCal = (Calendar) cal.clone(); + compareCal.set(Calendar.MINUTE, this.start); + while (compareCal.get(Calendar.MINUTE) != this.end) { + if (compareCal.get(Calendar.MINUTE) == minute) { + return true; + } + compareCal.add(Calendar.MINUTE, 1); + } + return false; + } + + @Override + public Calendar first(Calendar cal) { + Calendar first = (Calendar) cal.clone(); + while (!includesDate(first)) { + first.add(Calendar.MINUTE, 1); + } + return first; + } + + @Override + public Calendar next(Calendar cal) { + Calendar next = (Calendar) cal.clone(); + next.add(Calendar.MINUTE, 1); + while (!includesDate(next)) { + next.add(Calendar.MINUTE, 1); + } + return next; + } + + @Override + public void accept(TemporalExpressionVisitor visitor) { + visitor.visit(this); + } + + /** Returns the starting minute of this range. + * @return The starting minute of this range + */ + public int getStartMinute() { + return this.start; + } + + /** Returns the ending minute of this range. + * @return The ending minute of this range + */ + public int getEndMinute() { + return this.end; + } + + public Set<Integer> getMinuteRangeAsSet() { + Set<Integer> rangeSet = new TreeSet<Integer>(); + if (this.start == this.end) { + rangeSet.add(this.start); + } else { + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.HOUR_OF_DAY, this.start); + while (cal.get(Calendar.HOUR_OF_DAY) != this.end) { + rangeSet.add(cal.get(Calendar.HOUR_OF_DAY)); + cal.add(Calendar.HOUR_OF_DAY, 1); + } + } + return rangeSet; + } + } /** A temporal expression that represents a time of day range. */ public static class TimeOfDayRange extends TemporalExpression { protected final String startStr; Modified: ofbiz/trunk/framework/webtools/webapp/webtools/tempexpr/tempExprMacros.ftl URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webtools/webapp/webtools/tempexpr/tempExprMacros.ftl?rev=900024&r1=900023&r2=900024&view=diff ============================================================================== --- ofbiz/trunk/framework/webtools/webapp/webtools/tempexpr/tempExprMacros.ftl (original) +++ ofbiz/trunk/framework/webtools/webapp/webtools/tempexpr/tempExprMacros.ftl Sat Jan 16 20:59:37 2010 @@ -78,6 +78,17 @@ </tr> </#macro> +<#macro HourOfDayRange fromHour=1 toHour=31> + <tr> + <td class="label">${uiLabelMap.CommonFrom}</td> + <td><@HourOfDayField fieldName="integer1" fieldValue=fromHour/></td> + </tr> + <tr> + <td class="label">${uiLabelMap.CommonTo}</td> + <td><@HourOfDayField fieldName="integer2" fieldValue=toHour/></td> + </tr> +</#macro> + <#macro DayOfWeekRange fromDay=firstDayOfWeek toDay=lastDayOfWeek> <tr> <td class="label">${uiLabelMap.CommonFrom}</td> @@ -118,6 +129,17 @@ </tr> </#macro> +<#macro MinuteRange fromMinute=1 toMinute=31> + <tr> + <td class="label">${uiLabelMap.CommonFrom}</td> + <td><@MinuteField fieldName="integer1" fieldValue=fromMinute/></td> + </tr> + <tr> + <td class="label">${uiLabelMap.CommonTo}</td> + <td><@MinuteField fieldName="integer2" fieldValue=toMinute/></td> + </tr> +</#macro> + <#macro MonthRange fromMonth=0 toMonth=11> <tr> <td class="label">${uiLabelMap.CommonFrom}</td> Modified: ofbiz/trunk/framework/webtools/webapp/webtools/tempexpr/tempExprMaint.ftl URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webtools/webapp/webtools/tempexpr/tempExprMaint.ftl?rev=900024&r1=900023&r2=900024&view=diff ============================================================================== --- ofbiz/trunk/framework/webtools/webapp/webtools/tempexpr/tempExprMaint.ftl (original) +++ ofbiz/trunk/framework/webtools/webapp/webtools/tempexpr/tempExprMaint.ftl Sat Jan 16 20:59:37 2010 @@ -44,8 +44,12 @@ <@DayOfWeekRange fromDay=temporalExpression.integer1 toDay=temporalExpression.integer2/> <#elseif temporalExpression.tempExprTypeId == "FREQUENCY"> <@Frequency formName="updateExpression" fromDate=temporalExpression.date1 freqType=temporalExpression.integer1 freqValue=temporalExpression.integer2/> - <#elseif temporalExpression.tempExprTypeId == "MONTH_RANGE"> - <@MonthRange fromMonth=temporalExpression.integer1 toMonth=temporalExpression.integer2/> + <#elseif temporalExpression.tempExprTypeId == "DAY_OF_WEEK_RANGE"> + <@DayOfWeekRange fromDay=temporalExpression.integer1 toDay=temporalExpression.integer2/> + <#elseif temporalExpression.tempExprTypeId == "HOUR_RANGE"> + <@HourOfDayRange fromHour=temporalExpression.integer1 toHour=temporalExpression.integer2/> + <#elseif temporalExpression.tempExprTypeId == "MINUTE_RANGE"> + <@MinuteRange fromMinute=temporalExpression.integer1 toMinute=temporalExpression.integer2/> <#elseif temporalExpression.tempExprTypeId == "TIME_OF_DAY_RANGE"> <@TimeOfDayRange fromTime=temporalExpression.string1 toTime=temporalExpression.string2 freqType=temporalExpression.integer1 freqValue=temporalExpression.integer2/> <#elseif "INTERSECTION.UNION.DIFFERENCE"?contains(temporalExpression.tempExprTypeId)> @@ -100,6 +104,10 @@ <hr/> <@CreateForm "FREQUENCY" Frequency/> <hr/> + <@CreateForm "HOUR_RANGE" HourOfDayRange/> + <hr/> + <@CreateForm "MINUTE_RANGE" MinuteRange/> + <hr/> <@CreateForm "MONTH_RANGE" MonthRange/> <hr/> <@CreateForm "TIME_OF_DAY_RANGE" TimeOfDayRange/> |
| Free forum by Nabble | Edit this page |
