ro.nextreports.designer.wizpublish.DownloadListWizardPanel.java Source code

Java tutorial

Introduction

Here is the source code for ro.nextreports.designer.wizpublish.DownloadListWizardPanel.java

Source

/*
 * 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
 * 
 *      http://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 ro.nextreports.designer.wizpublish;

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
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.Collections;
import java.util.List;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jdesktop.swingx.JXList;

import ro.nextreports.designer.FormSaver;
import ro.nextreports.designer.Globals;
import ro.nextreports.designer.chart.ChartUtil;
import ro.nextreports.designer.querybuilder.DBBrowserNode;
import ro.nextreports.designer.querybuilder.DBObject;
import ro.nextreports.designer.server.JcrBrowserTreeUtil;
import ro.nextreports.designer.ui.BaseDialog;
import ro.nextreports.designer.ui.wizard.WizardPanel;
import ro.nextreports.designer.util.FileUtil;
import ro.nextreports.designer.util.I18NSupport;
import ro.nextreports.designer.util.ImageUtil;
import ro.nextreports.designer.util.Show;
import ro.nextreports.designer.util.UIActivator;
import ro.nextreports.designer.wizrep.WizardConstants;

import ro.nextreports.engine.Report;
import ro.nextreports.engine.XStreamFactory;
import ro.nextreports.engine.chart.Chart;
import ro.nextreports.server.api.client.ChartMetaData;
import ro.nextreports.server.api.client.FileMetaData;
import ro.nextreports.server.api.client.ReportMetaData;
import ro.nextreports.server.api.client.WebServiceClient;
import com.thoughtworks.xstream.XStream;

public class DownloadListWizardPanel extends WizardPanel {

    private static Log LOG = LogFactory.getLog(DownloadListWizardPanel.class);

    private Dimension btnDim = new Dimension(20, 20);
    private Dimension scrDim = new Dimension(400, 150);
    private Dimension scrTreeDim = new Dimension(250, 200);
    private JXList list = new JXList();
    private DefaultListModel listModel = new DefaultListModel();
    private JScrollPane scrList = new JScrollPane();
    private JButton btnAdd = new JButton();
    private JButton btnRem = new JButton();

    public DownloadListWizardPanel() {
        super();
        banner.setTitle(I18NSupport.getString("download"));
        init();
    }

    private void init() {
        setLayout(new GridBagLayout());

        btnAdd.setIcon(ImageUtil.getImageIcon("add"));
        btnAdd.setPreferredSize(btnDim);
        btnAdd.setMinimumSize(btnDim);
        btnAdd.setMaximumSize(btnDim);
        btnAdd.setToolTipText(I18NSupport.getString("listselectionpanel.add"));
        btnAdd.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                add();
            }
        });

        btnRem.setIcon(ImageUtil.getImageIcon("delete"));
        btnRem.setPreferredSize(btnDim);
        btnRem.setMinimumSize(btnDim);
        btnRem.setMaximumSize(btnDim);
        btnRem.setToolTipText(I18NSupport.getString("listselectionpanel.remove"));
        btnRem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                remove();
            }
        });

        list.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                if (e.getClickCount() == 2) {
                    remove();
                }
            }
        });

        scrList.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scrList.setMinimumSize(scrDim);
        scrList.setPreferredSize(scrDim);
        scrList.getViewport().add(list, null);
        list.setModel(listModel);

        JPanel btnPanel = new JPanel();
        btnPanel.setLayout(new BoxLayout(btnPanel, BoxLayout.Y_AXIS));
        btnPanel.add(Box.createGlue());
        btnPanel.add(btnAdd);
        btnPanel.add(Box.createRigidArea(new Dimension(5, 5)));
        btnPanel.add(btnRem);
        btnPanel.add(Box.createGlue());

        add(scrList, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0, GridBagConstraints.NORTHEAST,
                GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0));

        add(btnPanel, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.NORTH,
                GridBagConstraints.NONE, new Insets(5, 0, 5, 5), 0, 0));
    }

    public void onDisplay() {
    }

    /**
     * Is there be a next panel?
     * 
     * @return true if there is a panel to move to next
     */
    public boolean hasNext() {
        return false;
    }

    public boolean validateNext(List<String> messages) {
        return false;
    }

    /**
     * Get the next panel to go to.
     */
    public WizardPanel getNextPanel() {
        return null;
    }

    /**
     * Can this panel finish the wizard?
     * 
     * @return true if this panel can finish the wizard.
     */
    public boolean canFinish() {
        return true;
    }

    /**
     * Called to validate the panel before finishing the wizard. Should return
     * false if canFinish returns false.
     * 
     * @param messages a List of messages to be displayed.
     * @return true if it is valid for this wizard to finish.
     */
    public boolean validateFinish(List<String> messages) {
        if (listModel.size() <= 0) {
            messages.add(I18NSupport.getString("wizard.publish.entities.select.error"));
            return false;
        }
        String destinationPath = (String) context.getAttribute(DownloadBulkWizard.DESTINATION);
        String entity = (String) context.getAttribute(WizardConstants.ENTITY);
        String extension;
        if (WizardConstants.ENTITY_REPORT.equals(entity)) {
            extension = FormSaver.REPORT_FULL_EXTENSION;
        } else {
            extension = ChartUtil.CHART_FULL_EXTENSION;
        }
        StringBuilder sb = new StringBuilder();
        for (Object path : Collections.list(listModel.elements())) {
            String serverPath = (String) path;
            String name = getName(serverPath);
            if (new File(destinationPath + File.separator + name + extension).exists()) {
                sb.append(name).append(" : ");
                sb.append(I18NSupport.getString("wizard.publish.entity.found"));
                sb.append("\n");
            }
        }
        if (sb.length() > 0) {
            JDialog parent = (JDialog) context.getAttribute(PublishWizard.MAIN_FRAME);
            if (!overwriteBulk(parent, sb.toString())) {
                return false;
            }
        }
        return true;
    }

    private void add() {
        String entity = (String) context.getAttribute(WizardConstants.ENTITY);
        byte type;
        if (WizardConstants.ENTITY_REPORT.equals(entity)) {
            type = DBObject.REPORTS_GROUP;
        } else {
            type = DBObject.CHARTS_GROUP;
        }
        createSelectionDialog(type);
    }

    private void remove() {
        for (Object obj : list.getSelectedValues()) {
            listModel.removeElement(obj);
        }
    }

    private void createSelectionDialog(final byte type) {
        WebServiceClient client = (WebServiceClient) context.getAttribute(PublishWizard.CLIENT);
        final JcrBrowserTree jcrBrowserTree = new JcrBrowserTree(type, client);
        jcrBrowserTree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
        JPanel selectionPanel = JcrBrowserTreeUtil.createSelectionPanel(jcrBrowserTree, type);

        JDialog dialog = new BaseDialog(selectionPanel, I18NSupport.getString("wizard.publish.file.path.select"),
                true) {
            protected boolean ok() {
                return selection(jcrBrowserTree, type);
            }
        };
        dialog.pack();
        Show.centrateComponent((JDialog) context.getAttribute(PublishWizard.MAIN_FRAME), dialog);
        dialog.setVisible(true);
    }

    private boolean selection(JcrBrowserTree jcrBrowserTree, byte type) {
        TreePath[] paths = jcrBrowserTree.getSelectionPaths();
        if (paths == null) {
            return false;
        }

        for (TreePath selPath : paths) {
            DBBrowserNode selectedNode = (DBBrowserNode) selPath.getLastPathComponent();
            if ((selectedNode.getDBObject().getType() == DBObject.REPORTS)
                    || (selectedNode.getDBObject().getType() == DBObject.CHARTS)) {
                if (!listModel.contains(selectedNode.getDBObject().getAbsolutePath())) {
                    listModel.addElement(selectedNode.getDBObject().getAbsolutePath());
                }
            }
        }
        if (listModel.size() <= 0) {
            return false;
        }

        return true;
    }

    public void onFinish() {

        Thread executorThread = new Thread(new Runnable() {

            public void run() {

                JDialog parent = (JDialog) context.getAttribute(PublishWizard.MAIN_FRAME);
                String destinationPath = (String) context.getAttribute(DownloadBulkWizard.DESTINATION);
                UIActivator activator = new UIActivator(Globals.getMainFrame(), I18NSupport.getString("download"),
                        listModel.size());
                activator.start();
                WebServiceClient client = (WebServiceClient) context.getAttribute(PublishWizard.CLIENT);
                String entity = (String) context.getAttribute(WizardConstants.ENTITY);
                try {
                    StringBuilder sbError = new StringBuilder();
                    StringBuilder sbInfo = new StringBuilder();

                    if (WizardConstants.ENTITY_REPORT.equals(entity)) {
                        for (Object path : Collections.list(listModel.elements())) {
                            String serverPath = (String) path;
                            String name = getName(serverPath) + FormSaver.REPORT_FULL_EXTENSION;
                            try {
                                ReportMetaData reportMetaData = client.getReport(serverPath);
                                XStream xstream = XStreamFactory.createXStream();
                                Report report = (Report) xstream.fromXML(
                                        new String(reportMetaData.getMainFile().getFileContent(), "UTF-8"));
                                boolean ok = FormSaver.getInstance().save(new File(destinationPath, name), report);
                                sbInfo.append(name).append(" : ").append(I18NSupport.getString("downloaded"))
                                        .append("\n");
                                if (ok) {
                                    // save images                           
                                    List<FileMetaData> list = reportMetaData.getImages();
                                    if (list != null) {
                                        for (FileMetaData image : list) {
                                            FileUtil.createFile(
                                                    destinationPath + File.separator + image.getFileName(),
                                                    image.getFileContent());
                                        }
                                    }

                                    // save template
                                    FileMetaData fmd = reportMetaData.getTemplate();
                                    if (fmd != null) {
                                        FileUtil.createFile(destinationPath + File.separator + fmd.getFileName(),
                                                fmd.getFileContent());
                                    }
                                }
                            } catch (Exception e) {
                                sbError.append(name).append(" : ").append(e.getMessage()).append("\n");
                            }
                            activator.updateProgress();
                        }

                    } else {
                        for (Object path : Collections.list(listModel.elements())) {
                            String serverPath = (String) path;
                            String name = getName(serverPath) + ChartUtil.CHART_FULL_EXTENSION;
                            try {
                                ChartMetaData chartMetaData = client.getChart(serverPath);
                                XStream xstream = XStreamFactory.createXStream();
                                Chart chart = (Chart) xstream
                                        .fromXML(new String(chartMetaData.getMainFile().getFileContent(), "UTF-8"));
                                ChartUtil.save(new File(destinationPath, name), chart);
                                sbInfo.append(name).append(" : ").append(I18NSupport.getString("downloaded"))
                                        .append("\n");
                            } catch (Exception e) {
                                sbError.append(name).append(" : ").append(e.getMessage()).append("\n");
                            }
                            activator.updateProgress();
                        }
                    }

                    if (sbError.length() > 0) {
                        Show.error(parent, sbInfo.toString() + "\n" + sbError.toString());
                    } else {
                        Show.info(parent, sbInfo.toString());
                    }

                } finally {
                    if (activator != null) {
                        activator.stop();
                        activator = null;
                    }
                }
            }
        }, "NEXT : " + getClass().getSimpleName());
        executorThread.start();
    }

    private String getName(String serverPath) {
        int separatorIndex = serverPath.lastIndexOf("/") + 1;
        if (separatorIndex == 0) {
            separatorIndex = serverPath.lastIndexOf("\\") + 1;
        }
        return serverPath.substring(separatorIndex);
    }

    private boolean overwriteBulk(JDialog parent, String message) {
        Object[] options = { I18NSupport.getString("report.util.yes"), I18NSupport.getString("report.util.no") };
        int option = JOptionPane.showOptionDialog(parent,
                message + "\n" + I18NSupport.getString("wizard.publish.entities.overwrite"),
                I18NSupport.getString("report.util.confirm"), JOptionPane.YES_NO_OPTION,
                JOptionPane.QUESTION_MESSAGE, null, options, options[1]);

        return (option == JOptionPane.YES_OPTION);
    }

}