package ru.gazprom.gtnn.minos.models; import java.util.ArrayList; import java.util.Collections; import java.util.concurrent.ExecutionException; import javax.swing.JOptionPane; import javax.swing.tree.TreePath; import com.google.common.base.Preconditions; import com.google.common.cache.LoadingCache; import ru.gazprom.gtnn.minos.entity.CatalogNode; import ru.gazprom.gtnn.minos.util.DatabaseConnectionKeeper; public class CatalogModel extends BasicModel { public CatalogModel(DatabaseConnectionKeeper kdb, LoadingCache<Integer, CatalogNode> cacheCatalog, String sqlLoadSubCatalogIDs, String pattern) { super(kdb); this.cacheCatalog = cacheCatalog; this.sqlLoadSubCatalogIDs = sqlLoadSubCatalogIDs; this.pattern = pattern; } @Override public Object getRoot() { if(root == null) { root = new CatalogNode(); root.catalogName = null; root.catalogID = 0; root.catalogParent = 0; checkAndLoadSubCatalogs(root); } return root; } @Override public boolean isLeaf(Object arg) { if(arg == null) return true; assert (arg instanceof CatalogNode) : "CatalogModel.isLeaf() : arg have invlaid type"; if(!(arg instanceof CatalogNode)) return true; CatalogNode cn = (CatalogNode)arg; checkAndLoadSubCatalogs(cn); return cn.subCatalogs.size() == 0; } @Override public int getChildCount(Object arg) { if(arg == null) return 0; assert (arg instanceof CatalogNode) : "CatalogModel.getChildCount() : arg have invlaid type"; if(!(arg instanceof CatalogNode)) return 0; CatalogNode cn = (CatalogNode)arg; checkAndLoadSubCatalogs(cn); return cn.subCatalogs.size(); } @Override public Object getChild(Object arg, int index) { if(arg == null) return null; assert (arg instanceof CatalogNode) : "CatalogModel.getChild() : arg have incorrect type"; if(!(arg instanceof CatalogNode)) return null; CatalogNode cn = (CatalogNode)arg; checkAndLoadSubCatalogs(cn); assert ((0 <= index) && (index < cn.subCatalogs.size())) : "CatalogModel.getChild() : index out of range"; if((index < 0) || (index >= cn.subCatalogs.size())) return null; Object obj = null; try { obj = cacheCatalog.get(((CatalogNode)arg).subCatalogs.get(index)); } catch (ExecutionException e) { e.printStackTrace(); obj = null; } return obj; } @Override public int getIndexOfChild(Object parent, Object child) { if(parent == null || child == null) return -1; assert (parent instanceof CatalogNode) : "CatalogTreeModel.getIndexOfChild() : parent have incorrect object type"; assert (child instanceof CatalogNode) : "CatalogTreeModel.getIndexOfChild() : child have incorrect object type"; if( !( (parent instanceof CatalogNode) && (child instanceof CatalogNode) ) ) return -1; CatalogNode parentNode = (CatalogNode) parent; CatalogNode childNode = (CatalogNode) child; assert parentNode.subCatalogs != null : "CatalogTreeModel.getIndexOfChild() : parents.catalogs is null"; assert parentNode.subCatalogs.size() != 0 : "CatalogTreeModel.getIndexOfChild() : parents.catalogs is empty"; int result = -1; for(int i = 0; i < parentNode.subCatalogs.size(); i++) { if (parentNode.subCatalogs.get(i) == childNode.catalogID) { result = i; break; } } assert result != -1 : "CatalogTreeModel.getIndexOfChild() : childNode cann't find in parentNode.catalogs"; return result; } @Override public void reload() { cacheCatalog.invalidateAll(); } @Override public void add(Object obj, TreePath path) throws Exception { if(obj instanceof CatalogNode) { if(path == null) { JOptionPane.showMessageDialog(null, "�� ������� ������� ��� �������"); return ; } Object []nodes = path.getPath(); if( (nodes == null) || (nodes.length == 0) ) { JOptionPane.showMessageDialog(null, "�� ������� ������� ��� �������"); return; } for(int i = nodes.length; i > 0; i--) { if(nodes[i - 1] instanceof CatalogNode) { add((CatalogNode)obj, (CatalogNode)nodes[i - 1], true, CatalogNode.CATALOG_ITEM | CatalogNode.CATALOG_NAME | CatalogNode.CATALOG_PARENT | ( ((CatalogNode)obj).catalogCreate == null ? 0 : CatalogNode.CATALOG_CREATE ) | ( ((CatalogNode)obj).catalogRemove == null ? 0 : CatalogNode.CATALOG_REMOVE ) | CatalogNode.CATALOG_VARIETY); break; } } } } public void add(CatalogNode source, CatalogNode dest, boolean flagLoadSubCatalogs, int flags) throws Exception { Preconditions.checkNotNull(source, "CatalogModel.add() : soure is null"); Preconditions.checkNotNull(dest, "CatalogModel.add() : dest is null"); if (flagLoadSubCatalogs) // need load sub catalogs ids loadSubCatalogs(dest, false); boolean fEmpty = true; if (dest.subCatalogs != null) if( !dest.subCatalogs.equals(Collections.emptyList()) ) fEmpty = true; source.catalogItem = (fEmpty ? 1 : dest.subCatalogs.size() + 1); // set item value source.catalogVariety = dest.catalogVariety; source.catalogParent = dest.catalogID; source.insert(kdb, flags); if(fEmpty) { dest.subCatalogs = new ArrayList<>(); } dest.subCatalogs.add(source.catalogID); } @Override public void valueForPathChanged(TreePath arg0, Object arg1) { // TODO Auto-generated method stub } private void checkAndLoadSubCatalogs(CatalogNode cn) { if (cn == null) return; if(cn.subCatalogs == null) { loadSubCatalogs(cn, true); } } private void loadSubCatalogs(CatalogNode cn, boolean flagPreload) { if (cn == null) return; cn.subCatalogs = loadChildIDs(sqlLoadSubCatalogIDs, pattern, cn.catalogID); if( flagPreload && (cn.subCatalogs.size() != 0) ) try { cacheCatalog.getAll(cn.subCatalogs); } catch (ExecutionException e) { e.printStackTrace(); } } private CatalogNode root = null; private LoadingCache<Integer, CatalogNode> cacheCatalog; private String sqlLoadSubCatalogIDs; private String pattern; }