提交 17486ff6 编写于 作者: S Serge Rider

Object refresh redesign (use deep copy instead of replace)

上级 ef21d658
......@@ -636,7 +636,7 @@ public abstract class ERDEditorPart extends GraphicalEditorWithFlyoutPalette
@Override
public void refreshPart(Object source, boolean force)
{
refreshDiagram(force);
refreshDiagram(false);
}
public void saveDiagramAs()
......
......@@ -91,7 +91,7 @@ public class MySQLTable extends MySQLTableBase
}
}
private SimpleObjectCache<MySQLTable, MySQLTableForeignKey> foreignKeys = new SimpleObjectCache<>();
private final SimpleObjectCache<MySQLTable, MySQLTableForeignKey> foreignKeys = new SimpleObjectCache<>();
private final PartitionCache partitionCache = new PartitionCache();
private final AdditionalInfo additionalInfo = new AdditionalInfo();
......
......@@ -26,6 +26,8 @@ import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.sql.SQLDataSource;
import org.jkiss.dbeaver.model.struct.DBSObject;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.*;
/**
......@@ -246,6 +248,46 @@ public abstract class AbstractObjectCache<OWNER extends DBSObject, OBJECT extend
return name;
}
/**
* Performs a deep copy of srcObject into dstObject.
* Copies all fields (recursively) and clears all nested caches
*/
protected void deepCopyCachedObject(@NotNull Object srcObject, @NotNull Object dstObject) {
if (srcObject.getClass() != dstObject.getClass()) {
log.error("Can't make object opy: src class " + srcObject.getClass().getName() + "' != dest class '" + dstObject.getClass().getName() + "'");
return;
}
try {
for (Class theClass = srcObject.getClass(); theClass != Object.class; theClass = theClass.getSuperclass()) {
final Field[] fields = theClass.getDeclaredFields();
for (Field field : fields) {
final int modifiers = field.getModifiers();
if (Modifier.isStatic(modifiers)) {
continue;
}
field.setAccessible(true);
final Object srcValue = field.get(srcObject);
final Object dstValue = field.get(dstObject);
if (DBSObjectCache.class.isAssignableFrom(field.getType())) {
((DBSObjectCache)dstValue).clearCache();
} else {
if (Modifier.isFinal(modifiers)) {
// Can't copy final. Let's try to make recursive copy
// Just in case check that values not null and have the same type
if (dstValue != null && srcValue != null && dstValue.getClass() == srcValue.getClass()) {
deepCopyCachedObject(srcValue, dstValue);
}
} else {
field.set(dstObject, srcValue);
}
}
}
}
} catch (Throwable e) {
log.error("Error copying object state", e);
}
}
protected class CacheIterator implements Iterator<OBJECT> {
private Iterator<OBJECT> listIterator = objectList.iterator();
private OBJECT curObject;
......
......@@ -74,11 +74,13 @@ public abstract class JDBCObjectLookupCache<OWNER extends DBSObject, OBJECT exte
this.loadObjects(monitor, owner);
} else {
OBJECT newObject = this.reloadObject(monitor, owner, oldObject, null);
removeObject(oldObject, false);
if (newObject != null) {
cacheObject(newObject);
deepCopyCachedObject(newObject, oldObject);
//cacheObject(newObject);
} else {
removeObject(oldObject, false);
}
return newObject;
return oldObject;
}
return getCachedObject(objectName);
}
......
......@@ -79,11 +79,16 @@ public abstract class JDBCStructLookupCache<OWNER extends DBSObject, OBJECT exte
if (isChildrenCached(oldObject)) {
clearChildrenCache(oldObject);
}
removeObject(oldObject, false);
if (newObject != null) {
cacheObject(newObject);
deepCopyCachedObject(newObject, oldObject);
} else {
removeObject(oldObject, false);
}
return newObject;
// removeObject(oldObject, false);
// if (newObject != null) {
// cacheObject(newObject);
// }
return oldObject;
}
return getCachedObject(objectName);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册