package com.mossle.bpm.calendar; import java.util.Calendar; import java.util.Date; import javax.xml.datatype.Duration; import com.mossle.api.workcal.WorkCalendarConnector; import org.activiti.engine.impl.calendar.BusinessCalendar; import org.activiti.engine.impl.util.DefaultClockImpl; import org.activiti.engine.runtime.ClockReader; import org.joda.time.DateTimeZone; import org.joda.time.format.ISODateTimeFormat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 支持工作日的工作日历. */ public abstract class AdvancedBusinessCalendar implements BusinessCalendar { /** logger. */ private static Logger logger = LoggerFactory .getLogger(AdvancedBusinessCalendar.class); private WorkCalendarConnector workCalendarConnector; protected ClockReader clockReader = new DefaultClockImpl(); /** * 解析截止时间. */ @Override public Date resolveDuedate(String duedateDescription) { return resolveDuedate(duedateDescription, -1); } /** * 解析截止时间. */ public abstract Date resolveDuedate(String duedateDescription, int maxIterations); /** * 校验截止时间是否有效. */ @Override public Boolean validateDuedate(String duedateDescription, int maxIterations, Date endDate, Date newTimer) { return (endDate == null) || endDate.after(newTimer) || endDate.equals(newTimer); } /** * 解析结束时间. */ @Override public Date resolveEndDate(String endDateString) { return ISODateTimeFormat .dateTimeParser() .withZone( DateTimeZone.forTimeZone(clockReader .getCurrentTimeZone())) .parseDateTime(endDateString).toCalendar(null).getTime(); } public Date processDate(Date date, boolean useBusinessTime) { if (!useBusinessTime) { return date; } // TODO: tenantId return workCalendarConnector.processDate(date, "1"); } public Date add(Date date, Duration duration, boolean useBusinessTime) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); if (!useBusinessTime) { duration.addTo(calendar); return calendar.getTime(); } // TODO: tenantId return workCalendarConnector.add(date, duration, "1"); } public void setWorkCalendarConnector( WorkCalendarConnector workCalendarConnector) { this.workCalendarConnector = workCalendarConnector; } // ~ ====================================================================== public abstract String getName(); }