/* * 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.wizimport; import ro.nextreports.engine.util.ReportUtil; import javax.swing.*; import java.awt.*; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.util.List; import java.util.Date; import java.util.Map; import java.util.HashMap; import java.util.ArrayList; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import ro.nextreports.designer.Globals; import ro.nextreports.designer.datasource.DataSource; import ro.nextreports.designer.datasource.DataSourceManager; import ro.nextreports.designer.datasource.DefaultDataSourceManager; import ro.nextreports.designer.datasource.SchemaManagerUtil; import ro.nextreports.designer.datasource.exception.NonUniqueException; import ro.nextreports.designer.persistence.FileReportPersistence; import ro.nextreports.designer.ui.HTMLDialog; 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.LicenseUtil; import ro.nextreports.designer.util.MergeProperties; import ro.nextreports.designer.util.Show; import ro.nextreports.designer.util.UIActivator; /** * Created by IntelliJ IDEA. * User: mihai.panaitescu * Date: 16-Mar-2009 * Time: 14:13:02 */ public class ImportPathSelectionWizardPanel extends WizardPanel { private SimpleDateFormat sdf = new SimpleDateFormat("dd_MM_yyyy_HH_mm_ss"); private JButton selButton; private JTextField nameTextField; private JCheckBox propCheck; private Dimension dim = new Dimension(200, 20); private Dimension buttonDim = new Dimension(20, 20); private String path; private static final Log LOG = LogFactory.getLog(ImportPathSelectionWizardPanel.class); public ImportPathSelectionWizardPanel() { super(); banner.setTitle(I18NSupport.getString("wizard.import.panel.start.select.title")); //banner.setSubtitle(I18NSupport.getString("wizard.panel.datasource.subtitle")); init(); } /** * Called when the panel is set. */ 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(java.util.List<String> messages) { boolean result = true; if (path == null) { messages.add(I18NSupport.getString("wizard.import.panel.start.select.title.error")); result = false; } String currentPath; try { currentPath = new File(Globals.USER_DATA_DIR).getCanonicalPath(); } catch (IOException e) { currentPath = Globals.USER_DATA_DIR; } if (currentPath.equals(path)) { messages.add(I18NSupport.getString("wizard.import.panel.start.select.title.error")); result = false; } else { String dataPath = path + File.separator + DefaultDataSourceManager.DATASOURCES_FILE; if (!new File(dataPath).exists()) { messages.add(I18NSupport.getString("wizard.import.panel.start.invalid.error")); result = false; } else { String version = DefaultDataSourceManager.getInstance().getVersion(dataPath); if (ReportUtil.isOlderUnsupportedVersion(version)) { messages.add(I18NSupport.getString("wizard.import.panel.start.invalid.version.error")); result = false; } } } return result; } /** * Handle finishing the wizard. */ public void onFinish() { Thread executorThread = new Thread(new Runnable() { public void run() { final List<String> sources = new ArrayList<String>(); final Map<String, List<String>> queries = new HashMap<String, List<String>>(); final Map<String, List<String>> reports = new HashMap<String, List<String>>(); final Map<String, List<String>> charts = new HashMap<String, List<String>>(); UIActivator activator = new UIActivator(Globals.getMainFrame(), I18NSupport.getString("import")); if (path != null) { activator.start(); String currentPath = Globals.USER_DATA_DIR; Map<String, String> newFolders = new HashMap<String, String>(); // override properties from next-reports.properties // do this first because we need tnsnames (if any) to connect to imported data sources if (propCheck.isSelected()) { String oldPropertiesPath = path + File.separator + "config" + File.separator + "next-reports.properties"; String newPropertiesPath = currentPath + File.separator + "config" + File.separator + "next-reports.properties"; MergeProperties mp = new MergeProperties(); File currentFile = new File(newPropertiesPath); mp.setFile(currentFile); mp.setImportFile(new File(oldPropertiesPath)); mp.setDestinationFile(currentFile); try { mp.execute(); } catch (Exception e) { e.printStackTrace(); } // must reset config to reload next-reports properties Globals.resetConfig(); // properties that are read from System.properties (must do a System.setProperty) Globals.setOracleClientPath(); } // see import data source String dataPath = path + File.separator + DefaultDataSourceManager.DATASOURCES_FILE; List<DataSource> list = DefaultDataSourceManager.getInstance().load(dataPath); String importVersion = DefaultDataSourceManager.getInstance().getVersion(dataPath); LOG.info("# Import files from version : " + importVersion); DataSourceManager manager = DefaultDataSourceManager.getInstance(); for (DataSource ds : list) { if (!LicenseUtil.allowToAddAnotherDataSource()) { return; } // to avoid data source with the same name if (manager.getDataSource(ds.getName()) != null) { String newName = ds.getName() + "_" + sdf.format(new Date()); newFolders.put(ds.getName(), newName); new File(currentPath + File.separator + FileReportPersistence.OUTPUT_DIR + File.separator + newName + File.separator + FileReportPersistence.QUERIES_FOLDER).mkdirs(); new File(currentPath + File.separator + FileReportPersistence.OUTPUT_DIR + File.separator + newName + File.separator + FileReportPersistence.REPORTS_FOLDER).mkdirs(); new File(currentPath + File.separator + FileReportPersistence.OUTPUT_DIR + File.separator + newName + File.separator + FileReportPersistence.CHARTS_FOLDER).mkdirs(); ds.setName(newName); } else { new File(currentPath + File.separator + FileReportPersistence.OUTPUT_DIR + File.separator + ds.getName() + File.separator + FileReportPersistence.QUERIES_FOLDER).mkdirs(); new File(currentPath + File.separator + FileReportPersistence.OUTPUT_DIR + File.separator + ds.getName() + File.separator + FileReportPersistence.REPORTS_FOLDER).mkdirs(); new File(currentPath + File.separator + FileReportPersistence.OUTPUT_DIR + File.separator + ds.getName() + File.separator + FileReportPersistence.CHARTS_FOLDER).mkdirs(); } try { sources.add(ds.getName()); queries.put(ds.getName(), new ArrayList<String>()); reports.put(ds.getName(), new ArrayList<String>()); charts.put(ds.getName(), new ArrayList<String>()); manager.addDataSource(ds); } catch (NonUniqueException e) { e.printStackTrace(); } Globals.getMainFrame().getQueryBuilderPanel().addDataSource(ds.getName()); boolean ok = SchemaManagerUtil.addDefaultSchemaAsVisible(ds); if (!ok) { LOG.warn("Could not add default schema for data source : " + ds.getName()); } } manager.save(); // copy all output files (.query and .report) File file = new File(path + File.separator + FileReportPersistence.OUTPUT_DIR); // all data sources folders List<File> files = FileUtil.listFiles(file, null, false); for (File f : files) { LOG.info("# Copy data source : " + f.getAbsolutePath()); String name = f.getName(); if (name.equals(FileReportPersistence.OUTPUT_DIR)) { continue; } String dsName; if (newFolders.containsKey(name)) { dsName = newFolders.get(name); } else { dsName = name; } File dest = new File(currentPath + File.separator + FileReportPersistence.OUTPUT_DIR + File.separator + dsName); File qFolder = new File(dest.getAbsolutePath() + File.separator + FileReportPersistence.QUERIES_FOLDER); File rFolder = new File(dest.getAbsolutePath() + File.separator + FileReportPersistence.REPORTS_FOLDER); File cFolder = new File(dest.getAbsolutePath() + File.separator + FileReportPersistence.CHARTS_FOLDER); dest.mkdirs(); qFolder.mkdirs(); rFolder.mkdirs(); cFolder.mkdirs(); try { // no QUERIES and REPORTS folders in data sources folders for versions 2.0 and 2.1 if (importVersion.equals("2.0") || importVersion.equals("2.1")) { List<File> all = FileUtil.listFiles(f, null, false); for (File aFile : all) { String fileName = aFile.getName(); if (fileName.endsWith(".query")) { FileUtil.copy(aFile, new File(qFolder.getAbsolutePath() + File.separator + fileName)); LOG.info("# Copy query : " + aFile.getAbsolutePath()); if (queries.get(dsName) == null) { queries.put(dsName, new ArrayList<String>()); } queries.get(dsName).add(fileName); } else if (fileName.endsWith(".report")) { FileUtil.copy(aFile, new File(rFolder.getAbsolutePath() + File.separator + fileName)); LOG.info("# Copy report : " + aFile.getAbsolutePath()); if (reports.get(dsName) == null) { reports.put(dsName, new ArrayList<String>()); } reports.get(dsName).add(fileName); } } } else { FileUtil.copyDirToDir(f, dest); LOG.info("# Copy all files from : " + f.getAbsolutePath()); List<File> all = FileUtil.listFiles(f, null, true); for (File aFile : all) { String fileName = aFile.getName(); if (fileName.endsWith(".query")) { if (queries.get(dsName) == null) { queries.put(dsName, new ArrayList<String>()); } queries.get(dsName).add(fileName); } else if (fileName.endsWith(".report")) { if (reports.get(dsName) == null) { reports.put(dsName, new ArrayList<String>()); } reports.get(dsName).add(fileName); } else if (fileName.endsWith(".chart")) { if (charts.get(dsName) == null) { charts.put(dsName, new ArrayList<String>()); } charts.get(dsName).add(fileName); } } } } catch (IOException e) { e.printStackTrace(); } } } if (activator != null) { activator.stop(); } SwingUtilities.invokeLater(new Runnable() { public void run() { HTMLDialog dialog = new HTMLDialog(Globals.getMainFrame(), I18NSupport.getString("import.files"), getStatistics(sources, queries, reports, charts)); Show.centrateComponent(Globals.getMainFrame(), dialog); dialog.setVisible(true); } }); } }, "NEXT : " + getClass().getSimpleName()); executorThread.start(); } private String getStatistics(List<String> sources, Map<String, List<String>> queries, Map<String, List<String>> reports, Map<String, List<String>> charts) { StringBuilder sb = new StringBuilder("<HTML><ul>"); for (String s : sources) { sb.append("<li><b>").append(s).append("</b>"); List<String> qNames = queries.get(s); if (qNames.size() > 0) { sb.append("<br><b>"); sb.append(I18NSupport.getString("node.queries")); sb.append("<br></b>"); for (String q : qNames) { sb.append(" - "); sb.append(q); sb.append("<br>"); } } List<String> rNames = reports.get(s); if (rNames.size() > 0) { sb.append("<br><b>"); sb.append(I18NSupport.getString("node.reports")); sb.append("<br></b>"); for (String r : rNames) { sb.append(" - "); sb.append(r); sb.append("<br>"); } } List<String> cNames = charts.get(s); if (cNames.size() > 0) { sb.append("<br><b>"); sb.append(I18NSupport.getString("node.charts")); sb.append("<br></b>"); for (String c : cNames) { sb.append(" - "); sb.append(c); sb.append("<br>"); } } sb.append("<br>"); } sb.append("</ul></HTML>"); return sb.toString(); } private void init() { setLayout(new BorderLayout()); nameTextField = new JTextField(); nameTextField.setPreferredSize(dim); nameTextField.setEditable(false); propCheck = new JCheckBox(I18NSupport.getString("wizard.import.panel.start.select.title.prop"), true); selButton = new JButton(); selButton.setPreferredSize(buttonDim); selButton.setMaximumSize(buttonDim); selButton.setMinimumSize(buttonDim); selButton.setIcon(ImageUtil.getImageIcon("folder")); selButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JFileChooser fc = new JFileChooser(); fc.setDialogTitle(I18NSupport.getString("import.long.desc")); fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); int returnVal = fc.showSaveDialog((JDialog) context.getAttribute(ImportWizard.MAIN_FRAME)); if (returnVal == JFileChooser.APPROVE_OPTION) { File f = fc.getSelectedFile(); if (f != null) { nameTextField.setText(f.getName()); path = f.getAbsolutePath(); } } } }); JPanel dsPanel = new JPanel(new GridBagLayout()); dsPanel.add(new JLabel(I18NSupport.getString("wizard.import.panel.start.select.title.label")), new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 0), 0, 0)); dsPanel.add(nameTextField, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 0), 0, 0)); dsPanel.add(selButton, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); dsPanel.add(propCheck, new GridBagConstraints(0, 1, 3, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); dsPanel.add(new JLabel(""), new GridBagConstraints(3, 1, 1, 2, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0)); add(dsPanel, BorderLayout.CENTER); } }