Author: aadamchik
Date: Mon Dec 14 04:56:50 2009
New Revision: 890179
URL: http://svn.apache.org/viewvc?rev=890179&view=rev
Log:
CAY-1329 DI-based cayenne-project module
* project upgrade framework - in progress
Added:
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/BaseUpgradeHandler.java
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/ProjectUpgrader.java
- copied, changed from r890150,
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/CayenneProjectModule.java
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/UpgradeHandler.java
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/UpgradeMetaData.java
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/UpgradeType.java
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/v6/
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/v6/ProjectUpgrader_V6.java
- copied, changed from r890150,
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/CayenneProjectModule.java
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/v6/UpgradeHandler_V6.java
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/java/org/apache/cayenne/project2/upgrade/
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/java/org/apache/cayenne/project2/upgrade/v6/
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/java/org/apache/cayenne/project2/upgrade/v6/ProjectUpgrader_V6Test.java
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/2_0a/
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/2_0a/cayenne.xml
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/2_0a/d1Map.map.xml
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/2_0a/d1Node.driver.xml
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/3_0_0_1a/
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/3_0_0_1a/cayenne.xml
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/3_0_0_1a/d1Map1.map.xml
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/3_0_0_1a/d1Map2.map.xml
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/3_0_0_1a/d1NodeDriver.driver.xml
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/6a/
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/6a/cayenne-PROJECT1.xml
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/6a/testProjectMap1_1.map.xml
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/6a/testProjectMap1_2.map.xml
Modified:
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/CayenneProjectModule.java
Modified:
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/CayenneProjectModule.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/CayenneProjectModule.java?rev=890179&r1=890178&r2=890179&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/CayenneProjectModule.java
(original)
+++
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/CayenneProjectModule.java
Mon Dec 14 04:56:50 2009
@@ -21,6 +21,8 @@
import org.apache.cayenne.di.Binder;
import org.apache.cayenne.di.Module;
import org.apache.cayenne.di.Scopes;
+import org.apache.cayenne.project2.upgrade.ProjectUpgrader;
+import org.apache.cayenne.project2.upgrade.v6.ProjectUpgrader_V6;
/**
* A dependency injection (DI) module contributing configuration related to
Cayenne
@@ -33,7 +35,7 @@
public void configure(Binder binder) {
binder.bind(ProjectLoader.class).to(DataChannelProjectLoader.class).in(
Scopes.SINGLETON);
- binder.bind(ProjectSaver.class).to(FileProjectSaver.class).in(
- Scopes.SINGLETON);
+
binder.bind(ProjectSaver.class).to(FileProjectSaver.class).in(Scopes.SINGLETON);
+ binder.bind(ProjectUpgrader.class).to(ProjectUpgrader_V6.class);
}
}
Added:
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/BaseUpgradeHandler.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/BaseUpgradeHandler.java?rev=890179&view=auto
==============================================================================
---
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/BaseUpgradeHandler.java
(added)
+++
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/BaseUpgradeHandler.java
Mon Dec 14 04:56:50 2009
@@ -0,0 +1,187 @@
+/*****************************************************************
+ * 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.project2.upgrade;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+
+import org.apache.cayenne.ConfigurationException;
+import org.apache.cayenne.resource.Resource;
+import org.apache.cayenne.util.Util;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * A common superclass of UpgradeHandlers.
+ *
+ * @since 3.1
+ */
+// there's no guarantee this will survive the further version upgrades, but
for now all
+// the code here seems like version-agnostic
+public abstract class BaseUpgradeHandler implements UpgradeHandler {
+
+ static final String UNKNOWN_VERSION = "0";
+
+ protected Resource projectSource;
+ protected UpgradeMetaData metaData;
+
+ public BaseUpgradeHandler(Resource projectSource) {
+
+ if (projectSource == null) {
+ throw new NullPointerException("Null project source");
+ }
+
+ this.projectSource = projectSource;
+ }
+
+ public Resource getProjectSource() {
+ return projectSource;
+ }
+
+ public UpgradeMetaData getUpgradeMetaData() {
+ // no attempts at thread-safety... shouldn't be needed for upgrades
+ if (metaData == null) {
+ metaData = loadMetaData();
+ }
+
+ return metaData;
+ }
+
+ 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 performNeededUpgrade();
+ default:
+ return getProjectSource();
+ }
+ }
+
+ protected abstract Resource performNeededUpgrade() throws
ConfigurationException;
+
+ protected abstract UpgradeMetaData loadMetaData();
+
+ /**
+ * A default method for quick extraction of the project version from an
XML file.
+ */
+ protected String loadProjectVersion() {
+
+ RootTagHandler rootHandler = new RootTagHandler();
+ URL url = projectSource.getURL();
+
+ InputStream in = null;
+
+ try {
+ in = url.openStream();
+ XMLReader parser = Util.createXmlReader();
+
+ parser.setContentHandler(rootHandler);
+ parser.setErrorHandler(rootHandler);
+ parser.parse(new InputSource(in));
+ }
+ catch (SAXException e) {
+ // expected ... handler will terminate as soon as it finds a root
tag.
+
+ }
+ catch (Exception e) {
+ throw new ConfigurationException(
+ "Error reading configuration from %s",
+ e,
+ url);
+ }
+ finally {
+ try {
+ if (in != null) {
+ in.close();
+ }
+ }
+ catch (IOException ioex) {
+ // ignoring...
+ }
+ }
+
+ return rootHandler.projectVersion != null
+ ? rootHandler.projectVersion
+ : UNKNOWN_VERSION;
+ }
+
+ /**
+ * Compares two String versions.
+ */
+ protected int compareVersions(String v1, String v2) {
+
+ if (v1.equals(v2)) {
+ return 0;
+ }
+
+ double v1Double = decodeVersion(v1);
+ double v2Double = decodeVersion(v2);
+ return v1Double < v2Double ? -1 : 1;
+ }
+
+ protected double decodeVersion(String version) {
+ if (version == null || version.trim().length() == 0) {
+ return 0;
+ }
+
+ // leave the first dot, and treat remaining as a fraction
+ // remove all non digit chars
+ StringBuilder buffer = new StringBuilder(version.length());
+ boolean dotProcessed = false;
+ for (int i = 0; i < version.length(); i++) {
+ char nextChar = version.charAt(i);
+ if (nextChar == '.' && !dotProcessed) {
+ dotProcessed = true;
+ buffer.append('.');
+ }
+ else if (Character.isDigit(nextChar)) {
+ buffer.append(nextChar);
+ }
+ }
+
+ return Double.parseDouble(buffer.toString());
+ }
+
+ class RootTagHandler extends DefaultHandler {
+
+ private String projectVersion;
+
+ @Override
+ public void startElement(
+ String uri,
+ String localName,
+ String qName,
+ Attributes attributes) throws SAXException {
+
+ this.projectVersion = attributes.getValue("", "project-version");
+
+ // bail right away - we are not interested in reading this to the
end
+ throw new SAXException("finished");
+ }
+ }
+}
Copied:
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/ProjectUpgrader.java
(from r890150,
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/CayenneProjectModule.java)
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/ProjectUpgrader.java?p2=cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/ProjectUpgrader.java&p1=cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/CayenneProjectModule.java&r1=890150&r2=890179&rev=890179&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/CayenneProjectModule.java
(original)
+++
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/ProjectUpgrader.java
Mon Dec 14 04:56:50 2009
@@ -16,24 +16,19 @@
* specific language governing permissions and limitations
* under the License.
****************************************************************/
-package org.apache.cayenne.project2;
+package org.apache.cayenne.project2.upgrade;
-import org.apache.cayenne.di.Binder;
-import org.apache.cayenne.di.Module;
-import org.apache.cayenne.di.Scopes;
+import org.apache.cayenne.resource.Resource;
/**
- * A dependency injection (DI) module contributing configuration related to
Cayenne
- * mapping project manipulation to a DI container.
+ * Defines API of an upgrade handler for Cayenne projects.
*
* @since 3.1
*/
-public class CayenneProjectModule implements Module {
+public interface ProjectUpgrader {
- public void configure(Binder binder) {
- binder.bind(ProjectLoader.class).to(DataChannelProjectLoader.class).in(
- Scopes.SINGLETON);
- binder.bind(ProjectSaver.class).to(FileProjectSaver.class).in(
- Scopes.SINGLETON);
- }
+ /**
+ * Returns an upgrade handler to process upgrades of a given project.
+ */
+ UpgradeHandler getUpgradeHandler(Resource projectSource);
}
Added:
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/UpgradeHandler.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/UpgradeHandler.java?rev=890179&view=auto
==============================================================================
---
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/UpgradeHandler.java
(added)
+++
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/UpgradeHandler.java
Mon Dec 14 04:56:50 2009
@@ -0,0 +1,57 @@
+/*****************************************************************
+ * 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.project2.upgrade;
+
+import org.apache.cayenne.ConfigurationException;
+import org.apache.cayenne.resource.Resource;
+
+/**
+ * A stateful helper object for analyzing the projects and performing upgrades.
+ *
+ * @since 3.1
+ */
+public interface UpgradeHandler {
+
+ /**
+ * Returns the original configuration source for the project before the
upgrade.
+ */
+ Resource getProjectSource();
+
+ /**
+ * Returns a metadata object containing information about the upgrade to
be performed.
+ * Users should call this method before invoking {...@link
#performUpgrade()}, to make
+ * sure upgrade is needed and possible. Tools (like CayenneModeler) may
use this
+ * object to build user-friendly messages asking for user input on the
upgrade.
+ */
+ UpgradeMetaData getUpgradeMetaData();
+
+ /**
+ * Performs an in-place project configuration upgrade, throwing a
+ * {...@link ConfigurationException} if the upgrade fails. Before doing
the upgrade,
+ * check the handler {...@link UpgradeMetaData}. Upgrades will succeed
only for projects
+ * that have {...@link UpgradeType#UPGRADE_NEEDED} or
+ * {...@link UpgradeType#UPGRADE_NOT_NEEDED} statuses. In the later case
of course,
+ * upgrade will simply be skipped.
+ *
+ * @return a configuration Resource for the upgraded project. Depending on
the upgrade
+ * type, it may be the same resource as the original
configuration, or a
+ * totally different resource.
+ */
+ Resource performUpgrade() throws ConfigurationException;
+}
Added:
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/UpgradeMetaData.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/UpgradeMetaData.java?rev=890179&view=auto
==============================================================================
---
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/UpgradeMetaData.java
(added)
+++
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/UpgradeMetaData.java
Mon Dec 14 04:56:50 2009
@@ -0,0 +1,66 @@
+/*****************************************************************
+ * 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.project2.upgrade;
+
+/**
+ * An object providing upgrade information about a specific project in the
context of
+ * enclosing Cayenne runtime.
+ *
+ * @since 3.1
+ */
+public class UpgradeMetaData {
+
+ protected UpgradeType upgradeType;
+ protected String projectVersion;
+ protected String supportedVersion;
+ protected String intermediateUpgradeVersion;
+
+ public UpgradeType getUpgradeType() {
+ return upgradeType;
+ }
+
+ public void setUpgradeType(UpgradeType upgradeType) {
+ this.upgradeType = upgradeType;
+ }
+
+ public String getProjectVersion() {
+ return projectVersion;
+ }
+
+ public void setProjectVersion(String projectVersion) {
+ this.projectVersion = projectVersion;
+ }
+
+ public String getSupportedVersion() {
+ return supportedVersion;
+ }
+
+ public void setSupportedVersion(String supportedVersion) {
+ this.supportedVersion = supportedVersion;
+ }
+
+ public String getIntermediateUpgradeVersion() {
+ return intermediateUpgradeVersion;
+ }
+
+ public void setIntermediateUpgradeVersion(String
intermediateUpgradeVersion) {
+ this.intermediateUpgradeVersion = intermediateUpgradeVersion;
+ }
+
+}
Added:
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/UpgradeType.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/UpgradeType.java?rev=890179&view=auto
==============================================================================
---
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/UpgradeType.java
(added)
+++
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/UpgradeType.java
Mon Dec 14 04:56:50 2009
@@ -0,0 +1,54 @@
+/*****************************************************************
+ * 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.project2.upgrade;
+
+/**
+ * An enum indicating what type of upgrade, if any, is needed and possible to
bring the
+ * project configuration format in sync with the current Cayenne runtime.
+ *
+ * @since 3.1
+ */
+public enum UpgradeType {
+
+ /**
+ * The project configuration is current and can be used with the enclosing
Cayenne
+ * runtime.
+ */
+ UPGRADE_NOT_NEEDED,
+
+ /**
+ * The project configuration format is from an older version of Cayenne,
and it can be
+ * fully upgraded to the current Cayenne version.
+ */
+ UPGRADE_NEEDED,
+
+ /**
+ * The project configuration format is from an older version of Cayenne,
and it can be
+ * upgraded to the current Cayenne version, however some information may
get lost
+ * during the upgrade. A user may still chose to upgrade, however a
recommended
+ * upgrade path is to do an intermediary upgrade using previous versions
of Cayenne.
+ */
+ INTERMEDIATE_UPGRADE_NEEDED,
+
+ /**
+ * The project configuration format is from a newer version of Cayenne,
and the
+ * current runtime can't work with it.
+ */
+ DOWNGRADE_NEEDED
+}
Copied:
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/v6/ProjectUpgrader_V6.java
(from r890150,
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/CayenneProjectModule.java)
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/v6/ProjectUpgrader_V6.java?p2=cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/v6/ProjectUpgrader_V6.java&p1=cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/CayenneProjectModule.java&r1=890150&r2=890179&rev=890179&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/CayenneProjectModule.java
(original)
+++
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/v6/ProjectUpgrader_V6.java
Mon Dec 14 04:56:50 2009
@@ -16,24 +16,21 @@
* specific language governing permissions and limitations
* under the License.
****************************************************************/
-package org.apache.cayenne.project2;
+package org.apache.cayenne.project2.upgrade.v6;
-import org.apache.cayenne.di.Binder;
-import org.apache.cayenne.di.Module;
-import org.apache.cayenne.di.Scopes;
+import org.apache.cayenne.project2.upgrade.UpgradeHandler;
+import org.apache.cayenne.project2.upgrade.ProjectUpgrader;
+import org.apache.cayenne.resource.Resource;
/**
- * A dependency injection (DI) module contributing configuration related to
Cayenne
- * mapping project manipulation to a DI container.
+ * A ProjectUpgrader that handles project upgrades to version 6.
*
* @since 3.1
*/
-public class CayenneProjectModule implements Module {
+public class ProjectUpgrader_V6 implements ProjectUpgrader {
- public void configure(Binder binder) {
- binder.bind(ProjectLoader.class).to(DataChannelProjectLoader.class).in(
- Scopes.SINGLETON);
- binder.bind(ProjectSaver.class).to(FileProjectSaver.class).in(
- Scopes.SINGLETON);
+ public UpgradeHandler getUpgradeHandler(Resource projectSource) {
+ return new UpgradeHandler_V6(projectSource);
}
+
}
Added:
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/v6/UpgradeHandler_V6.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/v6/UpgradeHandler_V6.java?rev=890179&view=auto
==============================================================================
---
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/v6/UpgradeHandler_V6.java
(added)
+++
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/upgrade/v6/UpgradeHandler_V6.java
Mon Dec 14 04:56:50 2009
@@ -0,0 +1,72 @@
+/*****************************************************************
+ * 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.project2.upgrade.v6;
+
+import org.apache.cayenne.ConfigurationException;
+import org.apache.cayenne.project2.upgrade.BaseUpgradeHandler;
+import org.apache.cayenne.project2.upgrade.UpgradeMetaData;
+import org.apache.cayenne.project2.upgrade.UpgradeType;
+import org.apache.cayenne.resource.Resource;
+
+/**
+ * @since 3.1
+ */
+class UpgradeHandler_V6 extends BaseUpgradeHandler {
+
+ static final String TO_VERSION = "6";
+ static final String MIN_SUPPORTED_VERSION = "3.0.0.1";
+
+ UpgradeHandler_V6(Resource source) {
+ super(source);
+ }
+
+ @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 performNeededUpgrade() throws ConfigurationException {
+ throw new UnsupportedOperationException("TODO");
+ }
+
+}
Added:
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/java/org/apache/cayenne/project2/upgrade/v6/ProjectUpgrader_V6Test.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/java/org/apache/cayenne/project2/upgrade/v6/ProjectUpgrader_V6Test.java?rev=890179&view=auto
==============================================================================
---
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/java/org/apache/cayenne/project2/upgrade/v6/ProjectUpgrader_V6Test.java
(added)
+++
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/java/org/apache/cayenne/project2/upgrade/v6/ProjectUpgrader_V6Test.java
Mon Dec 14 04:56:50 2009
@@ -0,0 +1,99 @@
+/*****************************************************************
+ * 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.project2.upgrade.v6;
+
+import java.net.URL;
+
+import junit.framework.TestCase;
+
+import org.apache.cayenne.project2.upgrade.UpgradeHandler;
+import org.apache.cayenne.project2.upgrade.UpgradeMetaData;
+import org.apache.cayenne.project2.upgrade.UpgradeType;
+import org.apache.cayenne.resource.Resource;
+import org.apache.cayenne.resource.URLResource;
+
+public class ProjectUpgrader_V6Test extends TestCase {
+
+ 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);
+
+ ProjectUpgrader_V6 upgrader = new ProjectUpgrader_V6();
+
+ 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("6", md.getSupportedVersion());
+ }
+
+ public void testMetadata_Type2_0() {
+ String baseUrl = getClass().getPackage().getName().replace('.', '/');
+ URL url = getClass().getClassLoader().getResource(baseUrl +
"/2_0a/cayenne.xml");
+ assertNotNull(url);
+
+ ProjectUpgrader_V6 upgrader = new ProjectUpgrader_V6();
+
+ Resource source = new URLResource(url);
+ UpgradeHandler handler = upgrader.getUpgradeHandler(source);
+
+ assertNotNull(handler);
+ assertSame(source, handler.getProjectSource());
+
+ UpgradeMetaData md = handler.getUpgradeMetaData();
+ assertNotNull(md);
+ assertSame(UpgradeType.INTERMEDIATE_UPGRADE_NEEDED,
md.getUpgradeType());
+ assertEquals("3.0.0.1", md.getIntermediateUpgradeVersion());
+ assertEquals("2.0", md.getProjectVersion());
+ assertEquals("6", md.getSupportedVersion());
+ }
+
+ public void testMetadata_Type6() {
+ String baseUrl = getClass().getPackage().getName().replace('.', '/');
+ URL url = getClass().getClassLoader().getResource(
+ baseUrl + "/6a/cayenne-PROJECT1.xml");
+ assertNotNull(url);
+
+ ProjectUpgrader_V6 upgrader = new ProjectUpgrader_V6();
+
+ 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_NOT_NEEDED, md.getUpgradeType());
+ assertNull(md.getIntermediateUpgradeVersion());
+ assertEquals("6", md.getProjectVersion());
+ assertEquals("6", md.getSupportedVersion());
+ }
+}
Added:
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/2_0a/cayenne.xml
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/2_0a/cayenne.xml?rev=890179&view=auto
==============================================================================
---
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/2_0a/cayenne.xml
(added)
+++
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/2_0a/cayenne.xml
Mon Dec 14 04:56:50 2009
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<domains project-version="2.0">
+<domain name="d1">
+ <map name="d1Map" location="d1Map.map.xml"/>
+
+ <node name="d1Node"
+ datasource="d1Node.driver.xml"
+ factory="org.apache.cayenne.conf.DriverDataSourceFactory">
+ <map-ref name="d1Map"/>
+ </node>
+</domain>
+</domains>
Added:
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/2_0a/d1Map.map.xml
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/2_0a/d1Map.map.xml?rev=890179&view=auto
==============================================================================
---
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/2_0a/d1Map.map.xml
(added)
+++
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/2_0a/d1Map.map.xml
Mon Dec 14 04:56:50 2009
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<data-map project-version="2.0">
+</data-map>
Added:
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/2_0a/d1Node.driver.xml
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/2_0a/d1Node.driver.xml?rev=890179&view=auto
==============================================================================
---
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/2_0a/d1Node.driver.xml
(added)
+++
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/2_0a/d1Node.driver.xml
Mon Dec 14 04:56:50 2009
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<driver project-version="2.0">
+ <connectionPool min="1" max="1" />
+</driver>
Added:
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/3_0_0_1a/cayenne.xml
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/3_0_0_1a/cayenne.xml?rev=890179&view=auto
==============================================================================
---
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/3_0_0_1a/cayenne.xml
(added)
+++
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/3_0_0_1a/cayenne.xml
Mon Dec 14 04:56:50 2009
@@ -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>
Added:
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/3_0_0_1a/d1Map1.map.xml
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/3_0_0_1a/d1Map1.map.xml?rev=890179&view=auto
==============================================================================
---
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/3_0_0_1a/d1Map1.map.xml
(added)
+++
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/3_0_0_1a/d1Map1.map.xml
Mon Dec 14 04:56:50 2009
@@ -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>
Added:
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/3_0_0_1a/d1Map2.map.xml
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/3_0_0_1a/d1Map2.map.xml?rev=890179&view=auto
==============================================================================
---
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/3_0_0_1a/d1Map2.map.xml
(added)
+++
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/3_0_0_1a/d1Map2.map.xml
Mon Dec 14 04:56:50 2009
@@ -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>
Added:
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/3_0_0_1a/d1NodeDriver.driver.xml
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/3_0_0_1a/d1NodeDriver.driver.xml?rev=890179&view=auto
==============================================================================
---
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/3_0_0_1a/d1NodeDriver.driver.xml
(added)
+++
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/3_0_0_1a/d1NodeDriver.driver.xml
Mon Dec 14 04:56:50 2009
@@ -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="1"/>
+ <login userName="user" password="password"/>
+</driver>
Added:
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/6a/cayenne-PROJECT1.xml
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/6a/cayenne-PROJECT1.xml?rev=890179&view=auto
==============================================================================
---
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/6a/cayenne-PROJECT1.xml
(added)
+++
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/6a/cayenne-PROJECT1.xml
Mon Dec 14 04:56:50 2009
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<domain name="DefaultDomain" 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>
Added:
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/6a/testProjectMap1_1.map.xml
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/6a/testProjectMap1_1.map.xml?rev=890179&view=auto
==============================================================================
---
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/6a/testProjectMap1_1.map.xml
(added)
+++
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/6a/testProjectMap1_1.map.xml
Mon Dec 14 04:56:50 2009
@@ -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>
Added:
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/6a/testProjectMap1_2.map.xml
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/6a/testProjectMap1_2.map.xml?rev=890179&view=auto
==============================================================================
---
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/6a/testProjectMap1_2.map.xml
(added)
+++
cayenne/main/trunk/framework/cayenne-project-unpublished/src/test/resources/org/apache/cayenne/project2/upgrade/v6/6a/testProjectMap1_2.map.xml
Mon Dec 14 04:56:50 2009
@@ -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>