/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
* Copyright (C) 2011-2012 Eugene Fradkin (eugene.fradkin@gmail.com)
*
* 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.ext.erd.navigator;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.IWizardContainer;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import org.jkiss.dbeaver.core.DBeaverCore;
import org.jkiss.dbeaver.core.DBeaverUI;
import org.jkiss.dbeaver.ext.erd.ERDMessages;
import org.jkiss.dbeaver.ext.erd.model.DiagramObjectCollector;
import org.jkiss.dbeaver.ext.erd.model.EntityDiagram;
import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode;
import org.jkiss.dbeaver.model.navigator.DBNNode;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress;
import org.jkiss.dbeaver.model.struct.DBSEntity;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.actions.navigator.NavigatorHandlerObjectOpen;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class DiagramCreateWizard extends Wizard implements INewWizard {
private IFolder folder;
private EntityDiagram diagram = new EntityDiagram(null, "");
private DiagramCreateWizardPage pageContent;
private String errorMessage;
public DiagramCreateWizard() {
}
@Override
public void init(IWorkbench workbench, IStructuredSelection selection) {
setWindowTitle(ERDMessages.wizard_diagram_create_title);
setNeedsProgressMonitor(true);
IFolder diagramFolder = null;
if (selection != null) {
Object element = selection.getFirstElement();
if (element != null) {
diagramFolder = Platform.getAdapterManager().getAdapter(element, IFolder.class);
}
}
if (diagramFolder == null) {
IProject activeProject = DBeaverCore.getInstance().getProjectRegistry().getActiveProject();
if (activeProject == null) {
errorMessage = "Can't create diagram without active project";
} else {
try {
diagramFolder = ERDResourceHandler.getDiagramsFolder(activeProject, true);
} catch (CoreException e) {
errorMessage = e.getMessage();
}
}
}
this.folder = diagramFolder;
}
@Override
public void addPages() {
super.addPages();
pageContent = new DiagramCreateWizardPage(diagram);
addPage(pageContent);
if (getContainer() != null) {
//WizardDialog call
pageContent.setErrorMessage(errorMessage);
}
}
@Override
public void setContainer(IWizardContainer wizardContainer) {
super.setContainer(wizardContainer);
if (pageContent != null) {
//New Wizard call
pageContent.setErrorMessage(errorMessage);
}
}
@Override
public boolean performFinish() {
try {
Collection<DBNNode> initialContent = pageContent.getInitialContent();
List<DBSObject> rootObjects = new ArrayList<>();
for (DBNNode node : initialContent) {
if (node instanceof DBNDatabaseNode) {
rootObjects.add(((DBNDatabaseNode) node).getObject());
}
}
DiagramCreator creator = new DiagramCreator(rootObjects);
DBeaverUI.run(getContainer(), true, true, creator);
NavigatorHandlerObjectOpen.openResource(creator.diagramFile, DBeaverUI.getActiveWorkbenchWindow());
}
catch (InterruptedException ex) {
return false;
}
catch (InvocationTargetException ex) {
UIUtils.showErrorDialog(
getShell(),
"Create error",
"Cannot create diagram",
ex.getTargetException());
return false;
}
return true;
}
private class DiagramCreator implements DBRRunnableWithProgress {
Collection<DBSObject> roots;
IFile diagramFile;
private DiagramCreator(Collection<DBSObject> roots)
{
this.roots = roots;
}
@Override
public void run(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException
{
try {
Collection<DBSEntity> tables = DiagramObjectCollector.collectTables(
monitor,
roots);
diagram.fillTables(monitor, tables, null);
diagramFile = ERDResourceHandler.createDiagram(diagram, diagram.getName(), folder, monitor);
} catch (Exception e) {
throw new InvocationTargetException(e);
}
}
}
}