Repository: cayenne Updated Branches: refs/heads/master faa8a2b89 -> cacea3671
CAY-2427 Skip adding DbEntitySyncUndoableEdit if no changes on DbEntitySyncAction. Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/115bc003 Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/115bc003 Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/115bc003 Branch: refs/heads/master Commit: 115bc003740c6bfa63f9cc5bd2c91c4a42059d13 Parents: 17063b8 Author: kkomyak <const1...@gmail.com> Authored: Thu Apr 12 09:20:03 2018 +0300 Committer: kkomyak <const1...@gmail.com> Committed: Sat Apr 14 09:48:55 2018 +0300 ---------------------------------------------------------------------- RELEASE-NOTES.txt | 1 + .../modeler/action/DbEntitySyncAction.java | 54 +++++++++++--------- 2 files changed, 31 insertions(+), 24 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cayenne/blob/115bc003/RELEASE-NOTES.txt ---------------------------------------------------------------------- diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index a619bcc..abc5802 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -52,6 +52,7 @@ CAY-2411 Wrong resolution of ExtendedType with ValueObjectType for inherited cla CAY-2418 Modeler: unable to edit entity selected via Search CAY-2419 Modeler: Not changing highlight on selecting search results within one entity CAY-2420 Modeler: search is not performed for Stored Procedures +CAY-2427 Modeler: Undo throws exeption ---------------------------------- Release: 4.1.M1 http://git-wip-us.apache.org/repos/asf/cayenne/blob/115bc003/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DbEntitySyncAction.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DbEntitySyncAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DbEntitySyncAction.java index b774233..8a08180 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DbEntitySyncAction.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DbEntitySyncAction.java @@ -22,6 +22,7 @@ package org.apache.cayenne.modeler.action; import org.apache.cayenne.configuration.DataChannelDescriptor; import org.apache.cayenne.dbsync.merge.context.EntityMergeSupport; import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator; +import org.apache.cayenne.map.DbAttribute; import org.apache.cayenne.map.DbEntity; import org.apache.cayenne.map.DbRelationship; import org.apache.cayenne.map.ObjEntity; @@ -33,8 +34,8 @@ import org.apache.cayenne.modeler.dialog.objentity.EntitySyncController; import org.apache.cayenne.modeler.undo.DbEntitySyncUndoableEdit; import org.apache.cayenne.modeler.util.CayenneAction; -import javax.swing.*; -import java.awt.*; +import javax.swing.KeyStroke; +import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.util.Collection; @@ -50,7 +51,7 @@ public class DbEntitySyncAction extends CayenneAction { return "Sync Dependent ObjEntities with DbEntity"; } - public DbEntitySyncAction(Application application) { + public DbEntitySyncAction(final Application application) { super(getActionName(), application); } @@ -68,23 +69,22 @@ public class DbEntitySyncAction extends CayenneAction { /** * @see org.apache.cayenne.modeler.util.CayenneAction#performAction(ActionEvent) */ - public void performAction(ActionEvent e) { + public void performAction(final ActionEvent e) { syncDbEntity(); } protected void syncDbEntity() { - ProjectController mediator = getProjectController(); - - DbEntity dbEntity = mediator.getCurrentDbEntity(); + final ProjectController mediator = getProjectController(); + final DbEntity dbEntity = mediator.getCurrentDbEntity(); if (dbEntity != null) { - Collection<ObjEntity> entities = dbEntity.getDataMap().getMappedEntities(dbEntity); + final Collection<ObjEntity> entities = dbEntity.getDataMap().getMappedEntities(dbEntity); if (entities.isEmpty()) { return; } - EntityMergeSupport merger = new EntitySyncController(Application.getInstance().getFrameController(), dbEntity) + final EntityMergeSupport merger = new EntitySyncController(Application.getInstance().getFrameController(), dbEntity) .createMerger(); if (merger == null) { @@ -93,34 +93,40 @@ public class DbEntitySyncAction extends CayenneAction { merger.setNameGenerator(new PreserveRelationshipNameGenerator()); - DbEntitySyncUndoableEdit undoableEdit = new DbEntitySyncUndoableEdit((DataChannelDescriptor) mediator + final DbEntitySyncUndoableEdit undoableEdit = new DbEntitySyncUndoableEdit((DataChannelDescriptor) mediator .getProject().getRootNode(), mediator.getCurrentDataMap()); // filter out inherited entities, as we need to add attributes only to the roots filterInheritedEntities(entities); - for(ObjEntity entity : entities) { + boolean hasChanges = false; + for (final ObjEntity entity : entities) { - DbEntitySyncUndoableEdit.EntitySyncUndoableListener listener = undoableEdit.new EntitySyncUndoableListener( + final DbEntitySyncUndoableEdit.EntitySyncUndoableListener listener = undoableEdit.new EntitySyncUndoableListener( entity); merger.addEntityMergeListener(listener); + final Collection<DbAttribute> meaningfulFKs = merger.getMeaningfulFKs(entity); + // TODO: addition or removal of model objects should be reflected in listener callbacks... // we should not be trying to introspect the merger - if (merger.isRemovingMeaningfulFKs()) { - undoableEdit.addEdit(undoableEdit.new MeaningfulFKsUndoableEdit(entity, merger - .getMeaningfulFKs(entity))); + if (merger.isRemovingMeaningfulFKs() && !meaningfulFKs.isEmpty()) { + undoableEdit.addEdit(undoableEdit.new MeaningfulFKsUndoableEdit(entity, meaningfulFKs)); + hasChanges = true; } if (merger.synchronizeWithDbEntity(entity)) { mediator.fireObjEntityEvent(new EntityEvent(this, entity, MapEvent.CHANGE)); + hasChanges = true; } merger.removeEntityMergeListener(listener); } - application.getUndoManager().addEdit(undoableEdit); + if (hasChanges) { + application.getUndoManager().addEdit(undoableEdit); + } } } @@ -128,11 +134,11 @@ public class DbEntitySyncAction extends CayenneAction { * This method works only for case when all inherited entities bound to same DbEntity * if this will ever change some additional checks should be performed. */ - private void filterInheritedEntities(Collection<ObjEntity> entities) { + private void filterInheritedEntities(final Collection<ObjEntity> entities) { // entities.removeIf(c -> c.getSuperEntity() != null); - Iterator<ObjEntity> it = entities.iterator(); - while(it.hasNext()) { - if(it.next().getSuperEntity() != null) { + final Iterator<ObjEntity> it = entities.iterator(); + while (it.hasNext()) { + if (it.next().getSuperEntity() != null) { it.remove(); } } @@ -141,13 +147,13 @@ public class DbEntitySyncAction extends CayenneAction { static class PreserveRelationshipNameGenerator extends DefaultObjectNameGenerator { @Override - public String relationshipName(DbRelationship... relationshipChain) { - if(relationshipChain.length == 0) { + public String relationshipName(final DbRelationship... relationshipChain) { + if (relationshipChain.length == 0) { return super.relationshipName(relationshipChain); } - DbRelationship last = relationshipChain[relationshipChain.length - 1]; + final DbRelationship last = relationshipChain[relationshipChain.length - 1]; // must be in sync with DefaultBaseNameVisitor.visitDbRelationship - if(last.getName().startsWith("untitledRel")) { + if (last.getName().startsWith("untitledRel")) { return super.relationshipName(relationshipChain); }