/* * 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.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.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.core.DBeaverCore; import org.jkiss.dbeaver.core.DBeaverUI; import org.jkiss.dbeaver.ext.erd.editor.ERDEditorInput; import org.jkiss.dbeaver.ext.erd.editor.ERDEditorStandalone; import org.jkiss.dbeaver.ext.erd.model.DiagramLoader; import org.jkiss.dbeaver.ext.erd.model.EntityDiagram; import org.jkiss.dbeaver.model.navigator.DBNNode; import org.jkiss.dbeaver.model.navigator.DBNResource; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress; import org.jkiss.dbeaver.ui.resources.AbstractResourceHandler; import org.jkiss.dbeaver.utils.ContentUtils; import org.jkiss.dbeaver.utils.RuntimeUtils; import org.jkiss.utils.CommonUtils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; /** * Bookmarks handler */ public class ERDResourceHandler extends AbstractResourceHandler { private static final String ERD_EXT = "erd"; //$NON-NLS-1$ public static IFolder getDiagramsFolder(IProject project, boolean forceCreate) throws CoreException { return DBeaverCore.getInstance().getProjectRegistry().getResourceDefaultRoot(project, ERDResourceHandler.class, forceCreate); } @Override public int getFeatures(IResource resource) { if (resource instanceof IFolder) { if (resource.getParent() instanceof IFolder) { return FEATURE_DELETE | FEATURE_RENAME | FEATURE_CREATE_FOLDER | FEATURE_MOVE_INTO; } return FEATURE_CREATE_FOLDER | FEATURE_MOVE_INTO; } else { return FEATURE_OPEN | FEATURE_DELETE | FEATURE_RENAME; } } @NotNull @Override public String getTypeName(@NotNull IResource resource) { if (resource instanceof IFolder) { return "diagram folder"; } else { return "diagram"; } } @NotNull @Override public String getResourceNodeName(@NotNull IResource resource) { if (resource.getParent() instanceof IProject && resource.equals(getDefaultRoot(resource.getProject()))) { return "ER Diagrams"; } else { return super.getResourceNodeName(resource); } } @NotNull @Override public DBNResource makeNavigatorNode(@NotNull DBNNode parentNode, @NotNull IResource resource) throws CoreException, DBException { if (resource instanceof IFile) { return new DBNDiagram(parentNode, resource, this); } else { return new DBNDiagramFolder(parentNode, resource, this); } } @Override public void openResource(@NotNull final IResource resource) throws CoreException, DBException { if (!(resource instanceof IFile)) { return; } ERDEditorInput erdInput = new ERDEditorInput((IFile)resource); DBeaverUI.getActiveWorkbenchWindow().getActivePage().openEditor( erdInput, ERDEditorStandalone.class.getName()); } public static IFile createDiagram( final EntityDiagram copyFrom, final String title, IFolder folder, DBRProgressMonitor monitor) throws DBException { if (folder == null) { try { folder = getDiagramsFolder(DBeaverCore.getInstance().getProjectRegistry().getActiveProject(), true); } catch (CoreException e) { throw new DBException("Can't obtain folder for diagram", e); } } if (folder == null) { throw new DBException("Can't detect folder for diagram"); } final IFile file = ContentUtils.getUniqueFile(folder, CommonUtils.escapeFileName(title), ERD_EXT); try { DBRRunnableWithProgress runnable = new DBRRunnableWithProgress() { @Override public void run(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException { try { EntityDiagram newDiagram = copyFrom == null ? new EntityDiagram(null, "<Diagram>") : copyFrom.copy(); newDiagram.setName(title); newDiagram.setLayoutManualAllowed(true); newDiagram.setLayoutManualDesired(true); ByteArrayOutputStream buffer = new ByteArrayOutputStream(); DiagramLoader.save(monitor, null, newDiagram, false, buffer); InputStream data = new ByteArrayInputStream(buffer.toByteArray()); file.create(data, true, RuntimeUtils.getNestedMonitor(monitor)); } catch (Exception e) { throw new InvocationTargetException(e); } } }; if (monitor == null) { DBeaverUI.runInProgressService(runnable); } else { runnable.run(monitor); } } catch (InvocationTargetException e) { throw new DBException("Error creating diagram", e.getTargetException()); } catch (InterruptedException e) { // interrupted } return file; } }