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

org.datacleaner.panels.AddDatastorePanel Maven / Gradle / Ivy

/**
 * DataCleaner (community edition)
 * Copyright (C) 2014 Free Software Foundation, Inc.
 *
 * This copyrighted material is made available to anyone wishing to use, modify,
 * copy, or redistribute it subject to the terms and conditions of the GNU
 * Lesser General Public License, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
 * for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this distribution; if not, write to:
 * Free Software Foundation, Inc.
 * 51 Franklin Street, Fifth Floor
 * Boston, MA  02110-1301  USA
 */
package org.datacleaner.panels;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.List;

import javax.inject.Provider;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.border.EmptyBorder;

import org.datacleaner.bootstrap.WindowContext;
import org.datacleaner.configuration.ServerInformationCatalog;
import org.datacleaner.connection.Datastore;
import org.datacleaner.connection.DatastoreCatalog;
import org.datacleaner.connection.DatastoreDescriptor;
import org.datacleaner.connection.DatastoreDescriptors;
import org.datacleaner.connection.JdbcDatastore;
import org.datacleaner.database.DatabaseDriverCatalog;
import org.datacleaner.database.DatabaseDriverDescriptor;
import org.datacleaner.guice.DCModule;
import org.datacleaner.user.DatastoreSelectedListener;
import org.datacleaner.user.UserPreferences;
import org.datacleaner.util.IconUtils;
import org.datacleaner.util.WidgetFactory;
import org.datacleaner.util.WidgetUtils;
import org.datacleaner.widgets.Alignment;
import org.datacleaner.widgets.Dropzone;
import org.datacleaner.widgets.PopupButton;
import org.datacleaner.windows.AbstractDatastoreDialog;
import org.datacleaner.windows.JdbcDatastoreDialog;
import org.datacleaner.windows.OptionsDialog;

import com.google.inject.Injector;

public class AddDatastorePanel extends DCPanel {

    private static final long serialVersionUID = 1L;

    private final DCModule _dcModule;
    private final DatastoreSelectedListener _datastoreSelectedListener;
    private final Dropzone _dropzone;
    private final DatastoreCatalog _datastoreCatalog;
    private final DatabaseDriverCatalog _databaseDriverCatalog;

    public AddDatastorePanel(final DatastoreCatalog datastoreCatalog,
            final ServerInformationCatalog serverInformationCatalog, final DatabaseDriverCatalog databaseDriverCatalog,
            final DCModule dcModule, final DatastoreSelectedListener datastoreSelectedListener,
            final UserPreferences userPreferences, final boolean showExistingDatastoresButton) {
        super();
        setLayout(new GridBagLayout());
        setBorder(new EmptyBorder(10, 10, 10, 10));
        _datastoreCatalog = datastoreCatalog;
        _databaseDriverCatalog = databaseDriverCatalog;
        _dcModule = dcModule;
        _datastoreSelectedListener = datastoreSelectedListener;

        final Injector injector = dcModule.createInjectorBuilder().createInjector();
        final WindowContext windowContext = injector.getInstance(WindowContext.class);
        final Provider optionsDialogProvider = injector.getProvider(OptionsDialog.class);
        _dropzone = new Dropzone(datastoreCatalog, serverInformationCatalog, datastoreSelectedListener, userPreferences,
                windowContext, optionsDialogProvider);

        GridBagConstraints c = new GridBagConstraints();
        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 2;
        c.weightx = 1.0;
        c.insets = new Insets(0, 0, 10, 0);
        c.fill = GridBagConstraints.BOTH;
        add(_dropzone, c);

        final PopupButton databaseButton = createDatabaseButton();

        final PopupButton cloudButton = createCloudButton();

        final DCPanel buttonPanel;
        if (showExistingDatastoresButton) {
            final PopupButton existingDatastoresButton = createExistingDatastoresButton();
            buttonPanel = DCPanel.flow(Alignment.CENTER, databaseButton, cloudButton, existingDatastoresButton);
        } else {
            buttonPanel = DCPanel.flow(Alignment.CENTER, databaseButton, cloudButton);
        }

        c = new GridBagConstraints();
        c.gridx = 0;
        c.gridy = 1;
        c.gridwidth = 2;
        c.weightx = 1.0;
        c.insets = new Insets(0, 5, 0, 0);
        c.fill = GridBagConstraints.HORIZONTAL;
        add(buttonPanel, c);

    }

    private PopupButton createExistingDatastoresButton() {
        final PopupButton existingDatastoresButton =
                WidgetFactory.createDefaultPopupButton("Existing datastores", IconUtils.FILE_FOLDER);
        final JPopupMenu menu = existingDatastoresButton.getMenu();
        final String[] datastoreNames = _datastoreCatalog.getDatastoreNames();
        for (final String datastoreName : datastoreNames) {
            final Datastore datastore = _datastoreCatalog.getDatastore(datastoreName);
            final JMenuItem menuItem = WidgetFactory.createMenuItem(datastoreName,
                    IconUtils.getDatastoreIcon(datastore, IconUtils.ICON_SIZE_MENU_ITEM));
            menuItem.addActionListener(e -> _datastoreSelectedListener.datastoreSelected(datastore));

            menu.add(menuItem);
        }
        return existingDatastoresButton;
    }

    private PopupButton createCloudButton() {
        final PopupButton cloudButton =
                WidgetFactory.createDefaultPopupButton("Cloud service", IconUtils.CLOUD_IMAGEPATH);
        cloudButton.setFont(WidgetUtils.FONT_HEADER2);
        final List cloudDatastores =
                new DatastoreDescriptors(_databaseDriverCatalog).getAvailableCloudBasedDatastoreDescriptors();

        for (final DatastoreDescriptor datastoreDescriptor : cloudDatastores) {
            cloudButton.getMenu()
                    .add(createNewDatastoreButton(datastoreDescriptor.getName(), datastoreDescriptor.getDescription(),
                            datastoreDescriptor.getIconPath(), datastoreDescriptor.getDatastoreClass(),
                            datastoreDescriptor.getDatastoreDialogClass()));
        }
        return cloudButton;
    }

    private PopupButton createDatabaseButton() {
        final PopupButton databaseButton =
                WidgetFactory.createDefaultPopupButton("Database", IconUtils.GENERIC_DATASTORE_IMAGEPATH);
        databaseButton.setFont(WidgetUtils.FONT_HEADER2);

        final List databaseBasedDatastores =
                new DatastoreDescriptors(_databaseDriverCatalog).getAvailableDatabaseBasedDatastoreDescriptors();

        for (final DatastoreDescriptor datastoreDescriptor : databaseBasedDatastores) {
            if (datastoreDescriptor.getDatastoreClass().equals(JdbcDatastore.class)) {
                databaseButton.getMenu().add(createNewJdbcDatastoreButton(datastoreDescriptor.getName()));
            } else {
                databaseButton.getMenu().add(createNewDatastoreButton(datastoreDescriptor.getName(),
                        datastoreDescriptor.getDescription(), datastoreDescriptor.getIconPath(),
                        datastoreDescriptor.getDatastoreClass(), datastoreDescriptor.getDatastoreDialogClass()));
            }
        }

        return databaseButton;
    }

    private JMenuItem createNewJdbcDatastoreButton(final String databaseName) {

        final DatabaseDriverDescriptor driverDescriptor =
                DatabaseDriverCatalog.getDatabaseDriverByDriverDatabaseName(databaseName);

        final JMenuItem item = WidgetFactory.createMenuItem(databaseName, driverDescriptor.getIconImagePath());
        item.setToolTipText("Connect to " + databaseName);

        item.addActionListener(event -> {
            final Injector injectorWithDatastore =
                    _dcModule.createInjectorBuilder().with(JdbcDatastore.class, null).createInjector();
            final JdbcDatastoreDialog dialog = injectorWithDatastore.getInstance(JdbcDatastoreDialog.class);
            dialog.setSelectedDatabase(databaseName);
            dialog.setVisible(true);
            dialog.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosed(final WindowEvent e) {
                    if (dialog.getSavedDatastore() != null) {
                        _datastoreSelectedListener.datastoreSelected(dialog.getSavedDatastore());
                    }
                }
            });
        });
        return item;
    }

    private  JMenuItem createNewDatastoreButton(final String title, final String description,
            final String imagePath, final Class datastoreClass,
            final Class> dialogClass) {
        final JMenuItem item = WidgetFactory.createMenuItem(title, imagePath);
        item.setToolTipText(description);

        item.addActionListener(event -> {
            final Injector injectorWithNullDatastore =
                    _dcModule.createInjectorBuilder().with(datastoreClass, null).createInjector();
            final AbstractDatastoreDialog dialog =
                    injectorWithNullDatastore.getInstance(dialogClass);

            dialog.setVisible(true);

            dialog.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosed(final WindowEvent e) {
                    if (dialog.getSavedDatastore() != null) {
                        _datastoreSelectedListener.datastoreSelected(dialog.getSavedDatastore());
                    }
                }
            });
        });
        return item;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy