提交 f4244608 编写于 作者: S Serge Rider

Object creation refactoring (use monitor)


Former-commit-id: a36276d8
上级 6931d842
......@@ -263,7 +263,7 @@ public abstract class NavigatorHandlerObjectBase extends AbstractHandler {
}
@Override
public void run(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException
public void run(DBRProgressMonitor monitor) throws InvocationTargetException
{
try {
commander.saveChanges(monitor);
......
......@@ -18,26 +18,30 @@
package org.jkiss.dbeaver.ui.actions.navigator;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWorkbenchWindow;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.core.DBeaverCore;
import org.jkiss.dbeaver.core.DBeaverUI;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.ui.editors.IDatabaseEditor;
import org.jkiss.dbeaver.model.edit.DBEObjectMaker;
import org.jkiss.dbeaver.model.edit.DBEObjectManager;
import org.jkiss.dbeaver.model.navigator.DBNContainer;
import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode;
import org.jkiss.dbeaver.model.navigator.DBNNode;
import org.jkiss.dbeaver.model.runtime.AbstractJob;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.registry.editor.EntityEditorsRegistry;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.editors.IDatabaseEditor;
import org.jkiss.dbeaver.ui.editors.entity.EntityEditor;
import org.jkiss.dbeaver.ui.editors.entity.EntityEditorInput;
import org.jkiss.dbeaver.ui.navigator.database.DatabaseNavigatorView;
import java.lang.reflect.InvocationTargetException;
import org.jkiss.dbeaver.utils.GeneralUtils;
public abstract class NavigatorHandlerObjectCreateBase extends NavigatorHandlerObjectBase {
......@@ -83,57 +87,102 @@ public abstract class NavigatorHandlerObjectCreateBase extends NavigatorHandlerO
openEditor);
final Object parentObject = container.getValueObject();
DBSObject result = objectMaker.createNewObject(VoidProgressMonitor.INSTANCE, commandTarget.getContext(), parentObject, sourceObject);
if (result == null) {
return true;
}
createDatabaseObject(commandTarget, objectMaker, parentObject, sourceObject);
}
catch (Throwable e) {
UIUtils.showErrorDialog(workbenchWindow.getShell(), "Create object", null, e);
return false;
}
if ((objectMaker.getMakerOptions() & DBEObjectMaker.FEATURE_SAVE_IMMEDIATELY) != 0) {
// Save object manager's content
ObjectSaver objectSaver = new ObjectSaver(commandTarget.getContext());
DBeaverUI.runInProgressService(objectSaver);
}
return true;
}
final DBNNode newChild = DBeaverCore.getInstance().getNavigatorModel().findNode(result);
if (newChild != null) {
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run()
{
DatabaseNavigatorView view = UIUtils.findView(workbenchWindow, DatabaseNavigatorView.class);
if (view != null) {
view.showNode(newChild);
private <OBJECT_TYPE extends DBSObject, CONTAINER_TYPE> void createDatabaseObject(
CommandTarget commandTarget,
DBEObjectMaker<OBJECT_TYPE, CONTAINER_TYPE> objectMaker,
CONTAINER_TYPE parentObject,
DBSObject sourceObject) throws DBException
{
final CreateJob<OBJECT_TYPE, CONTAINER_TYPE> job = new CreateJob<>(commandTarget, objectMaker, parentObject, sourceObject);
job.addJobChangeListener(new JobChangeAdapter() {
@Override
public void done(IJobChangeEvent event) {
if (event.getResult().isOK() && job.newObject != null) {
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
job.showNewObject();
}
}
});
IDatabaseEditor editor = commandTarget.getEditor();
if (editor != null) {
// Just activate existing editor
workbenchWindow.getActivePage().activate(editor);
} else if (openEditor && newChild instanceof DBNDatabaseNode) {
// Open new one with existing context
EntityEditorInput editorInput = new EntityEditorInput(
(DBNDatabaseNode) newChild,
commandTarget.getContext());
workbenchWindow.getActivePage().openEditor(
editorInput,
EntityEditor.class.getName());
});
}
} else {
throw new DBException("Can't find node corresponding to new object");
}
} catch (InterruptedException e) {
// do nothing
});
job.schedule();
}
static class CreateJob<OBJECT_TYPE extends DBSObject, CONTAINER_TYPE> extends AbstractJob {
private final CommandTarget commandTarget;
private final DBEObjectMaker<OBJECT_TYPE, CONTAINER_TYPE> objectMaker;
private final CONTAINER_TYPE parentObject;
private final DBSObject sourceObject;
private OBJECT_TYPE newObject;
public CreateJob(CommandTarget commandTarget, DBEObjectMaker<OBJECT_TYPE, CONTAINER_TYPE> objectMaker, CONTAINER_TYPE parentObject, DBSObject sourceObject) {
super("Create new database object with " + objectMaker);
this.commandTarget = commandTarget;
this.objectMaker = objectMaker;
this.parentObject = parentObject;
this.sourceObject = sourceObject;
}
catch (Throwable e) {
if (e instanceof InvocationTargetException) {
e = ((InvocationTargetException)e).getTargetException();
@Override
protected IStatus run(DBRProgressMonitor monitor) {
try {
newObject = objectMaker.createNewObject(monitor, commandTarget.getContext(), parentObject, sourceObject);
if (newObject != null) {
if ((objectMaker.getMakerOptions() & DBEObjectMaker.FEATURE_SAVE_IMMEDIATELY) != 0) {
// Save object manager's content
commandTarget.getContext().saveChanges(monitor);
}
}
return Status.OK_STATUS;
} catch (Exception e) {
return GeneralUtils.makeExceptionStatus(e);
}
UIUtils.showErrorDialog(workbenchWindow.getShell(), "Create object", null, e);
return false;
}
return true;
// This function must be run in UI thread
private void showNewObject() {
IWorkbenchWindow workbenchWindow = DBeaverUI.getActiveWorkbenchWindow();
try {
final boolean openEditor = (objectMaker.getMakerOptions() & DBEObjectMaker.FEATURE_EDITOR_ON_CREATE) != 0;
final DBNDatabaseNode newChild = DBeaverCore.getInstance().getNavigatorModel().findNode(newObject);
if (newChild != null) {
DatabaseNavigatorView view = UIUtils.findView(workbenchWindow, DatabaseNavigatorView.class);
if (view != null) {
view.showNode(newChild);
}
IDatabaseEditor editor = commandTarget.getEditor();
if (editor != null) {
// Just activate existing editor
workbenchWindow.getActivePage().activate(editor);
} else if (openEditor) {
// Open new one with existing context
EntityEditorInput editorInput = new EntityEditorInput(
newChild,
commandTarget.getContext());
workbenchWindow.getActivePage().openEditor(
editorInput,
EntityEditor.class.getName());
}
} else {
throw new DBException("Can't find node corresponding to new object");
}
} catch (Throwable e) {
UIUtils.showErrorDialog(workbenchWindow.getShell(), "Create object", null, e);
}
}
}
}
\ No newline at end of file
......@@ -90,7 +90,7 @@ public class DB2TableColumnManager extends SQLTableColumnManager<DB2TableColumn,
Object copyFrom)
{
DB2TableColumn column = new DB2TableColumn(parent);
column.setName(getNewColumnName(context, parent));
column.setName(getNewColumnName(monitor, context, parent));
return column;
}
......
......@@ -88,7 +88,7 @@ public class DB2TableManager extends SQLTableManager<DB2Table, DB2Schema> implem
{
DB2Table table = new DB2Table(db2Schema, NEW_TABLE_NAME);
try {
setTableName(db2Schema, table);
setTableName(monitor, db2Schema, table);
} catch (DBException e) {
log.error(e);
}
......
......@@ -52,7 +52,7 @@ public class GenericTableColumnManager extends SQLTableColumnManager<GenericTabl
DBSDataType columnType = findBestDataType(parent.getDataSource(), DBConstants.DEFAULT_DATATYPE_NAMES);
final GenericTableColumn column = new GenericTableColumn(parent);
column.setName(getNewColumnName(context, parent));
column.setName(getNewColumnName(monitor, context, parent));
column.setTypeName(columnType == null ? "INTEGER" : columnType.getName());
column.setMaxLength(columnType != null && columnType.getDataKind() == DBPDataKind.STRING ? 100 : 0);
column.setValueType(columnType == null ? Types.INTEGER : columnType.getTypeID());
......
......@@ -56,7 +56,7 @@ public class GenericTableManager extends SQLTableManager<GenericTable, GenericSt
{
final GenericTable table = new GenericTable(parent);
try {
setTableName(parent, table);
setTableName(monitor, parent, table);
} catch (DBException e) {
log.error(e);
}
......
......@@ -95,7 +95,7 @@ public class MySQLTableColumnManager extends SQLTableColumnManager<MySQLTableCol
DBSDataType columnType = findBestDataType(parent.getDataSource(), "varchar"); //$NON-NLS-1$
final MySQLTableColumn column = new MySQLTableColumn(parent);
column.setName(getNewColumnName(context, parent));
column.setName(getNewColumnName(monitor, context, parent));
final String typeName = columnType == null ? "integer" : columnType.getName().toLowerCase();
column.setTypeName(typeName); //$NON-NLS-1$
column.setMaxLength(columnType != null && columnType.getDataKind() == DBPDataKind.STRING ? 100 : 0);
......
......@@ -63,10 +63,10 @@ public class MySQLTableManager extends SQLTableManager<MySQLTableBase, MySQLCata
final MySQLTable table;
if (copyFrom instanceof MySQLTable) {
table = new MySQLTable(monitor, (MySQLTable)copyFrom);
table.setName(getTableName(parent, ((MySQLTable) copyFrom).getName()));
table.setName(getTableName(monitor, parent, ((MySQLTable) copyFrom).getName()));
} else {
table = new MySQLTable(parent);
setTableName(parent, table);
setTableName(monitor, parent, table);
final MySQLTable.AdditionalInfo additionalInfo = table.getAdditionalInfo(monitor);
additionalInfo.setEngine(parent.getDataSource().getDefaultEngine());
......
......@@ -62,7 +62,7 @@ public class OracleTableColumnManager extends SQLTableColumnManager<OracleTableC
DBSDataType columnType = findBestDataType(parent.getDataSource(), "varchar2"); //$NON-NLS-1$
final OracleTableColumn column = new OracleTableColumn(parent);
column.setName(getNewColumnName(context, parent));
column.setName(getNewColumnName(monitor, context, parent));
column.setDataType((OracleDataType) columnType);
column.setTypeName(columnType == null ? "INTEGER" : columnType.getName()); //$NON-NLS-1$
column.setMaxLength(columnType != null && columnType.getDataKind() == DBPDataKind.STRING ? 100 : 0);
......
......@@ -58,7 +58,7 @@ public class OracleTableManager extends SQLTableManager<OracleTable, OracleSchem
{
OracleTable table = new OracleTable(parent, "");
try {
setTableName(parent, table);
setTableName(monitor, parent, table);
} catch (DBException e) {
log.error(e);
}
......
......@@ -116,7 +116,7 @@ public class PostgreTableColumnManager extends SQLTableColumnManager<PostgreTabl
DBSDataType columnType = findBestDataType(parent.getDataSource(), "varchar"); //$NON-NLS-1$
final PostgreTableColumn column = new PostgreTableColumn(parent);
column.setName(getNewColumnName(context, parent));
column.setName(getNewColumnName(monitor, context, parent));
final PostgreDataType dataType = parent.getDatabase().getDataType(PostgreOid.VARCHAR);
column.setDataType(dataType); //$NON-NLS-1$
column.setMaxLength(columnType != null && columnType.getDataKind() == DBPDataKind.STRING ? 100 : 0);
......
......@@ -59,7 +59,7 @@ public class PostgreTableManager extends SQLTableManager<PostgreTableBase, Postg
{
final PostgreTableRegular table = new PostgreTableRegular(parent);
try {
setTableName(parent, table);
setTableName(monitor, parent, table);
} catch (DBException e) {
// Never be here
log.error(e);
......
......@@ -29,7 +29,7 @@ import org.jkiss.dbeaver.model.impl.jdbc.struct.JDBCTable;
import org.jkiss.dbeaver.model.impl.jdbc.struct.JDBCTableColumn;
import org.jkiss.dbeaver.model.impl.sql.edit.SQLObjectEditor;
import org.jkiss.dbeaver.model.messages.ModelMessages;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.sql.SQLUtils;
import org.jkiss.dbeaver.model.struct.DBSDataType;
import org.jkiss.utils.CommonUtils;
......@@ -184,13 +184,13 @@ public abstract class SQLTableColumnManager<OBJECT_TYPE extends JDBCTableColumn<
);
}
protected String getNewColumnName(DBECommandContext context, TABLE_TYPE table)
protected String getNewColumnName(DBRProgressMonitor monitor, DBECommandContext context, TABLE_TYPE table)
{
for (int i = 1; ; i++) {
final String name = DBObjectNameCaseTransformer.transformName(table.getDataSource(), "Column" + i);
try {
// check for existing columns
boolean exists = table.getAttribute(VoidProgressMonitor.INSTANCE, name) != null;
boolean exists = table.getAttribute(monitor, name) != null;
if (!exists) {
// Check for new columns (they are present only within command context)
for (DBPObject contextObject : context.getEditedObjects()) {
......
......@@ -28,7 +28,6 @@ import org.jkiss.dbeaver.model.impl.sql.edit.SQLObjectEditor;
import org.jkiss.dbeaver.model.impl.sql.edit.SQLStructEditor;
import org.jkiss.dbeaver.model.messages.ModelMessages;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSEntityAssociation;
import org.jkiss.dbeaver.model.struct.DBSEntityAttribute;
import org.jkiss.dbeaver.model.struct.DBSObject;
......@@ -121,18 +120,18 @@ public abstract class SQLTableManager<OBJECT_TYPE extends JDBCTable, CONTAINER_T
}
protected void setTableName(CONTAINER_TYPE container, OBJECT_TYPE table) throws DBException {
table.setName(getTableName(container));
protected void setTableName(DBRProgressMonitor monitor, CONTAINER_TYPE container, OBJECT_TYPE table) throws DBException {
table.setName(getTableName(monitor, container));
}
protected String getTableName(CONTAINER_TYPE container) throws DBException {
return getTableName(container, BASE_TABLE_NAME);
protected String getTableName(DBRProgressMonitor monitor, CONTAINER_TYPE container) throws DBException {
return getTableName(monitor, container, BASE_TABLE_NAME);
}
protected String getTableName(CONTAINER_TYPE container, String baseName) throws DBException {
protected String getTableName(DBRProgressMonitor monitor, CONTAINER_TYPE container, String baseName) throws DBException {
for (int i = 0; ; i++) {
String tableName = DBObjectNameCaseTransformer.transformName(container.getDataSource(), i == 0 ? baseName : (baseName + "_" + i));
DBSObject child = container.getChild(VoidProgressMonitor.INSTANCE, tableName);
DBSObject child = container.getChild(monitor, tableName);
if (child == null) {
return tableName;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册