提交 2144af05 编写于 作者: S serge-rider

#6570 Embedded ERD save/load


Former-commit-id: 9ed7d106
上级 6c4eb887
......@@ -26,6 +26,7 @@ import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.ext.erd.ERDActivator;
import org.jkiss.dbeaver.ext.erd.ERDConstants;
import org.jkiss.dbeaver.ext.erd.model.DiagramLoader;
import org.jkiss.dbeaver.ext.erd.model.ERDEntity;
import org.jkiss.dbeaver.ext.erd.model.EntityDiagram;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.exec.DBCExecutionContext;
......@@ -42,7 +43,11 @@ import org.jkiss.dbeaver.ui.editors.IDatabaseEditor;
import org.jkiss.dbeaver.ui.editors.IDatabaseEditorInput;
import org.jkiss.dbeaver.ui.editors.entity.IEntityStructureEditor;
import org.jkiss.dbeaver.utils.RuntimeUtils;
import org.jkiss.utils.CommonUtils;
import org.jkiss.utils.xml.XMLUtils;
import org.w3c.dom.Document;
import java.io.StringReader;
import java.lang.reflect.InvocationTargetException;
import java.util.*;
......@@ -142,19 +147,7 @@ public class ERDEditorEmbedded extends ERDEditorPart implements IDatabaseEditor,
diagramLoadingJob = LoadingJob.createService(
new DatabaseLoadService<EntityDiagram>("Load diagram '" + object.getName() + "'", object.getDataSource()) {
@Override
public EntityDiagram evaluate(DBRProgressMonitor monitor)
throws InvocationTargetException, InterruptedException
{
// Do not refresh actual metadata. It is slow and it may corrupt diagram state
/*
if (refreshMetadata && object instanceof DBPRefreshableObject) {
try {
getEditorInput().getNavigatorNode().refreshNode(monitor, ERDEditorEmbedded.this);
} catch (DBException e) {
log.warn("Error refreshing database metadata", e);
}
}
*/
public EntityDiagram evaluate(DBRProgressMonitor monitor) {
try {
return loadFromDatabase(monitor);
} catch (DBException e) {
......@@ -195,19 +188,38 @@ public class ERDEditorEmbedded extends ERDEditorPart implements IDatabaseEditor,
} else {
diagram = new EntityDiagram(getDecorator(), dbObject, dbObject.getName());
boolean hasPersistedState = false;
try {
// Load persisted state
DBVObject vObject = this.getVirtualObject();
if (vObject != null) {
Map<String, Object> diagramState = vObject.getProperty(PROP_DIAGRAM_STATE);
if (diagramState != null) {
String serializedDiagram = (String) diagramState.get(PROPS_DIAGRAM_SERIALIZED);
if (!CommonUtils.isEmpty(serializedDiagram)) {
Document xmlDocument = XMLUtils.parseDocument(new StringReader(serializedDiagram));
DiagramLoader.loadDiagram(monitor, xmlDocument, dbObject.getDataSource().getContainer().getProject(), diagram);
hasPersistedState = true;
}
}
}
} catch (Exception e) {
log.error("Error loading ER diagram from saved state", e);
}
diagram.setLayoutManualAllowed(true);
diagram.setNeedsAutoLayout(true);
diagram.setNeedsAutoLayout(!hasPersistedState);
// Fill from database even if we loaded from state (something could change since last view)
diagram.fillEntities(
monitor,
collectDatabaseTables(monitor, dbObject),
collectDatabaseTables(monitor, dbObject, diagram),
dbObject);
}
return diagram;
}
private Collection<DBSEntity> collectDatabaseTables(DBRProgressMonitor monitor, DBSObject root) throws DBException
private Collection<DBSEntity> collectDatabaseTables(DBRProgressMonitor monitor, DBSObject root, EntityDiagram diagram) throws DBException
{
Set<DBSEntity> result = new LinkedHashSet<>();
......@@ -315,6 +327,11 @@ public class ERDEditorEmbedded extends ERDEditorPart implements IDatabaseEditor,
monitor.done();
}
// Remove entities already loaded in the diagram
for (ERDEntity diagramEntity : diagram.getEntities()) {
result.remove(diagramEntity.getObject());
}
return result;
}
......
......@@ -187,7 +187,7 @@ public class DiagramLoader
}
public static void load(DBRProgressMonitor monitor, IProject project, DiagramPart diagramPart, InputStream in)
throws IOException, XMLException, DBException
throws XMLException, DBException
{
monitor.beginTask("Parse diagram", 1);
final EntityDiagram diagram = diagramPart.getDiagram();
......@@ -199,6 +199,10 @@ public class DiagramLoader
final Document document = XMLUtils.parseDocument(in);
loadDiagram(monitor, document, projectMeta, diagram);
}
public static void loadDiagram(DBRProgressMonitor monitor, Document document, DBPProject projectMeta, EntityDiagram diagram) throws DBException {
final Element diagramElem = document.getDocumentElement();
monitor.done();
......
......@@ -22,6 +22,7 @@ import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry;
import org.jkiss.dbeaver.model.app.DBPPlatform;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.connection.DBPNativeClientLocation;
import org.jkiss.dbeaver.model.connection.DBPConnectionConfiguration;
import org.jkiss.dbeaver.model.connection.DBPDriver;
......@@ -193,6 +194,9 @@ public interface DBPDataSourceContainer extends DBSObject, DBDPreferences, DBPNa
@NotNull
DBPDataSourceRegistry getRegistry();
@NotNull
DBPProject getProject();
void persistConfiguration();
@NotNull
......
......@@ -70,6 +70,7 @@ public class DBVContainer extends DBVObject implements DBSObjectContainer {
String id = element.getKey();
if (id.startsWith(ENTITY_PREFIX)) {
DBVEntity entity = new DBVEntity(this, id.substring(ENTITY_PREFIX.length()), (Map<String, Object>) element.getValue());
entities.put(entity.getName(), entity);
} else if (id.startsWith(CONFIG_PREFIX)) {
String configMap = id.substring(CONFIG_PREFIX.length());
if (configMap.equals("properties")) {
......
......@@ -62,8 +62,8 @@ public abstract class DBVObject implements DBSObject {
* @param name property name
*/
@Nullable
public Object getProperty(@NotNull String name) {
return CommonUtils.isEmpty(properties) ? null : properties.get(name);
public <T> T getProperty(@NotNull String name) {
return CommonUtils.isEmpty(properties) ? null : (T) properties.get(name);
}
public void setProperty(String name, @Nullable Object value) {
......
......@@ -28,6 +28,7 @@ import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.ModelPreferences;
import org.jkiss.dbeaver.model.*;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.connection.DBPAuthInfo;
import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry;
import org.jkiss.dbeaver.model.app.DBPPlatform;
......@@ -706,6 +707,12 @@ public class DataSourceDescriptor
return registry;
}
@NotNull
@Override
public DBPProject getProject() {
return registry.getProject();
}
@Override
public void persistConfiguration()
{
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册