View Javadoc
1   /*******************************************************************************
2    * Copyhacked (H) 2012-2025.
3    * This program and the accompanying materials
4    * are made available under no term at all, use it like
5    * you want, but share and discuss it
6    * every time possible with every body.
7    * 
8    * Contributors:
9    *      ron190 at ymail dot com - initial implementation
10   ******************************************************************************/
11  package com.jsql.view.swing.tree.model;
12  
13  import com.jsql.model.bean.database.Database;
14  import com.jsql.util.LogLevelUtil;
15  import com.jsql.view.swing.tree.custom.JPopupMenuCustomExtract;
16  import com.jsql.view.swing.util.MediatorHelper;
17  import com.jsql.view.swing.util.UiUtil;
18  import org.apache.logging.log4j.LogManager;
19  import org.apache.logging.log4j.Logger;
20  
21  import javax.swing.*;
22  import javax.swing.tree.DefaultTreeModel;
23  import javax.swing.tree.TreePath;
24  
25  /**
26   * Database model displaying the database icon on the label.
27   */
28  public class NodeModelDatabase extends AbstractNodeModel {
29      
30      private static final Logger LOGGER = LogManager.getRootLogger();
31      
32      /**
33       * Node as a database model.
34       * @param database Element database coming from model
35       */
36      public NodeModelDatabase(Database database) {
37          super(database);
38      }
39  
40      @Override
41      protected Icon getLeafIcon(boolean leaf) {
42          if (leaf) {
43              return UiUtil.DATABASE_LINEAR.getIcon();
44          } else {
45              return UiUtil.DATABASE_BOLD.getIcon();
46          }
47      }
48  
49      @Override
50      public void runAction() {
51          if (this.isRunning()) {
52              return;
53          }
54      
55          MediatorHelper.treeDatabase().getTreeNodeModels().get(this.getElementDatabase()).removeAllChildren();
56          DefaultTreeModel treeModel = (DefaultTreeModel) MediatorHelper.treeDatabase().getModel();
57          // Fix #90522: ArrayIndexOutOfBoundsException on reload()
58          try {
59              treeModel.reload(MediatorHelper.treeDatabase().getTreeNodeModels().get(this.getElementDatabase()));
60          } catch (ArrayIndexOutOfBoundsException e) {
61              LOGGER.log(LogLevelUtil.CONSOLE_JAVA, e, e);
62          }
63          
64          new SwingWorker<>() {
65              @Override
66              protected Object doInBackground() throws Exception {
67                  Thread.currentThread().setName("SwingWorkerNodeModelDatabase");
68                  var selectedDatabase = (Database) NodeModelDatabase.this.getElementDatabase();
69                  return MediatorHelper.model().getDataAccess().listTables(selectedDatabase);
70              }
71          }.execute();
72          
73          this.setRunning(true);
74      }
75  
76      @Override
77      public boolean isPopupDisplayable() {
78          return this.isLoaded() || !this.isLoaded() && this.isRunning();
79      }
80  
81      @Override
82      protected void buildMenu(JPopupMenuCustomExtract tablePopupMenu, TreePath path) {
83          // Do nothing
84      }
85  }