All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.cayenne.modeler.action.LoadDbSchemaAction Maven / Gradle / Ivy

There is a newer version: 5.0-M1
Show newest version
/*****************************************************************
 *   Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 *
 *    https://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing,
 *  software distributed under the License is distributed on an
 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, either express or implied.  See the License for the
 *  specific language governing permissions and limitations
 *  under the License.
 ****************************************************************/

package org.apache.cayenne.modeler.action;

import javax.swing.JOptionPane;
import javax.swing.tree.TreePath;
import java.awt.event.ActionEvent;
import java.sql.SQLException;

import org.apache.cayenne.dbsync.reverse.dbimport.Catalog;
import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable;
import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
import org.apache.cayenne.dbsync.reverse.dbimport.Schema;
import org.apache.cayenne.modeler.Application;
import org.apache.cayenne.modeler.dialog.db.load.DbImportTreeNode;
import org.apache.cayenne.modeler.editor.dbimport.DatabaseSchemaLoader;
import org.apache.cayenne.modeler.editor.dbimport.DbImportModel;
import org.apache.cayenne.modeler.editor.dbimport.DbImportView;
import org.apache.cayenne.modeler.editor.dbimport.DraggableTreePanel;
import org.apache.cayenne.modeler.editor.dbimport.PrintColumnsBiFunction;
import org.apache.cayenne.modeler.editor.dbimport.PrintTablesBiFunction;
import org.apache.cayenne.modeler.pref.DBConnectionInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @since 4.1
 */
public class LoadDbSchemaAction extends DBConnectionAwareAction {

    private static final Logger LOGGER = LoggerFactory.getLogger(LoadDbSchemaAction.class);

    private static final String ICON_NAME = "icon-dbi-refresh.png";
    private static final String ACTION_NAME = "Refresh Db Schema";
    private DraggableTreePanel draggableTreePanel;

    LoadDbSchemaAction(Application application) {
        super(ACTION_NAME, application);
    }

    public String getIconName() {
        return ICON_NAME;
    }

    @Override
    public void performAction(ActionEvent e) {
        performAction(e, null);
    }

    public void performAction(ActionEvent e, TreePath tablePath) {
        final DbImportView rootParent = ((DbImportView) draggableTreePanel.getParent().getParent());
        rootParent.getLoadDbSchemaProgress().setVisible(true);
        rootParent.getLoadDbSchemaButton().setEnabled(false);
        Thread thread = new Thread(() -> {
            LoadDbSchemaAction.this.setEnabled(false);
            rootParent.lockToolbarButtons();
            draggableTreePanel.getMoveButton().setEnabled(false);
            draggableTreePanel.getMoveInvertButton().setEnabled(false);
            try {

                DBConnectionInfo connectionInfo = getConnectionInfo("Load Db Schema");
                if (connectionInfo == null) {
                    return;
                }

                if (tablePath != null) {
                    Object userObject = ((DbImportTreeNode) tablePath.getLastPathComponent()).getUserObject();
                    if (userObject instanceof Catalog) {
                        Catalog catalog = (Catalog) userObject;
                        if (catalog.getSchemas().isEmpty()) {
                            loadTables(connectionInfo, tablePath, rootParent);
                        }
                    } else if (userObject instanceof Schema) {
                        loadTables(connectionInfo, tablePath, rootParent);
                    } else if (userObject instanceof IncludeTable) {
                        loadColumns(connectionInfo, tablePath);
                    } else {
                        loadTables(connectionInfo, tablePath, rootParent);
                    }
                } else {
                    loadDataBase(connectionInfo);
                }
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(
                        Application.getFrame(),
                        ex.getMessage(),
                        "Error loading db schema",
                        JOptionPane.ERROR_MESSAGE);
                LOGGER.warn("Error loading db schema", ex);
            } finally {
                rootParent.getLoadDbSchemaButton().setEnabled(true);
                rootParent.getLoadDbSchemaProgress().setVisible(false);
                rootParent.unlockToolbarButtons();
            }
        });
        thread.start();
    }

    private void loadDataBase(DBConnectionInfo connectionInfo) throws Exception {
        ReverseEngineering databaseReverseEngineering = new DatabaseSchemaLoader()
                .load(connectionInfo,
                        getApplication().getClassLoadingService());
        draggableTreePanel.getSourceTree()
                .setEnabled(true);
        draggableTreePanel.getSourceTree()
                .translateReverseEngineeringToTree(databaseReverseEngineering, true);
        draggableTreePanel
                .bindReverseEngineeringToDatamap(getProjectController().getCurrentDataMap(), databaseReverseEngineering);
        ((DbImportModel) draggableTreePanel.getSourceTree().getModel()).reload();
    }

    private void loadTables(DBConnectionInfo connectionInfo,
                            TreePath tablePath,
                            DbImportView rootParent) throws SQLException {
        ReverseEngineering databaseReverseEngineering = new DatabaseSchemaLoader()
                .loadTables(connectionInfo,
                        getApplication().getClassLoadingService(),
                        tablePath,
                        rootParent.getTableTypes());
        draggableTreePanel.getSourceTree()
                .update(databaseReverseEngineering,
                        new PrintTablesBiFunction(draggableTreePanel.getSourceTree()));
    }

    private void loadColumns(DBConnectionInfo connectionInfo, TreePath tablePath) throws SQLException {
        ReverseEngineering databaseReverseEngineering = new DatabaseSchemaLoader()
                .loadColumns(connectionInfo, getApplication().getClassLoadingService(), tablePath);
        draggableTreePanel.getSourceTree()
                .update(databaseReverseEngineering,
                        new PrintColumnsBiFunction(draggableTreePanel.getSourceTree()));
    }

    public void setDraggableTreePanel(DraggableTreePanel draggableTreePanel) {
        this.draggableTreePanel = draggableTreePanel;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy