From d0340587bd1ce798a6b09584e21827802427a853 Mon Sep 17 00:00:00 2001 From: serge-rider Date: Sat, 22 Dec 2018 00:43:26 +0300 Subject: [PATCH] #4529 MAppings load fix (create/existing - check object existence) Former-commit-id: 4d46576b980601a30e91d1ca506ca5b1cfcf1faf --- .../database/DatabaseMappingAttribute.java | 22 +++++++++++-- .../database/DatabaseMappingContainer.java | 32 +++++++++++++++---- .../database/DatabaseTransferConsumer.java | 2 +- 3 files changed, 45 insertions(+), 11 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseMappingAttribute.java b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseMappingAttribute.java index b11e51e8a6..9b72038852 100644 --- a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseMappingAttribute.java +++ b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseMappingAttribute.java @@ -22,6 +22,7 @@ import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.*; import org.jkiss.dbeaver.model.impl.DBObjectNameCaseTransformer; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; +import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; import org.jkiss.dbeaver.model.sql.SQLDataSource; import org.jkiss.dbeaver.model.sql.SQLDialect; import org.jkiss.dbeaver.model.struct.*; @@ -272,10 +273,25 @@ public class DatabaseMappingAttribute implements DatabaseMappingObject { targetType = settings.get("targetType"); if (settings.get("mappingType") != null) { try { - mappingType = DatabaseMappingType.valueOf(settings.get("mappingType")); - } catch (IllegalArgumentException e) { + DatabaseMappingType newMappingType = DatabaseMappingType.valueOf(settings.get("mappingType")); + + if (!CommonUtils.isEmpty(targetName)) { + DBSDataManipulator targetEntity = parent.getTarget(); + if (targetEntity instanceof DBSEntity) { + this.target = ((DBSEntity) targetEntity).getAttribute(new VoidProgressMonitor(), targetName); + } + } + + if (target != null && newMappingType == DatabaseMappingType.create) { + // Change create to existing. + newMappingType = DatabaseMappingType.existing; + } else if (target == null && newMappingType == DatabaseMappingType.existing) { + newMappingType = DatabaseMappingType.create; + } + + setMappingType(newMappingType); + } catch (Exception e) { log.error(e); - mappingType = DatabaseMappingType.unspecified; } } } diff --git a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseMappingContainer.java b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseMappingContainer.java index ed88185021..eb64cb9d3d 100644 --- a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseMappingContainer.java +++ b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseMappingContainer.java @@ -44,28 +44,28 @@ public class DatabaseMappingContainer implements DatabaseMappingObject { private static final Log log = Log.getLog(DatabaseMappingContainer.class); - private DatabaseConsumerSettings settings; + private DatabaseConsumerSettings consumerSettings; private DBSDataContainer source; private DBSDataManipulator target; private String targetName; private DatabaseMappingType mappingType; private List attributeMappings = new ArrayList<>(); - public DatabaseMappingContainer(DatabaseConsumerSettings settings, DBSDataContainer source) { - this.settings = settings; + public DatabaseMappingContainer(DatabaseConsumerSettings consumerSettings, DBSDataContainer source) { + this.consumerSettings = consumerSettings; this.source = source; this.mappingType = DatabaseMappingType.unspecified; } - public DatabaseMappingContainer(IRunnableContext context, DatabaseConsumerSettings settings, DBSDataContainer sourceObject, DBSDataManipulator targetObject) throws DBException { - this.settings = settings; + public DatabaseMappingContainer(IRunnableContext context, DatabaseConsumerSettings consumerSettings, DBSDataContainer sourceObject, DBSDataManipulator targetObject) throws DBException { + this.consumerSettings = consumerSettings; this.source = sourceObject; this.target = targetObject; refreshMappingType(context, DatabaseMappingType.existing); } public DatabaseConsumerSettings getSettings() { - return settings; + return consumerSettings; } @Override @@ -222,7 +222,25 @@ public class DatabaseMappingContainer implements DatabaseMappingObject { targetName = settings.get("targetName"); if (settings.get("mappingType") != null) { try { - refreshMappingType(context, DatabaseMappingType.valueOf(settings.get("mappingType"))); + DatabaseMappingType newMappingType = DatabaseMappingType.valueOf(settings.get("mappingType")); + if (!CommonUtils.isEmpty(targetName)) { + DBSObjectContainer objectContainer = consumerSettings.getContainer(); + if (objectContainer != null) { + DBSObject child = objectContainer.getChild(new VoidProgressMonitor(), targetName); + if (child instanceof DBSDataManipulator) { + target = (DBSDataManipulator) child; + } + } + } + + if (target != null && newMappingType == DatabaseMappingType.create) { + // Change create to existing. + newMappingType = DatabaseMappingType.existing; + } else if (target == null && newMappingType == DatabaseMappingType.existing) { + newMappingType = DatabaseMappingType.create; + } + refreshMappingType(context, newMappingType); + } catch (Exception e) { log.error(e); } diff --git a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseTransferConsumer.java b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseTransferConsumer.java index 271e517442..dbfc81c05b 100644 --- a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseTransferConsumer.java +++ b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseTransferConsumer.java @@ -170,7 +170,7 @@ public class DatabaseTransferConsumer implements IDataTransferConsumer