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

org.datacleaner.widgets.Dropzone Maven / Gradle / Ivy

/**
 * DataCleaner (community edition)
 * Copyright (C) 2014 Neopost - Customer Information Management
 *
 * 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.widgets;

import java.awt.Component;
import java.awt.Cursor;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.TransferHandler;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;

import org.apache.metamodel.util.Resource;
import org.datacleaner.connection.CsvDatastore;
import org.datacleaner.connection.Datastore;
import org.datacleaner.connection.DatastoreCatalog;
import org.datacleaner.connection.FileDatastore;
import org.datacleaner.panels.DCPanel;
import org.datacleaner.user.DatastoreSelectedListener;
import org.datacleaner.user.UserPreferences;
import org.datacleaner.util.DatastoreCreationUtil;
import org.datacleaner.util.FileFilters;
import org.datacleaner.util.IconUtils;
import org.datacleaner.util.WidgetFactory;
import org.datacleaner.util.WidgetUtils;
import org.datacleaner.util.convert.HdfsResourceTypeHandler;
import org.datacleaner.util.convert.ResourceConverter;
import org.datacleaner.util.convert.ResourceConverter.ResourceTypeHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * A dropzone where the user can drop files to register them as datastores.
 */
public class Dropzone extends DCPanel {

    private static final Logger logger = LoggerFactory.getLogger(Dropzone.class);
    private static final long serialVersionUID = 1L;

    private final DatastoreCatalog _datastoreCatalog;
    private final DatastoreSelectedListener _datastoreSelectListener;
    private final UserPreferences _userPreferences;

    public Dropzone(final DatastoreCatalog datastoreCatalog, final DatastoreSelectedListener datastoreSelectListener,
            final UserPreferences userPreferences) {
        super(WidgetUtils.BG_SEMI_TRANSPARENT);
        _datastoreCatalog = datastoreCatalog;
        _datastoreSelectListener = datastoreSelectListener;
        _userPreferences = userPreferences;
        setLayout(new GridBagLayout());

        setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        setBorder(new CompoundBorder(BorderFactory.createDashedBorder(WidgetUtils.BG_COLOR_MEDIUM, 3f, 3.0f, 3.0f,
                false), new EmptyBorder(30, 30, 30, 30)));

        final DCLabel dropFileLabel = DCLabel.dark("Drop file here");
        dropFileLabel.setFont(WidgetUtils.FONT_BANNER);
        add(dropFileLabel, new GridBagConstraints(0, 0, 2, 1, 1.0, 1.0, GridBagConstraints.CENTER,
                GridBagConstraints.NONE, new Insets(0, 0, 10, 0), 0, 0));

        // orclick button
        final JButton orClickButton = WidgetFactory.createPrimaryButton("(Click to browse)", IconUtils.FILE_FILE);
        orClickButton.setFont(WidgetUtils.FONT_HEADER2);
        orClickButton.setAlignmentX(Component.CENTER_ALIGNMENT);
        add(orClickButton, new GridBagConstraints(0, 1, 1, 1, 1.0, 1.0, GridBagConstraints.EAST,
                GridBagConstraints.NONE, new Insets(0, 0, 10, 0), 0, 0));
        orClickButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                showFileChooser();
            }
        });
        // select hadoop file button
        final JButton selectHadoopButton = WidgetFactory.createPrimaryButton("Select Hadoop HDFS file",
                IconUtils.FILE_HDFS);
        selectHadoopButton.setFont(WidgetUtils.FONT_HEADER2);
        selectHadoopButton.setAlignmentX(Component.CENTER_ALIGNMENT);
        add(selectHadoopButton, new GridBagConstraints(1, 1, 1, 1, 1.0, 1.0, GridBagConstraints.WEST,
                GridBagConstraints.NONE, new Insets(0, 10, 10, 0), 0, 0));

        // error label
        final DCLabel errorResourceLabel = DCLabel
                .dark("

The HDFS file does not exist

"); errorResourceLabel.setVisible(false); add(errorResourceLabel, new GridBagConstraints(0, 3, 2, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 10, 0), 0, 0)); // hdfs resource selector final DCPanel hdfsResourceSelectorPanel = createHdfsResourcePanel(errorResourceLabel); add(hdfsResourceSelectorPanel, new GridBagConstraints(0, 2, 2, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, -5, 10, 0), 0, 0)); hdfsResourceSelectorPanel.setVisible(false); selectHadoopButton.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (hdfsResourceSelectorPanel.isVisible()) { hdfsResourceSelectorPanel.setVisible(false); errorResourceLabel.setVisible(false); } else { hdfsResourceSelectorPanel.setVisible(true); } } }); addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { showFileChooser(); } }); makeDroppable(); } private DCPanel createHdfsResourcePanel(final DCLabel errorResourceLabel) { final List> handlers = new ArrayList<>(); handlers.add(new HdfsResourceTypeHandler()); final ResourceConverter resourceConverter = new ResourceConverter(handlers); final ResourceSelector resourceSelector = new ResourceSelector(resourceConverter, _userPreferences, true); resourceSelector.setScheme("hdfs"); resourceSelector.setVisibleResourceTypeCombox(false); final ResourceTypePresenter resourceTypePresenter = resourceSelector.getResourceTypePresenter("hdfs"); resourceSelector.setCurrentPresenter(resourceTypePresenter); final DCPanel panel = new DCPanel(); panel.add(resourceSelector); final JButton okButton = WidgetFactory.createDefaultButton("OK"); okButton.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { final Resource resource = resourceSelector.getResource(); if (resource != null && resource.isExists()) { errorResourceLabel.setVisible(false); final Datastore datastore = new CsvDatastore(resource.getName(), resource); _datastoreSelectListener.datastoreSelected(datastore); } else { errorResourceLabel.setVisible(true); } } }); panel.add(okButton); return panel; } protected void showFileChooser() { final DCFileChooser fileChooser = new DCFileChooser(_userPreferences.getOpenDatastoreDirectory()); fileChooser.addChoosableFileFilter(FileFilters.ALL); fileChooser.setFileFilter(FileFilters.allDataFiles()); final int result = fileChooser.showOpenDialog(Dropzone.this); if (result == JFileChooser.APPROVE_OPTION) { final File file = fileChooser.getSelectedFile(); if (file.exists()) { Datastore datastore = null; final String filename = file.getName(); final String filePath = file.getAbsolutePath(); final String[] datastoreNames = _datastoreCatalog.getDatastoreNames(); for (int i = 0; i < datastoreNames.length; i++) { final Datastore existingDatastore = _datastoreCatalog.getDatastore(datastoreNames[i]); if (existingDatastore instanceof FileDatastore) { FileDatastore fileDatastore = (FileDatastore) existingDatastore; final String datastoreFilename = fileDatastore.getFilename(); if (filename.equals(datastoreFilename) || filePath.equals(datastoreFilename)) { datastore = _datastoreCatalog.getDatastore(filename); } } } if (datastore == null) { datastore = DatastoreCreationUtil.createAndAddUniqueDatastoreFromFile(_datastoreCatalog, file); } _datastoreSelectListener.datastoreSelected(datastore); final File directory; if (file.isFile()) { directory = file.getParentFile(); } else if (file.isDirectory()) { directory = file; } else { directory = _userPreferences.getOpenDatastoreDirectory(); } _userPreferences.setOpenDatastoreDirectory(directory); } } } private void makeDroppable() { TransferHandler handler = new TransferHandler() { private static final long serialVersionUID = 1L; @Override public boolean canImport(TransferHandler.TransferSupport info) { // we only import FileList if (!info.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { return false; } return true; } @SuppressWarnings("unchecked") @Override public boolean importData(TransferHandler.TransferSupport info) { if (!info.isDrop()) { return false; } // Check for FileList flavor if (!info.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { logger.warn("List doesn't accept a drop of this type."); return false; } // Get the fileList that is being dropped. Transferable t = info.getTransferable(); List data; try { data = (List) t.getTransferData(DataFlavor.javaFileListFlavor); } catch (Exception e) { return false; } if (data.size() != 1) { logger.warn("Only one file/directory supported."); return false; } File file = data.get(0); if (!file.exists()) { return false; } Datastore datastore = DatastoreCreationUtil .createAndAddUniqueDatastoreFromFile(_datastoreCatalog, file); _datastoreSelectListener.datastoreSelected(datastore); return true; } }; setTransferHandler(handler); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy