package ru.gazprom.gtnn.minos.models;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.tree.TreePath;
import ru.gazprom.gtnn.minos.entity.CatalogNode;
import ru.gazprom.gtnn.minos.entity.CompetenceNode;
import ru.gazprom.gtnn.minos.entity.IndicatorNode;
import ru.gazprom.gtnn.minos.util.DatabaseConnectionKeeper;
import ru.gedr.util.tuple.Pair;
import com.google.common.cache.LoadingCache;
public class CompetenceAndCatalogModel extends BasicModel {
public CompetenceAndCatalogModel(DatabaseConnectionKeeper kdb,
LoadingCache<Integer, CompetenceNode> cacheCompetence,
BasicModel catalog,
BasicModel competence,
String sqlLoadCompetenceIDsForCatalog,
String pattern,
boolean flagCompetenceBeforeCatalog ) {
super(kdb);
this.cacheCompetence = cacheCompetence;
this.catalog = catalog;
this.competence = competence;
this.sqlLoadCompetenceIDsForCatalog= sqlLoadCompetenceIDsForCatalog;
this.pattern = pattern;
this.flagCompetenceBeforeCatalog = flagCompetenceBeforeCatalog;
competencesInCatalog = new HashMap<>();
}
public BasicModel getCompetenceModel() {
return competence;
}
public BasicModel getCatalogModel() {
return catalog;
}
@Override
public Object getRoot() {
return catalog.getRoot();
}
@Override
public boolean isLeaf(Object arg) {
if(arg == null)
return true;
if((arg instanceof CompetenceNode) ||
(arg instanceof Pair) ||
(arg instanceof IndicatorNode))
return competence.isLeaf(arg);
if(arg instanceof CatalogNode) {
CatalogNode node = (CatalogNode)arg;
List<Integer> lst = checkAndLoadCompetence(node);
return ( catalog.isLeaf(arg) && (lst.size() == 0) );
}
return true;
}
@Override
public int getChildCount(Object parent) {
if(parent == null)
return 0;
if((parent instanceof CompetenceNode) ||
(parent instanceof Pair) ||
(parent instanceof IndicatorNode))
return competence.getChildCount(parent);
if(parent instanceof CatalogNode) {
List<Integer> lst = checkAndLoadCompetence((CatalogNode)parent);
return lst.size() + catalog.getChildCount(parent);
}
return 0;
}
@Override
public Object getChild(Object parent, int index) {
if(parent == null)
return null;
if((parent instanceof CompetenceNode) ||
(parent instanceof Pair) ||
(parent instanceof IndicatorNode))
return competence.getChild(parent, index);
Object obj = null;
if(parent instanceof CatalogNode) {
try {
List<Integer> lst = checkAndLoadCompetence((CatalogNode)parent);
if(flagCompetenceBeforeCatalog) {
obj = ( ((0 <= index) && (index < lst.size())) ? cacheCompetence.get(lst.get(index))
: catalog.getChild(parent, index - lst.size()) );
} else {
int countSubCatalog = catalog.getChildCount(parent);
obj = (((0 <= index) && (index < countSubCatalog)) ? catalog.getChild(parent, index)
: cacheCompetence.get(lst.get(index - countSubCatalog)) );
}
} catch(Exception e) {
e.printStackTrace();
obj = null;
}
}
return obj;
}
@Override
public int getIndexOfChild(Object parent, Object child) {
if(parent == null || child == null)
return -1;
if((parent instanceof CompetenceNode) ||
(parent instanceof Pair) ||
(parent instanceof IndicatorNode))
return competence.getIndexOfChild(parent, child);
List<Integer> lst = checkAndLoadCompetence((CatalogNode)parent);
if((parent instanceof CatalogNode) && (child instanceof CatalogNode))
return ( flagCompetenceBeforeCatalog ? catalog.getIndexOfChild(parent, child) + lst.size()
: catalog.getIndexOfChild(parent, child) );
if((parent instanceof CatalogNode) && (child instanceof CompetenceNode)) {
CompetenceNode node = (CompetenceNode)child;
int result = -1;
boolean fOk = false;
try {
for (Integer it : lst) {
result++;
if (node.competenceID == cacheCompetence.get(it).competenceID) {
fOk = true;
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return (!fOk ? -1 : (result += flagCompetenceBeforeCatalog ? 0 : catalog.getChildCount(parent)));
}
return -1;
}
@Override
public void valueForPathChanged(TreePath arg0, Object arg1) {
// TODO Auto-generated method stub
}
@Override
public void reload() {
catalog.reload();
competencesInCatalog.clear();
competence.reload();
}
@Override
public void add(Object obj, TreePath path) throws Exception {
if(obj instanceof CatalogNode) {
catalog.add(obj, path);
}
if( (obj instanceof CompetenceNode) ||
(obj instanceof IndicatorNode) ) {
competence.add(obj, path);
}
}
private List<Integer> checkAndLoadCompetence(CatalogNode cn) {
List<Integer> lst = competencesInCatalog.get(cn.catalogID);
if(lst == null) {
lst = loadChildIDs(sqlLoadCompetenceIDsForCatalog, pattern, cn.catalogID);
competencesInCatalog.put(cn.catalogID, lst);
}
return lst;
}
private LoadingCache<Integer, CompetenceNode> cacheCompetence;
private BasicModel catalog;
private BasicModel competence;
private String sqlLoadCompetenceIDsForCatalog;
private String pattern;
private boolean flagCompetenceBeforeCatalog;
private Map<Integer, List<Integer>> competencesInCatalog;
}