/* * 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.model.navigator; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.CoreException; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBIcon; import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry; import org.jkiss.dbeaver.model.DBPImage; import org.jkiss.dbeaver.model.app.DBPResourceHandler; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; import org.jkiss.utils.ArrayUtils; import java.util.ArrayList; import java.util.List; /** * DBNProject */ public class DBNProject extends DBNResource { private static final Log log = Log.getLog(DBNProject.class); public DBNProject(DBNNode parentNode, IProject project, DBPResourceHandler handler) { super(parentNode, project, handler); getModel().getPlatform().getProjectManager().addProject(project); } @Override protected void dispose(boolean reflect) { IProject project = getProject(); super.dispose(reflect); getModel().getPlatform().getProjectManager().removeProject(project); } public IProject getProject() { return (IProject)getResource(); } public DBNProjectDatabases getDatabases() { try { for (DBNNode db : getChildren(new VoidProgressMonitor())) { if (db instanceof DBNProjectDatabases) { return (DBNProjectDatabases) db; } } } catch (DBException e) { throw new IllegalStateException("Can't read project contents", e); } throw new IllegalStateException("No databases resource in project"); } @Override public String getNodeDescription() { try { final IProject project = getProject(); return project == null ? null : project.getDescription().getComment(); } catch (CoreException e) { log.debug(e); return null; } } @Override public DBPImage getNodeIcon() { return DBIcon.PROJECT; } @Override public boolean allowsOpen() { return true; } @Override public <T> T getAdapter(Class<T> adapter) { if (adapter == DBNProject.class) { return adapter.cast(this); } return super.getAdapter(adapter); } @Override public boolean supportsRename() { // Do not rename active projects return getModel().getPlatform().getProjectManager().getActiveProject() != getProject(); } @Override public void rename(DBRProgressMonitor monitor, String newName) throws DBException { try { final IProjectDescription description = getProject().getDescription(); description.setName(newName); getProject().move(description, true, monitor.getNestedMonitor()); } catch (CoreException e) { throw new DBException("Can't rename project", e); } } @Override protected DBNNode[] readChildNodes(DBRProgressMonitor monitor) throws DBException { IProject project = getProject(); if (!project.isOpen()) { try { project.open(monitor.getNestedMonitor()); project.refreshLocal(IFile.DEPTH_ONE, monitor.getNestedMonitor()); } catch (CoreException e) { throw new DBException("Can't open project '" + project.getName() + "'", e); } } DBPDataSourceRegistry dataSourceRegistry = getModel().getPlatform().getProjectManager().getDataSourceRegistry(project); DBNNode[] children = super.readChildNodes(monitor); if (dataSourceRegistry != null) { children = ArrayUtils.insertArea(DBNNode.class, children, 0, new Object[] {new DBNProjectDatabases(this, dataSourceRegistry)}); } return children; } public DBNResource findResource(IResource resource) { List<IResource> path = new ArrayList<>(); for (IResource parent = resource; !(parent instanceof IProject); parent = parent.getParent()) { path.add(0, parent); } DBNResource resNode = this; for (IResource res : path) { try { resNode.getChildren(new VoidProgressMonitor()); } catch (DBException e) { log.error(e); } resNode = resNode.getChild(res); if (resNode == null) { return null; } } return resNode; } @Override protected void handleChildResourceChange(IResourceDelta delta) { final String name = delta.getResource().getName(); if (name.startsWith(DBPDataSourceRegistry.CONFIG_FILE_PREFIX) && name.endsWith(DBPDataSourceRegistry.CONFIG_FILE_EXT)) { // DS registry configuration changed getDatabases().getDataSourceRegistry().refreshConfig(); } else { super.handleChildResourceChange(delta); } } public void openProject() { final DBNProjectDatabases databases = getDatabases(); if (databases != null) { databases.getDataSourceRegistry().refreshConfig(); } } }