/*!
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.platform.scheduler2.quartz;
import java.util.List;
import org.pentaho.platform.api.scheduler2.ComplexJobTrigger;
import org.pentaho.platform.api.scheduler2.recur.ITimeRecurrence;
import org.pentaho.platform.api.scheduler2.wrappers.ITimeWrapper;
import org.pentaho.platform.scheduler2.recur.IncrementalRecurrence;
import org.pentaho.platform.scheduler2.recur.QualifiedDayOfMonth;
import org.pentaho.platform.scheduler2.recur.QualifiedDayOfWeek;
import org.pentaho.platform.scheduler2.recur.QualifiedDayOfWeek.DayOfWeekQualifier;
import org.pentaho.platform.scheduler2.recur.RecurrenceList;
import org.pentaho.platform.scheduler2.recur.SequentialRecurrence;
public class QuartzCronStringFactory {
public static String createCronString( ComplexJobTrigger jobTrigger ) {
StringBuffer stringBuffer = new StringBuffer();
String secondRecurrence = getRecurrenceString( jobTrigger.getSecondRecurrences(), "*" ); //$NON-NLS-1$
String minuteRecurrence = getRecurrenceString( jobTrigger.getMinuteRecurrences(), "*" ); //$NON-NLS-1$
String hourlyRecurrence = getRecurrenceString( jobTrigger.getHourlyRecurrences(), "*" ); //$NON-NLS-1$
String dayOfMonthRecurrence = getRecurrenceString( jobTrigger.getDayOfMonthRecurrences(), "*" ); //$NON-NLS-1$
String monthlyRecurrence = getRecurrenceString( jobTrigger.getMonthlyRecurrences(), "*" ); //$NON-NLS-1$
String dayOfWeekRecurrence = getRecurrenceString( jobTrigger.getDayOfWeekRecurrences(), "*" ); //$NON-NLS-1$
String yearlyRecurrence = getRecurrenceString( jobTrigger.getYearlyRecurrences(), "*" ); //$NON-NLS-1$
if ( dayOfWeekRecurrence.equals( "*" ) && dayOfMonthRecurrence.equals( "*" ) ) { //$NON-NLS-1$ //$NON-NLS-2$
dayOfWeekRecurrence = "?"; //$NON-NLS-1$
} else if ( !dayOfMonthRecurrence.equals( "*" ) ) { //$NON-NLS-1$
dayOfWeekRecurrence = "?"; //$NON-NLS-1$
} else if ( !dayOfWeekRecurrence.equals( "*" ) ) { //$NON-NLS-1$
dayOfMonthRecurrence = "?"; //$NON-NLS-1$
}
stringBuffer.append( secondRecurrence );
stringBuffer.append( " " ); //$NON-NLS-1$
stringBuffer.append( minuteRecurrence );
stringBuffer.append( " " ); //$NON-NLS-1$
stringBuffer.append( hourlyRecurrence );
stringBuffer.append( " " ); //$NON-NLS-1$
stringBuffer.append( dayOfMonthRecurrence );
stringBuffer.append( " " ); //$NON-NLS-1$
stringBuffer.append( monthlyRecurrence );
stringBuffer.append( " " ); //$NON-NLS-1$
stringBuffer.append( dayOfWeekRecurrence );
stringBuffer.append( " " ); //$NON-NLS-1$
stringBuffer.append( yearlyRecurrence );
return stringBuffer.toString();
}
private static String getRecurrenceString( ITimeWrapper recurrences, String defaultString ) {
String aString = ""; //$NON-NLS-1$
StringBuffer stringBuffer = new StringBuffer();
for ( Object recurrence : recurrences.getRecurrences() ) {
if ( recurrence instanceof RecurrenceList ) {
aString = getRecurrenceString( (RecurrenceList) recurrence );
} else if ( recurrence instanceof SequentialRecurrence ) {
aString = getRecurrenceString( (SequentialRecurrence) recurrence );
} else if ( recurrence instanceof IncrementalRecurrence ) {
aString = getRecurrenceString( (IncrementalRecurrence) recurrence );
} else if ( recurrence instanceof QualifiedDayOfWeek ) {
aString = getRecurrenceString( (QualifiedDayOfWeek) recurrence );
} else if ( recurrence instanceof QualifiedDayOfMonth ) {
aString = getRecurrenceString( (QualifiedDayOfMonth) recurrence );
}
if ( aString.length() > 0 ) {
stringBuffer.append( aString ).append( "," ); //$NON-NLS-1$
}
}
if ( stringBuffer.length() != 0 ) {
// Delete the last comma.
stringBuffer.deleteCharAt( stringBuffer.length() - 1 );
} else {
stringBuffer.append( defaultString );
}
return stringBuffer.toString();
}
private static String getRecurrenceString( QualifiedDayOfWeek qualifiedDayOfWeek ) {
String aString = ""; //$NON-NLS-1$
if ( ( qualifiedDayOfWeek.getQualifier() != null ) && ( qualifiedDayOfWeek.getDayOfWeek() != null ) ) {
if ( qualifiedDayOfWeek.getQualifier() == DayOfWeekQualifier.LAST ) {
aString = Integer.toString( qualifiedDayOfWeek.getDayOfWeek().ordinal() + 1 ) + "L"; //$NON-NLS-1$
} else {
aString =
Integer.toString( qualifiedDayOfWeek.getDayOfWeek().ordinal() + 1 )
+ "#" + ( qualifiedDayOfWeek.getQualifier().ordinal() + 1 ); //$NON-NLS-1$
}
}
return aString;
}
private static String getRecurrenceString( QualifiedDayOfMonth qualifiedDayOfMonth ) {
return qualifiedDayOfMonth.toString();
}
private static String getRecurrenceString( RecurrenceList recurrenceList ) {
StringBuffer stringBuffer = new StringBuffer();
if ( recurrenceList.getValues().size() > 0 ) {
for ( Integer recurrence : recurrenceList.getValues() ) {
if ( recurrence != null ) {
stringBuffer.append( recurrence.toString() ).append( "," ); //$NON-NLS-1$
}
}
}
if ( stringBuffer.length() != 0 ) {
// Delete the last comma.
stringBuffer.deleteCharAt( stringBuffer.length() - 1 );
}
return stringBuffer.toString();
}
private static String getRecurrenceString( SequentialRecurrence sequentialRecurrence ) {
String aString = ""; //$NON-NLS-1$
if ( ( sequentialRecurrence.getFirstValue() != null ) && ( sequentialRecurrence.getLastValue() != null ) ) {
aString = sequentialRecurrence.getFirstValue().toString() + "-" + sequentialRecurrence.getLastValue(); //$NON-NLS-1$
} else if ( sequentialRecurrence.getFirstValue() != null ) {
aString = sequentialRecurrence.getFirstValue().toString();
} else if ( sequentialRecurrence.getLastValue() != null ) {
aString = sequentialRecurrence.getLastValue().toString();
}
return aString;
}
private static String getRecurrenceString( IncrementalRecurrence incrementalRecurrence ) {
String aString = ""; //$NON-NLS-1$
if ( ( incrementalRecurrence.getStartingValue() != null ) && ( incrementalRecurrence.getIncrement() != null ) ) {
aString = incrementalRecurrence.getStartingValue().toString() + "/" + incrementalRecurrence.getIncrement(); //$NON-NLS-1$
} else if ( incrementalRecurrence.getStartingValue() != null ) {
aString = incrementalRecurrence.getStartingValue().toString();
}
return aString;
}
}