package ru.gazprom.gtnn.minos.models; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; import ru.gazprom.gtnn.minos.entity.DivisionNode; import ru.gazprom.gtnn.minos.entity.IndicatorNode; import ru.gazprom.gtnn.minos.entity.LevelNode; import ru.gazprom.gtnn.minos.entity.PositionNode; import ru.gazprom.gtnn.minos.entity.ProfileNode; import ru.gazprom.gtnn.minos.util.DatabaseConnectionKeeper; import ru.gedr.util.tuple.Pair; import com.google.common.base.Preconditions; import com.google.common.cache.LoadingCache; public class ProfileAndPositionInDivision extends BasicModel { public ProfileAndPositionInDivision(DatabaseConnectionKeeper kdb, LoadingCache<Integer, ProfileNode> cacheProfile, TreeModel positionInDivision, TreeModel profile, String sqlLoadProfileForPosition, String[] pattern ) { super(kdb); this.cacheProfile = cacheProfile; this.positionInDivision = positionInDivision; this.profile = profile; this.sqlLoadProfileForPosition = sqlLoadProfileForPosition; this.pattern = pattern; map = new HashMap<>(); } @Override public Object getRoot() { // System.out.println("getRoot"); return positionInDivision.getRoot(); } @Override public boolean isLeaf(Object arg) { // System.out.println("isLeaf" + arg); if(arg == null) return true; if(arg instanceof DivisionNode) return positionInDivision.isLeaf(arg); if( (arg instanceof ProfileNode) || (arg instanceof IndicatorNode) ) return profile.isLeaf(arg); if(arg instanceof Pair<?, ?>) { @SuppressWarnings("unchecked") Pair<Integer, Object> p = (Pair<Integer, Object>)arg; if(p.getSecond() instanceof LevelNode) // this is Level of competence return profile.isLeaf(arg); if(p.getSecond() instanceof PositionNode) { PositionNode pn = (PositionNode) p.getSecond(); List<Integer> lst = cheackAndloadProfile(p.getFirst(), pn.positionID); return lst.size() == 0; } } return true; } @Override public int getChildCount(Object parent) { // System.out.println("getChildCount" + parent); if(parent == null) return 0; if(parent instanceof DivisionNode) return positionInDivision.getChildCount(parent); if( (parent instanceof ProfileNode) || (parent instanceof IndicatorNode) ) return profile.getChildCount(parent); if(parent instanceof Pair<?, ?>) { @SuppressWarnings("unchecked") Pair<Integer, Object> p = (Pair<Integer, Object>)parent; if(p.getSecond() instanceof LevelNode) // this is Level of competence return profile.getChildCount(parent); if(p.getSecond() instanceof PositionNode) { PositionNode pn = (PositionNode) p.getSecond(); List<Integer> lst = cheackAndloadProfile(p.getFirst(), pn.positionID); return lst.size(); } } return 0; } @Override public Object getChild(Object parent, int index) { //System.out.println("getChild" + parent); if(parent == null) return null; if(parent instanceof DivisionNode) return positionInDivision.getChild(parent, index); if( (parent instanceof ProfileNode) || (parent instanceof IndicatorNode) ) return profile.getChild(parent, index); if(parent instanceof Pair<?, ?>) { @SuppressWarnings("unchecked") Pair<Integer, Object> p = (Pair<Integer, Object>)parent; if(p.getSecond() instanceof LevelNode) // this is Level of competence return profile.getChild(parent, index); if(p.getSecond() instanceof PositionNode) { PositionNode pn = (PositionNode) p.getSecond(); List<Integer> lst = cheackAndloadProfile(p.getFirst(), pn.positionID); if( (0 <= index) && (index < lst.size()) ) { ProfileNode tmp = null; try { tmp = cacheProfile.get(lst.get(index)); } catch (ExecutionException e) { tmp = null; e.printStackTrace(); } return tmp; } } } return null; } @Override public int getIndexOfChild(Object parent, Object child) { //System.out.println("getIndexOfChild" + parent); if(parent == null || child == null) return -1; if(parent instanceof DivisionNode) return positionInDivision.getIndexOfChild(parent, child); if( (parent instanceof ProfileNode) || (parent instanceof IndicatorNode) ) return profile.getIndexOfChild(parent, child); if(parent instanceof Pair<?, ?>) { @SuppressWarnings("unchecked") Pair<Integer, Object> p = (Pair<Integer, Object>)parent; if(p.getSecond() instanceof LevelNode) // this is Level of competence return profile.getIndexOfChild(parent, child); if(p.getSecond() instanceof PositionNode) { if( !(child instanceof ProfileNode) ) return -1; ProfileNode nodeProfile = (ProfileNode)child; PositionNode poitionNode = (PositionNode) p.getSecond(); List<Integer> lst = cheackAndloadProfile(p.getFirst(), poitionNode.positionID); int ind = 0; for(Integer it : lst) { if(it == nodeProfile.profileID) break; ind++; } return ( (ind < lst.size()) ? ind : -1); } } return -1; } @Override public void valueForPathChanged(TreePath arg0, Object arg1) { // TODO Auto-generated method stub } private List<Integer> cheackAndloadProfile(int divisionID, int positionID) { Pair<Integer, Integer> p = new Pair<>(divisionID, positionID); List<Integer> lst = map.get(p); if(lst == null) { String request = kdb.makeSQLString(sqlLoadProfileForPosition, pattern[0], String.valueOf(divisionID)); Preconditions.checkNotNull(request, "ProfileAndPositionInDivision.cheackAndloadProfile() : makeSQLString return null"); lst = loadChildIDs(request, pattern[1], String.valueOf(positionID)); map.put(p, lst); } return lst; } private LoadingCache<Integer, ProfileNode> cacheProfile; private String sqlLoadProfileForPosition; private TreeModel profile; private TreeModel positionInDivision; private String[] pattern; private Map<Pair<Integer, Integer>, List<Integer>> map; }