/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
*
* Licensed 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 org.jkiss.dbeaver.tools.compare;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.ui.IExportWizard;
import org.eclipse.ui.IWorkbench;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.core.DBeaverUI;
import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.utils.CommonUtils;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
public class CompareObjectsWizard extends Wizard implements IExportWizard {
private static final Log log = Log.getLog(CompareObjectsWizard.class);
private static final String RS_COMPARE_WIZARD_DIALOG_SETTINGS = "CompareWizard";//$NON-NLS-1$
private CompareObjectsSettings settings;
public CompareObjectsWizard(List<DBNDatabaseNode> nodes)
{
this.settings = new CompareObjectsSettings(nodes);
IDialogSettings section = UIUtils.getDialogSettings(RS_COMPARE_WIZARD_DIALOG_SETTINGS);
setDialogSettings(section);
settings.loadFrom(section);
}
@Override
public void dispose()
{
super.dispose();
}
public CompareObjectsSettings getSettings()
{
return settings;
}
@Override
public void addPages()
{
super.addPages();
addPage(new CompareObjectsPageSettings());
addPage(new CompareObjectsPageOutput());
}
@Override
public void init(IWorkbench workbench, IStructuredSelection currentSelection)
{
setWindowTitle("Compare objects");
setNeedsProgressMonitor(true);
}
private void showError(String error)
{
((WizardPage)getContainer().getCurrentPage()).setErrorMessage(error);
}
@Override
public boolean performFinish()
{
// Save settings
getSettings().saveTo(getDialogSettings());
showError(null);
// Compare
final CompareObjectsExecutor executor = new CompareObjectsExecutor(settings);
try {
DBeaverUI.run(getContainer(), true, true, new DBRRunnableWithProgress() {
@Override
public void run(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
try {
CompareReport report = generateReport(monitor, executor);
renderReport(monitor, report);
} catch (DBException e) {
throw new InvocationTargetException(e);
}
}
});
UIUtils.showMessageBox(getShell(), "Objects compare", "Objects compare finished", SWT.ICON_INFORMATION);
} catch (InvocationTargetException e) {
if (executor.getInitializeError() != null) {
showError(executor.getInitializeError().getMessage());
} else {
log.error(e.getTargetException());
showError(e.getTargetException().getMessage());
}
return false;
} catch (InterruptedException e) {
showError("Compare interrupted");
return false;
} finally {
executor.dispose();
}
// Done
return true;
}
private CompareReport generateReport(DBRProgressMonitor monitor, CompareObjectsExecutor executor) throws DBException, InterruptedException
{
monitor.beginTask("Compare objects", 1000);
CompareReport report = executor.compareObjects(monitor, getSettings().getNodes());
monitor.done();
return report;
}
private void renderReport(DBRProgressMonitor monitor, CompareReport report)
{
try {
File reportFile;
switch (settings.getOutputType()) {
case BROWSER:
reportFile = File.createTempFile("compare-report", ".html");
break;
default:
{
StringBuilder fileName = new StringBuilder("compare");//"compare-report.html";
for (DBNDatabaseNode node : report.getNodes()) {
fileName.append("-").append(CommonUtils.escapeIdentifier(node.getName()));
}
fileName.append("-report.html");
reportFile = new File(settings.getOutputFolder(), fileName.toString());
break;
}
}
reportFile.deleteOnExit();
try (OutputStream outputStream = new FileOutputStream(reportFile)) {
monitor.beginTask("Render report", report.getReportLines().size());
CompareReportRenderer reportRenderer = new CompareReportRenderer();
reportRenderer.renderReport(monitor, report, getSettings(), outputStream);
monitor.done();
}
UIUtils.launchProgram(reportFile.getAbsolutePath());
} catch (IOException e) {
showError(e.getMessage());
log.error(e);
}
}
}