Changeset 59

Show
Ignore:
Timestamp:
02/26/10 22:55:40 (2 years ago)
Author:
ke
Message:

DB tree seems to work correctly at last. Last bug fix: Fixed getParent(int, int) to fall back to the real parent when appropriate.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • kahina/trunk/src/org/kahina/data/tree/KahinaDbTree.java

    r58 r59  
    1313import org.w3c.dom.NodeList; 
    1414 
    15 public class KahinaDbTree extends KahinaTree { 
     15public class KahinaDbTree extends KahinaTree 
     16
    1617        private static final String CLIENT_ID = KahinaDbTree.class.getName(); 
    1718 
     
    4647        private PreparedStatement getRealChildrenStatement; 
    4748 
    48         private PreparedStatement getVirtualChildrenStatement; 
     49        private PreparedStatement getChildrenForLayerStatement; 
    4950 
    5051        private PreparedStatement getEdgeLabelStatement; 
     
    6263        private int nextID; 
    6364 
    64         public KahinaDbTree(DatabaseHandler db) { 
     65        public KahinaDbTree(DatabaseHandler db) 
     66        { 
    6567                this(new DefaultLayerDecider(), db); 
    6668        } 
    6769 
    68         public KahinaDbTree(LayerDecider decider, DatabaseHandler db) { 
     70        public KahinaDbTree(LayerDecider decider, DatabaseHandler db) 
     71        { 
    6972                super(decider); 
    7073                this.db = db; 
     
    7477        } 
    7578 
    76         private void createTablesIfNecessary() { 
    77                 if (!db.isRegistered(CLIENT_ID)) { 
     79        private void createTablesIfNecessary() 
     80        { 
     81                if (!db.isRegistered(CLIENT_ID)) 
     82                { 
    7883                        db.execute("CREATE TABLE " + NODE_TABLE_NAME + " (id INT, " 
    7984                                        + "tree INT, " + "nodeCaption LONG VARCHAR, " 
     
    9297        } 
    9398 
    94         private void prepareStatements() { 
     99        private void prepareStatements() 
     100        { 
    95101                int treeID = getID(); 
    96102                addNodeStatement = db.prepareStatement("INSERT INTO " + NODE_TABLE_NAME 
     
    123129                                + NODE_TABLE_NAME + " WHERE realParent = ? AND tree = " 
    124130                                + treeID); 
    125                 getVirtualChildrenStatement = db.prepareStatement("SELECT id FROM " 
     131                getChildrenForLayerStatement = db.prepareStatement("SELECT id FROM " 
    126132                                + NODE_TABLE_NAME + " WHERE tree = " + treeID 
    127133                                + " AND (virtualParent = ? OR (realParent = ? AND layer < ?))"); 
     
    142148        } 
    143149 
    144         public void addNode(int id, String caption, String label, int nodeStatus) { 
    145                 try { 
     150        public void addNode(int id, String caption, String label, int nodeStatus) 
     151        { 
     152                try 
     153                { 
    146154                        addNodeStatement.setInt(1, id); 
    147155                        addNodeStatement.setString(2, caption); 
     
    149157                        addNodeStatement.setInt(4, nodeStatus); 
    150158                        addNodeStatement.execute(); 
    151                 } catch (SQLException e) { 
     159                } catch (SQLException e) 
     160                { 
    152161                        throw new KahinaException("SQL error.", e); 
    153162                } 
     
    156165 
    157166        @Override 
    158         public int addNode(String caption, String label, int nodeStatus) { 
     167        public int addNode(String caption, String label, int nodeStatus) 
     168        { 
    159169                int id = nextID++; 
    160170                addNode(id, caption, label, nodeStatus); 
     
    163173 
    164174        @Override 
    165         public void addChild(int parent, int child) { 
    166                 try { 
     175        public void addChild(int parent, int child) 
     176        { 
     177                try 
     178                { 
    167179                        addEdgeStatement.setInt(1, parent); 
    168180                        addEdgeStatement.setInt(2, child); 
    169181                        addEdgeStatement.execute(); 
    170                 } catch (SQLException e) { 
     182                } catch (SQLException e) 
     183                { 
    171184                        throw new KahinaException("SQL error.", e); 
    172185                } 
     
    174187        } 
    175188 
    176         private void computeAndStoreLayerInformation(int child) { 
     189        private void computeAndStoreLayerInformation(int child) 
     190        { 
    177191                int childLayer = decider.decideOnLayer(child, this); 
    178192                int virtualParent = getParent(child); 
    179193                int parentLayer = getLayer(virtualParent); 
    180                 while (parentLayer > childLayer) { 
     194                while (parentLayer > childLayer) 
     195                { 
    181196                        virtualParent = getParent(virtualParent); 
    182197                        parentLayer = getLayer(virtualParent); 
    183198                } 
    184                 if (parentLayer < childLayer) { 
     199                if (parentLayer < childLayer) 
     200                { 
    185201                        virtualParent = -1; 
    186202                } 
    187                 try { 
     203                try 
     204                { 
    188205                        addLayerInformationStatement.setInt(1, childLayer); 
    189206                        addLayerInformationStatement.setInt(2, virtualParent); 
    190207                        addLayerInformationStatement.setInt(3, child); 
    191208                        addLayerInformationStatement.execute(); 
    192                 } catch (SQLException e) { 
    193                         throw new KahinaException("SQL error.", e); 
    194                 } 
    195         } 
    196  
    197         @Override 
    198         public void setLayerDecider(LayerDecider decider) { 
     209                } catch (SQLException e) 
     210                { 
     211                        throw new KahinaException("SQL error.", e); 
     212                } 
     213        } 
     214 
     215        @Override 
     216        public void setLayerDecider(LayerDecider decider) 
     217        { 
    199218                super.setLayerDecider(decider); 
    200219                recomputeLayers(); 
    201220        } 
    202221 
    203         public void recomputeLayers() { 
     222        public void recomputeLayers() 
     223        { 
    204224                recomputeLayers(getRootID()); 
    205225        } 
    206226 
    207         public void recomputeLayers(int nodeID) { 
     227        public void recomputeLayers(int nodeID) 
     228        { 
    208229                computeAndStoreLayerInformation(nodeID); 
    209                 for (int childID : getChildren(nodeID)) { 
     230                for (int childID : getChildren(nodeID)) 
     231                { 
    210232                        recomputeLayers(childID); 
    211233                } 
     
    213235 
    214236        @Override 
    215         public int getParent(int nodeID) { 
    216                 try { 
     237        public int getParent(int nodeID) 
     238        { 
     239                try 
     240                { 
    217241                        getRealParentStatement.setInt(1, nodeID); 
    218                 } catch (SQLException e) { 
     242                } catch (SQLException e) 
     243                { 
    219244                        throw new KahinaException("SQL error.", e); 
    220245                } 
     
    222247        } 
    223248 
    224         private int getVirtualParent(int nodeID) { 
    225                 try { 
     249        private int getVirtualParent(int nodeID) 
     250        { 
     251                try 
     252                { 
    226253                        getVirtualParentStatement.setInt(1, nodeID); 
    227                 } catch (SQLException e) { 
     254                } catch (SQLException e) 
     255                { 
    228256                        throw new KahinaException("SQL error.", e); 
    229257                } 
     
    231259        } 
    232260 
    233         private int getLayer(int nodeID) { 
    234                 try { 
     261        private int getLayer(int nodeID) 
     262        { 
     263                try 
     264                { 
    235265                        getLayerStatement.setInt(1, nodeID); 
    236                 } catch (SQLException e) { 
     266                } catch (SQLException e) 
     267                { 
    237268                        throw new KahinaException("SQL error.", e); 
    238269                } 
     
    241272 
    242273        @Override 
    243         public void clear() { 
     274        public void clear() 
     275        { 
    244276                db.execute(clearStatement); 
    245277        } 
    246278 
    247279        @Override 
    248         public void collapse(int nodeID) { 
    249                 try { 
     280        public void collapse(int nodeID) 
     281        { 
     282                try 
     283                { 
    250284                        collapseStatement.setInt(1, nodeID); 
    251285                        collapseStatement.execute(); 
    252                 } catch (SQLException e) { 
    253                         throw new KahinaException("SQL error.", e); 
    254                 } 
    255         } 
    256  
    257         @Override 
    258         public void decollapse(int nodeID) { 
    259                 try { 
     286                } catch (SQLException e) 
     287                { 
     288                        throw new KahinaException("SQL error.", e); 
     289                } 
     290        } 
     291 
     292        @Override 
     293        public void decollapse(int nodeID) 
     294        { 
     295                try 
     296                { 
    260297                        decollapseStatement.setInt(1, nodeID); 
    261298                        decollapseStatement.execute(); 
    262                 } catch (SQLException e) { 
    263                         throw new KahinaException("SQL error.", e); 
    264                 } 
    265         } 
    266  
    267         @Override 
    268         public void decollapseAll() { 
     299                } catch (SQLException e) 
     300                { 
     301                        throw new KahinaException("SQL error.", e); 
     302                } 
     303        } 
     304 
     305        @Override 
     306        public void decollapseAll() 
     307        { 
    269308                db.execute(decollapseAllStatement); 
    270309        } 
    271310 
    272311        @Override 
    273         public List<Integer> getChildren(int nodeID, int layer) { 
     312        public List<Integer> getChildren(int nodeID, int layer) 
     313        { 
    274314                int nodeLayer = getLayer(nodeID); 
    275                 if (layer == nodeLayer) { 
     315                if (layer == nodeLayer) 
     316                { 
    276317                        // the most common case, for which we have precalculated the virtual 
    277318                        // children 
    278                         List<Integer> result = getVirtualChildren(nodeID, nodeLayer); 
     319                        List<Integer> result = getChildrenForLayer(nodeID, nodeLayer); 
    279320                        return result; 
    280321                } 
    281                 if (nodeID == getRootID(layer) || nodeLayer >= layer) { 
     322                if (nodeID == getRootID(layer) || nodeLayer >= layer) 
     323                { 
    282324                        // usually only the case for the root of a partial tree 
    283325                        List<Integer> frontLine = getChildren(nodeID); 
    284                         for (int i = 0; i < frontLine.size();) { 
     326                        for (int i = 0; i < frontLine.size();) 
     327                        { 
    285328                                int child = frontLine.get(i); 
    286                                 if (getLayer(child) > layer) { 
     329                                if (getLayer(child) > layer) 
     330                                { 
    287331                                        frontLine.remove(i); 
    288332                                        frontLine.addAll(i, getChildren(child)); 
    289                                 } else { 
     333                                } else 
     334                                { 
    290335                                        i++; 
    291336                                } 
     
    297342        } 
    298343 
    299         private List<Integer> getChildren(int nodeID) { 
    300                 try { 
     344        private List<Integer> getChildren(int nodeID) 
     345        { 
     346                try 
     347                { 
    301348                        getRealChildrenStatement.setInt(1, nodeID); 
    302                 } catch (SQLException e) { 
     349                } catch (SQLException e) 
     350                { 
    303351                        throw new KahinaException("SQL error.", e); 
    304352                } 
     
    306354        } 
    307355 
    308         private List<Integer> getVirtualChildren(int nodeID, int layer) { 
    309                 try { 
    310                         getVirtualChildrenStatement.setInt(1, nodeID); 
    311                         getVirtualChildrenStatement.setInt(2, nodeID); 
    312                         getVirtualChildrenStatement.setInt(3, layer); 
    313                 } catch (SQLException e) { 
    314                         throw new KahinaException("SQL error.", e); 
    315                 } 
    316                 List<Integer> result = db.queryIntList(getVirtualChildrenStatement); 
     356        private List<Integer> getChildrenForLayer(int nodeID, int layer) 
     357        { 
     358                try 
     359                { 
     360                        getChildrenForLayerStatement.setInt(1, nodeID); 
     361                        getChildrenForLayerStatement.setInt(2, nodeID); 
     362                        getChildrenForLayerStatement.setInt(3, layer); 
     363                } catch (SQLException e) 
     364                { 
     365                        throw new KahinaException("SQL error.", e); 
     366                } 
     367                List<Integer> result = db.queryIntList(getChildrenForLayerStatement); 
    317368                return result; 
    318369        } 
    319370 
    320371        @Override 
    321         public String getEdgeLabel(int nodeID) { 
    322                 try { 
     372        public String getEdgeLabel(int nodeID) 
     373        { 
     374                try 
     375                { 
    323376                        getEdgeLabelStatement.setInt(1, nodeID); 
    324                 } catch (SQLException e) { 
     377                } catch (SQLException e) 
     378                { 
    325379                        throw new KahinaException("SQL error.", e); 
    326380                } 
     
    329383 
    330384        @Override 
    331         protected void collectLeaves(int nodeID, List<Integer> leaves) { 
     385        protected void collectLeaves(int nodeID, List<Integer> leaves) 
     386        { 
    332387                List<Integer> children = getChildren(nodeID); 
    333                 if (children.isEmpty()) { 
     388                if (children.isEmpty()) 
     389                { 
    334390                        leaves.add(nodeID); 
    335                 } else { 
    336                         for (int child : children) { 
     391                } else 
     392                { 
     393                        for (int child : children) 
     394                        { 
    337395                                collectLeaves(child, leaves); 
    338396                        } 
     
    341399 
    342400        @Override 
    343         public String getNodeCaption(int nodeID) { 
    344                 try { 
     401        public String getNodeCaption(int nodeID) 
     402        { 
     403                try 
     404                { 
    345405                        getNodeCaptionStatement.setInt(1, nodeID); 
    346                 } catch (SQLException e) { 
     406                } catch (SQLException e) 
     407                { 
    347408                        throw new KahinaException("SQL error.", e); 
    348409                } 
     
    351412 
    352413        @Override 
    353         public int getNodeStatus(int nodeID) { 
    354                 try { 
     414        public int getNodeStatus(int nodeID) 
     415        { 
     416                try 
     417                { 
    355418                        getNodeStatusStatement.setInt(1, nodeID); 
    356                 } catch (SQLException e) { 
     419                } catch (SQLException e) 
     420                { 
    357421                        throw new KahinaException("SQL error.", e); 
    358422                } 
     
    361425 
    362426        @Override 
    363         public int getParent(int nodeID, int layer) { 
    364                 if (nodeID == getRootID(layer)) { 
     427        public int getParent(int nodeID, int layer) 
     428        { 
     429                if (nodeID == getRootID(layer)) 
     430                { 
    365431                        return -1; 
    366432                } 
    367                 if (getLayer(nodeID) == layer) { 
    368                         return getVirtualParent(nodeID); 
     433                if (getLayer(nodeID) == layer) 
     434                { 
     435                        int virtualParent = getVirtualParent(nodeID); 
     436                        if (virtualParent != -1) 
     437                        { 
     438                                return virtualParent; 
     439                        } 
    369440                } 
    370441                int result = getParent(nodeID); 
    371                 while (getLayer(result) > layer) { 
     442                while (getLayer(result) > layer) 
     443                { 
    372444                        result = getParent(result); 
    373445                } 
     
    376448 
    377449        @Override 
    378         public int getRootID() { 
     450        public int getRootID() 
     451        { 
    379452                return db.queryInteger(getRootStatement, -1); 
    380453        } 
    381454 
    382455        @Override 
    383         public int getRootID(int layer) { 
    384                 if (layer == 0) { 
     456        public int getRootID(int layer) 
     457        { 
     458                if (layer == 0) 
     459                { 
    385460                        return getRootID(); 
    386461                } 
    387462                int result = getReferenceNode(); 
    388                 while (getLayer(result) >= layer) { 
     463                while (getLayer(result) >= layer) 
     464                { 
    389465                        result = getParent(result); 
    390466                } 
     
    393469 
    394470        @Override 
    395         public boolean isCollapsed(int nodeID) { 
    396                 try { 
     471        public boolean isCollapsed(int nodeID) 
     472        { 
     473                try 
     474                { 
    397475                        isCollapsedStatement.setInt(1, nodeID); 
    398                 } catch (SQLException e) { 
     476                } catch (SQLException e) 
     477                { 
    399478                        throw new KahinaException("SQL error.", e); 
    400479                } 
     
    404483 
    405484        @Override 
    406         public int getSize() { 
     485        public int getSize() 
     486        { 
    407487                return db.queryInteger(getSizeStatement, 0); 
    408488        } 
    409489 
    410490        public static KahinaTree importXML(Document dom, LayerDecider decider, 
    411                         DatabaseHandler db, KahinaTree primaryModel) { 
     491                        DatabaseHandler db, KahinaTree primaryModel) 
     492        { 
    412493                KahinaDbTree m = new KahinaDbTree(decider, db); 
    413                 if (primaryModel != null) { 
     494                if (primaryModel != null) 
     495                { 
    414496                        m.setPrimaryModel(primaryModel); 
    415497                } 
    416498                Element treeElement = dom.getDocumentElement(); 
    417499                NodeList childNodes = treeElement.getChildNodes(); 
    418                 for (int i = 0; i < childNodes.getLength(); i++) { 
     500                for (int i = 0; i < childNodes.getLength(); i++) 
     501                { 
    419502                        Node n = childNodes.item(i); 
    420                         if (n.getNodeName().equals("node")) { 
     503                        if (n.getNodeName().equals("node")) 
     504                        { 
    421505                                importXMLNode(m, (Element) n, -1); 
    422506                                // TODO: a little risky, root node could be assigned another ID 
     
    428512        } 
    429513 
    430         private static void importXMLNode(KahinaDbTree m, Element node, int parentID) { 
     514        private static void importXMLNode(KahinaDbTree m, Element node, int parentID) 
     515        { 
    431516                String caption = node.getAttribute("caption"); 
    432517                String label = node.getAttribute("label"); 
    433518                int status = 0; 
    434                 if (node.getAttribute("status").length() > 0) { 
     519                if (node.getAttribute("status").length() > 0) 
     520                { 
    435521                        status = Integer.parseInt(node.getAttribute("status")); 
    436522                } 
    437523                int id; 
    438                 if (node.getAttribute("id").length() > 0) { 
     524                if (node.getAttribute("id").length() > 0) 
     525                { 
    439526                        id = Integer.parseInt(node.getAttribute("id")); 
    440527                        m.addNode(id, caption, label, status); 
    441                 } else { 
     528                } else 
     529                { 
    442530                        id = m.addNode(caption, label, status); 
    443531                } 
    444                 if (parentID != -1) { 
     532                if (parentID != -1) 
     533                { 
    445534                        m.addChild(parentID, id); 
    446535                } 
    447536                // go through children recursively 
    448537                NodeList childNodes = node.getChildNodes(); 
    449                 for (int i = 0; i < childNodes.getLength(); i++) { 
     538                for (int i = 0; i < childNodes.getLength(); i++) 
     539                { 
    450540                        Node n = childNodes.item(i); 
    451                         if (n.getNodeName().equals("node")) { 
     541                        if (n.getNodeName().equals("node")) 
     542                        { 
    452543                                importXMLNode(m, (Element) n, id); 
    453544                        } 
     
    456547 
    457548        @Override 
    458         public void finalize() throws Throwable { 
     549        public void finalize() throws Throwable 
     550        { 
    459551                clear(); 
    460552                super.finalize(); 
  • kahina/trunk/src/org/kahina/visual/tree/KahinaTreeView.java

    r57 r59  
    620620 
    621621        createNodeLayers(); 
    622         System.err.println(showLevels()); 
     622        //System.err.println(showLevels()); 
    623623        //System.err.println(terminalLayer); 
    624624         
     
    758758          while(true) 
    759759          { 
    760             System.err.println("children:" + children); 
     760            //System.err.println("children:" + children); 
    761761            ArrayList<Integer> grandchildren = new ArrayList<Integer>(); 
    762762            for (int i = 0; i < children.size(); i++)