/* * 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; } }