/*
* SheduleHolidayLocal.java
*
*/
package clips.delegate.shedule.prorumble;
import TimeTable.Day;
import beans.shedule.holiday.SheduleHolidayBean;
import beans.shedule.prorumble.SheduleProrumbleBean;
import beans.shedule.prorumble.SheduleProrumbleBeanRemote;
import cli_fmw.delegate.DelegateStandart;
import cli_fmw.delegate.cache.ExtraDataManager;
import cli_fmw.delegate.lists.DataChunkMapList;
import cli_fmw.main.ClipsException;
import cli_fmw.utils.SelectorEditable;
import clips.delegate.directory.ro.DirectoryCollaboratorItem;
import beans.shedule.prorumble.ProrumbleDetails;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
/**
* Делегат по управлению праздничными днями,
* является простым менеджером для делегатов - праздничных дней.
* Пакетно их загружает. Делегирует в них события сохранения и отката.
* Это уникальный делегат, во всем клиенте он один.
* @author Axe Ilshat
*/
public class SheduleProrumbleLocal extends DelegateStandart<SheduleProrumbleBeanRemote> {
private DirectoryCollaboratorItem collaborator;
private ExtraDataManager ecm;
private HashMap<Integer, ProrumbleList> prerumbleList = new HashMap<Integer, ProrumbleList>();
/**
* Создает новый делегат.
* @param collaborator
* @throws ClipsException
*/
public SheduleProrumbleLocal(DirectoryCollaboratorItem collaborator) throws ClipsException {
super(SheduleProrumbleBean.class.getSimpleName());
initBean();
this.collaborator = collaborator;
ecm = new ExtraDataManager(getBean(), this, false);
}
public boolean canModify() throws ClipsException {
return getBeanRights().isCommandAccessible(SheduleHolidayBean.COMMAND_MODIFY);
}
/**
* Возвращает информацию о пропущенном дне
* @param day 1-31
* @param month 1-12
* @param year 1900-2100
* @return
* @throws ClipsException
*/
public SheduleProrumbleData getProrumble(Day day)
throws ClipsException {
SheduleProrumbleData res = get(day.getYear(), day.getMonth()+1).get(day.getDay());
System.out.println("Request prorumble for " + day
+ " - " + (res == null ? "none":res.toString()));
return res;
}
/**
* Сохраняет изменения, произошедшие в делегате
* @throws ClipsException
*/
@Override
public void save1() throws ClipsException {
Iterator<ProrumbleList> i = prerumbleList.values().iterator();
while(i.hasNext()) {
i.next().save();
}
}
/**
* Сбрасывает изменения, произошедшие в делегате
*/
@Override
public void restore() {
Iterator<ProrumbleList> i = prerumbleList.values().iterator();
while(i.hasNext()) {
i.next().restore();
System.out.println("WorkList restored");
}
}
/**
* Проверяет, нуждается ли делегат в сохранении состояния
* @return boolean
*/
@Override
public boolean isDirty() {
Iterator<ProrumbleList> i = prerumbleList.values().iterator();
while(i.hasNext()) {
if(i.next().isDirty()) {
return true;
}
}
return false;
}
/**
* Вовзврашает итератор пропущенных дней за заданный месяц
* @param year 1900-2100
* @param month 1-12
* @return
* @throws ClipsException
*/
public SelectorEditable<SheduleProrumbleData> iterator(int year, int month)
throws ClipsException {
return get(year, month).selector();
}
/**
* Возврашает объект пропущенных дней за заданный месяц
* @param year 1900-2100
* @param month 1-12
* @return
* @throws cli_fmw.delegate.exception.ClipsException
*/
private ProrumbleList get(int year, int month)
throws ClipsException{
int key = year*100 + month;
ProrumbleList dl = prerumbleList.get(key);
if(dl == null) {
dl = new ProrumbleList(ecm, month, year);
prerumbleList.put(key, dl);
}
return dl;
}
class ProrumbleList extends DataChunkMapList<SheduleProrumbleData, Integer> {
private int month;
private int year;
/**
*
* @param contaner
* @param month 1-12
* @param year
*/
public ProrumbleList(ExtraDataManager contaner, int month, int year) {
super(contaner);
this.month = month;
this.year = year;
}
@Override
protected void deleteDB(SheduleProrumbleData data) throws Exception {
Day day = data.getDay();
bean().removeProrumble(collaborator.getID(), day.getDay(), day.getMonth()+1, day.getYear());
}
@Override
protected int saveDB(SheduleProrumbleData data) throws Exception {
bean().setProrumble(data.getDetails());
return 0;
}
@Override
protected void loadDB() throws Exception {
System.out.println("Load prorumble data for month:" + month + ", year:" + year);
List<ProrumbleDetails> list = bean().getProrumbleList(collaborator.getID(), month, year);
for(ProrumbleDetails d :list) {
initByDetails(new SheduleProrumbleData(d));
}
}
}
}