package ru.gazprom.gtnn.minos.models;
import java.util.concurrent.ExecutionException;
import javax.swing.tree.TreePath;
import com.google.common.base.Preconditions;
import com.google.common.cache.LoadingCache;
import ru.gazprom.gtnn.minos.entity.DivisionNode;
import ru.gazprom.gtnn.minos.util.DatabaseConnectionKeeper;
import ru.gazprom.gtnn.minos.util.TableKeeper;
public class DivisionModel extends BasicModel {
public DivisionModel(DatabaseConnectionKeeper kdb,
LoadingCache<Integer, DivisionNode> cacheDivision,
String sqlLoadRootDivisionID,
String sqlLoadSubDivisionIDs,
String patternParentID) {
super(kdb);
this.cacheDivision = cacheDivision;
this.sqlLoadSubDivisionIDs = sqlLoadSubDivisionIDs;
this.patternParentID = patternParentID;
this.sqlLoadRootDivisionID = sqlLoadRootDivisionID;
}
@Override
public Object getRoot() {
if(root == null) {
try {
TableKeeper tk = kdb.selectRows(sqlLoadRootDivisionID);
Preconditions.checkState(((tk.getRowCount() == 1) && (tk.getColumnCount() == 1)),
"DivisionModel.getRoot() : selectRows() return incorrect row and column count (" + tk.getRowCount() + " , " + tk.getColumnCount() + ")");
root = cacheDivision.get((Integer) tk.getValue(1, 1));
root.subDivisions = loadChildIDs(sqlLoadSubDivisionIDs, patternParentID, root.divisionID);
if(root.subDivisions.size() != 0)
cacheDivision.getAll(root.subDivisions);
} catch (Exception e) {
e.printStackTrace();
root = null;
}
}
return root;
}
@Override
public boolean isLeaf(Object arg) {
if(arg == null)
return true;
assert arg instanceof DivisionNode : "DivisionModel.isLeaf() : arg have incorrect type";
if(!(arg instanceof DivisionNode))
return true;
DivisionNode node = (DivisionNode)arg;
checkAndLoadSubDivisions(node);
return (node.subDivisions.size() == 0);
}
@Override
public int getChildCount(Object arg) {
assert arg instanceof DivisionNode : "DivisionModel.getChildCount() : arg have incorrect type";
if(!(arg instanceof DivisionNode))
return 0;
DivisionNode node = (DivisionNode)arg;
checkAndLoadSubDivisions(node);
return node.subDivisions.size();
}
@Override
public Object getChild(Object arg, int index) {
if(arg == null)
return null;
assert arg instanceof DivisionNode : "DivisionModel.getChild() : arg have incorrect type";
if(!(arg instanceof DivisionNode))
return null;
DivisionNode node = (DivisionNode)arg;
checkAndLoadSubDivisions(node);
assert ((0 <= index) && (index < node.subDivisions.size())) : "DivisionModel.getChild() : index out of range";
if((index < 0) || (index >= node.subDivisions.size()))
return null;
Object obj = null;
try {
obj = cacheDivision.get(node.subDivisions.get(index));
} catch (Exception 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 DivisionNode : "DivisionModel.getIndexOfChild() : parent have incorrect type";
assert child instanceof DivisionNode : "DivisionModel.getIndexOfChild() : parent have incorrect type";
if( !( (parent instanceof DivisionNode) && (child instanceof DivisionNode) ) )
return -1;
DivisionNode nodeParent = (DivisionNode)parent;
DivisionNode nodeChild = (DivisionNode)child;
checkAndLoadSubDivisions(nodeParent);
int offs = -1;
for(int i = 0; i < nodeParent.subDivisions.size(); i++) {
if(nodeChild.divisionID == nodeParent.subDivisions.get(i)) {
offs = i;
break;
}
}
assert offs != -1 : "DivisionModel.getIndexOfChild() : childNode cann't find in parentNode.catalogs";
return offs;
}
@Override
public void valueForPathChanged(TreePath path, Object newValue) {
// TODO Auto-generated method stub
}
private void checkAndLoadSubDivisions(DivisionNode dn) {
if(dn.subDivisions == null) {
dn.subDivisions = loadChildIDs(sqlLoadSubDivisionIDs, patternParentID, dn.divisionID);
if(dn.subDivisions.size() != 0)
try {
cacheDivision.getAll(dn.subDivisions);
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
private DivisionNode root = null;
private LoadingCache<Integer, DivisionNode> cacheDivision;
private String sqlLoadSubDivisionIDs;
private String patternParentID;
private String sqlLoadRootDivisionID;
}