diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenExtension.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenExtension.java index 3748199421..f06ec19764 100644 --- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenExtension.java +++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenExtension.java @@ -20,8 +20,9 @@ import org.apache.cayenne.configuration.ConfigurationNodeVisitor; import org.apache.cayenne.configuration.xml.DataChannelMetaData; +import org.apache.cayenne.configuration.xml.ProjectVersion; +import org.apache.cayenne.configuration.xml.Schema; import org.apache.cayenne.di.Inject; -import org.apache.cayenne.project.Project; import org.apache.cayenne.project.extension.BaseNamingDelegate; import org.apache.cayenne.project.extension.LoaderDelegate; import org.apache.cayenne.project.extension.ProjectExtension; @@ -32,7 +33,7 @@ */ public class CgenExtension implements ProjectExtension { - public static final String NAMESPACE = "http://cayenne.apache.org/schema/" + Project.VERSION + "/cgen"; + public static final String NAMESPACE = Schema.buildNamespace(ProjectVersion.getCurrent(), "cgen"); @Inject private DataChannelMetaData metaData; diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportExtension.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportExtension.java index 5732061c74..11380a7186 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportExtension.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportExtension.java @@ -21,8 +21,9 @@ import org.apache.cayenne.configuration.ConfigurationNodeVisitor; import org.apache.cayenne.configuration.xml.DataChannelMetaData; +import org.apache.cayenne.configuration.xml.ProjectVersion; +import org.apache.cayenne.configuration.xml.Schema; import org.apache.cayenne.di.Inject; -import org.apache.cayenne.project.Project; import org.apache.cayenne.project.extension.BaseNamingDelegate; import org.apache.cayenne.project.extension.LoaderDelegate; import org.apache.cayenne.project.extension.ProjectExtension; @@ -33,7 +34,7 @@ */ public class DbImportExtension implements ProjectExtension { - public static final String NAMESPACE = "http://cayenne.apache.org/schema/" + Project.VERSION + "/dbimport"; + public static final String NAMESPACE = Schema.buildNamespace(ProjectVersion.getCurrent(), "dbimport"); @Inject private DataChannelMetaData metaData; diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/ConfigurationSaver.java b/cayenne-project/src/main/java/org/apache/cayenne/project/ConfigurationSaver.java index 7aeb30744f..b30db7ef98 100644 --- a/cayenne-project/src/main/java/org/apache/cayenne/project/ConfigurationSaver.java +++ b/cayenne-project/src/main/java/org/apache/cayenne/project/ConfigurationSaver.java @@ -22,6 +22,7 @@ import org.apache.cayenne.configuration.BaseConfigurationNodeVisitor; import org.apache.cayenne.configuration.DataChannelDescriptor; +import org.apache.cayenne.configuration.xml.ProjectVersion; import org.apache.cayenne.map.DataMap; import org.apache.cayenne.project.extension.SaverDelegate; import org.apache.cayenne.util.XMLEncoder; @@ -33,10 +34,10 @@ class ConfigurationSaver extends BaseConfigurationNodeVisitor { private PrintWriter printWriter; - private String version; + private ProjectVersion version; private SaverDelegate delegate; - ConfigurationSaver(PrintWriter printWriter, String version, SaverDelegate delegate) { + ConfigurationSaver(PrintWriter printWriter, ProjectVersion version, SaverDelegate delegate) { this.printWriter = printWriter; this.version = version; this.delegate = delegate; 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 e81c8a88f7..3223703dbe 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 @@ -22,6 +22,7 @@ import org.apache.cayenne.configuration.ConfigurationNameMapper; import org.apache.cayenne.configuration.ConfigurationNode; import org.apache.cayenne.configuration.ConfigurationNodeVisitor; +import org.apache.cayenne.configuration.xml.ProjectVersion; import org.apache.cayenne.di.Inject; import org.apache.cayenne.map.DataMap; import org.apache.cayenne.project.extension.ProjectExtension; @@ -77,8 +78,8 @@ public FileProjectSaver(@Inject List extensions) { } @Override - public String getSupportedVersion() { - return String.valueOf(Project.VERSION); + public ProjectVersion getSupportedVersion() { + return ProjectVersion.getCurrent(); } @Override diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/Project.java b/cayenne-project/src/main/java/org/apache/cayenne/project/Project.java index 4cd6c3242f..c25595b72a 100644 --- a/cayenne-project/src/main/java/org/apache/cayenne/project/Project.java +++ b/cayenne-project/src/main/java/org/apache/cayenne/project/Project.java @@ -25,6 +25,7 @@ import org.apache.cayenne.configuration.ConfigurationNode; import org.apache.cayenne.configuration.ConfigurationNodeVisitor; import org.apache.cayenne.configuration.ConfigurationTree; +import org.apache.cayenne.configuration.xml.ProjectVersion; import org.apache.cayenne.resource.Resource; /** @@ -41,8 +42,10 @@ public class Project { * Used by different parsers and savers of project's XML files. * * @since 4.1 + * @deprecated since 5.0 use {@link ProjectVersion#getCurrent()} instead */ - static public final int VERSION = 11; + @Deprecated(since = "5.0", forRemoval = true) + public static final int VERSION = (int) ProjectVersion.getCurrent().getAsDouble(); protected boolean modified; diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/ProjectSaver.java b/cayenne-project/src/main/java/org/apache/cayenne/project/ProjectSaver.java index 28909fcb5e..c79646a976 100644 --- a/cayenne-project/src/main/java/org/apache/cayenne/project/ProjectSaver.java +++ b/cayenne-project/src/main/java/org/apache/cayenne/project/ProjectSaver.java @@ -18,6 +18,7 @@ ****************************************************************/ package org.apache.cayenne.project; +import org.apache.cayenne.configuration.xml.ProjectVersion; import org.apache.cayenne.resource.Resource; /** @@ -30,7 +31,7 @@ public interface ProjectSaver { /** * Returns a version of the project configuration supported by the current runtime. */ - String getSupportedVersion(); + ProjectVersion getSupportedVersion(); /** * Saves project in the location of its current configuration sources. Since resource diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/info/InfoExtension.java b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/info/InfoExtension.java index 20aa6c92a9..d9f59295f2 100644 --- a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/info/InfoExtension.java +++ b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/info/InfoExtension.java @@ -21,8 +21,9 @@ import org.apache.cayenne.configuration.ConfigurationNodeVisitor; import org.apache.cayenne.configuration.xml.DataChannelMetaData; +import org.apache.cayenne.configuration.xml.ProjectVersion; +import org.apache.cayenne.configuration.xml.Schema; import org.apache.cayenne.di.Inject; -import org.apache.cayenne.project.Project; import org.apache.cayenne.project.extension.BaseNamingDelegate; import org.apache.cayenne.project.extension.LoaderDelegate; import org.apache.cayenne.project.extension.ProjectExtension; @@ -37,7 +38,7 @@ */ public class InfoExtension implements ProjectExtension { - static final String NAMESPACE = "http://cayenne.apache.org/schema/" + Project.VERSION + "/info"; + static final String NAMESPACE = Schema.buildNamespace(ProjectVersion.getCurrent(), "info"); @Inject private DataChannelMetaData metaData; diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/DefaultUpgradeService.java b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/DefaultUpgradeService.java index f9234559bf..2c9b163b79 100644 --- a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/DefaultUpgradeService.java +++ b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/DefaultUpgradeService.java @@ -23,7 +23,6 @@ import java.net.URL; import java.util.ArrayList; import java.util.Collection; -import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -42,6 +41,7 @@ import org.apache.cayenne.configuration.ConfigurationTree; import org.apache.cayenne.configuration.DataChannelDescriptor; import org.apache.cayenne.configuration.DataChannelDescriptorLoader; +import org.apache.cayenne.configuration.xml.ProjectVersion; import org.apache.cayenne.di.Inject; import org.apache.cayenne.map.DataMap; import org.apache.cayenne.map.EntityResolver; @@ -61,8 +61,6 @@ import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; -import static org.apache.cayenne.util.Util.isBlank; - /** * * Upgrade service sequence is following: @@ -89,10 +87,9 @@ public class DefaultUpgradeService implements UpgradeService { private static final Logger logger = LoggerFactory.getLogger(DefaultUpgradeService.class); - public static final String UNKNOWN_VERSION = "0"; - public static final String MIN_SUPPORTED_VERSION = "6"; + public static final ProjectVersion MIN_SUPPORTED_VERSION = ProjectVersion.V6; - TreeMap handlers = new TreeMap<>(VersionComparator.INSTANCE); + TreeMap handlers = new TreeMap<>(); @Inject private ProjectSaver projectSaver; @@ -101,7 +98,7 @@ public class DefaultUpgradeService implements UpgradeService { private DataChannelDescriptorLoader loader; public DefaultUpgradeService(@Inject List handlerList) { - for(UpgradeHandler handler : handlerList) { + for (UpgradeHandler handler : handlerList) { handlers.put(handler.getVersion(), handler); } } @@ -110,21 +107,20 @@ public DefaultUpgradeService(@Inject List handlerList) { public UpgradeMetaData getUpgradeType(Resource resource) { UpgradeMetaData metaData = new UpgradeMetaData(); - String version = loadProjectVersion(resource); - metaData.setProjectVersion(version); - metaData.setSupportedVersion(String.valueOf(Project.VERSION)); + ProjectVersion version = loadProjectVersion(resource); + metaData.setProjectVersion(version.getAsString()); + metaData.setSupportedVersion(ProjectVersion.getCurrent().getAsString()); - int c1 = VersionComparator.INSTANCE.compare(version, MIN_SUPPORTED_VERSION); - if (c1 < 0) { - metaData.setIntermediateUpgradeVersion(MIN_SUPPORTED_VERSION); + if (version.compareTo(MIN_SUPPORTED_VERSION) < 0) { + metaData.setIntermediateUpgradeVersion(MIN_SUPPORTED_VERSION.getAsString()); metaData.setUpgradeType(UpgradeType.INTERMEDIATE_UPGRADE_NEEDED); return metaData; } - int c2 = VersionComparator.INSTANCE.compare(String.valueOf(Project.VERSION), version); - if (c2 < 0) { + int comparison = ProjectVersion.getCurrent().compareTo(version); + if (comparison < 0) { metaData.setUpgradeType(UpgradeType.DOWNGRADE_NEEDED); - } else if (c2 == 0) { + } else if (comparison == 0) { metaData.setUpgradeType(UpgradeType.UPGRADE_NOT_NEEDED); } else { metaData.setUpgradeType(UpgradeType.UPGRADE_NEEDED); @@ -132,22 +128,13 @@ public UpgradeMetaData getUpgradeType(Resource resource) { return metaData; } - protected List getHandlersForVersion(String version) { - boolean found = MIN_SUPPORTED_VERSION.equals(version); + protected List getHandlersForVersion(ProjectVersion version) { List handlerList = new ArrayList<>(); - - for(Map.Entry entry : handlers.entrySet()) { - if(entry.getKey().equals(version)) { - found = true; - continue; + for (Map.Entry entry : handlers.entrySet()) { + if(entry.getKey().compareTo(version) > 0) { + handlerList.add(entry.getValue()); } - if(!found) { - continue; - } - - handlerList.add(entry.getValue()); } - return handlerList; } @@ -263,7 +250,7 @@ protected void saveDocument(UpgradeUnit upgradeUnit) { * A default method for quick extraction of the project version from an XML * file. */ - protected String loadProjectVersion(Resource resource) { + protected ProjectVersion loadProjectVersion(Resource resource) { RootTagHandler rootHandler = new RootTagHandler(); URL url = resource.getURL(); @@ -278,44 +265,7 @@ protected String loadProjectVersion(Resource resource) { throw new ConfigurationException("Error reading configuration from %s", e, url); } - return rootHandler.projectVersion != null ? rootHandler.projectVersion : UNKNOWN_VERSION; - } - - protected static double decodeVersion(String version) { - if (version == null || isBlank(version)) { - 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()); - } - - private static class VersionComparator implements Comparator { - - private static final VersionComparator INSTANCE = new VersionComparator(); - - @Override - public int compare(String o1, String o2) { - if (o1.equals(o2)) { - return 0; - } - double v1Double = decodeVersion(o1); - double v2Double = decodeVersion(o2); - return v1Double < v2Double ? -1 : 1; - } + return ProjectVersion.fromString(rootHandler.projectVersion); } class RootTagHandler extends DefaultHandler { diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler.java b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler.java index e5be3c86d3..d7a1bf3559 100644 --- a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler.java +++ b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler.java @@ -25,6 +25,8 @@ import javax.xml.xpath.XPathFactory; import org.apache.cayenne.configuration.DataChannelDescriptor; +import org.apache.cayenne.configuration.xml.ProjectVersion; +import org.apache.cayenne.configuration.xml.Schema; import org.apache.cayenne.project.upgrade.UpgradeUnit; import org.w3c.dom.Element; import org.w3c.dom.NodeList; @@ -58,7 +60,7 @@ public interface UpgradeHandler { /** * @return target version for this handler */ - String getVersion(); + ProjectVersion getVersion(); /** * Process DOM for the project root file (e.g. cayenne-project.xml) @@ -84,13 +86,14 @@ default void processModel(DataChannelDescriptor dataChannelDescriptor) { */ default void updateDomainSchemaAndVersion(UpgradeUnit upgradeUnit) { Element domain = upgradeUnit.getDocument().getDocumentElement(); + ProjectVersion version = getVersion(); // update schema - domain.setAttribute("xmlns","http://cayenne.apache.org/schema/"+getVersion()+"/domain"); + domain.setAttribute("xmlns", Schema.buildNamespace(version, "domain")); domain.setAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance"); - domain.setAttribute("xsi:schemaLocation", "http://cayenne.apache.org/schema/"+getVersion()+"/domain " + - "https://cayenne.apache.org/schema/"+getVersion()+"/domain.xsd"); + domain.setAttribute("xsi:schemaLocation", Schema.buildNamespace(version, "domain") + " " + + Schema.buildSchemaLocation(version, "domain")); // update version - domain.setAttribute("project-version", getVersion()); + domain.setAttribute("project-version", version.getAsString()); } /** @@ -99,12 +102,13 @@ default void updateDomainSchemaAndVersion(UpgradeUnit upgradeUnit) { */ default void updateDataMapSchemaAndVersion(UpgradeUnit upgradeUnit) { Element dataMap = upgradeUnit.getDocument().getDocumentElement(); + ProjectVersion version = getVersion(); // update schema - dataMap.setAttribute("xmlns","http://cayenne.apache.org/schema/"+getVersion()+"/modelMap"); - dataMap.setAttribute("xsi:schemaLocation", "http://cayenne.apache.org/schema/"+getVersion()+"/modelMap " + - "https://cayenne.apache.org/schema/"+getVersion()+"/modelMap.xsd"); + dataMap.setAttribute("xmlns", Schema.buildNamespace(version, "modelMap")); + dataMap.setAttribute("xsi:schemaLocation", Schema.buildNamespace(version, "modelMap") + " " + + Schema.buildSchemaLocation(version, "modelMap")); // update version - dataMap.setAttribute("project-version", getVersion()); + dataMap.setAttribute("project-version", version.getAsString()); } /** @@ -123,7 +127,7 @@ default void updateExtensionSchema(UpgradeUnit upgradeUnit, String extension) { } for (int j = 0; j < nodes.getLength(); j++) { Element element = (Element) nodes.item(j); - element.setAttribute("xmlns", "http://cayenne.apache.org/schema/"+getVersion()+"/"+extension.toLowerCase()); + element.setAttribute("xmlns", Schema.buildNamespace(getVersion(), extension.toLowerCase())); } } } diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V10.java b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V10.java index ba01d8b2b9..112f3153db 100644 --- a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V10.java +++ b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V10.java @@ -19,6 +19,7 @@ package org.apache.cayenne.project.upgrade.handlers; +import org.apache.cayenne.configuration.xml.ProjectVersion; import org.apache.cayenne.project.upgrade.UpgradeUnit; /** @@ -32,8 +33,8 @@ public class UpgradeHandler_V10 implements UpgradeHandler { @Override - public String getVersion() { - return "10"; + public ProjectVersion getVersion() { + return ProjectVersion.V10; } @Override diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V11.java b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V11.java index 6e95a685a7..c010166d39 100644 --- a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V11.java +++ b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V11.java @@ -19,6 +19,8 @@ package org.apache.cayenne.project.upgrade.handlers; +import org.apache.cayenne.configuration.xml.ProjectVersion; +import org.apache.cayenne.configuration.xml.Schema; import org.apache.cayenne.project.upgrade.UpgradeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -64,8 +66,8 @@ public class UpgradeHandler_V11 implements UpgradeHandler { "templates/v4_1/datamap-subclass.vm"); @Override - public String getVersion() { - return "11"; + public ProjectVersion getVersion() { + return ProjectVersion.V11; } @Override @@ -102,7 +104,7 @@ private void upgradeComments(UpgradeUnit upgradeUnit) { for (int j = 0; j < infoNodes.getLength(); j++) { Element infoElement = (Element) infoNodes.item(j); if (infoElement.hasAttribute("xmlns:info")) { - infoElement.setAttribute("xmlns:info", "http://cayenne.apache.org/schema/11/info"); + infoElement.setAttribute("xmlns:info", Schema.buildNamespace(getVersion(), "info")); } } } diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V7.java b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V7.java index 2176458188..e3998b87bd 100644 --- a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V7.java +++ b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V7.java @@ -26,6 +26,7 @@ import javax.xml.xpath.XPathFactory; import org.apache.cayenne.configuration.DataChannelDescriptor; +import org.apache.cayenne.configuration.xml.ProjectVersion; import org.apache.cayenne.map.DataMap; import org.apache.cayenne.map.ObjAttribute; import org.apache.cayenne.map.ObjEntity; @@ -39,14 +40,14 @@ public class UpgradeHandler_V7 implements UpgradeHandler { @Override - public String getVersion() { - return "7"; + public ProjectVersion getVersion() { + return ProjectVersion.V7; } @Override public void processProjectDom(UpgradeUnit upgradeUnit) { Element domain = upgradeUnit.getDocument().getDocumentElement(); - domain.setAttribute("project-version", getVersion()); + domain.setAttribute("project-version", getVersion().getAsString()); XPath xpath = XPathFactory.newInstance().newXPath(); Node node; diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V8.java b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V8.java index c94dc68ec4..f77e8271a8 100644 --- a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V8.java +++ b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V8.java @@ -24,6 +24,7 @@ import javax.xml.xpath.XPathFactory; import org.apache.cayenne.ConfigurationException; +import org.apache.cayenne.configuration.xml.ProjectVersion; import org.apache.cayenne.map.QueryDescriptor; import org.apache.cayenne.project.upgrade.UpgradeUnit; import org.w3c.dom.Element; @@ -35,14 +36,14 @@ public class UpgradeHandler_V8 implements UpgradeHandler { @Override - public String getVersion() { - return "8"; + public ProjectVersion getVersion() { + return ProjectVersion.V8; } @Override public void processProjectDom(UpgradeUnit upgradeUnit) { Element domain = upgradeUnit.getDocument().getDocumentElement(); - domain.setAttribute("project-version", getVersion()); + domain.setAttribute("project-version", getVersion().getAsString()); } @Override diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V9.java b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V9.java index 05ce5ec005..604a117ca5 100644 --- a/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V9.java +++ b/cayenne-project/src/main/java/org/apache/cayenne/project/upgrade/handlers/UpgradeHandler_V9.java @@ -19,12 +19,11 @@ package org.apache.cayenne.project.upgrade.handlers; -import java.io.File; +import org.apache.cayenne.configuration.xml.ProjectVersion; +import org.apache.cayenne.project.upgrade.UpgradeUnit; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathFactory; - -import org.apache.cayenne.project.upgrade.UpgradeUnit; import org.apache.cayenne.util.Util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,6 +31,8 @@ import org.w3c.dom.Element; import org.w3c.dom.Node; +import java.io.File; + /** * @since 4.1 */ @@ -40,14 +41,14 @@ public class UpgradeHandler_V9 implements UpgradeHandler { private static final Logger logger = LoggerFactory.getLogger(UpgradeHandler_V9.class); @Override - public String getVersion() { - return "9"; + public ProjectVersion getVersion() { + return ProjectVersion.V9; } @Override public void processProjectDom(UpgradeUnit upgradeUnit) { Element domain = upgradeUnit.getDocument().getDocumentElement(); - domain.setAttribute("project-version", getVersion()); + domain.setAttribute("project-version", getVersion().getAsString()); } @Override diff --git a/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/DefaultUpgradeServiceTest.java b/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/DefaultUpgradeServiceTest.java index a2ba5ca124..b4c649846f 100644 --- a/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/DefaultUpgradeServiceTest.java +++ b/cayenne-project/src/test/java/org/apache/cayenne/project/upgrade/DefaultUpgradeServiceTest.java @@ -27,6 +27,7 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; +import org.apache.cayenne.configuration.xml.ProjectVersion; import org.apache.cayenne.project.upgrade.handlers.UpgradeHandler; import org.apache.cayenne.resource.Resource; import org.apache.cayenne.resource.URLResource; @@ -57,7 +58,7 @@ public void createService() { } @Test - public void getUpgradeType() throws Exception { + public void getUpgradeType() { UpgradeMetaData metaData = upgradeService.getUpgradeType(getResourceForVersion("5")); assertEquals(UpgradeType.INTERMEDIATE_UPGRADE_NEEDED, metaData.getUpgradeType()); @@ -75,15 +76,15 @@ public void getUpgradeType() throws Exception { } @Test - public void getHandlersForVersion() throws Exception { + public void getHandlersForVersion() { - List handlers = upgradeService.getHandlersForVersion("6"); + List handlers = upgradeService.getHandlersForVersion(ProjectVersion.V6); assertEquals(5, handlers.size()); - handlers = upgradeService.getHandlersForVersion("9"); + handlers = upgradeService.getHandlersForVersion(ProjectVersion.V9); assertEquals(2, handlers.size()); - assertEquals("10", handlers.get(0).getVersion()); - assertEquals("11", handlers.get(1).getVersion()); + assertEquals(ProjectVersion.V10, handlers.get(0).getVersion()); + assertEquals(ProjectVersion.V11, handlers.get(1).getVersion()); } @Test @@ -99,20 +100,13 @@ public void getAdditionalDatamapResources() throws Exception { } @Test - public void loadProjectVersion() throws Exception { - assertEquals("3.2.1.0", upgradeService.loadProjectVersion(getResourceForVersion("3.2.1.0"))); - assertEquals("10", upgradeService.loadProjectVersion(getResourceForVersion("10"))); + public void loadProjectVersion() { + assertEquals("3.21", upgradeService.loadProjectVersion(getResourceForVersion("3.2.1.0")).getAsString()); + assertEquals(ProjectVersion.V10, upgradeService.loadProjectVersion(getResourceForVersion("10"))); } @Test - public void decodeVersion() throws Exception { - assertEquals(1.2340, DefaultUpgradeService.decodeVersion("1.2.3.4"), 0.000001); - assertEquals(1.0004, DefaultUpgradeService.decodeVersion("1.0.0.0.4"), 0.000001); - assertEquals(10, DefaultUpgradeService.decodeVersion("10"), 0.000001); - } - - @Test - public void upgradeDOM() throws Exception { + public void upgradeDOM() { Resource resource = new URLResource(getClass().getResource("../cayenne-PROJECT1.xml")); // Mock service so it will use actual reading but skip actual saving part @@ -136,7 +130,7 @@ public void upgradeDOM() throws Exception { } @Test - public void readDocument() throws Exception { + public void readDocument() { Document document = Util.readDocument(getClass().getResource("../cayenne-PROJECT1.xml")); assertEquals("11", document.getDocumentElement().getAttribute("project-version")); } @@ -148,13 +142,12 @@ private Document readDocument(URL url) throws Exception { private void createHandlers() { handlers = new ArrayList<>(); - String[] versions = {"7", "8", "9", "10", "11"}; - for(String version : versions) { + for (ProjectVersion version : ProjectVersion.KNOWN_VERSIONS) { handlers.add(createHandler(version)); } } - private UpgradeHandler createHandler(String version) { + private UpgradeHandler createHandler(ProjectVersion version) { UpgradeHandler handler = mock(UpgradeHandler.class); when(handler.getVersion()).thenReturn(version); return handler; @@ -163,5 +156,4 @@ private UpgradeHandler createHandler(String version) { private Resource getResourceForVersion(String version) { return new URLResource(getClass().getResource("handlers/cayenne-project-v"+version+".xml")); } - -} \ No newline at end of file +} diff --git a/cayenne/src/main/java/org/apache/cayenne/configuration/DataChannelDescriptor.java b/cayenne/src/main/java/org/apache/cayenne/configuration/DataChannelDescriptor.java index 54386801a2..fd369c7dd2 100644 --- a/cayenne/src/main/java/org/apache/cayenne/configuration/DataChannelDescriptor.java +++ b/cayenne/src/main/java/org/apache/cayenne/configuration/DataChannelDescriptor.java @@ -18,6 +18,8 @@ ****************************************************************/ package org.apache.cayenne.configuration; +import org.apache.cayenne.configuration.xml.ProjectVersion; +import org.apache.cayenne.configuration.xml.Schema; import org.apache.cayenne.map.DataMap; import org.apache.cayenne.resource.Resource; import org.apache.cayenne.util.XMLEncoder; @@ -43,8 +45,8 @@ public class DataChannelDescriptor implements ConfigurationNode, Serializable, X /** * The namespace in which the data map XML file will be created. */ - public static final String SCHEMA_XSD = "http://cayenne.apache.org/schema/11/domain"; - public static final String SCHEMA_XSD_LOCATION = "https://cayenne.apache.org/schema/11/domain.xsd"; + public static final String SCHEMA_XSD = Schema.buildNamespace(ProjectVersion.getCurrent(), "domain"); + public static final String SCHEMA_XSD_LOCATION = Schema.buildSchemaLocation(ProjectVersion.getCurrent(), "domain"); protected String name; protected Map properties; diff --git a/cayenne/src/main/java/org/apache/cayenne/configuration/xml/ProjectVersion.java b/cayenne/src/main/java/org/apache/cayenne/configuration/xml/ProjectVersion.java new file mode 100644 index 0000000000..8b7679f181 --- /dev/null +++ b/cayenne/src/main/java/org/apache/cayenne/configuration/xml/ProjectVersion.java @@ -0,0 +1,139 @@ +/***************************************************************** + * 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 + * + * https://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.configuration.xml; + +import java.text.DecimalFormat; +import java.util.Set; + +/** + * Represents Cayenne project XML version. + * This version is used across all project XML files including domain, data maps, and extensions. + * + * @since 5.0 + */ +public final class ProjectVersion implements Comparable { + + public static final ProjectVersion V6 = new ProjectVersion(6); + public static final ProjectVersion V7 = new ProjectVersion(7); + public static final ProjectVersion V8 = new ProjectVersion(8); + public static final ProjectVersion V9 = new ProjectVersion(9); + public static final ProjectVersion V10 = new ProjectVersion(10); + public static final ProjectVersion V11 = new ProjectVersion(11); + + public static final Set KNOWN_VERSIONS = Set.of(V6, V7, V8, V9, V10, V11); + + private static final DecimalFormat VERSION_FORMAT = new DecimalFormat("#.#################"); + + private final double version; + + private ProjectVersion(double version) { + this.version = version; + } + + /** + * Returns the version as a double. + * + * @return version number + */ + public double getAsDouble() { + return version; + } + + /** + * Returns the version as a string. + * + * @return version string + */ + public String getAsString() { + return VERSION_FORMAT.format(version); + } + + @Override + public String toString() { + return getAsString(); + } + + @Override + public int compareTo(ProjectVersion other) { + return Double.compare(this.version, other.version); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + ProjectVersion that = (ProjectVersion) obj; + return Double.compare(that.version, version) == 0; + } + + @Override + public int hashCode() { + return Double.hashCode(version); + } + + /** + * Returns the current project version. + * + * @return current project version + */ + public static ProjectVersion getCurrent() { + return V11; + } + + /** + * Parses a version string and returns the corresponding value-object. + * + * @param versionString version string to parse + * @return corresponding ProjectVersion + */ + public static ProjectVersion fromString(String versionString) { + double version = decodeVersion(versionString); + for (ProjectVersion knownVersion : KNOWN_VERSIONS) { + if (knownVersion.version == version) { + return knownVersion; + } + } + return new ProjectVersion(version); + } + + private static double decodeVersion(String version) { + if (version == null || version.isBlank()) { + 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()); + } +} diff --git a/cayenne/src/main/java/org/apache/cayenne/configuration/xml/Schema.java b/cayenne/src/main/java/org/apache/cayenne/configuration/xml/Schema.java new file mode 100644 index 0000000000..2bfbd69240 --- /dev/null +++ b/cayenne/src/main/java/org/apache/cayenne/configuration/xml/Schema.java @@ -0,0 +1,55 @@ +/***************************************************************** + * 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 + * + * https://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.configuration.xml; + +/** + * Utility class for generating XSD namespace URLs for Cayenne project XML files. + * + * @since 5.0 + */ +public final class Schema { + + private static final String NAMESPACE_BASE = "http://cayenne.apache.org/schema/"; + private static final String SCHEMA_LOCATION_BASE = "https://cayenne.apache.org/schema/"; + + private Schema() { + } + + /** + * Generates XSD namespace for the given schema type and version. + * + * @param version project version + * @param schemaType schema type (e.g., "domain", "modelMap", "info", "cgen") + * @return XSD namespace URL + */ + public static String buildNamespace(ProjectVersion version, String schemaType) { + return NAMESPACE_BASE + version.getAsString() + "/" + schemaType; + } + + /** + * Generates XSD schema location for the given schema type and version. + * + * @param version project version + * @param schemaType schema type (e.g., "domain", "modelMap") + * @return XSD schema location URL + */ + public static String buildSchemaLocation(ProjectVersion version, String schemaType) { + return SCHEMA_LOCATION_BASE + version.getAsString() + "/" + schemaType + ".xsd"; + } +} diff --git a/cayenne/src/main/java/org/apache/cayenne/configuration/xml/VersionAwareHandler.java b/cayenne/src/main/java/org/apache/cayenne/configuration/xml/VersionAwareHandler.java index 27e7d87ddb..1d03686480 100644 --- a/cayenne/src/main/java/org/apache/cayenne/configuration/xml/VersionAwareHandler.java +++ b/cayenne/src/main/java/org/apache/cayenne/configuration/xml/VersionAwareHandler.java @@ -53,9 +53,10 @@ protected boolean processElement(String namespaceURI, String localName, Attribut return false; } - protected void validateVersion(Attributes attributes, String[] supportedVersions) { + protected void validateVersion(Attributes attributes, ProjectVersion[] supportedVersions) { String version = attributes.getValue("project-version"); - if(Arrays.binarySearch(supportedVersions, version) < 0) { + boolean anyMatch = Arrays.stream(supportedVersions).map(ProjectVersion::getAsString).anyMatch(version::equals); + if (!anyMatch) { throw new CayenneRuntimeException("Unsupported project version: %s, please upgrade project using Modeler or " + "include cayenne-project-compatibility module v%s", version, LocalizedStringsHandler.getString("cayenne.version")); diff --git a/cayenne/src/main/java/org/apache/cayenne/configuration/xml/XMLDataChannelDescriptorLoader.java b/cayenne/src/main/java/org/apache/cayenne/configuration/xml/XMLDataChannelDescriptorLoader.java index c2ea04420e..fccd117e35 100644 --- a/cayenne/src/main/java/org/apache/cayenne/configuration/xml/XMLDataChannelDescriptorLoader.java +++ b/cayenne/src/main/java/org/apache/cayenne/configuration/xml/XMLDataChannelDescriptorLoader.java @@ -48,7 +48,7 @@ public class XMLDataChannelDescriptorLoader implements DataChannelDescriptorLoad /** * Versions of project XML files that this loader can read. */ - static final String[] SUPPORTED_PROJECT_VERSIONS = {"11"}; + static final ProjectVersion[] SUPPORTED_PROJECT_VERSIONS = {ProjectVersion.getCurrent()}; static { Arrays.sort(SUPPORTED_PROJECT_VERSIONS); } diff --git a/cayenne/src/main/java/org/apache/cayenne/map/DataMap.java b/cayenne/src/main/java/org/apache/cayenne/map/DataMap.java index 6b405c6783..bd7e95a5ba 100644 --- a/cayenne/src/main/java/org/apache/cayenne/map/DataMap.java +++ b/cayenne/src/main/java/org/apache/cayenne/map/DataMap.java @@ -24,6 +24,8 @@ import org.apache.cayenne.configuration.ConfigurationNode; import org.apache.cayenne.configuration.ConfigurationNodeVisitor; import org.apache.cayenne.configuration.DataChannelDescriptor; +import org.apache.cayenne.configuration.xml.ProjectVersion; +import org.apache.cayenne.configuration.xml.Schema; import org.apache.cayenne.map.event.DbEntityListener; import org.apache.cayenne.map.event.EntityEvent; import org.apache.cayenne.map.event.ObjEntityListener; @@ -96,8 +98,8 @@ 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/11/modelMap"; - public static final String SCHEMA_XSD_LOCATION = "https://cayenne.apache.org/schema/11/modelMap.xsd"; + public static final String SCHEMA_XSD = Schema.buildNamespace(ProjectVersion.getCurrent(), "modelMap"); + public static final String SCHEMA_XSD_LOCATION = Schema.buildSchemaLocation(ProjectVersion.getCurrent(), "modelMap"); protected String name; protected String location; diff --git a/cayenne/src/main/java/org/apache/cayenne/util/XMLEncoder.java b/cayenne/src/main/java/org/apache/cayenne/util/XMLEncoder.java index cfa4e2f8be..c7dee47570 100644 --- a/cayenne/src/main/java/org/apache/cayenne/util/XMLEncoder.java +++ b/cayenne/src/main/java/org/apache/cayenne/util/XMLEncoder.java @@ -26,6 +26,7 @@ import java.util.Map; import org.apache.cayenne.configuration.ConfigurationNodeVisitor; +import org.apache.cayenne.configuration.xml.ProjectVersion; /** *

@@ -44,7 +45,7 @@ */ public class XMLEncoder { - protected String projectVersion; + protected ProjectVersion projectVersion; protected String indent; protected PrintWriter out; @@ -68,7 +69,7 @@ public XMLEncoder(PrintWriter out, String indent) { /** * @since 3.1 */ - public XMLEncoder(PrintWriter out, String indent, String projectVersion) { + public XMLEncoder(PrintWriter out, String indent, ProjectVersion projectVersion) { this.indent = indent; this.out = out; this.projectVersion = projectVersion; @@ -343,6 +344,9 @@ public XMLEncoder simpleTag(String tag, String value) { * @since 4.1 */ public XMLEncoder projectVersion() { - return attribute("project-version", projectVersion, true); + if (projectVersion != null) { + return attribute("project-version", projectVersion.getAsString(), true); + } + return this; } } diff --git a/cayenne/src/test/java/org/apache/cayenne/configuration/xml/ProjectVersionTest.java b/cayenne/src/test/java/org/apache/cayenne/configuration/xml/ProjectVersionTest.java new file mode 100644 index 0000000000..f95e234ff1 --- /dev/null +++ b/cayenne/src/test/java/org/apache/cayenne/configuration/xml/ProjectVersionTest.java @@ -0,0 +1,29 @@ +package org.apache.cayenne.configuration.xml; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class ProjectVersionTest { + + @Test + public void decodeVersion() { + assertEquals(1.2340, ProjectVersion.fromString("1.2.3.4").getAsDouble(), 0.000001); + assertEquals(1.0004, ProjectVersion.fromString("1.0.0.0.4").getAsDouble(), 0.000001); + assertEquals(10.0, ProjectVersion.fromString("10").getAsDouble(), 0.000001); + } + + @Test + public void knownVersions() { + assertEquals(ProjectVersion.V7, ProjectVersion.fromString("7")); + assertEquals(ProjectVersion.V10, ProjectVersion.fromString("10")); + assertEquals(ProjectVersion.V11, ProjectVersion.fromString("11")); + } + + @Test + public void comparison() { + assertEquals(0, ProjectVersion.V10.compareTo(ProjectVersion.V10)); + assertEquals(-1, ProjectVersion.V7.compareTo(ProjectVersion.V10)); + assertEquals(1, ProjectVersion.V11.compareTo(ProjectVersion.V9)); + } +} diff --git a/cayenne/src/test/java/org/apache/cayenne/configuration/xml/VersionAwareHandlerTest.java b/cayenne/src/test/java/org/apache/cayenne/configuration/xml/VersionAwareHandlerTest.java index 9f37b1da28..342be51eb0 100644 --- a/cayenne/src/test/java/org/apache/cayenne/configuration/xml/VersionAwareHandlerTest.java +++ b/cayenne/src/test/java/org/apache/cayenne/configuration/xml/VersionAwareHandlerTest.java @@ -30,8 +30,8 @@ */ public class VersionAwareHandlerTest { - private static String[] VERSION_SET_1 = {"10", "11", "9"}; // sorted as strings - private static String[] VERSION_SET_2 = {"10"}; + private static ProjectVersion[] VERSION_SET_1 = {ProjectVersion.V9, ProjectVersion.V10, ProjectVersion.V11}; + private static ProjectVersion[] VERSION_SET_2 = {ProjectVersion.V10}; VersionAwareHandler handler; @@ -41,27 +41,27 @@ public void createHandler() { }; } - private Attributes createAttributesWithVersion(String version) { + private Attributes createAttributesWithVersion(ProjectVersion version) { AttributesImpl attributes = new AttributesImpl(); - attributes.addAttribute("", "project-version", "project-version", "", version); + attributes.addAttribute("", "project-version", "project-version", "", version.getAsString()); return attributes; } @Test public void validateCorrectVersion() { - handler.validateVersion(createAttributesWithVersion("9"), VERSION_SET_1); - handler.validateVersion(createAttributesWithVersion("10"), VERSION_SET_1); - handler.validateVersion(createAttributesWithVersion("11"), VERSION_SET_1); - handler.validateVersion(createAttributesWithVersion("10"), VERSION_SET_2); + handler.validateVersion(createAttributesWithVersion(ProjectVersion.V9), VERSION_SET_1); + handler.validateVersion(createAttributesWithVersion(ProjectVersion.V10), VERSION_SET_1); + handler.validateVersion(createAttributesWithVersion(ProjectVersion.V11), VERSION_SET_1); + handler.validateVersion(createAttributesWithVersion(ProjectVersion.V10), VERSION_SET_2); } @Test(expected = CayenneRuntimeException.class) public void validateIncorrectVersion1() { - handler.validateVersion(createAttributesWithVersion("8"), VERSION_SET_1); + handler.validateVersion(createAttributesWithVersion(ProjectVersion.V8), VERSION_SET_1); } @Test(expected = CayenneRuntimeException.class) public void validateIncorrectVersion2() { - handler.validateVersion(createAttributesWithVersion("11"), VERSION_SET_2); + handler.validateVersion(createAttributesWithVersion(ProjectVersion.V11), VERSION_SET_2); } -} \ No newline at end of file +} diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbImportProjectSaver.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbImportProjectSaver.java index bc707daafb..5881ae056a 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbImportProjectSaver.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbImportProjectSaver.java @@ -21,6 +21,7 @@ import org.apache.cayenne.configuration.ConfigurationNameMapper; import org.apache.cayenne.configuration.DataChannelDescriptor; import org.apache.cayenne.configuration.event.DataMapEvent; +import org.apache.cayenne.configuration.xml.ProjectVersion; import org.apache.cayenne.di.Inject; import org.apache.cayenne.map.DataMap; import org.apache.cayenne.map.event.MapEvent; @@ -42,9 +43,9 @@ public DbImportProjectSaver(@Inject ProjectController projectController, @Inject } @Override - public String getSupportedVersion() { + public ProjectVersion getSupportedVersion() { // not important in the context of non-saving saver - return "-1"; + return null; } @Override diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/extension/GraphExtension.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/extension/GraphExtension.java index 33b62c4096..2e95244f45 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/extension/GraphExtension.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/extension/GraphExtension.java @@ -21,11 +21,12 @@ import org.apache.cayenne.configuration.ConfigurationNodeVisitor; import org.apache.cayenne.configuration.DataChannelDescriptor; +import org.apache.cayenne.configuration.xml.ProjectVersion; +import org.apache.cayenne.configuration.xml.Schema; import org.apache.cayenne.di.Inject; import org.apache.cayenne.di.Provider; import org.apache.cayenne.modeler.Application; import org.apache.cayenne.modeler.graph.GraphRegistry; -import org.apache.cayenne.project.Project; import org.apache.cayenne.project.extension.BaseNamingDelegate; import org.apache.cayenne.project.extension.LoaderDelegate; import org.apache.cayenne.project.extension.ProjectExtension; @@ -36,7 +37,7 @@ */ public class GraphExtension implements ProjectExtension { - static final String NAMESPACE = "http://cayenne.apache.org/schema/" + Project.VERSION + "/graph"; + static final String NAMESPACE = Schema.buildNamespace(ProjectVersion.getCurrent(), "graph"); static final String GRAPH_SUFFIX = ".graph.xml"; diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/validation/extension/ValidationExtension.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/validation/extension/ValidationExtension.java index f78cb023d4..96ff8751e5 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/validation/extension/ValidationExtension.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/validation/extension/ValidationExtension.java @@ -20,8 +20,9 @@ import org.apache.cayenne.configuration.ConfigurationNodeVisitor; import org.apache.cayenne.configuration.xml.DataChannelMetaData; +import org.apache.cayenne.configuration.xml.ProjectVersion; +import org.apache.cayenne.configuration.xml.Schema; import org.apache.cayenne.di.Inject; -import org.apache.cayenne.project.Project; import org.apache.cayenne.project.extension.BaseNamingDelegate; import org.apache.cayenne.project.extension.LoaderDelegate; import org.apache.cayenne.project.extension.ProjectExtension; @@ -32,7 +33,7 @@ */ public class ValidationExtension implements ProjectExtension { - static final String NAMESPACE = "http://cayenne.apache.org/schema/" + Project.VERSION + "/validation"; + static final String NAMESPACE = Schema.buildNamespace(ProjectVersion.getCurrent(), "validation"); @Inject protected DataChannelMetaData metadata;