From cdf40e386e7d50feb1653c7a204c65ebacae134a Mon Sep 17 00:00:00 2001 From: olga Date: Thu, 31 Mar 2016 17:14:14 +0300 Subject: [PATCH] improvement of vertical inheritance --- .../java/org/apache/cayenne/map/DataMap.java | 11 +++++ .../cayenne/util/EntityMergeSupport.java | 48 +++++++++++++++---- .../ObjEntityAttributeRelationshipTab.java | 9 +++- .../editor/ObjEntityRelationshipPanel.java | 7 +++ 4 files changed, 64 insertions(+), 11 deletions(-) diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/DataMap.java b/cayenne-server/src/main/java/org/apache/cayenne/map/DataMap.java index a570d665fc..c3ac20b41b 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/map/DataMap.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/map/DataMap.java @@ -44,6 +44,7 @@ import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; +import java.util.HashMap; import static java.util.Collections.emptyList; @@ -1400,6 +1401,16 @@ public String getNameWithDefaultClientPackage(String name) { return getNameWithPackage(defaultClientPackage, name); } + public Map getSubclassesForObjEntity(ObjEntity superEntity) { + Map subObjectEntities = new HashMap(5); + for (ObjEntity objectEntity : objEntityMap.values()) { + if (superEntity.getName().equals(objectEntity.getSuperEntityName())) { + subObjectEntities.put(objectEntity.getName(), objectEntity); + } + } + return subObjectEntities; + } + public ReverseEngineering getReverseEngineering() { return reverseEngineering; } diff --git a/cayenne-server/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java b/cayenne-server/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java index 7d38cd8325..5bccccea18 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java @@ -180,29 +180,59 @@ private boolean addMissingRelationships(ObjEntity entity) { createObjRelationship(entity, dr, mappedTarget.getName()); } } else { - LOG.warn("Can't find ObjEntity for " + dr.getTargetEntityName()); - LOG.warn("Db Relationship (" + dr + ") will have GUESSED Obj Relationship reflection. "); - if (targetEntity == null) { targetEntity = new DbEntity(dr.getTargetEntityName()); } - createObjRelationship(entity, dr, nameGenerator.createObjEntityName(targetEntity)); + if (dr.getTargetEntityName() != null) { + boolean needGeneratedEntity = createObjRelationship(entity, dr, nameGenerator.createObjEntityName(targetEntity)); + if (needGeneratedEntity) { + LOG.warn("Can't find ObjEntity for " + dr.getTargetEntityName()); + LOG.warn("Db Relationship (" + dr + ") will have GUESSED Obj Relationship reflection. "); + } + } } } return true; } - private void createObjRelationship(ObjEntity entity, DbRelationship dr, String targetEntityName) { + private boolean createObjRelationship(ObjEntity entity, DbRelationship dr, String targetEntityName) { String relationshipName = nameGenerator.createObjRelationshipName(dr); relationshipName = DefaultUniqueNameGenerator.generate(NameCheckers.objRelationship, entity, relationshipName); ObjRelationship or = new ObjRelationship(relationshipName); or.addDbRelationship(dr); - or.setSourceEntity(entity); - or.setTargetEntityName(targetEntityName); - entity.addRelationship(or); + Map objEntities = entity.getDataMap().getSubclassesForObjEntity(entity); + + boolean hasFlattingAttributes = false; + boolean needGeneratedEntity = true; + + if (objEntities.containsKey(targetEntityName)) { + needGeneratedEntity = false; + } + + for (ObjEntity subObjEntity : objEntities.values()) { + for (ObjAttribute objAttribute : subObjEntity.getAttributes()) { + String path = objAttribute.getDbAttributePath(); + if (path != null) { + if (path.startsWith(or.getDbRelationshipPath())) { + hasFlattingAttributes = true; + break; + } + } + } + } + + if (!hasFlattingAttributes) { + if (needGeneratedEntity) { + or.setTargetEntityName(targetEntityName); + or.setSourceEntity(entity); + } + + entity.addRelationship(or); + fireRelationshipAdded(or); + } - fireRelationshipAdded(or); + return needGeneratedEntity; } private boolean addMissingAttributes(ObjEntity entity) { diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributeRelationshipTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributeRelationshipTab.java index fcdf45d1c0..9406cf897f 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributeRelationshipTab.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributeRelationshipTab.java @@ -61,6 +61,7 @@ public class ObjEntityAttributeRelationshipTab extends JPanel implements ObjEnti private CutAttributeRelationshipAction cut; private RemoveAttributeRelationshipAction remove; private CopyAttributeRelationshipAction copy; + private JToolBar toolBar; public ObjEntityAttributeRelationshipTab(ProjectController mediator) { this.mediator = mediator; @@ -95,7 +96,7 @@ private void init() { } private void initToolBar() { - JToolBar toolBar = new JToolBar(); + toolBar = new JToolBar(); ActionManager actionManager = Application.getInstance().getActionManager(); toolBar.add(actionManager.getAction(CreateAttributeAction.class).buildButton()); @@ -167,4 +168,8 @@ public void currentObjEntityChanged(EntityDisplayEvent e) { attributePanel.currentObjEntityChanged(e); relationshipPanel.currentObjEntityChanged(e); } -} \ No newline at end of file + + public JToolBar getToolBar() { + return toolBar; + } +} diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityRelationshipPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityRelationshipPanel.java index a9900c4d96..7a4c2af327 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityRelationshipPanel.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityRelationshipPanel.java @@ -225,6 +225,13 @@ public void currentObjEntityChanged(EntityDisplayEvent e) { if (e.isUnselectAttributes()) { table.clearSelection(); } + + ObjEntity objEntity = (ObjEntity) e.getEntity(); + if (objEntity.getSuperEntity() != null) { + parentPanel.getToolBar().getComponentAtIndex(2).setEnabled(false); + } else { + parentPanel.getToolBar().getComponentAtIndex(2).setEnabled(true); + } } /**