/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package clips.directory.editors.update.updaters.dlo;
import beans.directory.dlodrugsection.DloDrugSectionDetails;
import cli_fmw.delegate.directory.UpdaterDirectory;
import cli_fmw.delegate.directory.complex.DirectoryLocator;
import cli_fmw.main.ClipsException;
import clips.delegate.directory.complex.DirectoryDloDrugSection;
import clips.delegate.directory.complex.DirectoryDloDrugSectionItem;
import clips.main.ClipsConfig;
import framework.utils.ROList;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import org.xBaseJ.micro.DBF;
import org.xBaseJ.micro.fields.Field;
import org.xBaseJ.micro.xBaseJException;
/**
*
* @author lacoste
*/
public class UpdaterDloDrugSection
extends UpdaterDirectory {
private DirectoryDloDrugSection dir;
private enum Col {
C_RLP,
N_RAZD,
NAME_RAZD,
N_PRAZD,
NAME_PRAZD
}
@Override
public String getFilename() {
return "S_RLP.DBF";
}
@Override
public String getTitle() {
return "Разделы перечня ЛС";
}
@Override
protected void updateImpl() throws ClipsException {
dir = DirectoryLocator.getDirectory(DirectoryDloDrugSection.class);
ClipsConfig cfg = ClipsConfig.getInstance();
File file = new File(cfg.getLastDBFImportPath(),getFilename());
DBF dbf = createDBF(file);
HashMap<Col, Field> fields = new HashMap<Col, Field>();
try {
for (int i = 0; i < Col.values().length; i++) {
Col col = Col.values()[i];
fields.put(col, dbf.getField(col.toString()));
}
} catch (xBaseJException ex) {
throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName(), ex);
}
//мап существующих итемов по внешнему ключу //потом будет списком на удаление
HashMap<Integer, DirectoryDloDrugSectionItem> presentItems =
new HashMap<Integer, DirectoryDloDrugSectionItem>();
//мап существующих итемов для изменения Тайтла
HashMap<DirectoryDloDrugSectionItem, String> changeList =
new HashMap<DirectoryDloDrugSectionItem, String>();
//список итемов для добавления
ArrayList<DirectoryDloDrugSectionItem> addList =
new ArrayList<DirectoryDloDrugSectionItem>();
ROList<DirectoryDloDrugSectionItem> itemsList = dir.getItemsList();
for (int i = 0; i < itemsList.size(); i++) {
DirectoryDloDrugSectionItem item = itemsList.get(i);
if (item.getID() != 0 && item.getCode() != 0) {
presentItems.put(item.getCode(), item);
}
}
int recordCount = dbf.getRecordCount();
for (int c = 0; c < recordCount; c++) {
try {
if ((c%500) == 0) {
System.out.println("Обновление разделов перечня ЛС выполнено " + (c+1)/((float)recordCount)*100 + "%");
out.println("Обновление разделов перечня ЛС выполнено " + (c+1)/((float)recordCount)*100 + "%");
}
dbf.read();
int code = Integer.parseInt(fields.get(Col.C_RLP).get().trim());
int number = Integer.parseInt(fields.get(Col.N_RAZD).get().trim());
String title = fields.get(Col.NAME_PRAZD).get().trim();
String p_number = fields.get(Col.N_PRAZD).get().trim();
String p_title = fields.get(Col.NAME_PRAZD).get().trim();
DirectoryDloDrugSectionItem pItem = presentItems.get(code);
if (pItem != null) {
if (!pItem.getTitle().equals(title)) {
changeList.put(pItem, title);
}
presentItems.remove(code);
} else {
//Создать новый
DloDrugSectionDetails details = new DloDrugSectionDetails();
details.code = code;
details.number = number;
details.title = title;
details.subNumber = p_number;
details.subTitle = p_title;
DirectoryDloDrugSectionItem newItem = new DirectoryDloDrugSectionItem(details);
addList.add(newItem);
}
} catch (IOException ex) {
closeDBF(dbf);
throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName() + " строка + " + c, ex);
} catch (xBaseJException ex) {
closeDBF(dbf);
throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName() + " строка + " + c, ex);
}
}
closeDBF(dbf);
//Удаление (а может пассивация решает бин)
for (DirectoryDloDrugSectionItem item : presentItems.values()) {
dir.getItems().remove(item);
}
//разпассивация и изменение тайтла
for (DirectoryDloDrugSectionItem item : changeList.keySet()) {
item.setTitle(changeList.get(item));
}
//добавление новых
for (DirectoryDloDrugSectionItem item : addList) {
dir.getItems().append(item);
}
dir = DirectoryLocator.getDirectory(dir.getClass(), true);
}
}