/*
* 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.ui.editors;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IPersistableElement;
import org.eclipse.ui.model.IWorkbenchAdapter;
import org.eclipse.ui.model.WorkbenchAdapter;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBeaverPreferences;
import org.jkiss.dbeaver.core.DBeaverCore;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.preferences.DBPPropertySource;
import org.jkiss.dbeaver.model.IDataSourceContainerProvider;
import org.jkiss.dbeaver.model.edit.DBECommandContext;
import org.jkiss.dbeaver.model.exec.DBCExecutionContext;
import org.jkiss.dbeaver.model.navigator.DBNDataSource;
import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.ui.DBeaverIcons;
import org.jkiss.dbeaver.ui.SimpleCommandContext;
import org.jkiss.dbeaver.runtime.properties.PropertySourceEditable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* DatabaseEditorInput
*/
public abstract class DatabaseEditorInput<NODE extends DBNDatabaseNode> implements IPersistableElement, IDatabaseEditorInput, IDataSourceContainerProvider
{
private final NODE node;
private final DBCExecutionContext executionContext;
private final DBECommandContext commandContext;
private String defaultPageId;
private String defaultFolderId;
private Map<String, Object> attributes = new LinkedHashMap<>();
protected DatabaseEditorInput(@Nullable NODE node)
{
this(node, null);
}
protected DatabaseEditorInput(@Nullable NODE node, @Nullable DBECommandContext commandContext)
{
this.node = node;
DBPDataSource dataSource = node == null ? null : node.getDataSource();
if (dataSource != null) {
this.executionContext = dataSource.getDefaultContext(false);
this.commandContext = commandContext != null ?
commandContext :
new SimpleCommandContext(
this.executionContext,
false);
} else {
this.executionContext = null;
this.commandContext = null;
}
}
@Override
public boolean exists()
{
return false;
}
@Override
public ImageDescriptor getImageDescriptor()
{
return DBeaverIcons.getImageDescriptor(node.getNodeIconDefault());
}
@Override
public String getName()
{
if (DBeaverCore.getGlobalPreferenceStore().getBoolean(DBeaverPreferences.NAVIGATOR_EDITOR_FULL_NAME)) {
return node.getNodeFullName();
} else {
return node.getName();
}
}
@Override
public IPersistableElement getPersistable()
{
if (getExecutionContext() == null ||
getDatabaseObject() == null ||
!getDatabaseObject().isPersisted() ||
!DBeaverCore.getGlobalPreferenceStore().getBoolean(DBeaverPreferences.UI_KEEP_DATABASE_EDITORS))
{
return null;
}
return this;
}
@Override
public String getToolTipText()
{
return node.getNodeDescription();
}
@Override
public <T> T getAdapter(Class<T> adapter)
{
if (IWorkbenchAdapter.class.equals(adapter)) {
return adapter.cast(new WorkbenchAdapter() {
@Override
public ImageDescriptor getImageDescriptor(Object object) {
return DBeaverIcons.getImageDescriptor(node.getNodeIconDefault());
}
@Override
public String getLabel(Object o) {
return node.getName();
}
@Override
public Object getParent(Object o) {
return node.getParentNode();
}
});
}
return null;
}
@Override
public DBPDataSourceContainer getDataSourceContainer()
{
if (executionContext != null) {
return executionContext.getDataSource().getContainer();
} else if (node instanceof DBNDataSource) {
return node.getDataSourceContainer();
} else {
return null;
}
}
@Override
public DBCExecutionContext getExecutionContext() {
return executionContext;
}
@Override
public NODE getNavigatorNode()
{
return node;
}
@Override
public DBSObject getDatabaseObject()
{
return node.getObject();
}
@Override
public String getDefaultPageId()
{
return defaultPageId;
}
@Override
public String getDefaultFolderId()
{
return defaultFolderId;
}
@Nullable
@Override
public DBECommandContext getCommandContext()
{
return commandContext;
}
public void setDefaultPageId(String defaultPageId)
{
this.defaultPageId = defaultPageId;
}
public void setDefaultFolderId(String defaultFolderId)
{
this.defaultFolderId = defaultFolderId;
}
@Override
public Collection<String> getAttributeNames() {
return new ArrayList<>(attributes.keySet());
}
@Override
public Object getAttribute(String name) {
return attributes.get(name);
}
@Override
public Object setAttribute(String name, Object value) {
if (value == null) {
return attributes.remove(name);
} else {
return attributes.put(name, value);
}
}
@Override
public DBPPropertySource getPropertySource()
{
PropertySourceEditable propertySource = new PropertySourceEditable(
getCommandContext(),
getNavigatorNode(),
getDatabaseObject());
propertySource.collectProperties();
return propertySource;
}
@Override
public boolean equals(Object obj)
{
return obj == this ||
(obj instanceof DatabaseEditorInput && ((DatabaseEditorInput<?>)obj).node.equals(node));
}
@Override
public String getFactoryId()
{
return DatabaseEditorInputFactory.ID_FACTORY;
}
@Override
public void saveState(IMemento memento)
{
DatabaseEditorInputFactory.saveState(memento, this);
}
}