ro.nextreports.designer.NextReportsServerRequest.java Source code

Java tutorial

Introduction

Here is the source code for ro.nextreports.designer.NextReportsServerRequest.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;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;

import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import ro.nextreports.designer.action.datasource.DataSourceConnectAction;
import ro.nextreports.designer.chart.ChartUtil;
import ro.nextreports.designer.datasource.DataSource;
import ro.nextreports.designer.datasource.DefaultDataSourceManager;
import ro.nextreports.designer.datasource.exception.NonUniqueException;
import ro.nextreports.designer.persistence.FileReportPersistence;
import ro.nextreports.designer.querybuilder.DBBrowserTree;
import ro.nextreports.designer.querybuilder.DBObject;
import ro.nextreports.designer.ui.wizard.Wizard;
import ro.nextreports.designer.ui.wizard.WizardListener;
import ro.nextreports.designer.util.FileUtil;
import ro.nextreports.designer.util.I18NSupport;
import ro.nextreports.designer.wizpublish.PublishLoginWizardPanel;
import ro.nextreports.designer.wizpublish.PublishWizard;

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.DataSourceMetaData;
import ro.nextreports.server.api.client.FileMetaData;
import ro.nextreports.server.api.client.ReportMetaData;
import ro.nextreports.server.api.client.WebServiceException;
import com.thoughtworks.xstream.XStream;

/**
 * @author Mihai Dinca-Panaitescu
 */
public class NextReportsServerRequest implements WizardListener {

    private static final Log LOG = LogFactory.getLog(NextReportsServerRequest.class);
    private JDialog dialog;
    private PublishLoginWizardPanel loginPanel;

    public NextReportsServerRequest() {

        try {
            SwingUtilities.invokeLater(new Runnable() {

                @Override
                public void run() {
                    String message = I18NSupport.getString("download");
                    dialog = new JDialog(Globals.getMainFrame(), message, true);

                    loginPanel = new PublishLoginWizardPanel(null) {
                        public boolean hasNext() {
                            return false;
                        }

                        public boolean canFinish() {
                            return true;
                        }

                        public boolean validateFinish(java.util.List<String> messages) {
                            boolean ok = validateNext(messages);
                            return ok;
                        }
                    };

                    Wizard wizard = new Wizard(loginPanel);
                    wizard.getContext().setAttribute(PublishWizard.MAIN_FRAME, dialog);
                    wizard.addWizardListener(NextReportsServerRequest.this);

                    dialog.setContentPane(wizard);
                    dialog.setSize(400, 340);
                    dialog.setLocationRelativeTo(null);
                    dialog.addWindowListener(new WindowAdapter() {
                        public void windowClosing(WindowEvent e) {
                            super.windowClosing(e);
                        }
                    });
                    dialog.setVisible(true);

                }

            });
        } catch (Exception e) {
            e.printStackTrace();
            LOG.error(e.getMessage(), e);
        }

    }

    // After server request (open report / chart from Edit action on server)
    //   save data source
    //   connect to data source
    //   download report / chart
    //   open report/ chart
    public void wizardFinished(Wizard wizard) {
        dialog.dispose();

        try {
            ReportMetaData _rmd = null;
            ChartMetaData _cmd = null;
            DataSourceMetaData dsmd = null;
            final boolean isReport = Globals.getServerPath().contains("reports");
            if (isReport) {
                _rmd = loginPanel.getClient().getReport(Globals.getServerPath());
                dsmd = loginPanel.getClient().getDataSource(_rmd.getDataSourcePath());
            } else {
                _cmd = loginPanel.getClient().getChart(Globals.getServerPath());
                dsmd = loginPanel.getClient().getDataSource(_cmd.getDataSourcePath());
            }
            final ReportMetaData rmd = _rmd;
            final ChartMetaData cmd = _cmd;

            Globals.setWebService(loginPanel.getClient());
            Globals.setServerReportMetaData(rmd);
            Globals.setServerChartMetaData(cmd);
            Globals.setServerDSMetaData(dsmd);
            String dsName;
            if (isReport) {
                dsName = getName(rmd.getDataSourcePath());
            } else {
                dsName = getName(cmd.getDataSourcePath());
            }
            String serverIp = getServerIp(Globals.getServerUrl());

            // create a data source with name: dsName@serverIp
            DataSource ds = new DataSource();
            ds.setName(dsName + "@" + serverIp);
            ds.setDriver(dsmd.getDriver());
            ds.setUser(dsmd.getUsername() == null ? "" : dsmd.getUsername());
            ds.setPassword(dsmd.getPassword() == null ? "" : dsmd.getPassword());
            ds.setUrl(dsmd.getUrl());
            ds.setType(dsmd.getVendor());
            ds.setProperties(dsmd.getProperties());

            try {
                DefaultDataSourceManager.getInstance().addDataSource(ds);
                DefaultDataSourceManager.getInstance().save();

                // User interface            
                Globals.getMainFrame().getQueryBuilderPanel().addDataSource(ds.getName());

            } catch (NonUniqueException e) {
                // data source found, use this 
                // @todo may not be correct if we have two data sources with the same name (in different folder) on the server
                LOG.info("Edit from server: data source '" + ds.getName() + "' exists.");
            }

            final String baseName = getName(Globals.getServerPath());
            String _name = null;
            if (isReport) {
                _name = baseName + FormSaver.REPORT_FULL_EXTENSION;
            } else {
                _name = baseName + ChartUtil.CHART_FULL_EXTENSION;
            }
            final String name = _name;
            final DBBrowserTree tree = Globals.getMainFrame().getQueryBuilderPanel().getTree();
            tree.selectNode(ds.getName(), DBObject.DATABASE);
            DataSourceConnectAction ca = new DataSourceConnectAction(tree, tree.getSelectionPath()) {

                // NON-EDT
                protected void afterJob() {
                    // save report           
                    XStream xstream = XStreamFactory.createXStream();
                    Report report = null;
                    Chart chart = null;
                    String destinationPath = null;
                    String type = null;
                    try {
                        if (isReport) {
                            report = (Report) xstream
                                    .fromXML(new String(rmd.getMainFile().getFileContent(), "UTF-8"));
                            destinationPath = FileReportPersistence.getReportsAbsolutePath();
                            type = I18NSupport.getString("report");
                        } else {
                            chart = (Chart) xstream
                                    .fromXML(new String(cmd.getMainFile().getFileContent(), "UTF-8"));
                            destinationPath = FileReportPersistence.getChartsAbsolutePath();
                            type = I18NSupport.getString("chart");
                        }
                    } catch (UnsupportedEncodingException ex) {
                        ex.printStackTrace();
                        LOG.error(ex.getMessage(), ex);
                    }
                    new File(destinationPath).mkdirs();
                    File entityFile = new File(destinationPath, name);
                    boolean overwrite = false;
                    if (entityFile.exists()) {
                        int option = JOptionPane.showConfirmDialog(Globals.getMainFrame(),
                                I18NSupport.getString("save.entity.exists", type, name), "",
                                JOptionPane.YES_NO_OPTION);
                        if (option == JOptionPane.YES_OPTION) {
                            overwrite = true;
                        }
                    } else {
                        overwrite = true;
                    }
                    if (overwrite) {
                        if (isReport) {
                            boolean ok = FormSaver.getInstance().save(entityFile, report);
                            if (ok) {
                                // save images
                                List<FileMetaData> list = rmd.getImages();
                                if (list != null) {
                                    for (FileMetaData image : list) {
                                        try {
                                            FileUtil.createFile(
                                                    destinationPath + File.separator + image.getFileName(),
                                                    image.getFileContent());
                                        } catch (IOException e) {
                                            // TODO Auto-generated catch block
                                            e.printStackTrace();
                                            LOG.error(e.getMessage(), e);
                                        }
                                    }
                                }

                                // save template
                                FileMetaData fmd = rmd.getTemplate();
                                if (fmd != null) {
                                    try {
                                        FileUtil.createFile(destinationPath + File.separator + fmd.getFileName(),
                                                fmd.getFileContent());
                                    } catch (IOException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                        LOG.error(e.getMessage(), e);
                                    }
                                }
                            }
                        } else {
                            boolean ok = ChartUtil.save(entityFile, chart);
                        }
                    }
                }

                // EDT
                protected void afterCreate() {
                    if (isReport) {
                        Globals.getMainFrame().openSystemReport(tree, baseName);
                    } else {
                        Globals.getMainFrame().openSystemChart(tree, baseName);
                    }
                }
            };
            ca.actionPerformed(null);

        } catch (WebServiceException e) {
            e.printStackTrace();
            LOG.error(e.getMessage(), e);
        }
    }

    public void wizardCancelled(Wizard wizard) {
        Globals.resetServerFile();
        dialog.dispose();
    }

    @Override
    public void wizardPanelChanged(Wizard wizard) {
    }

    private String getName(String path) {
        int lastPathSeparatorIndex = path.lastIndexOf("/");
        if (lastPathSeparatorIndex == -1) {
            return null;
        }
        return path.substring(lastPathSeparatorIndex + 1);
    }

    private String getServerIp(String url) {
        String protocol = "http://";
        int index = url.indexOf(protocol);
        if (index == -1) {
            protocol = "https://";
            index = url.indexOf(protocol);
            if (index == -1) {
                return "";
            }
        }
        String s = url.substring(index + protocol.length());
        index = s.indexOf(":");
        if (index != -1) {
            return s.substring(0, index);
        } else {
            index = s.indexOf("/");
            if (index != -1) {
                return s.substring(0, index);
            }
        }
        return s;
    }

}