You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by sk...@apache.org on 2016/10/20 14:49:42 UTC

[7/7] cayenne git commit: Upgrade datamap schema version from 8 to 9;

Upgrade datamap schema version from 8 to 9;


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

Branch: refs/heads/master
Commit: f72210ccbd5663b71a0aee49ab527cd108bece3c
Parents: aa6efa4
Author: Savva Kolbachev <s....@gmail.com>
Authored: Thu Oct 20 17:49:09 2016 +0300
Committer: Savva Kolbachev <s....@gmail.com>
Committed: Thu Oct 20 17:49:09 2016 +0300

----------------------------------------------------------------------
 .../src/test/resources/cayenne-crypto.xml       |   2 +-
 .../src/test/resources/datamap.map.xml          |   6 +-
 .../src/test/resources/cayenne-java8.xml        |   2 +-
 cayenne-java8/src/test/resources/java8.map.xml  |   6 +-
 .../src/test/resources/cayenne-joda.xml         |   2 +-
 cayenne-joda/src/test/resources/joda.map.xml    |   6 +-
 .../src/test/resources/cayenne-lifecycle.xml    |   2 +-
 .../src/test/resources/lifecycle-map.map.xml    |   6 +-
 .../cayenne/project/CayenneProjectModule.java   |   4 +-
 .../cayenne/project/FileProjectSaver.java       |   2 +-
 .../project/upgrade/v9/ProjectUpgrader_V9.java  |  44 +++
 .../project/upgrade/v9/UpgradeHandler_V9.java   | 166 +++++++++
 .../upgrade/v7/ProjectUpgrader_V7Test.java      |  54 ++-
 .../upgrade/v8/ProjectUpgrader_V8Test.java      |  24 +-
 .../upgrade/v9/ProjectUpgrader_V9Test.java      | 185 ++++++++++
 .../project/upgrade/v9/cayenne-PROJECT1.xml     |  15 +
 .../project/upgrade/v9/reverseEngineering.xml   |  11 +
 .../upgrade/v9/testProjectMap1_1.map.xml        |  15 +
 .../upgrade/v9/testProjectMap1_2.map.xml        |   7 +
 .../src/test/resources/cayenne-protostuff.xml   |   2 +-
 .../src/test/resources/protostuff.map.xml       |   6 +-
 .../java/org/apache/cayenne/map/DataMap.java    |   4 +-
 .../org/apache/cayenne/schema/8/modelMap.xsd    | 338 -------------------
 .../cayenne/schema/8/reverseEngineering.xsd     | 141 --------
 .../org/apache/cayenne/schema/9/modelMap.xsd    | 338 +++++++++++++++++++
 .../src/test/resources/array-type.map.xml       |   6 +-
 .../src/test/resources/binary-pk.map.xml        |   6 +-
 .../test/resources/cay743/cayenne-domain.xml    |   2 +-
 .../src/test/resources/cay743/map1.map.xml      |   6 +-
 .../src/test/resources/cay743/map2.map.xml      |   6 +-
 .../src/test/resources/cayenne-array-type.xml   |   2 +-
 .../src/test/resources/cayenne-binary-pk.xml    |   2 +-
 .../src/test/resources/cayenne-compound.xml     |   2 +-
 .../src/test/resources/cayenne-date-time.xml    |   2 +-
 .../src/test/resources/cayenne-delete-rules.xml |   2 +-
 .../src/test/resources/cayenne-embeddable.xml   |   2 +-
 .../src/test/resources/cayenne-empty.xml        |   2 +-
 .../src/test/resources/cayenne-enum.xml         |   2 +-
 .../test/resources/cayenne-extended-type.xml    |   2 +-
 .../src/test/resources/cayenne-generated.xml    |   2 +-
 .../src/test/resources/cayenne-generic.xml      |   2 +-
 .../cayenne-inheritance-single-table1.xml       |   2 +-
 .../resources/cayenne-inheritance-vertical.xml  |   2 +-
 .../src/test/resources/cayenne-inheritance.xml  |   2 +-
 .../cayenne-lifecycle-callbacks-order.xml       |   2 +-
 .../src/test/resources/cayenne-lifecycles.xml   |   2 +-
 .../src/test/resources/cayenne-lob.xml          |   2 +-
 .../src/test/resources/cayenne-locking.xml      |   2 +-
 .../src/test/resources/cayenne-map-to-many.xml  |   2 +-
 .../test/resources/cayenne-meaningful-pk.xml    |   2 +-
 .../src/test/resources/cayenne-misc-types.xml   |   2 +-
 .../cayenne-mixed-persistence-strategy.xml      |   2 +-
 .../src/test/resources/cayenne-multi-tier.xml   |   2 +-
 .../src/test/resources/cayenne-multinode.xml    |   2 +-
 .../src/test/resources/cayenne-no-pk.xml        |   2 +-
 .../test/resources/cayenne-numeric-types.xml    |   2 +-
 .../src/test/resources/cayenne-oneway-rels.xml  |   2 +-
 ...nne.configuration.rop.server.test-config.xml |   2 +-
 .../src/test/resources/cayenne-people.xml       |   2 +-
 .../src/test/resources/cayenne-persistent.xml   |   2 +-
 .../src/test/resources/cayenne-primitive.xml    |   2 +-
 .../src/test/resources/cayenne-qualified.xml    |   2 +-
 .../resources/cayenne-quoted-identifiers.xml    |   2 +-
 .../src/test/resources/cayenne-reflexive.xml    |   2 +-
 .../cayenne-relationships-activity.xml          |   2 +-
 .../cayenne-relationships-child-master.xml      |   2 +-
 .../resources/cayenne-relationships-clob.xml    |   2 +-
 ...cayenne-relationships-collection-to-many.xml |   2 +-
 .../cayenne-relationships-delete-rules.xml      |   2 +-
 .../cayenne-relationships-flattened.xml         |   2 +-
 .../cayenne-relationships-set-to-many.xml       |   2 +-
 .../cayenne-relationships-to-many-fk.xml        |   2 +-
 .../cayenne-relationships-to-one-fk.xml         |   2 +-
 .../test/resources/cayenne-relationships.xml    |   2 +-
 .../src/test/resources/cayenne-return-types.xml |   2 +-
 .../test/resources/cayenne-small-testmap.xml    |   2 +-
 .../src/test/resources/cayenne-soft-delete.xml  |   2 +-
 .../src/test/resources/cayenne-sus.xml          |   2 +-
 .../test/resources/cayenne-table-primitives.xml |   2 +-
 .../src/test/resources/cayenne-testmap.xml      |   2 +-
 .../src/test/resources/cayenne-things.xml       |   2 +-
 .../src/test/resources/cayenne-toone.xml        |   2 +-
 .../cayenne-unsupported-distinct-types.xml      |   2 +-
 .../src/test/resources/cayenne-uuid.xml         |   2 +-
 .../src/test/resources/compound.map.xml         |   6 +-
 .../src/test/resources/date-time.map.xml        |   6 +-
 .../src/test/resources/delete-rules.map.xml     |   6 +-
 .../src/test/resources/embeddable.map.xml       |   6 +-
 cayenne-server/src/test/resources/empty.map.xml |   6 +-
 cayenne-server/src/test/resources/enum.map.xml  |   6 +-
 .../src/test/resources/extended-type.map.xml    |   6 +-
 .../src/test/resources/generated.map.xml        |   6 +-
 .../src/test/resources/generic.map.xml          |   6 +-
 .../resources/inheritance-single-table1.map.xml |   6 +-
 .../test/resources/inheritance-vertical.map.xml |   6 +-
 .../src/test/resources/inheritance.map.xml      |   6 +-
 .../resources/lifecycle-callbacks-order.map.xml |   6 +-
 .../src/test/resources/lifecycles.map.xml       |   6 +-
 cayenne-server/src/test/resources/lob.map.xml   |   6 +-
 .../src/test/resources/locking.map.xml          |   6 +-
 .../src/test/resources/map-db1.map.xml          |   6 +-
 .../src/test/resources/map-db2.map.xml          |   6 +-
 .../src/test/resources/map-to-many.map.xml      |   6 +-
 .../src/test/resources/meaningful-pk.map.xml    |   6 +-
 .../src/test/resources/misc-types.map.xml       |   6 +-
 .../mixed-persistence-strategy.map.xml          |   6 +-
 .../src/test/resources/multi-tier.map.xml       |   6 +-
 cayenne-server/src/test/resources/no-pk.map.xml |   6 +-
 .../src/test/resources/numeric-types.map.xml    |   6 +-
 .../src/test/resources/oneway-rels.map.xml      |   6 +-
 .../src/test/resources/people.map.xml           |   6 +-
 .../src/test/resources/persistent.map.xml       |   6 +-
 .../src/test/resources/primitive.map.xml        |   6 +-
 .../src/test/resources/qualified.map.xml        |   6 +-
 .../test/resources/quoted-identifiers.map.xml   |   6 +-
 .../src/test/resources/reflexive.map.xml        |   6 +-
 .../resources/relationships-activity.map.xml    |   6 +-
 .../relationships-child-master.map.xml          |   6 +-
 .../test/resources/relationships-clob.map.xml   |   6 +-
 .../relationships-collection-to-many.map.xml    |   6 +-
 .../relationships-delete-rules.map.xml          |   6 +-
 .../resources/relationships-flattened.map.xml   |   6 +-
 .../resources/relationships-set-to-many.map.xml |   6 +-
 .../resources/relationships-to-many-fk.map.xml  |   6 +-
 .../resources/relationships-to-one-fk.map.xml   |   6 +-
 .../src/test/resources/relationships.map.xml    |   6 +-
 .../src/test/resources/return-types.map.xml     |   6 +-
 .../src/test/resources/soft-delete.map.xml      |   6 +-
 .../src/test/resources/sus-map.map.xml          |   6 +-
 .../src/test/resources/table-primitives.map.xml |   6 +-
 .../src/test/resources/testmap.map.xml          |   6 +-
 .../src/test/resources/things.map.xml           |   6 +-
 cayenne-server/src/test/resources/toone.map.xml |   6 +-
 .../unsupported-distinct-types.map.xml          |   6 +-
 cayenne-server/src/test/resources/uuid.map.xml  |   6 +-
 .../tools/build-include-table.map.xml-result    |   8 +-
 .../testCustomObjectLayerSettings.map.xml       |   6 +-
 ...testCustomObjectLayerSettings.map.xml-result |   6 +-
 .../dbimport/testDefaultPackage.map.xml-result  |   6 +-
 .../testFilteringWithSchema.map.xml-result      |   6 +-
 ...nsManyToManyWithRecursiveLink.map.xml-result |   6 +-
 .../testImportAddTableAndColumn.map.xml         |   6 +-
 .../testImportAddTableAndColumn.map.xml-result  |   6 +-
 .../testImportNewDataMap.map.xml-result         |   6 +-
 .../dbimport/testImportWithoutChanges.map.xml   |   6 +-
 .../testImportWithoutChanges.map.xml-result     |   6 +-
 .../tools/dbimport/testOneToOne.map.xml-result  |   6 +-
 .../testPreserveCustomObjMappings.map.xml       |   6 +-
 ...testPreserveCustomObjMappings.map.xml-result |   6 +-
 .../dbimport/testPreserveRelationships.map.xml  |   6 +-
 .../testPreserveRelationships.map.xml-result    |   6 +-
 .../testSchemasAndTableExclude.map.xml-result   |   6 +-
 .../dbimport/testSkipPrimaryKeyLoading.map.xml  |   6 +-
 .../testSkipPrimaryKeyLoading.map.xml-result    |   6 +-
 .../testSkipRelationshipsLoading.map.xml        |   6 +-
 .../testSkipRelationshipsLoading.map.xml-result |   6 +-
 ...SupportsCatalogsOnReverseEngineering.map.xml |   6 +-
 .../dbimport/testTableTypes.map.xml-result      |   6 +-
 .../dbimport/testUnFlattensManyToMany.map.xml   |   6 +-
 .../testUnFlattensManyToMany.map.xml-result     |   6 +-
 .../dbimport/testViewsExclude.map.xml-result    |   6 +-
 .../src/main/resources/cayenne-project.xml      |   2 +-
 .../src/main/resources/datamap.map.xml          |   6 +-
 163 files changed, 1151 insertions(+), 843 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/f72210cc/cayenne-crypto/src/test/resources/cayenne-crypto.xml
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/test/resources/cayenne-crypto.xml b/cayenne-crypto/src/test/resources/cayenne-crypto.xml
index cf7e20f..bd98b69 100644
--- a/cayenne-crypto/src/test/resources/cayenne-crypto.xml
+++ b/cayenne-crypto/src/test/resources/cayenne-crypto.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<domain project-version="8">
+<domain project-version="9">
 	<map name="datamap"/>
 
 	<node name="datanode"

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f72210cc/cayenne-crypto/src/test/resources/datamap.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/test/resources/datamap.map.xml b/cayenne-crypto/src/test/resources/datamap.map.xml
index b71de41..4182205 100644
--- a/cayenne-crypto/src/test/resources/datamap.map.xml
+++ b/cayenne-crypto/src/test/resources/datamap.map.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
-<data-map xmlns="http://cayenne.apache.org/schema/8/modelMap"
+<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/8/modelMap http://cayenne.apache.org/schema/8/modelMap.xsd"
-	 project-version="8">
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/9/modelMap http://cayenne.apache.org/schema/9/modelMap.xsd"
+	 project-version="9">
 	<property name="defaultPackage" value="org.apache.cayenne.crypto.db"/>
 	<db-entity name="TABLE1">
 		<db-attribute name="CRYPTO_INT" type="BLOB"/>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f72210cc/cayenne-java8/src/test/resources/cayenne-java8.xml
----------------------------------------------------------------------
diff --git a/cayenne-java8/src/test/resources/cayenne-java8.xml b/cayenne-java8/src/test/resources/cayenne-java8.xml
index d4ad35d..93f67fd 100644
--- a/cayenne-java8/src/test/resources/cayenne-java8.xml
+++ b/cayenne-java8/src/test/resources/cayenne-java8.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<domain project-version="8">
+<domain project-version="9">
 	<map name="java8"/>
 
 	<node name="datanode"

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f72210cc/cayenne-java8/src/test/resources/java8.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-java8/src/test/resources/java8.map.xml b/cayenne-java8/src/test/resources/java8.map.xml
index 1d8a274..734c915 100644
--- a/cayenne-java8/src/test/resources/java8.map.xml
+++ b/cayenne-java8/src/test/resources/java8.map.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
-<data-map xmlns="http://cayenne.apache.org/schema/8/modelMap"
+<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/8/modelMap http://cayenne.apache.org/schema/8/modelMap.xsd"
-	 project-version="8">
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/9/modelMap http://cayenne.apache.org/schema/9/modelMap.xsd"
+	 project-version="9">
 	<property name="defaultPackage" value="org.apache.cayenne.java8.db"/>
 	<db-entity name="LOCAL_DATE_TEST">
 		<db-attribute name="Date" type="DATE"/>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f72210cc/cayenne-joda/src/test/resources/cayenne-joda.xml
----------------------------------------------------------------------
diff --git a/cayenne-joda/src/test/resources/cayenne-joda.xml b/cayenne-joda/src/test/resources/cayenne-joda.xml
index 7c7ef9d..68673f9 100644
--- a/cayenne-joda/src/test/resources/cayenne-joda.xml
+++ b/cayenne-joda/src/test/resources/cayenne-joda.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<domain project-version="8">
+<domain project-version="9">
 	<map name="joda"/>
 
 	<node name="datanode"

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f72210cc/cayenne-joda/src/test/resources/joda.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-joda/src/test/resources/joda.map.xml b/cayenne-joda/src/test/resources/joda.map.xml
index 0234bf8..b1021f8 100644
--- a/cayenne-joda/src/test/resources/joda.map.xml
+++ b/cayenne-joda/src/test/resources/joda.map.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
-<data-map xmlns="http://cayenne.apache.org/schema/8/modelMap"
+<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/8/modelMap http://cayenne.apache.org/schema/8/modelMap.xsd"
-	 project-version="8">
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/9/modelMap http://cayenne.apache.org/schema/9/modelMap.xsd"
+	 project-version="9">
 	<property name="defaultPackage" value="org.apache.cayenne.joda.db"/>
 	<db-entity name="DATE_TIME_TEST">
 		<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f72210cc/cayenne-lifecycle/src/test/resources/cayenne-lifecycle.xml
----------------------------------------------------------------------
diff --git a/cayenne-lifecycle/src/test/resources/cayenne-lifecycle.xml b/cayenne-lifecycle/src/test/resources/cayenne-lifecycle.xml
index cffc16b..5b9a83e 100644
--- a/cayenne-lifecycle/src/test/resources/cayenne-lifecycle.xml
+++ b/cayenne-lifecycle/src/test/resources/cayenne-lifecycle.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<domain project-version="8">
+<domain project-version="9">
 	<map name="lifecycle-map"/>
 
 	<node name="lifecycle-db"

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f72210cc/cayenne-lifecycle/src/test/resources/lifecycle-map.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-lifecycle/src/test/resources/lifecycle-map.map.xml b/cayenne-lifecycle/src/test/resources/lifecycle-map.map.xml
index 312b7ac..7b62e06 100644
--- a/cayenne-lifecycle/src/test/resources/lifecycle-map.map.xml
+++ b/cayenne-lifecycle/src/test/resources/lifecycle-map.map.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
-<data-map xmlns="http://cayenne.apache.org/schema/8/modelMap"
+<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/8/modelMap http://cayenne.apache.org/schema/8/modelMap.xsd"
-	 project-version="8">
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/9/modelMap http://cayenne.apache.org/schema/9/modelMap.xsd"
+	 project-version="9">
 	<property name="defaultPackage" value="org.apache.cayenne.lifecycle.db"/>
 	<db-entity name="AUDITABLE1">
 		<db-attribute name="CHAR_PROPERTY1" type="VARCHAR" length="200"/>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f72210cc/cayenne-project/src/main/java/org/apache/cayenne/project/CayenneProjectModule.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/CayenneProjectModule.java b/cayenne-project/src/main/java/org/apache/cayenne/project/CayenneProjectModule.java
index f066e2f..6f31b9c 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/CayenneProjectModule.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/CayenneProjectModule.java
@@ -21,7 +21,7 @@ package org.apache.cayenne.project;
 import org.apache.cayenne.di.Binder;
 import org.apache.cayenne.di.Module;
 import org.apache.cayenne.project.upgrade.ProjectUpgrader;
-import org.apache.cayenne.project.upgrade.v8.ProjectUpgrader_V8;
+import org.apache.cayenne.project.upgrade.v9.ProjectUpgrader_V9;
 import org.apache.cayenne.project.validation.DefaultProjectValidator;
 import org.apache.cayenne.project.validation.ProjectValidator;
 
@@ -36,7 +36,7 @@ public class CayenneProjectModule implements Module {
     public void configure(Binder binder) {
         binder.bind(ProjectLoader.class).to(DataChannelProjectLoader.class);
         binder.bind(ProjectSaver.class).to(FileProjectSaver.class);
-        binder.bind(ProjectUpgrader.class).to(ProjectUpgrader_V8.class);
+        binder.bind(ProjectUpgrader.class).to(ProjectUpgrader_V9.class);
         binder.bind(ProjectValidator.class).to(DefaultProjectValidator.class);
         binder.bind(ConfigurationNodeParentGetter.class).to(
                 DefaultConfigurationNodeParentGetter.class);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f72210cc/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java b/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java
index 95ef738..5b22b08 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java
@@ -62,7 +62,7 @@ public class FileProjectSaver implements ProjectSaver {
 	}
 
 	public String getSupportedVersion() {
-		return "8";
+		return "9";
 	}
 
 	public void save(Project project) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f72210cc/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/v9/ProjectUpgrader_V9.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/v9/ProjectUpgrader_V9.java b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/v9/ProjectUpgrader_V9.java
new file mode 100644
index 0000000..2f585b2
--- /dev/null
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/v9/ProjectUpgrader_V9.java
@@ -0,0 +1,44 @@
+/*****************************************************************
+ *   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.
+ ****************************************************************/
+package org.apache.cayenne.project.upgrade.v9;
+
+
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.di.Injector;
+import org.apache.cayenne.project.upgrade.ProjectUpgrader;
+import org.apache.cayenne.project.upgrade.UpgradeHandler;
+import org.apache.cayenne.resource.Resource;
+
+/**
+ * A ProjectUpgrader that handles project upgrades from version 4.0.M4 and 8
+ * to version 9.
+ */
+public class ProjectUpgrader_V9 implements ProjectUpgrader {
+
+    @Inject
+    protected Injector injector;
+
+    @Override
+    public UpgradeHandler getUpgradeHandler(Resource projectSource) {
+        UpgradeHandler_V9 handler = new UpgradeHandler_V9(projectSource);
+        injector.injectMembers(handler);
+        return handler;
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f72210cc/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/v9/UpgradeHandler_V9.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/v9/UpgradeHandler_V9.java b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/v9/UpgradeHandler_V9.java
new file mode 100644
index 0000000..2a3faaa
--- /dev/null
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/v9/UpgradeHandler_V9.java
@@ -0,0 +1,166 @@
+/*****************************************************************
+ *   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.
+ ****************************************************************/
+package org.apache.cayenne.project.upgrade.v9;
+
+import org.apache.cayenne.ConfigurationException;
+import org.apache.cayenne.configuration.ConfigurationTree;
+import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.configuration.XMLDataChannelDescriptorLoader;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.di.Injector;
+import org.apache.cayenne.project.Project;
+import org.apache.cayenne.project.ProjectSaver;
+import org.apache.cayenne.project.upgrade.BaseUpgradeHandler;
+import org.apache.cayenne.project.upgrade.UpgradeHandler;
+import org.apache.cayenne.project.upgrade.UpgradeMetaData;
+import org.apache.cayenne.project.upgrade.UpgradeType;
+import org.apache.cayenne.project.upgrade.v8.ProjectUpgrader_V8;
+import org.apache.cayenne.resource.Resource;
+import org.apache.cayenne.util.Util;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathFactory;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class UpgradeHandler_V9 extends BaseUpgradeHandler {
+
+    static final String TO_VERSION = "9";
+    static final String MIN_SUPPORTED_VERSION = "8";
+
+    @Inject
+    protected Injector injector;
+
+    @Inject
+    private ProjectSaver projectSaver;
+
+    public UpgradeHandler_V9(Resource source) {
+        super(source);
+    }
+
+    @Override
+    protected Resource doPerformUpgrade(UpgradeMetaData metaData) throws ConfigurationException {
+        if (compareVersions(metaData.getProjectVersion(), MIN_SUPPORTED_VERSION) == 0) {
+            ProjectUpgrader_V8 upgraderV8 = new ProjectUpgrader_V8();
+            injector.injectMembers(upgraderV8);
+            UpgradeHandler handlerV8 = upgraderV8.getUpgradeHandler(projectSource);
+            projectSource = handlerV8.performUpgrade();
+        }
+
+        deleteReverseEngineeringFiles(projectSource);
+
+        XMLDataChannelDescriptorLoader loader = new XMLDataChannelDescriptorLoader();
+        injector.injectMembers(loader);
+        ConfigurationTree<DataChannelDescriptor> tree = loader.load(projectSource);
+        Project project = new Project(tree);
+
+        // load and safe cycle updates project version
+        projectSaver.save(project);
+        return project.getConfigurationResource();
+    }
+
+    private void deleteReverseEngineeringFiles(Resource projectSource) {
+        Document projectDoc = readDOMDocument(projectSource);
+
+        try {
+            XPath xpath = XPathFactory.newInstance().newXPath();
+            NodeList nodes = (NodeList) xpath.evaluate("/domain/map/@name", projectDoc, XPathConstants.NODESET);
+
+            for (int i = 0; i < nodes.getLength(); i++) {
+                Node mapNode = nodes.item(i);
+
+                Resource mapResource = projectSource.getRelativeResource(mapNode.getNodeValue() + ".map.xml");
+
+                Document datamapDoc = readDOMDocument(mapResource);
+
+                Node reNode = (Node) xpath.evaluate("/data-map/reverse-engineering-config",
+                        datamapDoc, XPathConstants.NODE);
+
+                if (reNode != null) {
+                    String reFileName = ((Element) reNode).getAttribute("name") + ".xml";
+
+                    try {
+                        String directoryPath = Util.toFile(projectSource.getURL()).getParent();
+
+                        File file = new File(directoryPath + "/" + reFileName);
+                        if (file.exists()) {
+                            file.delete();
+                        }
+                    } catch (Exception e) {
+                        // ignore...
+                    }
+                }
+            }
+
+        } catch (Exception e) {
+            throw new ConfigurationException("Unable to parse Cayenne XML configuration files.", e);
+        }
+    }
+
+    private Document readDOMDocument(Resource resource) {
+        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
+        try {
+            DocumentBuilder domBuilder = documentBuilderFactory.newDocumentBuilder();
+
+            try (InputStream inputStream = resource.getURL().openStream()) {
+                return domBuilder.parse(inputStream);
+            } catch (IOException | SAXException e) {
+                throw new ConfigurationException("Error loading configuration from %s", e, resource);
+            }
+        } catch (ParserConfigurationException e) {
+            throw new ConfigurationException(e);
+        }
+    }
+
+    @Override
+    protected UpgradeMetaData loadMetaData() {
+        String version = loadProjectVersion();
+
+        UpgradeMetaData metadata = new UpgradeMetaData();
+        metadata.setSupportedVersion(TO_VERSION);
+        metadata.setProjectVersion(version);
+
+        int c1 = compareVersions(version, MIN_SUPPORTED_VERSION);
+        int c2 = compareVersions(TO_VERSION, version);
+
+        if (c1 < 0) {
+            metadata.setIntermediateUpgradeVersion(MIN_SUPPORTED_VERSION);
+            metadata.setUpgradeType(UpgradeType.INTERMEDIATE_UPGRADE_NEEDED);
+        } else if (c2 < 0) {
+            metadata.setUpgradeType(UpgradeType.DOWNGRADE_NEEDED);
+        } else if (c2 == 0) {
+            metadata.setUpgradeType(UpgradeType.UPGRADE_NOT_NEEDED);
+        } else {
+            metadata.setUpgradeType(UpgradeType.UPGRADE_NEEDED);
+        }
+
+        return metadata;
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f72210cc/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/v7/ProjectUpgrader_V7Test.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/v7/ProjectUpgrader_V7Test.java b/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/v7/ProjectUpgrader_V7Test.java
index 7fa997b..d97733f 100644
--- a/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/v7/ProjectUpgrader_V7Test.java
+++ b/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/v7/ProjectUpgrader_V7Test.java
@@ -18,36 +18,13 @@
  ****************************************************************/
 package org.apache.cayenne.project.upgrade.v7;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-import java.io.File;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpression;
-import javax.xml.xpath.XPathFactory;
-
 import org.apache.cayenne.configuration.ConfigurationNameMapper;
 import org.apache.cayenne.configuration.DataMapLoader;
 import org.apache.cayenne.configuration.DefaultConfigurationNameMapper;
 import org.apache.cayenne.configuration.XMLDataMapLoader;
 import org.apache.cayenne.configuration.server.JNDIDataSourceFactory;
 import org.apache.cayenne.configuration.server.XMLPoolingDataSourceFactory;
-import org.apache.cayenne.di.AdhocObjectFactory;
-import org.apache.cayenne.di.Binder;
-import org.apache.cayenne.di.ClassLoaderManager;
-import org.apache.cayenne.di.DIBootstrap;
-import org.apache.cayenne.di.Injector;
-import org.apache.cayenne.di.Module;
+import org.apache.cayenne.di.*;
 import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
 import org.apache.cayenne.di.spi.DefaultClassLoaderManager;
 import org.apache.cayenne.project.FileProjectSaver;
@@ -64,6 +41,17 @@ import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpression;
+import javax.xml.xpath.XPathFactory;
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
 public class ProjectUpgrader_V7Test extends Project2Case {
 
 	@Test
@@ -274,7 +262,7 @@ public class ProjectUpgrader_V7Test extends Project2Case {
 
 		XPath xpath = XPathFactory.newInstance().newXPath();
 		assertEquals("", xpath.evaluate("/domain/@name", document));
-		assertEquals("8", xpath.evaluate("/domain/@project-version", document));
+		assertEquals("9", xpath.evaluate("/domain/@project-version", document));
 
 		NodeList maps = (NodeList) xpath.evaluate("/domain/map", document, XPathConstants.NODESET);
 		assertNotNull(maps);
@@ -316,7 +304,7 @@ public class ProjectUpgrader_V7Test extends Project2Case {
 
 		XPath xpath = XPathFactory.newInstance().newXPath();
 		assertEquals("", xpath.evaluate("/domain/@name", document));
-		assertEquals("8", xpath.evaluate("/domain/@project-version", document));
+		assertEquals("9", xpath.evaluate("/domain/@project-version", document));
 
 		NodeList maps = (NodeList) xpath.evaluate("/domain/map", document, XPathConstants.NODESET);
 		assertNotNull(maps);
@@ -350,14 +338,14 @@ public class ProjectUpgrader_V7Test extends Project2Case {
 		Document document = toDOMTree(file);
 
 		XPath xpath = XPathFactory.newInstance().newXPath();
-		assertEquals("8", xpath.evaluate("/data-map/@project-version", document));
+		assertEquals("9", xpath.evaluate("/data-map/@project-version", document));
 	}
 
 	private void assertPerformUpgrade_3_0_0_1_d1Map2(File file) throws Exception {
 		Document document = toDOMTree(file);
 
 		XPath xpath = XPathFactory.newInstance().newXPath();
-		assertEquals("8", xpath.evaluate("/data-map/@project-version", document));
+		assertEquals("9", xpath.evaluate("/data-map/@project-version", document));
 	}
 
 	@Test
@@ -408,7 +396,7 @@ public class ProjectUpgrader_V7Test extends Project2Case {
 		Document document = toDOMTree(file);
 
 		XPath xpath = XPathFactory.newInstance().newXPath();
-		assertEquals("8", xpath.evaluate("/data-map/@project-version", document));
+		assertEquals("9", xpath.evaluate("/data-map/@project-version", document));
 
 		NodeList maps = (NodeList) xpath.evaluate("/data-map/obj-entity/entity-listener", document,
 				XPathConstants.NODESET);
@@ -420,14 +408,14 @@ public class ProjectUpgrader_V7Test extends Project2Case {
 		Document document = toDOMTree(file);
 
 		XPath xpath = XPathFactory.newInstance().newXPath();
-		assertEquals("8", xpath.evaluate("/domain/@project-version", document));
+		assertEquals("9", xpath.evaluate("/domain/@project-version", document));
 	}
 
 	private void assertPerformUpgradeMap2(File file) throws Exception {
 		Document document = toDOMTree(file);
 
 		XPath xpath = XPathFactory.newInstance().newXPath();
-		assertEquals("8", xpath.evaluate("/data-map/@project-version", document));
+		assertEquals("9", xpath.evaluate("/data-map/@project-version", document));
 	}
 
 	@Test
@@ -483,7 +471,7 @@ public class ProjectUpgrader_V7Test extends Project2Case {
 		Document document = toDOMTree(file);
 
 		XPath xpath = XPathFactory.newInstance().newXPath();
-		assertEquals("8", xpath.evaluate("/data-map/@project-version", document));
+		assertEquals("9", xpath.evaluate("/data-map/@project-version", document));
 
 		String xpathValue = "/data-map/obj-entity[@name='GreatArtist']/obj-attribute";
 		XPathExpression expr = xpath.compile(xpathValue);
@@ -496,7 +484,7 @@ public class ProjectUpgrader_V7Test extends Project2Case {
 		Document document = toDOMTree(file);
 
 		XPath xpath = XPathFactory.newInstance().newXPath();
-		assertEquals("8", xpath.evaluate("/data-map/@project-version", document));
+		assertEquals("9", xpath.evaluate("/data-map/@project-version", document));
 
 		String xpath_1 = "/data-map/obj-entity[@name='House']/obj-attribute/@name";
 		String xpath_2 = "/data-map/obj-entity[@name='Penthouse']/obj-attribute/@name";

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f72210cc/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/v8/ProjectUpgrader_V8Test.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/v8/ProjectUpgrader_V8Test.java b/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/v8/ProjectUpgrader_V8Test.java
index ceb87a8..610d77c 100644
--- a/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/v8/ProjectUpgrader_V8Test.java
+++ b/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/v8/ProjectUpgrader_V8Test.java
@@ -1,3 +1,21 @@
+/*****************************************************************
+ *   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.
+ ****************************************************************/
 package org.apache.cayenne.project.upgrade.v8;
 
 import org.apache.cayenne.CayenneRuntimeException;
@@ -126,7 +144,7 @@ public class ProjectUpgrader_V8Test extends Project2Case {
 
         XPath xpath = XPathFactory.newInstance().newXPath();
         assertEquals("", xpath.evaluate("/domain/@name", document));
-        assertEquals("8", xpath.evaluate("/domain/@project-version", document));
+        assertEquals("9", xpath.evaluate("/domain/@project-version", document));
 
         NodeList maps = (NodeList) xpath.evaluate("/domain/map", document, XPathConstants.NODESET);
         assertNotNull(maps);
@@ -147,7 +165,7 @@ public class ProjectUpgrader_V8Test extends Project2Case {
         Document document = toDOMTree(file);
 
         XPath xpath = XPathFactory.newInstance().newXPath();
-        assertEquals("8", xpath.evaluate("/data-map/@project-version", document));
+        assertEquals("9", xpath.evaluate("/data-map/@project-version", document));
 
         NodeList queryNodes = (NodeList) xpath.evaluate("/data-map/query", document, XPathConstants.NODESET);
         assertNotNull(queryNodes);
@@ -174,6 +192,6 @@ public class ProjectUpgrader_V8Test extends Project2Case {
         Document document = toDOMTree(file);
 
         XPath xpath = XPathFactory.newInstance().newXPath();
-        assertEquals("8", xpath.evaluate("/data-map/@project-version", document));
+        assertEquals("9", xpath.evaluate("/data-map/@project-version", document));
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f72210cc/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/v9/ProjectUpgrader_V9Test.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/v9/ProjectUpgrader_V9Test.java b/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/v9/ProjectUpgrader_V9Test.java
new file mode 100644
index 0000000..32f4b68
--- /dev/null
+++ b/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/v9/ProjectUpgrader_V9Test.java
@@ -0,0 +1,185 @@
+/*****************************************************************
+ *   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.
+ ****************************************************************/
+package org.apache.cayenne.project.upgrade.v9;
+
+import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.configuration.ConfigurationNameMapper;
+import org.apache.cayenne.configuration.DataMapLoader;
+import org.apache.cayenne.configuration.DefaultConfigurationNameMapper;
+import org.apache.cayenne.configuration.XMLDataMapLoader;
+import org.apache.cayenne.di.*;
+import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
+import org.apache.cayenne.di.spi.DefaultClassLoaderManager;
+import org.apache.cayenne.project.FileProjectSaver;
+import org.apache.cayenne.project.ProjectSaver;
+import org.apache.cayenne.project.unit.Project2Case;
+import org.apache.cayenne.project.upgrade.UpgradeHandler;
+import org.apache.cayenne.resource.Resource;
+import org.apache.cayenne.resource.URLResource;
+import org.apache.cayenne.test.file.FileUtil;
+import org.apache.cayenne.test.resource.ResourceUtil;
+import org.junit.Test;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathFactory;
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertTrue;
+
+public class ProjectUpgrader_V9Test extends Project2Case {
+
+    protected File setupTestDirectory(String subfolder) {
+        String classPath = getClass().getName().replace('.', '/');
+        String location = "target/testrun/" + classPath + "/" + subfolder;
+        File testDirectory = new File(location);
+
+        // delete old tests
+        if (testDirectory.exists()) {
+            if (!FileUtil.delete(location, true)) {
+                throw new CayenneRuntimeException(
+                        "Error deleting test directory '%s'",
+                        location);
+            }
+        }
+
+        if (!testDirectory.mkdirs()) {
+            throw new CayenneRuntimeException(
+                    "Error creating test directory '%s'",
+                    location);
+        }
+
+        return testDirectory;
+    }
+
+    @Test
+    public void testPerformUpgradeFrom8() throws Exception {
+
+        File testFolder = setupTestDirectory("testPerformUpgradeFrom8");
+        String sourceUrl = getClass().getPackage().getName().replace('.', '/') + "/";
+
+        List<String> sources = new ArrayList<>();
+
+        sources.add("cayenne-PROJECT1.xml");
+        sources.add("testProjectMap1_1.map.xml");
+        sources.add("testProjectMap1_2.map.xml");
+        sources.add("reverseEngineering.xml");
+
+        // upgrades are done in-place, so copy it first
+        List<File> targetsBefore = new ArrayList<>();
+        for (String source : sources) {
+
+            URL url = getClass().getClassLoader().getResource(sourceUrl + source);
+            File target = new File(testFolder, source);
+            assertNotNull(source);
+            ResourceUtil.copyResourceToFile(url, target);
+            targetsBefore.add(target);
+        }
+
+        Module testModule = new Module() {
+
+            public void configure(Binder binder) {
+                binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class);
+                binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
+                binder.bind(ProjectSaver.class).to(FileProjectSaver.class);
+                binder.bind(ConfigurationNameMapper.class).to(DefaultConfigurationNameMapper.class);
+                binder.bind(DataMapLoader.class).to(XMLDataMapLoader.class);
+            }
+        };
+
+        ProjectUpgrader_V9 upgrader = new ProjectUpgrader_V9();
+        Injector injector = DIBootstrap.createInjector(testModule);
+        injector.injectMembers(upgrader);
+
+        Resource source = new URLResource(targetsBefore.get(0).toURL());
+        UpgradeHandler handler = upgrader.getUpgradeHandler(source);
+
+        Resource upgraded = handler.performUpgrade();
+        assertNotNull(upgraded);
+        assertNotSame(source, upgrader);
+
+        // check that all the new files are created...
+        String[] targetsAfterNames = new String[] {
+                "cayenne-PROJECT1.xml", "testProjectMap1_1.map.xml", "testProjectMap1_2.map.xml"
+        };
+
+        File[] targetsAfter = new File[targetsAfterNames.length];
+        for (int i = 0; i < targetsAfter.length; i++) {
+            targetsAfter[i] = new File(testFolder, targetsAfterNames[i]);
+            assertTrue("File was not created: " + targetsAfter[i].getAbsolutePath(), targetsAfter[i].exists());
+        }
+
+        // assert XML structure of the generated files
+        assertPerformUpgradeFrom8_cayenne(targetsAfter[0]);
+        assertPerformUpgradeFrom8_map1_1(targetsAfter[1]);
+        assertPerformUpgradeFrom8_map1_2(targetsAfter[2]);
+        assertFalse(new File(testFolder, "reverseEngineering.xml").exists());
+    }
+
+    private void assertPerformUpgradeFrom8_cayenne(File file) throws Exception {
+        Document document = toDOMTree(file);
+
+        XPath xpath = XPathFactory.newInstance().newXPath();
+        assertEquals("", xpath.evaluate("/domain/@name", document));
+        assertEquals("9", xpath.evaluate("/domain/@project-version", document));
+
+        NodeList maps = (NodeList) xpath.evaluate("/domain/map", document, XPathConstants.NODESET);
+        assertNotNull(maps);
+        assertEquals(2, maps.getLength());
+
+        Node map1 = maps.item(0);
+        Node map2 = maps.item(1);
+
+        assertEquals("testProjectMap1_1", xpath.evaluate("@name", map1));
+        assertEquals("testProjectMap1_2", xpath.evaluate("@name", map2));
+
+        NodeList nodes = (NodeList) xpath.evaluate("/domain/node", document, XPathConstants.NODESET);
+        assertNotNull(nodes);
+        assertEquals(1, nodes.getLength());
+    }
+
+    private void assertPerformUpgradeFrom8_map1_1(File file) throws Exception {
+        Document document = toDOMTree(file);
+
+        XPath xpath = XPathFactory.newInstance().newXPath();
+        assertEquals("9", xpath.evaluate("/data-map/@project-version", document));
+
+        NodeList reverseEngineeringNodes = (NodeList) xpath.evaluate("/data-map/reverse-engineering-config",
+                document, XPathConstants.NODESET);
+        assertEquals(0, reverseEngineeringNodes.getLength());
+    }
+
+    private void assertPerformUpgradeFrom8_map1_2(File file) throws Exception {
+        Document document = toDOMTree(file);
+
+        XPath xpath = XPathFactory.newInstance().newXPath();
+        assertEquals("9", xpath.evaluate("/data-map/@project-version", document));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f72210cc/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/cayenne-PROJECT1.xml
----------------------------------------------------------------------
diff --git a/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/cayenne-PROJECT1.xml b/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/cayenne-PROJECT1.xml
new file mode 100644
index 0000000..745ea3f
--- /dev/null
+++ b/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/cayenne-PROJECT1.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<domain project-version="8">
+
+    <map name="testProjectMap1_1" />
+    <map name="testProjectMap1_2" />
+
+    <node name="testProjectNode1"
+          adapter="org.example.test.Adapter" factory="org.example.test.DataSourceFactory">
+        <data-source>
+            <connectionPool min="1" max="1" />
+            <login />
+        </data-source>
+        <map-ref name="testProjectMap1_1" />
+    </node>
+</domain>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f72210cc/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/reverseEngineering.xml
----------------------------------------------------------------------
diff --git a/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/reverseEngineering.xml b/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/reverseEngineering.xml
new file mode 100644
index 0000000..f88b81f
--- /dev/null
+++ b/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/reverseEngineering.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<reverseEngineering xsi:schemaLocation="http://cayenne.apache.org/schema/8/reverseEngineering http://cayenne.apache.org/schema/8/reverseEngineering.xsd" xmlns="http://cayenne.apache.org/schema/8/reverseEngineering" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <skipRelationshipsLoading>false</skipRelationshipsLoading>
+    <skipPrimaryKeyLoading>false</skipPrimaryKeyLoading>
+    <catalog>
+        <schema>
+            <includeTable/>
+            <includeProcedure pattern=".*"/>
+        </schema>
+    </catalog>
+</reverseEngineering>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f72210cc/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/testProjectMap1_1.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/testProjectMap1_1.map.xml b/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/testProjectMap1_1.map.xml
new file mode 100644
index 0000000..e7dcd65
--- /dev/null
+++ b/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/testProjectMap1_1.map.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<data-map xmlns="http://cayenne.apache.org/schema/8/modelMap"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://cayenne.apache.org/schema/8/modelMap http://cayenne.apache.org/schema/8/modelMap.xsd"
+          project-version="8">
+    <reverse-engineering-config name="reverseEngineering"/>
+    <db-entity name="Artist">
+        <db-attribute name="untitledAttr" type="CHAR" isPrimaryKey="true" isMandatory="true" length="10"/>
+        <db-attribute name="untitledAttr1" type="DATE"/>
+    </db-entity>
+    <obj-entity name="Artist" dbEntityName="Artist">
+        <entity-listener class="NowyListener">
+        </entity-listener>
+    </obj-entity>
+</data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f72210cc/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/testProjectMap1_2.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/testProjectMap1_2.map.xml b/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/testProjectMap1_2.map.xml
new file mode 100644
index 0000000..67968c9
--- /dev/null
+++ b/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/testProjectMap1_2.map.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<data-map xmlns="http://cayenne.apache.org/schema/3.0/modelMap"
+		  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		  xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
+		  project-version="8">
+
+</data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f72210cc/cayenne-protostuff/src/test/resources/cayenne-protostuff.xml
----------------------------------------------------------------------
diff --git a/cayenne-protostuff/src/test/resources/cayenne-protostuff.xml b/cayenne-protostuff/src/test/resources/cayenne-protostuff.xml
index e585624..08d85b1 100644
--- a/cayenne-protostuff/src/test/resources/cayenne-protostuff.xml
+++ b/cayenne-protostuff/src/test/resources/cayenne-protostuff.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<domain project-version="8">
+<domain project-version="9">
 	<map name="protostuff"/>
 
 	<node name="datanode"

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f72210cc/cayenne-protostuff/src/test/resources/protostuff.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-protostuff/src/test/resources/protostuff.map.xml b/cayenne-protostuff/src/test/resources/protostuff.map.xml
index 373b84e..d3277bf 100644
--- a/cayenne-protostuff/src/test/resources/protostuff.map.xml
+++ b/cayenne-protostuff/src/test/resources/protostuff.map.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
-<data-map xmlns="http://cayenne.apache.org/schema/8/modelMap"
+<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/8/modelMap http://cayenne.apache.org/schema/8/modelMap.xsd"
-	 project-version="8">
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/9/modelMap http://cayenne.apache.org/schema/9/modelMap.xsd"
+	 project-version="9">
 	<property name="defaultPackage" value="org.apache.cayenne.rop.protostuff.persistent"/>
 	<property name="clientSupported" value="true"/>
 	<property name="defaultClientPackage" value="org.apache.cayenne.rop.protostuff.persistent"/>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f72210cc/cayenne-server/src/main/java/org/apache/cayenne/map/DataMap.java
----------------------------------------------------------------------
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 5f7d9ab..0d66f55 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
@@ -120,7 +120,7 @@ public class DataMap implements Serializable, ConfigurationNode, XMLSerializable
 	 * The namespace in which the data map XML file will be created. This is
 	 * also the URI to locate a copy of the schema document.
 	 */
-	public static final String SCHEMA_XSD = "http://cayenne.apache.org/schema/8/modelMap";
+	public static final String SCHEMA_XSD = "http://cayenne.apache.org/schema/9/modelMap";
 
 	protected String name;
 	protected String location;
@@ -311,7 +311,7 @@ public class DataMap implements Serializable, ConfigurationNode, XMLSerializable
 	 * @since 1.1
 	 */
 	public void encodeAsXML(XMLEncoder encoder) {
-		encoder.println("<data-map xmlns=\"http://cayenne.apache.org/schema/8/modelMap\"");
+		encoder.println("<data-map xmlns=\"http://cayenne.apache.org/schema/9/modelMap\"");
 
 		encoder.indent(1);
 		encoder.println(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"");

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f72210cc/cayenne-server/src/main/resources/org/apache/cayenne/schema/8/modelMap.xsd
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/resources/org/apache/cayenne/schema/8/modelMap.xsd b/cayenne-server/src/main/resources/org/apache/cayenne/schema/8/modelMap.xsd
deleted file mode 100644
index 45c0792..0000000
--- a/cayenne-server/src/main/resources/org/apache/cayenne/schema/8/modelMap.xsd
+++ /dev/null
@@ -1,338 +0,0 @@
-<?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.
--->
-
-<!--
-	Cayenne entity map schema 
-	Defines format of Cayenne DataMap XML files (*.map.xml).  DataMap files contain
-	the metadata needed for Cayenne object-relational features. Multiple DataMaps
-	are usually combined in one shared namespace, so the elements of the DataMap
-	may reference objects from other DataMaps.
---> 
-<xs:schema targetNamespace="http://cayenne.apache.org/schema/8/modelMap"
-	xmlns:cay="http://cayenne.apache.org/schema/8/modelMap"
-	xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="8">
-	<xs:element name="data-map">
-		<xs:complexType>
-			<xs:sequence>
-				<xs:element minOccurs="0" maxOccurs="unbounded" ref="cay:property"/>
-				<xs:element minOccurs="0" maxOccurs="unbounded" ref="cay:embeddable"/>
-				<xs:element minOccurs="0" maxOccurs="unbounded" ref="cay:procedure"/>
-				<xs:element minOccurs="0" maxOccurs="unbounded" ref="cay:db-entity"/>
-				<xs:element minOccurs="0" maxOccurs="unbounded" ref="cay:obj-entity"/>
-				<xs:element minOccurs="0" maxOccurs="unbounded" ref="cay:db-relationship"/>
-				<xs:element minOccurs="0" maxOccurs="unbounded" ref="cay:obj-relationship"/>
-				<xs:element minOccurs="0" maxOccurs="unbounded" ref="cay:query"/>
-			</xs:sequence>
-			<xs:attribute name="project-version" use="required" type="xs:string"/>
-		</xs:complexType>
-	</xs:element>
-	<xs:element name="db-entity">
-		<xs:complexType>
-			<xs:sequence>
-				<xs:element maxOccurs="unbounded" ref="cay:db-attribute"/>
-				<xs:element minOccurs="0" ref="cay:db-key-generator"/>
-				
-				<!-- Qualifier for DB Entity -->
-				<xs:element minOccurs="0" ref="cay:qualifier"/>
-			</xs:sequence>
-			<xs:attribute name="name" use="required" type="xs:string"/>
-			<xs:attribute name="schema" type="xs:string"/>
-			<xs:attribute name="catalog" type="xs:string"/>
-		</xs:complexType>
-	</xs:element>
-	<xs:element name="db-attribute">
-		<xs:annotation>
-			<xs:documentation>A database column.</xs:documentation>
-		</xs:annotation>
-		<xs:complexType>
-			<xs:attribute name="isMandatory" type="xs:boolean"/>
-			<xs:attribute name="isPrimaryKey" type="xs:boolean">
-				<xs:annotation>
-					<xs:documentation>If true, the value of attribute is unique and used as a primary key identifier.</xs:documentation>
-				</xs:annotation>
-			</xs:attribute>
-			<xs:attribute name="isGenerated" use="optional" type="xs:boolean"/>
-			<xs:attribute name="length" type="xs:integer"/>
-			<xs:attribute name="name" use="required" type="xs:string"/>
-			<xs:attribute name="scale" type="xs:integer"/>
-			<xs:attribute name="type" use="required" type="xs:string"/>
-		</xs:complexType>
-	</xs:element>
-
-	<xs:element name="obj-entity">
-		<xs:annotation>
-			<xs:documentation>A persistent Java class managed by Cayenne.</xs:documentation>
-		</xs:annotation>
-		<xs:complexType>
-			<xs:sequence>
-				<xs:element minOccurs="0" ref="cay:qualifier"/>
-				<xs:element minOccurs="0" maxOccurs="unbounded" ref="cay:embedded-attribute"/>
-				<xs:element minOccurs="0" maxOccurs="unbounded" ref="cay:obj-attribute"/>
-				<xs:element minOccurs="0" maxOccurs="unbounded" ref="cay:attribute-override"/>
-				
-				<!--  Callbacks -->
-				<xs:element minOccurs="0" maxOccurs="unbounded" ref="cay:post-add"/>
-				<xs:element minOccurs="0" maxOccurs="unbounded" ref="cay:pre-persist"/>
-				<xs:element minOccurs="0" maxOccurs="unbounded" ref="cay:post-persist"/>
-				<xs:element minOccurs="0" maxOccurs="unbounded" ref="cay:pre-update"/>
-				<xs:element minOccurs="0" maxOccurs="unbounded" ref="cay:post-update"/>
-				<xs:element minOccurs="0" maxOccurs="unbounded" ref="cay:pre-remove"/>
-				<xs:element minOccurs="0" maxOccurs="unbounded" ref="cay:post-remove"/>
-				<xs:element minOccurs="0" maxOccurs="unbounded" ref="cay:post-load"/>
-			</xs:sequence>
-			<xs:attribute name="className" use="optional" type="xs:string"/>
-			<xs:attribute name="abstract" use="optional" type="xs:string"/>
-			<xs:attribute name="readOnly" use="optional" type="xs:boolean"/>
-			<xs:attribute name="clientClassName" use="optional" type="xs:string"/>
-			<xs:attribute name="clientSuperClassName" use="optional" type="xs:string"/>
-			<xs:attribute name="dbEntityName" use="optional" type="xs:string"/>
-			<xs:attribute name="lock-type" type="xs:string"/>
-			<xs:attribute name="name" use="required" type="xs:string"/>
-			<xs:attribute name="superClassName" use="optional" type="xs:string"/>
-			<xs:attribute name="superEntityName" use="optional" type="xs:string"/>
-			<xs:attribute name="serverOnly" use="optional" type="xs:boolean"/>
-		</xs:complexType>
-	</xs:element>
-
-	<xs:element name="qualifier" type="xs:string"/>
-
-	<xs:element name="obj-attribute">
-		<xs:complexType>
-			<xs:attribute name="db-attribute-path" use="optional" type="xs:string"/>
-			<xs:attribute name="lock" use="optional" type="xs:boolean"/>
-			<xs:attribute name="name" use="required" type="xs:string"/>
-			<xs:attribute name="type" use="required" type="xs:string"/>
-		</xs:complexType>
-	</xs:element>
-
-	<xs:element name="attribute-override">
-		<xs:complexType>
-			<xs:attribute name="db-attribute-path" use="optional" type="xs:string"/>
-			<xs:attribute name="lock" use="optional" type="xs:boolean"/>
-			<xs:attribute name="name" use="optional" type="xs:string"/>
-			<xs:attribute name="type" use="optional" type="xs:string"/>
-		</xs:complexType>
-	</xs:element>
-
-	<xs:element name="db-relationship">
-		<xs:complexType>
-			<xs:sequence>
-				<xs:element minOccurs="1" maxOccurs="unbounded" ref="cay:db-attribute-pair"/>
-			</xs:sequence>
-			<xs:attribute name="name" use="required" type="xs:string"/>
-			<xs:attribute name="source" use="required" type="xs:string"/>
-			<xs:attribute name="target" use="required" type="xs:string"/>
-			<xs:attribute name="toDependentPK" type="xs:boolean"/>
-			<xs:attribute name="toMany" use="required" type="xs:boolean"/>
-		</xs:complexType>
-	</xs:element>
-	<xs:element name="db-attribute-pair">
-		<xs:complexType>
-			<xs:attribute name="source" use="required" type="xs:string"/>
-			<xs:attribute name="target" use="required" type="xs:string"/>
-		</xs:complexType>
-	</xs:element>
-	<xs:element name="obj-relationship">
-		<xs:complexType>
-			<xs:attribute name="db-relationship-path" use="required" type="xs:string"/>
-			<xs:attribute name="deleteRule" type="xs:string"/>
-			<xs:attribute name="lock" type="xs:boolean"/>
-			<xs:attribute name="name" use="required" type="xs:string"/>
-			<xs:attribute name="source" use="required" type="xs:string"/>
-			<xs:attribute name="target" use="required" type="xs:string"/>
-			<xs:attribute name="collection-type" use="optional" type="xs:string"/>
-			<xs:attribute name="map-key" use="optional" type="xs:string"/>
-		</xs:complexType>
-	</xs:element>
-
-	<xs:element name="query">
-		<xs:complexType>
-			<xs:sequence>
-				<xs:element minOccurs="0" maxOccurs="unbounded" ref="cay:property"/>
-				<xs:element minOccurs="0" maxOccurs="unbounded" ref="cay:sql"/>
-				<xs:element minOccurs="0" maxOccurs="unbounded" ref="cay:ejbql"/>
-				<xs:element name="qualifier" minOccurs="0" maxOccurs="unbounded" type="xs:string"/>
-				<xs:element minOccurs="0" maxOccurs="unbounded" ref="cay:ordering"/>
-				<xs:element name="prefetch" minOccurs="0" maxOccurs="unbounded" type="xs:string"/>
-			</xs:sequence>
-			<xs:attribute name="type" use="required" type="xs:string"/>
-			<xs:attribute name="name" use="required" type="xs:string"/>
-			<xs:attribute name="root" use="optional" type="xs:string"/>
-			<xs:attribute name="root-name" use="optional" type="xs:string"/>
-			<xs:attribute name="result-entity" use="optional" type="xs:string"/>
-		</xs:complexType>
-	</xs:element>
-
-	<xs:element name="ordering">
-		<xs:complexType>
-			<xs:simpleContent>
-				<xs:extension base="xs:string">
-					<xs:attribute name="descending" type="xs:boolean"/>
-					<xs:attribute name="ignore-case" type="xs:boolean"/>
-				</xs:extension>
-			</xs:simpleContent>
-		</xs:complexType>
-	</xs:element>
-
-	<xs:element name="sql">
-		<xs:annotation>
-			<xs:documentation>Defines arbitrary SQL statement. Note that SQL statement can be customized for different SQL dialects per DbAdapter class. If no adapter-specific statement is found, the one with no adapter label is used by default.</xs:documentation>
-		</xs:annotation>
-		<xs:complexType>
-			<xs:simpleContent>
-				<xs:extension base="xs:string">
-					<xs:attribute name="adapter-class" type="xs:string"/>
-				</xs:extension>
-			</xs:simpleContent>
-		</xs:complexType>
-	</xs:element>
-
-	<xs:element name="ejbql" type="xs:string"/>
-
-	<xs:element name="property">
-		<xs:annotation>
-			<xs:documentation>A generic property used by other elements.</xs:documentation>
-		</xs:annotation>
-		<xs:complexType>
-			<xs:attribute name="name" use="required" type="xs:string"/>
-			<xs:attribute name="value" use="required" type="xs:string"/>
-		</xs:complexType>
-	</xs:element>
-	<xs:element name="embeddable">
-		<xs:complexType>
-			<xs:sequence>
-				<xs:element name="embeddable-attribute" minOccurs="0" maxOccurs="unbounded">
-					<xs:complexType>
-						<xs:attribute name="name" use="required" type="xs:string"/>
-						<xs:attribute name="type" use="required" type="xs:string"/>
-						<xs:attribute name="db-attribute-name" use="required" type="xs:string"/>
-					</xs:complexType>
-				</xs:element>
-			</xs:sequence>
-			<xs:attribute name="className" use="required" type="xs:string"/>
-		</xs:complexType>
-	</xs:element>
-
-	<xs:element name="embedded-attribute">
-		<xs:complexType>
-			<xs:sequence>
-				<xs:element minOccurs="0" maxOccurs="unbounded"
-					ref="cay:embeddable-attribute-override"/>
-			</xs:sequence>
-			<xs:attribute name="type" use="required" type="xs:string"/>
-			<xs:attribute name="name" use="required" type="xs:string"/>
-		</xs:complexType>
-	</xs:element>
-
-	<xs:element name="embeddable-attribute-override">
-		<xs:complexType>
-			<xs:attribute name="db-attribute-path" use="required" type="xs:string"/>
-			<xs:attribute name="name" use="required" type="xs:string"/>
-		</xs:complexType>
-	</xs:element>
-
-	<xs:element name="procedure">
-		<xs:complexType>
-			<xs:sequence>
-				<xs:element minOccurs="0" maxOccurs="unbounded" name="procedure-parameter">
-					<xs:complexType>
-						<xs:attribute name="name" use="required" type="xs:string"/>
-						<xs:attribute name="type" use="required" type="xs:string"/>
-						<xs:attribute name="length" use="optional" type="xs:integer"/>
-						<xs:attribute name="direction" use="required" type="xs:string"/>
-					</xs:complexType>
-				</xs:element>
-			</xs:sequence>
-			<xs:attribute name="name" use="required" type="xs:string"/>
-			<xs:attribute name="schema" type="xs:string"/>
-			<xs:attribute name="catalog" type="xs:string"/>
-			<xs:attribute name="returningValue" type="xs:string"/>
-		</xs:complexType>
-	</xs:element>
-	<xs:element name="pre-update">
-		<xs:complexType>
-			<xs:attribute name="method-name" use="required" type="xs:string"/>
-		</xs:complexType>
-	</xs:element>
-	<xs:element name="post-persist">
-		<xs:complexType>
-			<xs:attribute name="method-name" use="required" type="xs:string"/>
-		</xs:complexType>
-	</xs:element>
-	<xs:element name="post-update">
-		<xs:complexType>
-			<xs:attribute name="method-name" use="required" type="xs:string"/>
-		</xs:complexType>
-	</xs:element>
-	<xs:element name="post-add">
-		<xs:complexType>
-			<xs:attribute name="method-name" use="required" type="xs:string"/>
-		</xs:complexType>
-	</xs:element>
-	<xs:element name="pre-persist">
-		<xs:complexType>
-			<xs:attribute name="method-name" use="required" type="xs:string"/>
-		</xs:complexType>
-	</xs:element>
-	<xs:element name="post-remove">
-		<xs:complexType>
-			<xs:attribute name="method-name" use="required" type="xs:string"/>
-		</xs:complexType>
-	</xs:element>
-	<xs:element name="post-load">
-		<xs:complexType>
-			<xs:attribute name="method-name" use="required" type="xs:string"/>
-		</xs:complexType>
-	</xs:element>
-	<xs:element name="pre-remove">
-		<xs:complexType>
-			<xs:attribute name="method-name" use="required" type="xs:string"/>
-		</xs:complexType>
-	</xs:element>
-
-	<xs:element name="db-key-generator">
-		<xs:annotation>
-			<xs:documentation>Used to install the Automatic Sequence/Key Generation facility for db-entity. This feature is intended for use with simple (non-compound) integral primary keys.</xs:documentation>
-		</xs:annotation>
-		<xs:complexType>
-			<xs:sequence>
-				<xs:element name="db-generator-type" type="xs:string">
-					<xs:annotation>
-						<xs:documentation>Specifies the Key Generation Method that will be employed
-      'ORACLE'               - use Oracle's SEQUENCE
-      'NAMED_SEQUENCE_TABLE' - use USER designated SEQUENCE TABLE. User specifies the name of a DBMS Table with the schema (sequence INT) which will be used to hold sequence values (not supported yet)</xs:documentation>
-					</xs:annotation>
-				</xs:element>
-				<xs:element minOccurs="0" name="db-generator-name" type="xs:string">
-					<xs:annotation>
-						<xs:documentation>For db-generator-type ORACLE this is the name of the ORACLE SEQUENCE to use. The SEQUENCE is assumed to already exist in the Database.
-If this is db-generator-type NAMED_SEQUENCE_TABLE Key Generation, this specifies the name of the SEQUENCE TABLE to use. The NAMED_SEQUENCE_TABLE is assumed to already exist in the database.</xs:documentation>
-					</xs:annotation>
-				</xs:element>
-				<xs:element minOccurs="0" name="db-key-cache-size" type="xs:integer">
-					<xs:annotation>
-						<xs:documentation>Size of key cache. For db-generator-type ORACLE , this value MUST match the Oracle SEQUENCE  INCREMENT value.  If there is a mismatch between this value and the Oracle SEQUENCE INCREMENT value, then there will likely be duplicate key problems.
-For db-generator-type NAMED_SEQUENCE_TABLE , this tells how many keys the Container will fetch in a single DBMS call.</xs:documentation>
-					</xs:annotation>
-				</xs:element>
-			</xs:sequence>
-		</xs:complexType>
-	</xs:element>
-</xs:schema>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f72210cc/cayenne-server/src/main/resources/org/apache/cayenne/schema/8/reverseEngineering.xsd
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/resources/org/apache/cayenne/schema/8/reverseEngineering.xsd b/cayenne-server/src/main/resources/org/apache/cayenne/schema/8/reverseEngineering.xsd
deleted file mode 100644
index 93248ba..0000000
--- a/cayenne-server/src/main/resources/org/apache/cayenne/schema/8/reverseEngineering.xsd
+++ /dev/null
@@ -1,141 +0,0 @@
-<?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.
-  -->
-<xs:schema attributeFormDefault="unqualified"
-           elementFormDefault="qualified"
-           xmlns:xs="http://www.w3.org/2001/XMLSchema">
-
-    <xs:complexType name="PatternParamType" mixed="true">
-        <xs:annotation>
-            <xs:documentation>
-                At least one of 3 options ot fill pattern information should be used
-                1) &lt;tag>pattern&lt;tag>
-                2) &lt;tag pattern="pattern" />
-                3) &lt;tag>
-                      &lt;pattern>pattern&lt;/pattern>
-                   &lt;/tag>
-            </xs:documentation>
-        </xs:annotation>
-        <xs:sequence>
-            <xs:element type="xs:string" name="pattern" minOccurs="0"/>
-        </xs:sequence>
-        <xs:attribute type="xs:string" name="pattern" use="optional"/>
-    </xs:complexType>
-
-    <xs:complexType name="IncludeTableType" mixed="true">
-        <xs:complexContent>
-            <xs:extension base="PatternParamType">
-                <xs:sequence>
-                    <xs:choice minOccurs="0" maxOccurs="unbounded">
-                        <xs:element name="includeColumn" type="PatternParamType" />
-                        <xs:element name="excludeColumn" type="PatternParamType" />
-                    </xs:choice>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="FilterContainerType">
-        <xs:sequence>
-            <xs:choice minOccurs="1" maxOccurs="unbounded">
-                <xs:element name="includeTable" type="IncludeTableType" />
-                <xs:element name="excludeTable" type="PatternParamType" />
-                <xs:element name="includeColumn" type="PatternParamType" />
-                <xs:element name="excludeColumn" type="PatternParamType" />
-                <xs:element name="includeProcedure" type="PatternParamType" />
-                <xs:element name="excludeProcedure" type="PatternParamType" />
-            </xs:choice>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="SchemaType" mixed="true">
-        <xs:annotation>
-            <xs:documentation>
-                At least one of 3 options to provide schema name can be used:
-                1) &lt;schema>name&lt;schema>
-                2) &lt;schema name="name" />
-                3) &lt;schema>
-                &lt;name>name&lt;/name>
-                &lt;/schema>
-            </xs:documentation>
-        </xs:annotation>
-        <xs:complexContent>
-            <xs:extension base="FilterContainerType">
-                <xs:sequence>
-                    <xs:element name="name" type="xs:string" minOccurs="0" maxOccurs="1" />
-                </xs:sequence>
-                <xs:attribute type="xs:string" name="name" use="optional" />
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="CatalogType" mixed="true">
-        <xs:annotation>
-            <xs:documentation>
-                At least one of 3 options to provide schema name can be used:
-                1) &lt;catalog>name&lt;catalog>
-                2) &lt;catalog name="name" />
-                3) &lt;catalog>
-                &lt;name>name&lt;/name>
-                &lt;/catalog>
-            </xs:documentation>
-        </xs:annotation>
-        <xs:complexContent>
-            <xs:extension base="FilterContainerType">
-                <xs:sequence>
-                    <xs:element name="name" type="xs:string" minOccurs="0" maxOccurs="1" />
-                    <xs:choice minOccurs="0" maxOccurs="unbounded">
-                        <xs:element name="schema" type="SchemaType" />
-                    </xs:choice>
-                </xs:sequence>
-                <xs:attribute type="xs:string" name="name" use="optional" />
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="ReverseEngineeringType">
-        <xs:annotation>
-            <xs:documentation>
-                <!-- TODO -->
-            </xs:documentation>
-        </xs:annotation>
-        <xs:complexContent>
-            <xs:extension base="FilterContainerType">
-                <xs:sequence>
-                    <xs:element name="name" type="xs:string" minOccurs="0" maxOccurs="1" />
-                    <xs:choice minOccurs="0" maxOccurs="unbounded">
-                        <xs:element name="skipRelationshipsLoading" type="xs:boolean" />
-                        <xs:element name="skipPrimaryKeyLoading" type="xs:boolean" />
-                        <xs:element name="catalog" type="CatalogType" />
-                        <xs:element name="schema" type="SchemaType" />
-                    </xs:choice>
-                </xs:sequence>
-                <xs:attribute type="xs:string" name="name" use="optional" />
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:element name="reverseEngineering" type="ReverseEngineeringType">
-        <xs:annotation>
-            <!-- TODO -->
-            <xs:documentation> </xs:documentation>
-        </xs:annotation>
-    </xs:element>
-
-</xs:schema>