package org.jboss.processFlow.util;
import org.drools.time.TimeUtils;
import org.joda.time.DateTime;
import org.joda.time.Duration;
import org.joda.time.Period;
import org.joda.time.format.ISODateTimeFormat;
import org.joda.time.format.ISOPeriodFormat;
/**
* PFP backport of the jBPM6 org.jbpm.process.core.timer.DateTimeUtils.
*
* @author <a href="mailto:duncan.doyle@redhat.com">Duncan Doyle</a>
*/
public class DateTimeUtils extends TimeUtils {
public static boolean isRepeatable(String dateTimeStr) {
if (dateTimeStr != null && dateTimeStr.startsWith("R")) {
return true;
}
return false;
}
public static boolean isPeriod(String dateTimeStr) {
if (dateTimeStr != null && dateTimeStr.startsWith("P")) {
return true;
}
return false;
}
public static long parseDateTime(String dateTimeStr) {
DateTime dt = ISODateTimeFormat.dateTimeNoMillis().parseDateTime(dateTimeStr);
return dt.getMillis();
}
public static long parseDuration(String durationStr) {
if (isPeriod(durationStr)) {
Period p = ISOPeriodFormat.standard().parsePeriod(durationStr);
return p.toStandardDuration().getMillis();
} else {
return TimeUtils.parseTimeString(durationStr);
}
}
public static long parseDateAsDuration(String dateTimeStr) {
try {
DateTime dt = ISODateTimeFormat.dateTimeParser().parseDateTime(dateTimeStr);
Duration duration = new Duration(System.currentTimeMillis(), dt.getMillis());
return duration.getMillis();
} catch (Exception e) {
return TimeUtils.parseTimeString(dateTimeStr);
}
}
public static long[] parseRepeatableDateTime(String dateTimeStr) {
long[] result = new long[3];
if (isRepeatable(dateTimeStr)) {
String repeats = null;
String delayIn = null;
String periodIn = null;
String[] elements = dateTimeStr.split("/");
if (elements.length==3) {
repeats = elements[0].substring(1);
delayIn = elements[1];
periodIn = elements[2];
} else {
repeats = elements[0].substring(1);
delayIn = new DateTime().toString();
periodIn = elements[1];
}
DateTime startAtDelay = ISODateTimeFormat.dateTimeParser().parseDateTime(delayIn);
Duration startAtDelayDur = new Duration(System.currentTimeMillis(), startAtDelay.getMillis());
if (startAtDelayDur.getMillis() <= 0) {
// need to introduce delay to allow all initialization
startAtDelayDur = Duration.standardSeconds(1);
}
Period period = ISOPeriodFormat.standard().parsePeriod(periodIn);
result[0] = Long.parseLong(repeats.length()==0?"-1":repeats);
result[1] = startAtDelayDur.getMillis();
result[2] = period.toStandardDuration().getMillis();
return result;
} else {
int index = dateTimeStr.indexOf("###");
if (index != -1) {
String period = dateTimeStr.substring(index + 3);
String delay = dateTimeStr.substring(0, index);
result = new long[]{TimeUtils.parseTimeString(delay), TimeUtils.parseTimeString(period)};
return result;
}
result = new long[]{TimeUtils.parseTimeString(dateTimeStr)};
return result;
}
}
}