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/26 20:14:20 UTC

cayenne git commit: CAY-2126 | Modeler cannot upgrade project from v7 to v9

Repository: cayenne
Updated Branches:
  refs/heads/master 6533ec416 -> 513acc4c0


CAY-2126 | Modeler cannot upgrade project from v7 to v9


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

Branch: refs/heads/master
Commit: 513acc4c0cd43e1a56216a323de996012a44fbf3
Parents: 6533ec4
Author: Savva Kolbachev <s....@gmail.com>
Authored: Wed Oct 26 23:13:00 2016 +0300
Committer: Savva Kolbachev <s....@gmail.com>
Committed: Wed Oct 26 23:13:00 2016 +0300

----------------------------------------------------------------------
 .../project/upgrade/BaseUpgradeHandler.java     | 50 +++++++++----
 .../project/upgrade/v6/UpgradeHandler_V6.java   | 46 +++---------
 .../project/upgrade/v7/UpgradeHandler_V7.java   | 35 ++-------
 .../project/upgrade/v8/UpgradeHandler_V8.java   | 32 ++-------
 .../project/upgrade/v9/UpgradeHandler_V9.java   | 29 ++------
 .../upgrade/v7/ProjectUpgrader_V7Test.java      |  1 -
 .../upgrade/v9/ProjectUpgrader_V9Test.java      | 74 ++++++++++++++++++--
 .../project/upgrade/v9/3_0_0_1a/cayenne.xml     | 24 +++++++
 .../project/upgrade/v9/3_0_0_1a/d1Map1.map.xml  |  6 ++
 .../project/upgrade/v9/3_0_0_1a/d1Map2.map.xml  |  9 +++
 .../upgrade/v9/3_0_0_1a/d1NodeDriver.driver.xml |  6 ++
 .../project/upgrade/v9/6a/cayenne-PROJECT1.xml  | 15 ++++
 .../upgrade/v9/6a/testProjectMap1_1.map.xml     | 21 ++++++
 .../upgrade/v9/6a/testProjectMap1_2.map.xml     |  7 ++
 14 files changed, 222 insertions(+), 133 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/513acc4c/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/BaseUpgradeHandler.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/BaseUpgradeHandler.java b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/BaseUpgradeHandler.java
index a22b7d7..89a7b82 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/BaseUpgradeHandler.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/BaseUpgradeHandler.java
@@ -18,10 +18,6 @@
  ****************************************************************/
 package org.apache.cayenne.project.upgrade;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
 import org.apache.cayenne.ConfigurationException;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DataMap;
@@ -34,6 +30,9 @@ import org.xml.sax.SAXException;
 import org.xml.sax.XMLReader;
 import org.xml.sax.helpers.DefaultHandler;
 
+import java.io.InputStream;
+import java.net.URL;
+
 /**
  * A common superclass of UpgradeHandlers.
  * 
@@ -45,6 +44,7 @@ import org.xml.sax.helpers.DefaultHandler;
 public abstract class BaseUpgradeHandler implements UpgradeHandler {
 
 	static final String UNKNOWN_VERSION = "0";
+	static final String MIN_SUPPORTED_VERSION = "3.0.0.1";
 
 	protected Resource projectSource;
 	protected UpgradeMetaData metaData;
@@ -90,14 +90,14 @@ public abstract class BaseUpgradeHandler implements UpgradeHandler {
 	public Resource performUpgrade() throws ConfigurationException {
 		UpgradeMetaData metaData = getUpgradeMetaData();
 		switch (metaData.getUpgradeType()) {
-		case DOWNGRADE_NEEDED:
-			throw new ConfigurationException("Downgrade can not be performed");
-		case INTERMEDIATE_UPGRADE_NEEDED:
-			throw new ConfigurationException("Upgrade can not be performed - intermediate version upgrade needed");
-		case UPGRADE_NEEDED:
-			return doPerformUpgrade(metaData);
-		default:
-			return getProjectSource();
+			case DOWNGRADE_NEEDED:
+				throw new ConfigurationException("Downgrade can not be performed");
+			case INTERMEDIATE_UPGRADE_NEEDED:
+				throw new ConfigurationException("Upgrade can not be performed - intermediate version upgrade needed");
+			case UPGRADE_NEEDED:
+				return doPerformUpgrade(metaData);
+			default:
+				return getProjectSource();
 		}
 	}
 
@@ -110,10 +110,34 @@ public abstract class BaseUpgradeHandler implements UpgradeHandler {
 	 */
 	protected abstract Resource doPerformUpgrade(UpgradeMetaData metaData) throws ConfigurationException;
 
+	protected abstract String getToVersion();
+
 	/**
 	 * Creates a metadata object describing the type of upgrade needed.
 	 */
-	protected abstract UpgradeMetaData loadMetaData();
+	protected UpgradeMetaData loadMetaData() {
+		String version = loadProjectVersion();
+
+		UpgradeMetaData metadata = new UpgradeMetaData();
+		metadata.setSupportedVersion(getToVersion());
+		metadata.setProjectVersion(version);
+
+		int c1 = compareVersions(version, MIN_SUPPORTED_VERSION);
+		int c2 = compareVersions(getToVersion(), 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;
+	}
 
 	/**
 	 * A default method for quick extraction of the project version from an XML

http://git-wip-us.apache.org/repos/asf/cayenne/blob/513acc4c/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/v6/UpgradeHandler_V6.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/v6/UpgradeHandler_V6.java b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/v6/UpgradeHandler_V6.java
index ae6f6b6..7a31fe9 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/v6/UpgradeHandler_V6.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/v6/UpgradeHandler_V6.java
@@ -18,11 +18,6 @@
  ****************************************************************/
 package org.apache.cayenne.project.upgrade.v6;
 
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
 import org.apache.cayenne.ConfigurationException;
 import org.apache.cayenne.configuration.ConfigurationTree;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
@@ -32,17 +27,20 @@ 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.UpgradeMetaData;
-import org.apache.cayenne.project.upgrade.UpgradeType;
 import org.apache.cayenne.resource.Resource;
 import org.apache.cayenne.util.Util;
 
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
 /**
  * @since 3.1
  */
 class UpgradeHandler_V6 extends BaseUpgradeHandler {
 
     static final String TO_VERSION = "6";
-    static final String MIN_SUPPORTED_VERSION = "3.0.0.1";
 
     /**
      * Notice that the loader is statically typed, intentionally not using DI to ensure
@@ -63,34 +61,6 @@ class UpgradeHandler_V6 extends BaseUpgradeHandler {
     }
 
     @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;
-    }
-
-    @Override
     protected Resource doPerformUpgrade(UpgradeMetaData metaData) throws ConfigurationException {
 
         List<DataChannelDescriptor> domains = projectLoader.load(projectSource);
@@ -140,4 +110,10 @@ class UpgradeHandler_V6 extends BaseUpgradeHandler {
         // configurations...
         return domains.get(0).getConfigurationSource();
     }
+
+    @Override
+    protected String getToVersion() {
+        return TO_VERSION;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/513acc4c/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/v7/UpgradeHandler_V7.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/v7/UpgradeHandler_V7.java b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/v7/UpgradeHandler_V7.java
index 7743741..4c4b4cc 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/v7/UpgradeHandler_V7.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/v7/UpgradeHandler_V7.java
@@ -18,9 +18,6 @@
  ****************************************************************/
 package org.apache.cayenne.project.upgrade.v7;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import org.apache.cayenne.ConfigurationException;
 import org.apache.cayenne.configuration.ConfigurationTree;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
@@ -35,14 +32,16 @@ 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.v6.ProjectUpgrader_V6;
 import org.apache.cayenne.resource.Resource;
 
+import java.util.ArrayList;
+import java.util.List;
+
 class UpgradeHandler_V7 extends BaseUpgradeHandler {
 
+    static final String PREVIOUS_VERSION = "6";
     static final String TO_VERSION = "7";
-    static final String MIN_SUPPORTED_VERSION = "3.0.0.1";
 
     // this will be removed from DataDomain soon. So caching this property name
     // in the upgrade handler
@@ -60,7 +59,7 @@ class UpgradeHandler_V7 extends BaseUpgradeHandler {
 
     @Override
     protected Resource doPerformUpgrade(UpgradeMetaData metaData) throws ConfigurationException {
-        if (compareVersions(metaData.getProjectVersion(), MIN_SUPPORTED_VERSION) == 0) {
+        if (compareVersions(metaData.getProjectVersion(), PREVIOUS_VERSION) == -1) {
             ProjectUpgrader_V6 upgraderV6 = new ProjectUpgrader_V6();
             injector.injectMembers(upgraderV6);
             UpgradeHandler handlerV6 = upgraderV6.getUpgradeHandler(projectSource);
@@ -131,28 +130,8 @@ class UpgradeHandler_V7 extends BaseUpgradeHandler {
     }
 
     @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;
+    protected String getToVersion() {
+        return TO_VERSION;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/513acc4c/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/v8/UpgradeHandler_V8.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/v8/UpgradeHandler_V8.java b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/v8/UpgradeHandler_V8.java
index 592569d..2782bf5 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/v8/UpgradeHandler_V8.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/v8/UpgradeHandler_V8.java
@@ -25,14 +25,13 @@ 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.map.QueryDescriptor;
 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.v7.ProjectUpgrader_V7;
-import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.resource.Resource;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -58,8 +57,8 @@ import java.io.InputStream;
 
 public class UpgradeHandler_V8 extends BaseUpgradeHandler {
 
+    static final String PREVIOUS_VERSION = "7";
     static final String TO_VERSION = "8";
-    static final String MIN_SUPPORTED_VERSION = "7";
 
     @Inject
     protected Injector injector;
@@ -73,7 +72,7 @@ public class UpgradeHandler_V8 extends BaseUpgradeHandler {
 
     @Override
     protected Resource doPerformUpgrade(UpgradeMetaData metaData) throws ConfigurationException {
-        if (compareVersions(metaData.getProjectVersion(), MIN_SUPPORTED_VERSION) == 0) {
+        if (compareVersions(metaData.getProjectVersion(), PREVIOUS_VERSION) == -1) {
             ProjectUpgrader_V7 upgraderV7 = new ProjectUpgrader_V7();
             injector.injectMembers(upgraderV7);
             UpgradeHandler handlerV7 = upgraderV7.getUpgradeHandler(projectSource);
@@ -165,27 +164,8 @@ public class UpgradeHandler_V8 extends BaseUpgradeHandler {
     }
 
     @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;
+    protected String getToVersion() {
+        return TO_VERSION;
     }
+
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/513acc4c/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
index 2a3faaa..92c2f0b 100644
--- 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
@@ -29,7 +29,6 @@ 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;
@@ -51,8 +50,8 @@ import java.io.InputStream;
 
 public class UpgradeHandler_V9 extends BaseUpgradeHandler {
 
+    static final String PREVIOUS_VERSION = "8";
     static final String TO_VERSION = "9";
-    static final String MIN_SUPPORTED_VERSION = "8";
 
     @Inject
     protected Injector injector;
@@ -66,7 +65,7 @@ public class UpgradeHandler_V9 extends BaseUpgradeHandler {
 
     @Override
     protected Resource doPerformUpgrade(UpgradeMetaData metaData) throws ConfigurationException {
-        if (compareVersions(metaData.getProjectVersion(), MIN_SUPPORTED_VERSION) == 0) {
+        if (compareVersions(metaData.getProjectVersion(), PREVIOUS_VERSION) == -1) {
             ProjectUpgrader_V8 upgraderV8 = new ProjectUpgrader_V8();
             injector.injectMembers(upgraderV8);
             UpgradeHandler handlerV8 = upgraderV8.getUpgradeHandler(projectSource);
@@ -139,28 +138,8 @@ public class UpgradeHandler_V9 extends BaseUpgradeHandler {
     }
 
     @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;
+    protected String getToVersion() {
+        return TO_VERSION;
     }
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/513acc4c/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 d97733f..793d6a0 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
@@ -83,7 +83,6 @@ public class ProjectUpgrader_V7Test extends Project2Case {
 		assertNotNull(md);
 
 		assertSame(UpgradeType.UPGRADE_NEEDED, md.getUpgradeType());
-		// assertEquals("6", md.getIntermediateUpgradeVersion());
 		assertNull(md.getIntermediateUpgradeVersion());
 		assertEquals("3.0.0.1", md.getProjectVersion());
 		assertEquals("7", md.getSupportedVersion());

http://git-wip-us.apache.org/repos/asf/cayenne/blob/513acc4c/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
index 32f4b68..cf0db9b 100644
--- 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
@@ -30,6 +30,8 @@ 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.project.upgrade.UpgradeMetaData;
+import org.apache.cayenne.project.upgrade.UpgradeType;
 import org.apache.cayenne.resource.Resource;
 import org.apache.cayenne.resource.URLResource;
 import org.apache.cayenne.test.file.FileUtil;
@@ -47,14 +49,76 @@ 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;
+import static org.junit.Assert.*;
 
 public class ProjectUpgrader_V9Test extends Project2Case {
 
+    @Test
+    public void testMetadata_3_0_0_1() {
+
+        String baseUrl = getClass().getPackage().getName().replace('.', '/');
+        URL url = getClass().getClassLoader().getResource(baseUrl + "/3_0_0_1a/cayenne.xml");
+        assertNotNull(url);
+
+        Module testModule = new Module() {
+
+            public void configure(Binder binder) {
+                binder.bind(ProjectSaver.class).to(FileProjectSaver.class);
+                binder.bind(ConfigurationNameMapper.class).to(DefaultConfigurationNameMapper.class);
+            }
+        };
+
+        ProjectUpgrader_V9 upgrader = new ProjectUpgrader_V9();
+        Injector injector = DIBootstrap.createInjector(testModule);
+        injector.injectMembers(upgrader);
+
+        Resource source = new URLResource(url);
+        UpgradeHandler handler = upgrader.getUpgradeHandler(source);
+
+        assertNotNull(handler);
+        assertSame(source, handler.getProjectSource());
+
+        UpgradeMetaData md = handler.getUpgradeMetaData();
+        assertNotNull(md);
+
+        assertSame(UpgradeType.UPGRADE_NEEDED, md.getUpgradeType());
+        assertNull(md.getIntermediateUpgradeVersion());
+        assertEquals("3.0.0.1", md.getProjectVersion());
+        assertEquals("9", md.getSupportedVersion());
+    }
+
+    @Test
+    public void testMetadata_Type6() {
+        String baseUrl = getClass().getPackage().getName().replace('.', '/');
+        URL url = getClass().getClassLoader().getResource(baseUrl + "/6a/cayenne-PROJECT1.xml");
+        assertNotNull(url);
+
+        Module testModule = new Module() {
+
+            public void configure(Binder binder) {
+                binder.bind(ProjectSaver.class).to(FileProjectSaver.class);
+                binder.bind(ConfigurationNameMapper.class).to(DefaultConfigurationNameMapper.class);
+            }
+        };
+
+        ProjectUpgrader_V9 upgrader = new ProjectUpgrader_V9();
+        Injector injector = DIBootstrap.createInjector(testModule);
+        injector.injectMembers(upgrader);
+
+        Resource source = new URLResource(url);
+        UpgradeHandler handler = upgrader.getUpgradeHandler(source);
+
+        assertNotNull(handler);
+        assertSame(source, handler.getProjectSource());
+
+        UpgradeMetaData md = handler.getUpgradeMetaData();
+        assertNotNull(md);
+        assertSame(UpgradeType.UPGRADE_NEEDED, md.getUpgradeType());
+        assertNull(md.getIntermediateUpgradeVersion());
+        assertEquals("6", md.getProjectVersion());
+        assertEquals("9", md.getSupportedVersion());
+    }
+
     protected File setupTestDirectory(String subfolder) {
         String classPath = getClass().getName().replace('.', '/');
         String location = "target/testrun/" + classPath + "/" + subfolder;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/513acc4c/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/3_0_0_1a/cayenne.xml
----------------------------------------------------------------------
diff --git a/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/3_0_0_1a/cayenne.xml b/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/3_0_0_1a/cayenne.xml
new file mode 100644
index 0000000..924da17
--- /dev/null
+++ b/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/3_0_0_1a/cayenne.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<domains project-version="3.0.0.1">
+<domain name="d1">
+	<map name="d1Map1" location="d1Map1.map.xml"/>
+	<map name="d1Map2" location="d1Map2.map.xml"/>
+
+	<node name="d1NodeDriver"
+		 datasource="d1NodeDriver.driver.xml"
+		 factory="org.apache.cayenne.conf.DriverDataSourceFactory">
+			<map-ref name="d1Map1"/>
+			<map-ref name="d1Map2"/>
+	 </node>
+</domain>
+<domain name="d2">
+	<node name="d2NodeDBCP"
+		 datasource="dbcpx"
+		 factory="org.apache.cayenne.conf.DBCPDataSourceFactory">
+	 </node>
+	<node name="d2NodeJNDI"
+		 datasource="jndi/x"
+		 factory="org.apache.cayenne.conf.JNDIDataSourceFactory">
+	 </node>
+</domain>
+</domains>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/513acc4c/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/3_0_0_1a/d1Map1.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/3_0_0_1a/d1Map1.map.xml b/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/3_0_0_1a/d1Map1.map.xml
new file mode 100644
index 0000000..c6fc238
--- /dev/null
+++ b/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/3_0_0_1a/d1Map1.map.xml
@@ -0,0 +1,6 @@
+<?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="3.0.0.1">
+</data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/513acc4c/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/3_0_0_1a/d1Map2.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/3_0_0_1a/d1Map2.map.xml b/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/3_0_0_1a/d1Map2.map.xml
new file mode 100644
index 0000000..1cc1bb3
--- /dev/null
+++ b/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/3_0_0_1a/d1Map2.map.xml
@@ -0,0 +1,9 @@
+<?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="3.0.0.1">
+	<db-entity name="table1">
+		<db-attribute name="pk" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
+	</db-entity>
+</data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/513acc4c/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/3_0_0_1a/d1NodeDriver.driver.xml
----------------------------------------------------------------------
diff --git a/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/3_0_0_1a/d1NodeDriver.driver.xml b/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/3_0_0_1a/d1NodeDriver.driver.xml
new file mode 100644
index 0000000..7b8973a
--- /dev/null
+++ b/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/3_0_0_1a/d1NodeDriver.driver.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<driver project-version="3.0.0.1" class="org.hsqldb.jdbcDriver">
+	<url value="jdbc:hsqldb:mem:xdb"/>
+	<connectionPool min="1" max="5"/>
+	<login userName="user" password="password"/>
+</driver>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/513acc4c/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/6a/cayenne-PROJECT1.xml
----------------------------------------------------------------------
diff --git a/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/6a/cayenne-PROJECT1.xml b/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/6a/cayenne-PROJECT1.xml
new file mode 100644
index 0000000..3b6cd77
--- /dev/null
+++ b/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/6a/cayenne-PROJECT1.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<domain project-version="6">
+
+	<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/513acc4c/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/6a/testProjectMap1_1.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/6a/testProjectMap1_1.map.xml b/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/6a/testProjectMap1_1.map.xml
new file mode 100644
index 0000000..25167f4
--- /dev/null
+++ b/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/6a/testProjectMap1_1.map.xml
@@ -0,0 +1,21 @@
+<?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="6">
+<db-entity name="Artist">
+        <db-attribute name="attributeOne" type="CHAR" isPrimaryKey="true" isMandatory="true" length="10"/>
+        <db-attribute name="attributeTwo" type="DATE"/>
+    </db-entity>
+    <obj-entity name="Artist" dbEntityName="Artist">
+        <entity-listener class="EntityListener">
+            <post-add method-name="prePersistEntityListener"/>
+			<post-persist method-name="postPersistEntityListener"/>
+			<pre-update method-name="preUpdateEntityListener"/>
+			<post-update method-name="postUpdateEntityListener"/>
+			<pre-remove method-name="preRemoveEntityListener"/>
+			<post-remove method-name="postRemoveEntityListener"/>
+			<post-load method-name="postLoadEntityListener"/>
+        </entity-listener>
+    </obj-entity>
+</data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/513acc4c/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/6a/testProjectMap1_2.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/6a/testProjectMap1_2.map.xml b/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/6a/testProjectMap1_2.map.xml
new file mode 100644
index 0000000..6b79eb5
--- /dev/null
+++ b/cayenne-project/src/test/resources/org/apache/cayenne/project/upgrade/v9/6a/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="6">
+
+</data-map>