/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package clips.directory.editors.update.updaters;
import cli_fmw.delegate.directory.UpdaterDirectory;
import cli_fmw.delegate.directory.complex.DirectoryLocator;
import cli_fmw.delegate.directory.simple.DirectorySimple;
import cli_fmw.delegate.directory.simple.DirectorySimpleItem;
import cli_fmw.main.ClipsException;
import cli_fmw.main.DirectoryItemTrasheException;
import clips.main.ClipsConfig;
import framework.beans.directory.DirectoryItemDetails;
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 vip
*/
abstract public class UpdaterDirectorySimpleAbstract
<DIRECTORY extends DirectorySimple,
DIRECTORYITEM extends DirectorySimpleItem>
extends UpdaterDirectory{
private DIRECTORY dir;
private String idField;
private String titleField;
/**
* Создает апдейтер простых справочников
* @param dir справочник
* @param idField имя ID поля в импортируемом файле
* @param titleField имя TITLE поля в импортируемом файле
*/
public UpdaterDirectorySimpleAbstract(Class<DIRECTORY> cl, String idField, String titleField) throws ClipsException {
this.dir = DirectoryLocator.getDirectory(cl);
this.idField = idField;
this.titleField = titleField;
}
@Override
final public void updateImpl() throws ClipsException {
ClipsConfig cfg = ClipsConfig.getInstance();
File file = new File(cfg.getLastDBFImportPath(),getFilename());
DBF dbf = createDBF(file);
HashMap<String, Field> fields = new HashMap<String, Field>();
try {
fields.put("ID", dbf.getField(idField));
fields.put("NAME", dbf.getField(titleField));
} catch (xBaseJException ex) {
throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName(), ex);
}
//мап существующих итемов по внешнему ключу
//потом будет списком на удаление
HashMap<String,DIRECTORYITEM> presentItems = new HashMap<String, DIRECTORYITEM>();
//мап существующих итемов для изменения Тайтла
HashMap<DIRECTORYITEM,String> changeList = new HashMap<DIRECTORYITEM, String>();
//список итемов для добавления
ArrayList<DIRECTORYITEM> addList = new ArrayList<DIRECTORYITEM>();
ROList<DIRECTORYITEM> itemsList = dir.getItemsList();
for (int i = 0; i < itemsList.size(); i++) {
DIRECTORYITEM item = itemsList.get(i);
if (item.getID() != 0 && !item.getExtKey().trim().isEmpty()) {
presentItems.put(item.getExtKey().trim(), item);
}
}
int recordCount = dbf.getRecordCount();
for (int c = 0; c < recordCount; c++) {
try {
dbf.read();
String id = fields.get("ID").get().trim();
String name = fields.get("NAME").get().trim();
System.out.println(id + " " + name);
DIRECTORYITEM pItem = presentItems.get(id);
if (pItem != null) {
if (!pItem.getTitle().equals(name) || !pItem.isVisible()) {
//либо разпассивировать либо сменить тайтл
changeList.put(pItem, name);
}
presentItems.remove(id);
} else {
//Создать новый
DirectoryItemDetails details = new DirectoryItemDetails();
details.title = name;
details.external_key = id;
DIRECTORYITEM newItem = (DIRECTORYITEM) dir.initNewItem(name);
newItem.setExtKey(id);
addList.add(newItem);
}
} catch (IOException ex) {
closeDBF(dbf);
throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName(), ex);
} catch (xBaseJException ex) {
closeDBF(dbf);
throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName(), ex);
}
}
closeDBF(dbf);
//Удаление (а может пассивация решает бин)
for (DIRECTORYITEM item : presentItems.values()) {
try {
dir.getItems().remove(item);
} catch (DirectoryItemTrasheException ex) {
//Все нормально
}
}
//разпассивация и изменение тайтла
for (DIRECTORYITEM item : changeList.keySet()) {
item.setVisible(true);
item.setTitle(changeList.get(item));
}
//добавление новых
for (DIRECTORYITEM item : addList) {
dir.getItems().append(item);
}
dir = (DIRECTORY) DirectoryLocator.getDirectory(dir.getClass(), true);
}
}