cayenne-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ntimof...@apache.org
Subject cayenne git commit: CAY-2286 Filter out inherited ObjEntities from sync with DbEntity
Date Fri, 28 Apr 2017 13:55:41 GMT
Repository: cayenne
Updated Branches:
  refs/heads/master 87c9c8f4b -> bd1b109a9


CAY-2286 Filter out inherited ObjEntities from sync with DbEntity


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/bd1b109a
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/bd1b109a
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/bd1b109a

Branch: refs/heads/master
Commit: bd1b109a943307a83078399c7a4d6aa53631a065
Parents: 87c9c8f
Author: Nikita Timofeev <stariy95@gmail.com>
Authored: Fri Apr 28 16:55:34 2017 +0300
Committer: Nikita Timofeev <stariy95@gmail.com>
Committed: Fri Apr 28 16:55:34 2017 +0300

----------------------------------------------------------------------
 .../merge/token/model/AbstractToModelToken.java | 17 ++++++
 .../merge/token/model/AddColumnToModel.java     |  2 +-
 .../token/model/AddRelationshipToModel.java     |  2 +-
 docs/doc/src/main/resources/RELEASE-NOTES.txt   |  1 +
 .../cayenne/tools/DbImporterMojoTest.java       |  5 ++
 .../tools/dbimport/testInheritance-pom.xml      | 41 ++++++++++++++
 .../tools/dbimport/testInheritance.map.xml      | 38 +++++++++++++
 .../dbimport/testInheritance.map.xml-result     | 58 ++++++++++++++++++++
 .../cayenne/tools/dbimport/testInheritance.sql  | 35 ++++++++++++
 .../modeler/action/DbEntitySyncAction.java      | 17 ++++++
 10 files changed, 214 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/bd1b109a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AbstractToModelToken.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AbstractToModelToken.java
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AbstractToModelToken.java
index a6544b2..5a6eb8e 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AbstractToModelToken.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AbstractToModelToken.java
@@ -19,6 +19,9 @@
 
 package org.apache.cayenne.dbsync.merge.token.model;
 
+import java.util.Collection;
+import java.util.Iterator;
+
 import org.apache.cayenne.dbsync.merge.context.MergeDirection;
 import org.apache.cayenne.dbsync.merge.token.AbstractMergerToken;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
@@ -85,6 +88,20 @@ public abstract class AbstractToModelToken extends AbstractMergerToken
{
             return entity;
         }
 
+        /**
+         * @return ObjEntities mapped to current DbEntity excluding inherited
+         */
+        public Collection<ObjEntity> getMappedObjEntities() {
+            Collection<ObjEntity> entities = entity.mappedObjEntities();
+            Iterator<ObjEntity> iterator = entities.iterator();
+            while(iterator.hasNext()) {
+                if(iterator.next().getSuperEntity() != null) {
+                    iterator.remove();
+                }
+            }
+            return entities;
+        }
+
         public String getTokenValue() {
             return getEntity().getName();
         }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bd1b109a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddColumnToModel.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddColumnToModel.java
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddColumnToModel.java
index 07ce947..af1a00c 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddColumnToModel.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddColumnToModel.java
@@ -46,7 +46,7 @@ public class AddColumnToModel extends AbstractToModelToken.EntityAndColumn
{
     public void execute(MergerContext mergerContext) {
         getEntity().addAttribute(getColumn());
 
-        for (ObjEntity e : getEntity().mappedObjEntities()) {
+        for (ObjEntity e : getMappedObjEntities()) {
             mergerContext.getEntityMergeSupport().synchronizeOnDbAttributeAdded(e, getColumn());
         }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bd1b109a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddRelationshipToModel.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddRelationshipToModel.java
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddRelationshipToModel.java
index 8647485..b34e017 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddRelationshipToModel.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/AddRelationshipToModel.java
@@ -71,7 +71,7 @@ public class AddRelationshipToModel extends AbstractToModelToken.Entity
{
         }
 
         getEntity().addRelationship(relationship);
-        for (ObjEntity e : getEntity().mappedObjEntities()) {
+        for (ObjEntity e : getMappedObjEntities()) {
             context.getEntityMergeSupport().synchronizeOnDbRelationshipAdded(e, relationship);
         }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bd1b109a/docs/doc/src/main/resources/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/docs/doc/src/main/resources/RELEASE-NOTES.txt b/docs/doc/src/main/resources/RELEASE-NOTES.txt
index 674903a..40c9097 100644
--- a/docs/doc/src/main/resources/RELEASE-NOTES.txt
+++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt
@@ -56,6 +56,7 @@ CAY-2276 PrePersist listener registered as PostPersist in LifecycleCallbackRegis
 CAY-2279 cdbimport: skip PK comparison for VIEWs
 CAY-2281 ObjEntity attribute overrides are never deleted
 CAY-2284 Expression likeIgnoreCase can't handle unicode chars in in-memory evaluation
+CAY-2286 Filter out inherited ObjEntities from sync with DbEntity
 
 ----------------------------------
 Release: 4.0.M5

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bd1b109a/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java
----------------------------------------------------------------------
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java
b/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java
index 63a349d..5d446fd 100644
--- a/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java
+++ b/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java
@@ -257,6 +257,11 @@ public class DbImporterMojoTest extends AbstractMojoTestCase {
     }
 
     @Test
+    public void testInheritance() throws Exception {
+        test("testInheritance");
+    }
+
+    @Test
     public void testFilteringConfig() throws Exception {
         DbImporterMojo cdbImport = getCdbImport("config/pom-01.xml");
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bd1b109a/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testInheritance-pom.xml
----------------------------------------------------------------------
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testInheritance-pom.xml
b/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testInheritance-pom.xml
new file mode 100644
index 0000000..37c18d4
--- /dev/null
+++ b/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testInheritance-pom.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  ~   Licensed to the Apache Software Foundation (ASF) under one
+  ~  or more contributor license agreements.  See the NOTICE file
+  ~  distributed with this work for additional information
+  ~  regarding copyright ownership.  The ASF licenses this file
+  ~  to you under the Apache License, Version 2.0 (the
+  ~  "License"); you may not use this file except in compliance
+  ~  with the License.  You may obtain a copy of the License at
+  ~
+  ~    http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~  Unless required by applicable law or agreed to in writing,
+  ~  software distributed under the License is distributed on an
+  ~  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~  KIND, either express or implied.  See the License for the
+  ~  specific language governing permissions and limitations
+  ~  under the License.
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+	http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+	<name>DbImporterMojo Test1</name>	
+
+	<build>
+		<plugins>
+			<plugin>
+				<artifactId>cayenne-maven-plugin</artifactId>
+				<configuration>
+					<map>target/test-classes/org/apache/cayenne/tools/dbimport/testInheritance.map.xml</map>
+					<dataSource>
+						<driver>org.apache.derby.jdbc.EmbeddedDriver</driver>
+						<url>jdbc:derby:memory:DbImporterMojoTest;create=true</url>
+					</dataSource>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+
+</project>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bd1b109a/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testInheritance.map.xml
----------------------------------------------------------------------
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testInheritance.map.xml
b/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testInheritance.map.xml
new file mode 100644
index 0000000..b849751
--- /dev/null
+++ b/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testInheritance.map.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  ~   Licensed to the Apache Software Foundation (ASF) under one
+  ~  or more contributor license agreements.  See the NOTICE file
+  ~  distributed with this work for additional information
+  ~  regarding copyright ownership.  The ASF licenses this file
+  ~  to you under the Apache License, Version 2.0 (the
+  ~  "License"); you may not use this file except in compliance
+  ~  with the License.  You may obtain a copy of the License at
+  ~
+  ~    http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~  Unless required by applicable law or agreed to in writing,
+  ~  software distributed under the License is distributed on an
+  ~  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~  KIND, either express or implied.  See the License for the
+  ~  specific language governing permissions and limitations
+  ~  under the License.
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
+<data-map xmlns="http://cayenne.apache.org/schema/9/modelMap"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://cayenne.apache.org/schema/9/modelMap http://cayenne.apache.org/schema/9/modelMap.xsd"
+          project-version="9">
+
+    <db-entity name="CHILD" schema="SCHEMA_01">
+        <db-attribute name="id" type="INTEGER" isPrimaryKey="true" isMandatory="true"
length="10"/>
+        <db-attribute name="parent_id" type="INTEGER" length="10"/>
+    </db-entity>
+    <db-entity name="PARENT" schema="SCHEMA_01">
+        <db-attribute name="id" type="INTEGER" isPrimaryKey="true" isMandatory="true"
length="10"/>
+    </db-entity>
+    <obj-entity name="Child" className="Child" dbEntityName="CHILD">
+    </obj-entity>
+    <obj-entity name="Parent" className="Parent" dbEntityName="PARENT">
+    </obj-entity>
+    <obj-entity name="ParentSub" className="ParentSub" dbEntityName="PARENT" superEntityName="Parent">
+    </obj-entity>
+</data-map>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bd1b109a/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testInheritance.map.xml-result
----------------------------------------------------------------------
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testInheritance.map.xml-result
b/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testInheritance.map.xml-result
new file mode 100644
index 0000000..7e54338
--- /dev/null
+++ b/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testInheritance.map.xml-result
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  ~   Licensed to the Apache Software Foundation (ASF) under one
+  ~  or more contributor license agreements.  See the NOTICE file
+  ~  distributed with this work for additional information
+  ~  regarding copyright ownership.  The ASF licenses this file
+  ~  to you under the Apache License, Version 2.0 (the
+  ~  "License"); you may not use this file except in compliance
+  ~  with the License.  You may obtain a copy of the License at
+  ~
+  ~    http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~  Unless required by applicable law or agreed to in writing,
+  ~  software distributed under the License is distributed on an
+  ~  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~  KIND, either express or implied.  See the License for the
+  ~  specific language governing permissions and limitations
+  ~  under the License.
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
+<data-map xmlns="http://cayenne.apache.org/schema/9/modelMap"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://cayenne.apache.org/schema/9/modelMap http://cayenne.apache.org/schema/9/modelMap.xsd"
+          project-version="9">
+
+    <db-entity name="CHILD" schema="SCHEMA_01">
+        <db-attribute name="id" type="INTEGER" isPrimaryKey="true" isMandatory="true"
length="10"/>
+        <db-attribute name="parent_id" type="INTEGER" length="10"/>
+    </db-entity>
+    <db-entity name="PARENT" schema="SCHEMA_01">
+        <db-attribute name="NAME" type="VARCHAR" length="255"/>
+        <db-attribute name="id" type="INTEGER" isPrimaryKey="true" isMandatory="true"
length="10"/>
+    </db-entity>
+    <obj-entity name="Child" className="Child" dbEntityName="CHILD">
+    </obj-entity>
+    <obj-entity name="Parent" className="Parent" dbEntityName="PARENT">
+        <obj-attribute name="name" type="java.lang.String" db-attribute-path="NAME"/>
+    </obj-entity>
+    <obj-entity name="ParentSub" superEntityName="Parent" className="ParentSub">
+    </obj-entity>
+    <db-relationship name="parent" source="CHILD" target="PARENT" toMany="false">
+        <db-attribute-pair source="parent_id" target="id"/>
+    </db-relationship>
+    <db-relationship name="children" source="PARENT" target="CHILD" toMany="true">
+        <db-attribute-pair source="id" target="parent_id"/>
+    </db-relationship>
+    <obj-relationship name="parent" source="Child" target="Parent" deleteRule="Nullify"
db-relationship-path="parent"/>
+    <obj-relationship name="parent1" source="Child" target="ParentSub" deleteRule="Nullify"
db-relationship-path="parent"/>
+    <obj-relationship name="children" source="Parent" target="Child" deleteRule="Deny"
db-relationship-path="children"/>
+</data-map>
+
+
+
+
+
+
+
+
+

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bd1b109a/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testInheritance.sql
----------------------------------------------------------------------
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testInheritance.sql
b/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testInheritance.sql
new file mode 100644
index 0000000..595da3e
--- /dev/null
+++ b/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testInheritance.sql
@@ -0,0 +1,35 @@
+--  Licensed to the Apache Software Foundation (ASF) under one
+--  or more contributor license agreements.  See the NOTICE file
+--  distributed with this work for additional information
+-- regarding copyright ownership.  The ASF licenses this file
+--  to you under the Apache License, Version 2.0 (the
+--  "License"); you may not use this file except in compliance
+--  with the License.  You may obtain a copy of the License at
+--
+--    http://www.apache.org/licenses/LICENSE-2.0
+--
+--  Unless required by applicable law or agreed to in writing,
+--  software distributed under the License is distributed on an
+--  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+--  KIND, either express or implied.  See the License for the
+--  specific language governing permissions and limitations
+--  under the License.
+
+CREATE SCHEMA schema_01;
+SET SCHEMA schema_01;
+
+CREATE TABLE schema_01.parent (
+    id INTEGER NOT NULL,
+    name VARCHAR(255),
+    PRIMARY KEY (id)
+);
+
+CREATE TABLE schema_01.child (
+    id INTEGER,
+    parent_id INTEGER,
+    PRIMARY KEY (id)
+);
+
+ALTER TABLE schema_01.child
+    ADD FOREIGN KEY (parent_id)
+    REFERENCES schema_01.parent (id);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/bd1b109a/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 9b4cb30..3b1ef7f 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
@@ -35,6 +35,7 @@ import org.apache.cayenne.modeler.util.CayenneAction;
 
 import java.awt.event.ActionEvent;
 import java.util.Collection;
+import java.util.Iterator;
 
 /**
  * Action that synchronizes all ObjEntities with the current state of the
@@ -85,6 +86,8 @@ public class DbEntitySyncAction extends CayenneAction {
 			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) {
 
@@ -111,6 +114,20 @@ 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) {
+		// entities.removeIf(c -> c.getSuperEntity() != null);
+		Iterator<ObjEntity> it = entities.iterator();
+		while(it.hasNext()) {
+			if(it.next().getSuperEntity() != null) {
+				it.remove();
+			}
+		}
+	}
+
 	static class PreserveRelationshipNameGenerator extends DefaultObjectNameGenerator {
 
 		@Override


Mime
View raw message