phex.gui.dialogs.ExportDialog.java Source code

Java tutorial

Introduction

Here is the source code for phex.gui.dialogs.ExportDialog.java

Source

/*
 *  PHEX - The pure-java Gnutella-servent.
 *  Copyright (C) 2001 - 2008 Phex Development Group
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  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 General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 * 
 *  --- SVN Information ---
 *  $Id: ExportDialog.java 4412 2009-03-22 13:40:44Z ArneBab $
 */
package phex.gui.dialogs;

import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.ButtonGroup;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.filechooser.FileFilter;

import org.apache.commons.lang.SystemUtils;

import phex.common.log.NLogger;
import phex.gui.common.BanneredDialog;
import phex.gui.common.GUIRegistry;
import phex.servent.Servent;
import phex.share.ShareFile;
import phex.share.SharedFilesService;
import phex.share.export.ExportEngine;
import phex.utils.FileUtils;
import phex.utils.IOUtil;
import phex.utils.Localizer;

import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.factories.ButtonBarFactory;
import com.jgoodies.forms.layout.FormLayout;

/**
 *
 */
public class ExportDialog extends BanneredDialog {
    private static final int DEFAULT_HTML_INDEX = 0;
    private static final int DEFAULT_MAGMA_YAML_INDEX = 1;
    private static final int DEFAULT_METALINK_XML_INDEX = 2;
    private static final int DEFAULT_RSS_XML_INDEX = 3;

    private CloseEventHandler closeEventHandler;

    private JRadioButton standardExport;
    private JComboBox standardExportFormatCB;

    private JRadioButton customExport;
    private JTextField customExportFormatTF;

    private JRadioButton exportAllFiles;
    private JRadioButton exportSelectedFiles;

    private JTextField outputFileTF;

    private JCheckBox magnetInclXs;
    private JCheckBox magnetInclFreebase;
    private JButton browseCustomFormat;
    private JButton browseOutFile;

    private JButton okBtn;
    private JButton cancelBtn;

    private List<ShareFile> shareFileList;

    /**
     * 
     */
    public ExportDialog() {
        this(null);
    }

    /**
     * 
     */
    public ExportDialog(List<ShareFile> selectionList) {
        super(GUIRegistry.getInstance().getMainFrame(), Localizer.getString("ExportDialog_DialogTitle"), false,
                Localizer.getString("ExportDialog_BannerHeader"),
                Localizer.getString("ExportDialog_BannerSubHeader"));

        shareFileList = selectionList;
        initContent();

        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        pack();
        setLocationRelativeTo(getParent());
    }

    private void initContent() {
        if (shareFileList == null || shareFileList.isEmpty()) {
            exportAllFiles.setSelected(true);
            exportSelectedFiles.setEnabled(false);
            exportSelectedFiles
                    .setText(Localizer.getFormatedString("ExportDialog_ExportSelectedFiles", Integer.valueOf(0)));
        } else {
            exportSelectedFiles.setSelected(true);
            exportSelectedFiles.setText(Localizer.getFormatedString("ExportDialog_ExportSelectedFiles",
                    Integer.valueOf(shareFileList.size())));
        }
    }

    @Override
    protected JPanel createDialogContentPanel() {
        initComponents();

        JPanel contentPanel = new JPanel();

        FormLayout layout = new FormLayout("7dlu, d, 3dlu, fill:d:grow, 2dlu, d");

        DefaultFormBuilder builder = new DefaultFormBuilder(layout, contentPanel);
        builder.setLeadingColumnOffset(1);

        // format section
        builder.appendSeparator(Localizer.getString("ExportDialog_ExportFormat"));

        builder.append(standardExport);
        builder.append(standardExportFormatCB);
        builder.nextLine();
        builder.append(customExport);
        builder.append(customExportFormatTF);
        builder.append(browseCustomFormat);

        // source section
        builder.appendSeparator(Localizer.getString("ExportDialog_ExportSource"));

        builder.append(exportAllFiles, 3);
        builder.nextLine();
        builder.append(exportSelectedFiles, 3);
        builder.nextLine();

        // output section
        builder.appendSeparator(Localizer.getString("ExportDialog_Output"));
        builder.append(Localizer.getString("ExportDialog_FileName"), outputFileTF, browseOutFile);

        // option section
        builder.appendSeparator(Localizer.getString("ExportDialog_Options"));
        magnetInclXs = new JCheckBox(Localizer.getString("ExportDialog_MagnetIncludeXS"));
        magnetInclXs.setToolTipText(Localizer.getString("ExportDialog_TTTMagnetIncludeXS"));
        builder.append(magnetInclXs, 3);
        builder.nextLine();
        builder.append(magnetInclFreebase, 3);

        return contentPanel;
    }

    @Override
    protected JPanel createDialogButtonPanel() {
        JPanel btnPanel = ButtonBarFactory.buildOKCancelBar(okBtn, cancelBtn);
        return btnPanel;
    }

    private void initComponents() {
        closeEventHandler = new CloseEventHandler();
        addWindowListener(closeEventHandler);

        DefaultComboBoxModel model = new DefaultComboBoxModel();
        model.insertElementAt(Localizer.getString("ExportDialog_DefaultHTMLExport"), DEFAULT_HTML_INDEX);
        model.insertElementAt(Localizer.getString("ExportDialog_MagmaYAMLExport"), DEFAULT_MAGMA_YAML_INDEX);
        model.insertElementAt(Localizer.getString("ExportDialog_MetalinkXMLExport"), DEFAULT_METALINK_XML_INDEX);
        model.insertElementAt(Localizer.getString("ExportDialog_RSSXMLExport"), DEFAULT_RSS_XML_INDEX);

        standardExport = new JRadioButton(Localizer.getString("ExportDialog_StandardExportFormat"));
        standardExport.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                replaceFileExtForStandardExport();
            }
        });

        customExport = new JRadioButton(Localizer.getString("ExportDialog_CustomExportFormat"));
        customExport.setToolTipText(Localizer.getString("ExportDialog_TTTCustomExportFormat"));
        ButtonGroup exportFormatGroup = new ButtonGroup();
        exportFormatGroup.add(standardExport);
        exportFormatGroup.add(customExport);
        standardExport.setSelected(true);

        standardExportFormatCB = new JComboBox(model);
        standardExportFormatCB.addActionListener(new ExportTypeListener());

        customExportFormatTF = new JTextField(40);
        customExportFormatTF.setToolTipText(Localizer.getString("ExportDialog_TTTCustomExportFormat"));
        customExportFormatTF.addKeyListener(new KeyListener() {
            public void keyPressed(KeyEvent e) {
                customExport.setSelected(true);
            }

            public void keyReleased(KeyEvent e) {
                customExport.setSelected(true);
            }

            public void keyTyped(KeyEvent e) {
                customExport.setSelected(true);
            }
        });

        browseCustomFormat = new JButton(Localizer.getString("ExportDialog_Browse"));
        browseCustomFormat.addActionListener(new BrowseCustomFileBtnListener());

        exportAllFiles = new JRadioButton(Localizer.getString("ExportDialog_ExportAllFiles"));
        // text will be set on initContent()
        exportSelectedFiles = new JRadioButton();
        ButtonGroup exportSourceGroup = new ButtonGroup();
        exportSourceGroup.add(exportAllFiles);
        exportSourceGroup.add(exportSelectedFiles);

        outputFileTF = new JTextField(40);
        File defOutFile = new File(SystemUtils.USER_HOME, "shared_files.html");
        outputFileTF.setText(defOutFile.getAbsolutePath());

        browseOutFile = new JButton(Localizer.getString("ExportDialog_Browse"));
        browseOutFile.addActionListener(new BrowseOutFileBtnListener());

        magnetInclXs = new JCheckBox(Localizer.getString("ExportDialog_MagnetIncludeXS"));
        magnetInclXs.setToolTipText(Localizer.getString("ExportDialog_TTTMagnetIncludeXS"));

        magnetInclFreebase = new JCheckBox(Localizer.getString("ExportDialog_MagnetIncludeFreebase"));
        magnetInclFreebase.setToolTipText(Localizer.getString("ExportDialog_TTTMagnetIncludeFreebase"));

        // delay setting initial index to ensure all components are available
        standardExportFormatCB.setSelectedIndex(0);

        okBtn = new JButton(Localizer.getString("OK"));
        okBtn.addActionListener(new OkBtnListener());

        cancelBtn = new JButton(Localizer.getString("Cancel"));
        cancelBtn.addActionListener(closeEventHandler);
    }

    private void closeDialog() {
        setVisible(false);
        dispose();
    }

    private void replaceFileExtForStandardExport() {
        String filename = outputFileTF.getText();
        String ext = FileUtils.getFileExtension(filename);

        int idx = standardExportFormatCB.getSelectedIndex();
        switch (idx) {
        case DEFAULT_HTML_INDEX:
            if (!(ext.equals("htm") || ext.equals("html"))) {
                filename = FileUtils.replaceFileExtension(filename, "html");
            }
            break;
        case DEFAULT_MAGMA_YAML_INDEX:
            if (!ext.equals("magma")) {
                filename = FileUtils.replaceFileExtension(filename, "magma");
            }
            break;
        case DEFAULT_METALINK_XML_INDEX:
            if (!ext.equals("metalink")) {
                filename = FileUtils.replaceFileExtension(filename, "metalink");
            }
            break;
        case DEFAULT_RSS_XML_INDEX:
            if (!ext.equals("xml")) {
                filename = FileUtils.replaceFileExtension(filename, "xml");
            }
            break;
        }
        outputFileTF.setText(filename);
    }

    /**
     * @param absolutePath
     * @return
     */
    private String ensureStandardExportFileExtension(String filename) {
        String ext = FileUtils.getFileExtension(filename);

        int idx = standardExportFormatCB.getSelectedIndex();
        switch (idx) {
        case DEFAULT_HTML_INDEX:
            if (!(ext.equals("htm") || ext.equals("html"))) {
                filename = filename + ".html";
            }
            break;
        case DEFAULT_MAGMA_YAML_INDEX:
            if (!ext.equals("magma")) {
                filename = filename + ".magma";
            }
            break;
        case DEFAULT_METALINK_XML_INDEX:
            if (!ext.equals("metalink")) {
                filename = filename + ".metalink";
            }
            break;
        case DEFAULT_RSS_XML_INDEX:
            if (!ext.equals("xml")) {
                filename = filename + ".rss.xml";
            }
            break;
        }
        return filename;
    }

    private void startExport() {
        String outFileName = outputFileTF.getText();
        File file = new File(outFileName);
        InputStream inStream = null;
        OutputStream outStream = null;
        try {
            outStream = new BufferedOutputStream(new FileOutputStream(file));
            if (standardExport.isSelected()) {
                int idx = standardExportFormatCB.getSelectedIndex();
                switch (idx) {
                case DEFAULT_HTML_INDEX:
                    inStream = ClassLoader
                            .getSystemResourceAsStream("phex/resources/defaultSharedFilesHTMLExport.xsl");
                    break;
                case DEFAULT_MAGMA_YAML_INDEX:
                    inStream = ClassLoader
                            .getSystemResourceAsStream("phex/resources/magmaSharedFilesYAMLExport.xsl");
                    break;
                case DEFAULT_METALINK_XML_INDEX:
                    inStream = ClassLoader
                            .getSystemResourceAsStream("phex/resources/metalinkSharedFilesXMLExport.xsl");
                    break;
                case DEFAULT_RSS_XML_INDEX:
                    inStream = ClassLoader.getSystemResourceAsStream("phex/resources/rssSharedFilesXMLExport.xsl");
                    break;
                }
            } else if (customExport.isSelected()) {
                String styleFileName = customExportFormatTF.getText();
                File styleFile = new File(styleFileName);
                inStream = new BufferedInputStream(new FileInputStream(styleFile));
            } else {
                return;
            }

            Map<String, String> exportOptions = new HashMap<String, String>();
            if (magnetInclXs.isSelected()) {
                exportOptions.put(ExportEngine.USE_MAGNET_URL_WITH_XS, "true");
            }
            if (magnetInclFreebase.isSelected()) {
                exportOptions.put(ExportEngine.USE_MAGNET_URL_WITH_FREEBASE, "true");
            }

            List<ShareFile> exportData;
            if (exportAllFiles.isSelected()) {
                SharedFilesService sharedFilesService = GUIRegistry.getInstance().getServent()
                        .getSharedFilesService();
                exportData = sharedFilesService.getSharedFiles();
            } else {
                exportData = shareFileList;
            }

            ExportEngine exportEngine = new ExportEngine(GUIRegistry.getInstance().getServent().getLocalAddress(),
                    inStream, outStream, exportData, exportOptions);
            exportEngine.startExport();
        } catch (IOException exp) {
            NLogger.error(ExportDialog.class, exp, exp);
        } finally {
            IOUtil.closeQuietly(inStream);
            IOUtil.closeQuietly(outStream);
        }
    }

    private final class OkBtnListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            try {
                startExport();
                closeDialog();
            } catch (Throwable th) {
                NLogger.error(OkBtnListener.class, th, th);
            }
        }
    }

    private final class BrowseOutFileBtnListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            try {
                if (SystemUtils.IS_OS_MAC_OSX) {
                    FileDialog dia = new FileDialog(GUIRegistry.getInstance().getMainFrame(),
                            Localizer.getString("ExportDialog_SelectOutputFile"), FileDialog.SAVE);
                    dia.setVisible(true);
                    String filename = dia.getDirectory() + dia.getFile();
                    if (standardExport.isSelected()) {
                        filename = ensureStandardExportFileExtension(filename);
                    }

                    outputFileTF.setText(filename);
                } else {
                    JFileChooser chooser = new JFileChooser();
                    chooser.setDialogTitle(Localizer.getString("ExportDialog_SelectOutputFile"));
                    chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                    chooser.setMultiSelectionEnabled(false);
                    int rc = chooser.showSaveDialog(ExportDialog.this);
                    if (rc == JFileChooser.APPROVE_OPTION) {
                        File file = chooser.getSelectedFile();
                        String filename = file.getAbsolutePath();
                        if (standardExport.isSelected()) {
                            filename = ensureStandardExportFileExtension(filename);
                        }
                        outputFileTF.setText(filename);
                    }
                }
            } catch (Throwable th) {
                NLogger.error(BrowseOutFileBtnListener.class, th, th);
            }
        }
    }

    private final class BrowseCustomFileBtnListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            try {
                customExport.setSelected(true);
                if (SystemUtils.IS_OS_MAC_OSX) {
                    FileDialog dia = new FileDialog(GUIRegistry.getInstance().getMainFrame(),
                            Localizer.getString("ExportDialog_SelectCustomStyleFile"), FileDialog.LOAD);
                    dia.setVisible(true);
                    customExportFormatTF.setText(dia.getDirectory() + dia.getFile());
                } else {
                    JFileChooser chooser = new JFileChooser();
                    chooser.setDialogTitle(Localizer.getString("ExportDialog_SelectCustomStyleFile"));
                    chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                    chooser.setMultiSelectionEnabled(false);
                    chooser.setFileFilter(new FileFilter() {
                        @Override
                        public boolean accept(File file) {
                            return file.isDirectory() || FileUtils.getFileExtension(file).equalsIgnoreCase("XSL");
                        }

                        @Override
                        public String getDescription() {
                            return "XSL-Stylesheet";
                        }
                    });
                    int rc = chooser.showOpenDialog(ExportDialog.this);
                    if (rc == JFileChooser.APPROVE_OPTION) {
                        File file = chooser.getSelectedFile();
                        customExportFormatTF.setText(file.getAbsolutePath());
                    }
                }
            } catch (Throwable th) {
                NLogger.error(BrowseCustomFileBtnListener.class, th, th);
            }
        }
    }

    private final class ExportTypeListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            try {
                standardExport.setSelected(true);
                replaceFileExtForStandardExport();
            } catch (Throwable th) {
                NLogger.error(ExportTypeListener.class, th, th);
            }
        }
    }

    private final class CloseEventHandler extends WindowAdapter implements ActionListener {
        @Override
        public void windowClosing(WindowEvent evt) {
            closeDialog();
        }

        /**
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
         */
        public void actionPerformed(ActionEvent e) {
            closeDialog();
        }
    }
}