Package cli_fmw.delegate.directory.simple

Source Code of cli_fmw.delegate.directory.simple.DirectorySimple

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package cli_fmw.delegate.directory.simple;

import cli_fmw.delegate.directory.DirectoryMagic;
import cli_fmw.delegate.SharedBean;
import cli_fmw.main.ClipsException;
import cli_fmw.main.DirectoryItemNotFoundException;
import cli_fmw.main.DirectoryItemReplacedException;
import cli_fmw.utils.Selector;
import cli_fmw.utils.SelectorEditableExceptional;
import framework.beans.directory.DirectoryItemDetails;
import framework.beans.directory.simple.DirectorySimpleBeanRemoteAbstract;
import java.util.HashMap;
import java.util.HashSet;







/**
* один общий делегат для всех видов справочников
* @param <BEAN>
* @param <ITEM>
* @author ViP
*/
public abstract class DirectorySimple<BEAN extends DirectorySimpleBeanRemoteAbstract,
                                    ITEM extends DirectorySimpleItem>
        extends DirectoryMagic<BEAN, ITEM> {

    protected int dlType;
    protected HashSet<Integer> replacedItems = new HashSet<Integer>();
    private HashMap<String, ITEM> extKeyMap;
    /**
     * В конструкторе указываем тип справочника
     * @param dlType
     * @param beanName
     * @throws ClipsException
     */
    public DirectorySimple(int dlType, String beanName) throws ClipsException {
        super(new SharedBeanSimple<BEAN>(beanName, dlType));
        this.dlType = dlType;
        load();
    }
   
    @Override
    public String toString() {
        return getDirectoryTitle();
  }

    public abstract ITEM initNewItem(String title);
    /**
     * Вызывается при попытке вставить элемент в справочник.
     * Сохраняет в базу.
     * @param item
     * @throws ClipsException
     */
    @Override
    protected final ITEM appendDB(ITEM item) throws ClipsException {
        try {
            DirectoryItemDetails det = getBean().get().append(item.getDetails());
            item.setID(det.id);
            System.err.println("Simple directory item added = " + det.id + ",'" + det.title + "'");
            return item;
        } catch (Exception ex) {
            clearBean();
            throw new ClipsException("Ошибка при вставке элемента справочника '"
                    + getDirectoryTitle() +"'",ex);
        }
    }

    /**
     * Заменяет все использования итема what на итем with и удаляет итем what из базы
     * @param what
     * @param with
     * @throws cli_fmw.main.ClipsException
     */
    public final void replace(ITEM what, ITEM with) throws ClipsException {
        replaceDB(what, with);
        removeOrphanItem(what);
        removeFromExtraCache(what);
        replacedItems.add(what.getID());
    }


    protected final void replaceDB(ITEM what, ITEM with) throws ClipsException {
        try {
            getBean().get().replace(what.getID(), with.getID());
        } catch (Exception ex) {
            clearBean();
            throw new ClipsException("Ошибка при замене элемента справочника '"
                    + getDirectoryTitle() +"'",ex);
        }
    }

    /**
     * А нахрен ето надо? Для выбора элемента справочника юзать
     * DirectorySimpleFilteredComboBoxModel
     * @param <DETAILS>
     * @param parent
     * @param currentValue
     * @param withNull
     * @return
     * @throws cli_fmw.main.ClipsException
     */
//    @Deprecated
//    public DialogDirectorySimpleM<ITEM, >
//            getDirectoryDialogM(Frame parent, String currentValue, boolean withNull) throws ClipsException {
//        return new DialogDirectorySimpleM<BEAN, ITEM>(parent, this, currentValue, withNull);
//    }

    @Override
    public ITEM getItemFromID(int id) throws DirectoryItemNotFoundException {
        if (replacedItems.contains(id)) {
            throw new DirectoryItemReplacedException("Элемент был заменен");
        }
        return super.getItemFromID(id);
    }

    private HashMap<String, ITEM> getExtKeyMap(DirectorySimple<BEAN, ITEM> dir) {
        HashMap<String, ITEM> map = new HashMap<String, ITEM>();
        Selector<ITEM> items = dir.getItems();
        for (int i = 0; i < items.size(); i++) {
            ITEM item = items.get(i);
            map.put(item.getExtKey(), item);
        }
        return map;
    }

    public ITEM getItemFromExtKey(String title) throws DirectoryItemNotFoundException {
        if (extKeyMap == null) {
            extKeyMap = getExtKeyMap(this);
        }
        return extKeyMap.get(title);
    }

    public boolean isExternal() throws ClipsException {
        return getBean().get().isExternal();
    }

    public boolean isDirty() throws ClipsException {
        return getBean().get().isDirty();
    }

    public boolean isTrash() throws ClipsException {
        return getBean().get().isTrash();
    }
   
}

class SharedBeanSimple<BEANREMOTE extends DirectorySimpleBeanRemoteAbstract>
        extends SharedBean<BEANREMOTE> {
    private int type;
    private boolean initialized = false;
    public SharedBeanSimple(String beanClassName, int type) {
        super(beanClassName);
        this.type = type;
    }

    @Override
    public void registerSession() throws ClipsException {
        if(!initialized) {
            initType();
        }
        super.registerSession();
    }

    @Override
    protected void initBean(BEANREMOTE bean) throws ClipsException {
        super.initBean(bean);
        if(!initialized) {
            initType();
        }
    }

    @Override
    public void clear() {
        super.clear();
        initialized = false;
    }
   
    private void initType() throws ClipsException {
        try {
            get().init(type);
            initialized = true;
        } catch (Exception ex) {
            throw new ClipsException("Не удалось инициализировать справочник", ex);
        }           
    }
   
   
}
TOP

Related Classes of cli_fmw.delegate.directory.simple.DirectorySimple

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.