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