Package clips.directory.editors.update.updaters

Source Code of clips.directory.editors.update.updaters.UpdaterDirectorySimpleAbstract

/*
* 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);
    }

}
TOP

Related Classes of clips.directory.editors.update.updaters.UpdaterDirectorySimpleAbstract

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.