package com.norteksoft.product.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Trigger;
import com.norteksoft.bs.options.entity.Timer;
import com.norteksoft.bs.options.enumeration.TimingType;
public class CornBuilder {
private static Log log = LogFactory.getLog(CornBuilder.class);
private Corn corn;
private CornBuilder(){
corn = new Corn();
}
public static CornBuilder newCorn(){
return new CornBuilder();
}
public String builder(){
return corn.builder();
}
/**
* 分钟中的秒设置,默认为第 0 秒<br/>
* eg: <ol><li> * 每秒一次
* <li> 3 第三秒钟一次
* <li> 0/5 每五秒钟一次
* <li> 0-5 0到5秒钟各一次
* <li> 10,20 第10秒和第20秒各一次
* @param second 只有以上5种格式
* @return CornBuilder
*/
public CornBuilder second(String second){
corn.second=second;
return this;
}
public CornBuilder minute(String minute){
corn.minute=minute;
return this;
}
public CornBuilder hour(String hour){
corn.hour=hour;
return this;
}
public CornBuilder dayOfMonth(String dayOfMonth){
corn.dayOfMonth=dayOfMonth;
return this;
}
public CornBuilder month(String month){
corn.month=month;
return this;
}
public CornBuilder dayOfWeek(String dayOfWeek){
corn.dayOfWeek=dayOfWeek;
return this;
}
public CornBuilder year(String year){
corn.dayOfWeek=year;
return this;
}
private class Corn{
String second = "0";
String minute = "0";
String hour = "0";
String dayOfMonth = "*";
String month = "*";
String dayOfWeek = "?";
String year = "*";
String builder(){
StringBuilder corn = new StringBuilder();
if(!"?".equals(dayOfWeek)&&"*".equals(dayOfMonth)){
dayOfMonth = "?";
}
corn.append(second).append(" ")
.append(minute).append(" ")
.append(hour).append(" ")
.append(dayOfMonth).append(" ")
.append(month).append(" ")
.append(dayOfWeek).append(" ")
.append(year);
return corn.toString();
}
}
private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm");
public static Trigger builderByCornInfo(Timer info){
Trigger tg = null;
String[] time = null;
switch (info.getTimingType()) {
case everyDate: // 09:37
log.debug("everyDate="+info.getCorn());
time = info.getCorn().split(":");
tg = Scheduler.cornTrigger(CornBuilder.newCorn().hour(time[0]).minute(time[1]).builder());
break;
case everyWeek: // 1,2,3,4,5,6,7 09:37
log.debug("everyWeek="+info.getWeekTime()+" "+info.getCorn());
time = info.getCorn().split(":");
tg = Scheduler.cornTrigger(CornBuilder.newCorn().dayOfWeek(prexData(info.getWeekTime())).hour(time[0]).minute(time[1]).builder());
break;
case everyMonth: // 27,28,29,30,31,L 09:38, 当有指定日期时,不能包含最后一天的L
time = info.getCorn().split(":");
log.debug("everyMonth="+info.getDateTime()+" "+info.getCorn());
tg = Scheduler.cornTrigger(CornBuilder.newCorn().dayOfMonth(prexData(info.getDateTime())).hour(time[0]).minute(time[1]).builder());
break;
case appointTime: // 2012-06-15 09:38
try {
log.debug("appointTime="+info.getAppointTime());
tg = Scheduler.getOnceTrigger(format.parse(info.getAppointTime()));
} catch (ParseException e) {
log.error("appointTime="+info.getAppointTime(), e);
throw new RuntimeException(e);
}
break;
case appointSet: // 0 15 10 * * ? 2005
log.debug("appointSet ="+info.getAppointSet());
tg = Scheduler.cornTrigger(info.getAppointSet());
break;
}
return tg;
}
public static void main(String[] args) throws Exception {
String[] time = null;
Timer i = new Timer();
i.setTimingType(TimingType.everyDate);
i.setCorn("09:37");
time = i.getCorn().split(":");
System.out.println(CornBuilder.newCorn().hour(time[0]).minute(time[1]).builder());
i = new Timer();
i.setTimingType(TimingType.everyWeek);
i.setCorn("09:37");
time = i.getCorn().split(":");
System.out.println(CornBuilder.newCorn().dayOfWeek("1,2,3,4,5,6,7,L").hour(time[0]).minute(time[1]).builder());
i = new Timer();
i.setTimingType(TimingType.everyMonth);
i.setCorn("09:37");
time = i.getCorn().split(":");
System.out.println(CornBuilder.newCorn().dayOfMonth("27,28,29,30,31,L").hour(time[0]).minute(time[1]).builder());
System.out.println(format.parse("2012-06-15 09:38"));
}
public static String prexData(String data){
if(StringUtils.isNotEmpty(data)){
String[] datas =data.split(",");
StringBuilder bu = new StringBuilder();
for (String str : datas) {
bu.append(str.split("_")[1]+",");
}
return StringUtils.removeEnd(bu.toString(), ",");
}
return null;
}
}