Merge branch '92'
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 0eddd05..500ee03 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 @@
return getNameWithPackage(defaultClientPackage, name);
}
+ public Map<String, ObjEntity> getSubclassesForObjEntity(ObjEntity superEntity) {
+ Map<String, ObjEntity> 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 7d38cd8..5bcccce 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 @@
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<String, ObjEntity> objEntities = entity.getDataMap().getSubclassesForObjEntity(entity);
- fireRelationshipAdded(or);
+ 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);
+ }
+
+ 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 fcdf45d..9406cf8 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 @@
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 initToolBar() {
- JToolBar toolBar = new JToolBar();
+ toolBar = new JToolBar();
ActionManager actionManager = Application.getInstance().getActionManager();
toolBar.add(actionManager.getAction(CreateAttributeAction.class).buildButton());
@@ -167,4 +168,8 @@
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 a9900c4..7a4c2af 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 @@
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);
+ }
}
/**